grix-connector 3.28.0 → 3.29.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.
Files changed (37) hide show
  1. package/dist/adapter/acp/acp-adapter.js +8 -8
  2. package/dist/adapter/acp/session-activity.js +1 -1
  3. package/dist/adapter/claude/claude-bridge-server.js +1 -1
  4. package/dist/adapter/claude/claude-tools.js +1 -1
  5. package/dist/adapter/claude/claude-worker-client.js +1 -1
  6. package/dist/adapter/claude/mcp-http-launcher.js +2 -2
  7. package/dist/adapter/claude/result-timeout.js +1 -1
  8. package/dist/adapter/codex/codex-bridge.js +8 -8
  9. package/dist/adapter/deepseek-harness/dsh-provider-config.js +5 -5
  10. package/dist/adapter/deepseek-harness/event-mapper.js +1 -1
  11. package/dist/adapter/deepseek-harness/grix-tool-bridge.js +1 -0
  12. package/dist/adapter/deepseek-harness/index.js +1 -1
  13. package/dist/adapter/deepseek-harness/jsonrpc-adapter.js +2 -2
  14. package/dist/adapter/deepseek-harness/plugin-manager.js +1 -2
  15. package/dist/adapter/deepseek-harness/profile-resolver.js +1 -1
  16. package/dist/adapter/deepseek-harness/profile-runtime.js +3 -3
  17. package/dist/adapter/deepseek-harness/session-plugin-overlay.js +4 -0
  18. package/dist/assets/dsh-bridge/grix-dsh-bridge-3.29.0.tgz +0 -0
  19. package/dist/assets/dsh-bridge/manifest.json +6 -6
  20. package/dist/audit/adapters/codex/codex-audit-adapter.js +1 -1
  21. package/dist/audit/adapters/deepseek-harness/deepseek-harness-audit-adapter.js +2 -2
  22. package/dist/bridge/bridge.js +7 -7
  23. package/dist/core/access/allowlist-store.js +1 -1
  24. package/dist/core/file-ops/list-files.js +1 -1
  25. package/dist/core/persistence/session-binding-store.js +2 -2
  26. package/dist/core/util/codex-output-policy.js +1 -1
  27. package/dist/log.js +2 -2
  28. package/dist/mcp/stream-http/config.js +1 -1
  29. package/dist/mcp/stream-http/connection-binding.js +1 -1
  30. package/dist/mcp/stream-http/security.js +1 -1
  31. package/dist/mcp/stream-http/tool-executor.js +1 -1
  32. package/dist/mcp/stream-http/tool-registry.js +1 -1
  33. package/dist/mcp/stream-http/tool-schemas.js +1 -1
  34. package/dist/protocol/acp-client.js +1 -1
  35. package/openclaw-plugin/index.js +3 -1
  36. package/package.json +2 -1
  37. package/dist/assets/dsh-bridge/grix-dsh-bridge-3.28.0.tgz +0 -0
@@ -1 +1 @@
1
- import{referenceCaptureContent as K}from"../../core/content-reference.js";import{assessToolCallCompleteness as oe,deduplicateGaps as ae}from"../../core/tool-call-audit.js";import{InvalidCodexUsageError as z,normalizeCodexUsage as de}from"../../core/usage.js";import{cleanupRawApiCapture as ue,loadRawApiCapture as ie}from"../../raw-capture/body-source.js";import{extractProviderResponseId as ce,extractRequestModel as pe,extractSystemPrompt as le}from"../../raw-capture/attribution.js";const fe=new Set(["rawResponse/completed","codex/rawResponse/completed"]),me=new Set(["thread/tokenUsage/updated","codex/thread/tokenUsage/updated"]),P=new Set(["item/completed","codex/item/completed"]),H=new Set(["item/started","codex/item/started"]),he=new Set(["rawResponseItem/completed","codex/rawResponseItem/completed"]),Ie=new Set(["error","codex/error"]),ve=new Set(["thread/compacted","codex/thread/compacted"]),V=new Set(["commandExecution","fileChange","mcpToolCall","dynamicToolCall","webSearch","imageView","sleep","imageGeneration"]),G=new Set(["collabAgentToolCall","subAgentActivity"]),ge=Object.freeze({inputOutput:!0,tools:!0,subagents:!0,thinking:!0,rawProviderBody:!1});function y(e){if(!(typeof e!="object"||e===null||Array.isArray(e)))return e}function I(e){return typeof e=="string"&&e.length>0?e:void 0}function T(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function $(e,t,n){return e[t]??e[n]}function _e(e){return["totalTokens","total_tokens","inputTokens","input_tokens","cachedInputTokens","cached_input_tokens","cacheWriteInputTokens","cache_write_input_tokens","outputTokens","output_tokens","reasoningOutputTokens","reasoning_output_tokens"].some(t=>Object.hasOwn(e,t))}function ye(e){const t=y(e);if(!(!t||!_e(t)))return{total_tokens:$(t,"totalTokens","total_tokens"),input_tokens:$(t,"inputTokens","input_tokens"),cached_input_tokens:$(t,"cachedInputTokens","cached_input_tokens"),cache_write_input_tokens:$(t,"cacheWriteInputTokens","cache_write_input_tokens"),output_tokens:$(t,"outputTokens","output_tokens"),reasoning_output_tokens:$(t,"reasoningOutputTokens","reasoning_output_tokens")}}function J(e){return[e.input.total,e.input.cacheRead??"unknown",e.input.cacheWrite??"unknown",e.output.total,e.output.reasoning??"unknown"].join(":")}function Q(e,t){return e.input.total!==t.input.total||e.output.total!==t.output.total?!1:[[e.input.cacheRead,t.input.cacheRead],[e.input.cacheWrite,t.input.cacheWrite],[e.output.reasoning,t.output.reasoning]].every(([r,s])=>r===null||s===null||r===s)}function R(e){let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function M(e){const t=I(e);if(!(!t||Number.isNaN(Date.parse(t))))return t}function O(e){return e.options?.enabled===!0?e.options.capture:ge}function S(e){if(typeof e=="string")return e;try{const t=JSON.stringify(e);return t===void 0?"null":t}catch{return String(e)}}function A(e,t){const n=K(t);return e.push(t),n}function x(e,t){t&&(e.some(n=>n.contentId===t.contentId)||e.push(t))}function Y(e){const t=ye(e);return t?{...de(t),providerUsageRaw:e}:void 0}function we(e){return{providerTurnId:I(e.boundary.providerTurnId)??I(e.boundary.turnId)??e.turnId,providerThreadId:I(e.boundary.providerThreadId)??I(e.boundary.threadId)}}function E(e,t){const n=I(e.turnId??e.turn_id);if(n&&n!==t.providerTurnId)return!1;const r=I(e.threadId??e.thread_id);return!(t.providerThreadId&&r&&r!==t.providerThreadId)}function C(e,t,n,r){e.push({code:t,message:n,providerIds:r})}function X(e,t,n){try{const r=Y(e);if(!r){C(n,"codex_usage_missing",`${t.nativeEventType} did not contain a usable usage payload`);return}return{...t,usage:r,providerUsageRaw:e,usageKey:J(r),reconciledWithTokenSnapshot:!1}}catch(r){if(r instanceof z){C(n,"codex_usage_invalid",r.message,t.responseId?{responseId:t.responseId}:void 0);return}throw r}}function L(e){const t=y(e);if(!t)return{events:[]};const n=I(t.modelId);return{...n?{modelId:n}:{},events:Array.isArray(t.events)?t.events.filter(r=>{const s=y(r);return!!(s&&typeof s.method=="string"&&y(s.params))}):[],rolloutEntries:Array.isArray(t.rolloutEntries)?t.rolloutEntries:[],...y(t.rawApiCapture)&&Array.isArray(y(t.rawApiCapture)?.exchanges)?{rawApiCapture:t.rawApiCapture}:{}}}function Z(e){const t=e?.toLowerCase()??"";return t.includes("ndjson")?"text":t.includes("json")?"json":(t.includes("event-stream"),"text")}function j(e){return e.correlation.providerResponseId??(e.upstream.body.value===void 0?void 0:ce(e.upstream.body.value))}function qe(e){const t=e.downstream.method.toUpperCase();if(t!=="POST"&&t!=="WEBSOCKET")return!1;const n=e.downstream.path.toLowerCase().replace(/\/+$/,"");return n.endsWith("/responses")||n.endsWith("/responses/compact")||n.endsWith("/chat/completions")||n.endsWith("/completions")}function xe(e,t,n,r){const s=t.correlation.providerRequestId;return e.find(a=>!r.has(a.spanId)&&(n&&(a.provider.nativeIds.responseId===n||a.provider.nativeIds.requestId===n)||s&&(a.provider.nativeIds.requestId===s||a.provider.nativeIds.responseId===s)))}function Te(e,t){const n=new Map,r=new Set;for(const p of t){const d=xe(e,p,j(p),r);d&&(n.set(p.exchangeId,d),r.add(d.spanId))}const s=t.filter(p=>!n.has(p.exchangeId)),u=e.filter(p=>!r.has(p.spanId));if(s.length!==u.length)return n;s.sort((p,d)=>Date.parse(p.startedAt)-Date.parse(d.startedAt)),u.sort((p,d)=>p.sequence-d.sequence);const a=s.every((p,d)=>{const o=Date.parse(p.completedAt??p.startedAt),c=Date.parse(u[d].startedAt);return Number.isFinite(o)&&Number.isFinite(c)&&o<=c});return s.length>1&&!a||s.forEach((p,d)=>{n.set(p.exchangeId,u[d])}),n}function Ae(e,t,n,r,s){const u=t.completedAt??t.startedAt;return{spanId:`codex-raw-${R(`${e.traceId}|${t.exchangeId}`)}`,traceId:e.traceId,turnId:e.turnId,sessionId:e.sessionId,parentSpanId:`codex:${e.turnId}:turn`,kind:"llm_request",name:"codex provider request",sequence:n,status:t.status==="cancelled"?"cancelled":t.status==="failed"?"failed":"completed",startedAt:t.startedAt,endedAt:u,durationMs:Math.max(0,Date.parse(u)-Date.parse(t.startedAt)),...r?{modelId:r}:{},inputRefs:[],outputRefs:[],provider:{provider:"codex",nativeEventType:"provider_raw_api_exchange",nativeIds:{requestId:t.correlation.providerRequestId??t.exchangeId,exchangeId:t.exchangeId,...s?{responseId:s}:{}}},provenance:{source:"provider_raw_body",accuracy:"runtime_exact"}}}function Se(e,t,n,r,s){if(!t)return;if(t.status==="unavailable"){C(s,"codex_raw_api_capture_unavailable",t.unavailableReason??"Codex raw API capture is unavailable");return}for(const i of t.errors)C(s,"codex_raw_api_capture_partial",i);const u=n.filter(i=>i.kind==="llm_request"),a=t.exchanges.filter(qe),p=Te(u,a),d=new Set([...p.values()].map(i=>i.spanId)),o=u.filter(i=>!d.has(i.spanId)).length,c=a.filter(i=>!p.has(i.exchangeId)).length;a.length>0&&o!==c&&C(s,"codex_raw_api_capture_partial",`Codex raw API exchanges and leaf usage requests do not align (${c} exchange(s), ${o} request(s) unmatched)`);let m=n.reduce((i,l)=>Math.max(i,l.sequence),0)+1;for(const i of a){const l=i.downstream.body.value,h=i.upstream.body.value,_=j(i),g=l?pe(l):void 0,q=p.get(i.exchangeId);!q&&o>0&&c>0&&C(s,"codex_raw_api_correlation_ambiguous",`Raw API exchange ${i.exchangeId} has no stable request identifier`,{exchangeId:i.exchangeId});const v=q??Ae(e,i,m++,g,_);n.includes(v)||n.push(v);const w=l===void 0?void 0:A(r,{role:"model_request",format:Z(i.downstream.body.contentType),value:l,sourcePath:i.downstream.body.sourcePath,captureLevel:"provider_exact"}),f=h===void 0?void 0:A(r,{role:"model_response",format:Z(i.upstream.body.contentType),value:h,sourcePath:i.upstream.body.sourcePath,captureLevel:"provider_exact"}),k=l?le(l):void 0;k&&A(r,{role:"system_prompt",format:"json",value:k,sourcePath:i.downstream.body.sourcePath,captureLevel:"provider_exact"}),x(v.inputRefs,w),x(v.outputRefs,f),g&&!v.modelId&&(v.modelId=g),v.provider.nativeIds.exchangeId=i.exchangeId,_&&(v.provider.nativeIds.responseId=_),v.provider.rawAttributes={...v.provider.rawAttributes,rawApiExchange:{method:i.downstream.method,path:i.downstream.path,query:i.downstream.query,requestHeaders:i.downstream.redactedHeaders,responseStatus:i.upstream.statusCode,responseHeaders:i.upstream.redactedHeaders,requestSha256:i.downstream.body.sha256,responseSha256:i.upstream.body.sha256,requestBytes:i.downstream.body.bytes,responseBytes:i.upstream.body.bytes}},(!w||!f||i.errors.length>0)&&C(s,"codex_raw_api_capture_partial",`Raw API exchange ${i.exchangeId} is incomplete`,{exchangeId:i.exchangeId})}}function Re(e,t,n){const r=new Map;let s=0;for(const u of e){if(!fe.has(u.method)||!E(u.params,t))continue;const a=I(u.params.turnId??u.params.turn_id)??t.providerTurnId,p=I(u.params.threadId??u.params.thread_id)??t.providerThreadId,d=I(u.params.responseId??u.params.response_id),o=X(u.params.usage,{sequence:T(u.sequence)??s,observedAt:M(u.observedAt),providerTurnId:a,threadId:p,responseId:d,nativeEventType:u.method,source:"provider_raw_body"},n);if(s+=1,!o)continue;const c=d?`response:${d}`:`anonymous:${o.sequence}:${o.usageKey}`,m=r.get(c);if(m&&!Q(m.usage,o.usage)){C(n,"codex_response_usage_conflict",`Response ${d??c} reported conflicting usage`,d?{responseId:d}:void 0);continue}m||r.set(c,o)}return[...r.values()].sort((u,a)=>u.sequence-a.sequence)}function ee(e,t,n,r){const s=X(e,n,r);if(!s)return;let u;try{const a=Y(t);a&&(u=[n.threadId??"unknown-thread",n.providerTurnId,J(a)].join("|"))}catch(a){if(a instanceof z)C(r,"codex_total_snapshot_invalid",a.message);else throw a}return{...s,providerUsageRaw:{last:e,total:t},usage:{...s.usage,providerUsageRaw:{last:e,total:t}},snapshotKey:u}}function Ce(e,t,n){const r=[];for(const s of e){if(!me.has(s.method)||!E(s.params,t))continue;const u=y(s.params.tokenUsage??s.params.token_usage);if(!u){C(n,"codex_usage_missing",`${s.method} did not contain tokenUsage`);continue}const a=I(s.params.turnId??s.params.turn_id)??t.providerTurnId,p=I(s.params.threadId??s.params.thread_id)??t.providerThreadId,d=ee(u.last??u.last_token_usage,u.total??u.total_token_usage,{sequence:T(s.sequence)??r.length,observedAt:M(s.observedAt),providerTurnId:a,threadId:p,responseId:I(s.params.responseId??s.params.response_id),nativeEventType:s.method,source:"provider_event"},n);d&&r.push(d)}return r}function ke(e,t,n,r){const s=[];return e.forEach((u,a)=>{const p=y(u),d=y(p?.payload);if(p?.type!=="event_msg"||d?.type!=="token_count")return;const o=y(d.info);if(!o)return;const c=ee(o.last_token_usage??o.lastTokenUsage,o.total_token_usage??o.totalTokenUsage,{sequence:T(p?.sequence)??n+a,observedAt:M(p?.timestamp),providerTurnId:t.providerTurnId,threadId:t.providerThreadId,nativeEventType:"rollout/event_msg/token_count",source:"provider_transcript"},r);c&&s.push(c)}),s}function Ee(e){const t=new Set;return e.filter(n=>n.snapshotKey?t.has(n.snapshotKey)?!1:(t.add(n.snapshotKey),!0):!0)}function be(e,t){const n=new Set(e),r=new Set(t);for(const s of t){const u=e.find(a=>!n.has(a)||s.responseId&&a.responseId&&s.responseId!==a.responseId?!1:a.providerTurnId===s.providerTurnId&&Q(a.usage,s.usage));u&&(u.reconciledWithTokenSnapshot=!0,u.snapshotKey=s.snapshotKey,u.threadId??=s.threadId,u.providerUsageRaw={rawResponse:u.providerUsageRaw,tokenUsage:s.providerUsageRaw},u.usage={...u.usage,providerUsageRaw:u.providerUsageRaw},n.delete(u),r.delete(s))}return[...e,...t.filter(s=>r.has(s))].sort((s,u)=>s.sequence-u.sequence)}function $e(e){if(e.responseId)return e.responseId;const t=e.snapshotKey??[e.threadId??"unknown-thread",e.providerTurnId,e.sequence,e.usageKey].join("|");return`codex-usage-${R(t)}`}function Me(e,t,n){const r=$e(t),s={requestId:r,turnId:t.providerTurnId};t.threadId&&(s.threadId=t.threadId),t.responseId&&(s.responseId=t.responseId),t.snapshotKey&&(s.usageSnapshotId=R(t.snapshotKey));const u=t.observedAt??e.startedAt;return{spanId:`codex-llm-${R(`${e.traceId}|${r}`)}`,traceId:e.traceId,turnId:e.turnId,sessionId:e.sessionId,parentSpanId:`codex:${e.turnId}:turn`,kind:"llm_request",name:"codex response",sequence:t.sequence,status:"completed",startedAt:u,endedAt:u,...n?{modelId:n}:{},inputRefs:[],outputRefs:[],usage:t.usage,provider:{provider:"codex",nativeEventType:t.nativeEventType,nativeIds:s,rawAttributes:{usageSource:t.source,reconciledWithTokenSnapshot:t.reconciledWithTokenSnapshot}},provenance:{source:t.source,accuracy:"provider_reported"}}}function W(e,t){const n=T(e.params.completedAtMs);if(n!==void 0){const r=new Date(n);if(!Number.isNaN(r.getTime()))return r.toISOString()}return M(e.observedAt)??t.endedAt}function D(e,t){const n=T(e.params.startedAtMs);if(n!==void 0){const r=new Date(n);if(!Number.isNaN(r.getTime()))return r.toISOString()}return M(e.observedAt)??t}function te(e){const t=I(e.status)?.toLowerCase();return t==="inprogress"||t==="in_progress"||t==="running"?"running":t==="failed"||t==="declined"||t==="error"||T(e.exitCode)!==void 0&&T(e.exitCode)!==0?"failed":t==="cancelled"||t==="canceled"?"cancelled":"completed"}function ne(e){const t=I(e.type)??"tool";if(t==="mcpToolCall"){const n=I(e.server),r=I(e.tool);return[n,r].filter(Boolean).join("/")||t}return I(e.tool)??t}function re(e){switch(I(e.type)){case"commandExecution":return typeof e.command=="string"?{format:"text",value:String(e.command)}:void 0;case"fileChange":return Object.hasOwn(e,"changes")?{format:"json",value:S(e.changes)}:void 0;case"mcpToolCall":case"dynamicToolCall":return Object.hasOwn(e,"arguments")?{format:"json",value:S(e.arguments)}:void 0;case"webSearch":return typeof e.query=="string"?{format:"text",value:String(e.query)}:void 0;default:return{format:"json",value:S(e)}}}function Oe(e){switch(I(e.type)){case"commandExecution":return typeof e.aggregatedOutput=="string"?{format:"text",value:e.aggregatedOutput}:e.status!==void 0||e.exitCode!==void 0?{format:"json",value:S({status:e.status,exitCode:e.exitCode})}:void 0;case"fileChange":return{format:"json",value:S({status:e.status})};case"mcpToolCall":return Object.hasOwn(e,"result")?{format:"json",value:S(e.result)}:Object.hasOwn(e,"error")?{format:"json",value:S(e.error)}:void 0;case"dynamicToolCall":return Object.hasOwn(e,"contentItems")?{format:"json",value:S(e.contentItems)}:void 0;default:return{format:"json",value:S(e)}}}function Pe(e,t,n,r,s){if(!O(e).tools)return[];const u=new Set,a=[],p=new Map;for(const d of t){if(!H.has(d.method)||!E(d.params,n))continue;const o=y(d.params.item),c=I(o?.id);c&&p.set(c,d)}for(const d of t){if(!P.has(d.method)||!E(d.params,n))continue;const o=y(d.params.item),c=I(o?.type);if(!o||!c||!V.has(c))continue;const m=I(o.id)??`sequence-${d.sequence}`;if(u.has(m))continue;u.add(m);const i=W(d,e),l=p.get(m),h=T(o.durationMs),_=Date.parse(i),g=l?D(l,i):h!==void 0&&Number.isFinite(_)?new Date(Math.max(0,_-h)).toISOString():i,q=Date.parse(i)-Date.parse(g),v=Number.isFinite(q)&&q>0?q:h,w=[...r].filter(b=>b.sequence<=d.sequence).sort((b,U)=>U.sequence-b.sequence)[0],f=[...r].filter(b=>b.sequence>d.sequence).sort((b,U)=>b.sequence-U.sequence)[0],k=w??f,N={spanId:`codex-tool-${R(`${e.traceId}|${m}`)}`,traceId:e.traceId,turnId:e.turnId,sessionId:e.sessionId,parentSpanId:k?.spanId??`codex:${e.turnId}:turn`,kind:"tool_call",name:ne(o),sequence:d.sequence,status:te(o),startedAt:g,endedAt:i,...v!==void 0?{durationMs:Math.max(0,v)}:{},inputRefs:[],outputRefs:[],provider:{provider:"codex",nativeEventType:d.method,nativeIds:{toolCallId:m,turnId:n.providerTurnId,...n.providerThreadId?{threadId:n.providerThreadId}:{}},rawAttributes:{itemType:c,auditEventSequence:d.sequence,startEventSequence:l?.sequence,...I(o.cwd)?{cwd:o.cwd}:{},...T(o.exitCode)!==void 0?{exitCode:o.exitCode}:{}}},provenance:{source:"provider_event",accuracy:"provider_reported"}},B=re(o);B&&x(N.inputRefs,A(s,{role:"tool_arguments",...B,captureLevel:"provider_exact"}));const F=Oe(o);F&&x(N.outputRefs,A(s,{role:"tool_result",...F,captureLevel:"provider_exact"})),a.push(N)}for(const[d,o]of p){if(u.has(d))continue;const c=y(o.params.item),m=I(c?.type);if(!c||!m||!V.has(m))continue;const i=D(o,e.startedAt),l=[...r].filter(g=>g.sequence<=o.sequence).sort((g,q)=>q.sequence-g.sequence)[0]??r[0],h={spanId:`codex-tool-${R(`${e.traceId}|${d}`)}`,traceId:e.traceId,turnId:e.turnId,sessionId:e.sessionId,parentSpanId:l?.spanId??`codex:${e.turnId}:turn`,kind:"tool_call",name:ne(c),sequence:o.sequence,status:"running",startedAt:i,endedAt:e.endedAt,durationMs:Math.max(0,Date.parse(e.endedAt)-Date.parse(i)),inputRefs:[],outputRefs:[],provider:{provider:"codex",nativeEventType:o.method,nativeIds:{toolCallId:d,turnId:n.providerTurnId,...n.providerThreadId?{threadId:n.providerThreadId}:{}},rawAttributes:{itemType:m,auditEventSequence:o.sequence,hasCompletion:!1}},provenance:{source:"provider_event",accuracy:"provider_reported"}},_=re(c);_&&x(h.inputRefs,A(s,{role:"tool_arguments",..._,captureLevel:"provider_exact"})),a.push(h)}return a}function De(e,t,n,r,s){if(!O(e).subagents)return[];const u=[],a=new Set,p=new Map;for(const d of t){if(!H.has(d.method)||!E(d.params,n))continue;const o=y(d.params.item),c=I(o?.id);c&&p.set(c,d)}for(const d of t){if(!P.has(d.method)||!E(d.params,n))continue;const o=y(d.params.item),c=I(o?.type);if(!o||!c||!G.has(c))continue;const m=I(o.id)??`sequence-${d.sequence}`;if(a.has(m))continue;a.add(m);const i=[...r].filter(f=>f.sequence<=d.sequence).sort((f,k)=>k.sequence-f.sequence)[0],l=W(d,e),h=p.get(m),_=h?D(h,l):l,g=Date.parse(l)-Date.parse(_),q={spanId:`codex-subagent-${R(`${e.traceId}|${m}`)}`,traceId:e.traceId,turnId:e.turnId,sessionId:e.sessionId,parentSpanId:i?.spanId??`codex:${e.turnId}:turn`,kind:"subagent",name:I(o.tool)??c,sequence:d.sequence,status:te(o),startedAt:_,endedAt:l,...Number.isFinite(g)?{durationMs:Math.max(0,g)}:{},inputRefs:[],outputRefs:[],provider:{provider:"codex",nativeEventType:d.method,nativeIds:{subagentCallId:m,turnId:n.providerTurnId,...n.providerThreadId?{threadId:n.providerThreadId}:{},...I(o.senderThreadId)?{senderThreadId:String(o.senderThreadId)}:{}},rawAttributes:{itemType:c,auditEventSequence:d.sequence,startEventSequence:h?.sequence,receiverThreadIds:o.receiverThreadIds,agentsStates:o.agentsStates,model:o.model,reasoningEffort:o.reasoningEffort}},provenance:{source:"provider_event",accuracy:"provider_reported"}},v=I(o.prompt);v&&x(q.inputRefs,A(s,{role:"subagent_prompt",format:"text",value:v,captureLevel:"provider_exact"}));const w=o.result??o.agentsStates??o.status;w!==void 0&&x(q.outputRefs,A(s,{role:"subagent_result",format:typeof w=="string"?"text":"json",value:S(w),captureLevel:"provider_exact"})),u.push(q)}for(const[d,o]of p){if(a.has(d))continue;const c=y(o.params.item),m=I(c?.type);if(!c||!m||!G.has(m))continue;const i=D(o,e.startedAt),l=[...r].filter(g=>g.sequence<=o.sequence).sort((g,q)=>q.sequence-g.sequence)[0]??r[0],h={spanId:`codex-subagent-${R(`${e.traceId}|${d}`)}`,traceId:e.traceId,turnId:e.turnId,sessionId:e.sessionId,parentSpanId:l?.spanId??`codex:${e.turnId}:turn`,kind:"subagent",name:I(c.tool)??m,sequence:o.sequence,status:"running",startedAt:i,endedAt:e.endedAt,durationMs:Math.max(0,Date.parse(e.endedAt)-Date.parse(i)),inputRefs:[],outputRefs:[],provider:{provider:"codex",nativeEventType:o.method,nativeIds:{subagentCallId:d,turnId:n.providerTurnId,...n.providerThreadId?{threadId:n.providerThreadId}:{},...I(c.senderThreadId)?{senderThreadId:String(c.senderThreadId)}:{}},rawAttributes:{itemType:m,auditEventSequence:o.sequence,hasCompletion:!1,receiverThreadIds:c.receiverThreadIds,model:c.model,reasoningEffort:c.reasoningEffort}},provenance:{source:"provider_event",accuracy:"provider_reported"}},_=I(c.prompt);_&&x(h.inputRefs,A(s,{role:"subagent_prompt",format:"text",value:_,captureLevel:"provider_exact"})),u.push(h)}return u}function Ne(e,t,n,r,s){const u=[];for(const a of t){if(!E(a.params,n))continue;if(Ie.has(a.method)&&a.params.willRetry===!0){const c=M(a.observedAt)??e.endedAt,m=y(a.params.error);u.push({spanId:`codex-retry-${R(`${e.traceId}|${a.sequence}`)}`,traceId:e.traceId,turnId:e.turnId,sessionId:e.sessionId,parentSpanId:`codex:${e.turnId}:turn`,kind:"retry",name:I(m?.message)??"Codex request retry",sequence:a.sequence,status:"completed",startedAt:c,endedAt:c,durationMs:0,inputRefs:[],outputRefs:[],provider:{provider:"codex",nativeEventType:a.method,nativeIds:{turnId:n.providerTurnId,...n.providerThreadId?{threadId:n.providerThreadId}:{}},rawAttributes:{error:a.params.error,willRetry:!0}},provenance:{source:"provider_event",accuracy:"provider_reported"}});continue}const p=y(a.params.item),d=P.has(a.method)&&p?.type==="contextCompaction";if(!ve.has(a.method)&&!d)continue;const o=W(a,e);u.push({spanId:`codex-compaction-${R(`${e.traceId}|${a.sequence}`)}`,traceId:e.traceId,turnId:e.turnId,sessionId:e.sessionId,parentSpanId:`codex:${e.turnId}:turn`,kind:"compaction",name:"Codex context compaction",sequence:a.sequence,status:"completed",startedAt:o,endedAt:o,durationMs:0,inputRefs:[],outputRefs:[],provider:{provider:"codex",nativeEventType:a.method,nativeIds:{turnId:n.providerTurnId,...n.providerThreadId?{threadId:n.providerThreadId}:{},...I(p?.id)?{itemId:String(p?.id)}:{}},rawAttributes:p?{item:p}:{params:a.params}},provenance:{source:"provider_event",accuracy:"provider_reported"}})}if(O(e).rawProviderBody)for(const a of t){if(!he.has(a.method)||!E(a.params,n))continue;const p=A(s,{role:"model_response",format:"json",value:S(a.params.item),captureLevel:"provider_exact"}),d=[...r].filter(o=>o.sequence>=a.sequence).sort((o,c)=>o.sequence-c.sequence)[0]??r.at(-1);d&&x(d.outputRefs,p)}return u}function se(e){return typeof e.text=="string"&&e.text.length>0?e.text:Array.isArray(e.content)&&e.content.map(n=>{if(typeof n=="string")return n;const r=y(n);return I(r?.text)??""}).join("")||void 0}function Ue(e,t,n,r,s,u){const a=[...r].sort((l,h)=>l.sequence-h.sequence),p=t.filter(l=>P.has(l.method)&&E(l.params,n)&&y(l.params.item)).sort((l,h)=>l.sequence-h.sequence),d=O(e);let o=Number.NEGATIVE_INFINITY,c=1;const m=new Set;for(const[l,h]of a.entries()){const _=h.sequence,g=p.filter(v=>v.sequence>o&&v.sequence<=_);if(d.inputOutput)for(const v of g){const w=y(v.params.item),f=I(w.type);if(f!=="userMessage"&&f!=="agentMessage")continue;const k=se(w);k&&x(f==="userMessage"?h.inputRefs:h.outputRefs,A(u,{role:f==="userMessage"?"user_input":"assistant_text",format:"text",value:k,captureLevel:"provider_exact"}))}if(d.thinking)for(const v of g){const w=y(v.params.item);if(w.type!=="reasoning")continue;const f=se(w);f&&x(h.outputRefs,A(u,{role:"thinking",format:"text",value:f,captureLevel:"provider_exact"}))}d.inputOutput&&l===0&&h.inputRefs.length===0&&e.input&&x(h.inputRefs,K(e.input)),d.inputOutput&&l===a.length-1&&h.outputRefs.length===0&&e.finalOutput&&x(h.outputRefs,K(e.finalOutput)),h.sequence=c++;const q=s.filter(v=>{const w=T(v.provider.rawAttributes?.auditEventSequence);return w!==void 0&&w>o&&w<=_}).sort((v,w)=>T(v.provider.rawAttributes?.auditEventSequence)-T(w.provider.rawAttributes?.auditEventSequence));for(const v of q)v.sequence=c++,m.add(v.spanId);o=_}const i=s.filter(l=>!m.has(l.spanId)).sort((l,h)=>l.sequence-h.sequence);for(const l of i)l.sequence=c++;for(const l of s){if(l.outputRefs.length===0)continue;const h=a.findIndex(g=>g.spanId===l.parentSpanId),_=h>=0?a[h+1]:void 0;if(_)for(const g of l.outputRefs)x(_.inputRefs,g)}}class ze{provider="codex";async collect(t){const n=L(t.boundary.codexEvidence),r=y(t.boundary.codexEvidence);return r?.rawApiCapture!==void 0&&(n.rawApiCapture=await ie(r.rawApiCapture)),n}async normalize(t,n){const r=L(n),s=we(t),u=[],a=Re(r.events,s,u),p=Ce(r.events,s,u),d=ke(r.rolloutEntries??[],s,r.events.length+1,u),o=Ee([...p,...d]),m=be(a,o).map(g=>Me(t,g,r.modelId)),i=[],l=Pe(t,r.events,s,m,i),h=De(t,r.events,s,m,i),_=Ne(t,r.events,s,m,i);return Ue(t,r.events,s,m,l,i),Se(t,r.rawApiCapture,m,i,u),{spans:[...m,...l,...h,..._],contents:i,anomalies:u}}async correlate(t,n){return n}validate(t,n){const r=n.spans.filter(f=>f.kind==="llm_request"&&f.usage),s=n.anomalies.some(f=>f.code==="codex_usage_invalid"||f.code==="codex_total_snapshot_invalid"||f.code==="codex_response_usage_conflict"),u=r.length>0&&!s&&r.every(f=>f.usage?.completeness==="complete"),a=O(t),p=!a.inputOutput||!!t.input,d=n.contents.some(f=>f.role==="assistant_text"||f.role==="model_response"||f.role==="final_response"),o=!a.inputOutput||!!t.finalOutput||d,c=oe(n.spans,a.tools),m=c.complete,i=n.spans.filter(f=>f.kind==="subagent"),l=!a.subagents||i.every(f=>f.status!=="running"),h=n.contents.filter(f=>f.role==="model_request"&&f.value!==void 0).length,_=n.contents.filter(f=>f.role==="model_response"&&f.value!==void 0).length,g=n.anomalies.some(f=>f.code==="codex_raw_api_capture_unavailable"||f.code==="codex_raw_api_capture_partial"||f.code==="codex_raw_api_correlation_ambiguous"),q=!a.rawProviderBody||h>0&&_>=h&&!g,v=[];return r.length===0&&v.push({category:"usage",reason:"provider_usage_missing",detail:"No Codex leaf request usage was found for the provider turn"}),r.length>0&&!u&&v.push({category:"provider_usage_cache_partition",reason:"provider_usage_missing",detail:"Codex reported request totals, but one or more cache or reasoning partitions were absent"}),a.subagents&&!l&&v.push({category:"subagents",reason:"correlation_failed",detail:"One or more Codex collaboration items did not reach a terminal state"}),a.rawProviderBody&&(h===0?v.push({category:"raw_provider_body",reason:"raw_capture_disabled",detail:"Codex raw API capture did not produce a request body"}):q||v.push({category:"raw_provider_body",reason:"correlation_failed",detail:"One or more Codex raw API exchanges are incomplete"})),v.push(...c.gaps),{status:u&&p&&o&&m&&l&&q?"complete":"partial",inputComplete:p,outputComplete:o,toolCallsComplete:m,subagentsComplete:l,usageComplete:u,rawRequestsComplete:q,gaps:ae(v)}}async cleanup(t,n){const r=L(n).rawApiCapture;r&&await ue(r)}}export{ze as CodexAuditAdapter};
1
+ import{referenceCaptureContent as L}from"../../core/content-reference.js";import{assessToolCallCompleteness as oe,deduplicateGaps as ae}from"../../core/tool-call-audit.js";import{InvalidCodexUsageError as z,normalizeCodexUsage as de}from"../../core/usage.js";import{cleanupRawApiCapture as ue,loadRawApiCapture as ie}from"../../raw-capture/body-source.js";import{extractProviderResponseId as ce,extractRequestModel as pe,extractSystemPrompt as le}from"../../raw-capture/attribution.js";const fe=new Set(["rawResponse/completed","codex/rawResponse/completed"]),me=new Set(["thread/tokenUsage/updated","codex/thread/tokenUsage/updated"]),D=new Set(["item/completed","codex/item/completed"]),H=new Set(["item/started","codex/item/started"]),he=new Set(["rawResponseItem/completed","codex/rawResponseItem/completed"]),Ie=new Set(["error","codex/error"]),ve=new Set(["thread/compacted","codex/thread/compacted"]),V=new Set(["commandExecution","fileChange","mcpToolCall","dynamicToolCall","webSearch","imageView","sleep","imageGeneration"]),G=new Set(["collabAgentToolCall","subAgentActivity"]),ge=Object.freeze({inputOutput:!0,tools:!0,subagents:!0,thinking:!0,rawProviderBody:!1});function w(e){if(!(typeof e!="object"||e===null||Array.isArray(e)))return e}function m(e){return typeof e=="string"&&e.length>0?e:void 0}function A(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function M(e,t,n){return e[t]??e[n]}function _e(e){return["totalTokens","total_tokens","inputTokens","input_tokens","cachedInputTokens","cached_input_tokens","cacheWriteInputTokens","cache_write_input_tokens","outputTokens","output_tokens","reasoningOutputTokens","reasoning_output_tokens"].some(t=>Object.hasOwn(e,t))}function ye(e){const t=w(e);if(!(!t||!_e(t)))return{total_tokens:M(t,"totalTokens","total_tokens"),input_tokens:M(t,"inputTokens","input_tokens"),cached_input_tokens:M(t,"cachedInputTokens","cached_input_tokens"),cache_write_input_tokens:M(t,"cacheWriteInputTokens","cache_write_input_tokens"),output_tokens:M(t,"outputTokens","output_tokens"),reasoning_output_tokens:M(t,"reasoningOutputTokens","reasoning_output_tokens")}}function J(e){return[e.input.total,e.input.cacheRead??"unknown",e.input.cacheWrite??"unknown",e.output.total,e.output.reasoning??"unknown"].join(":")}function Q(e,t){return e.input.total!==t.input.total||e.output.total!==t.output.total?!1:[[e.input.cacheRead,t.input.cacheRead],[e.input.cacheWrite,t.input.cacheWrite],[e.output.reasoning,t.output.reasoning]].every(([r,s])=>r===null||s===null||r===s)}function R(e){let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function O(e){const t=m(e);if(!(!t||Number.isNaN(Date.parse(t))))return t}function P(e){return e.options?.enabled===!0?e.options.capture:ge}function C(e){if(typeof e=="string")return e;try{const t=JSON.stringify(e);return t===void 0?"null":t}catch{return String(e)}}function S(e,t){const n=L(t);return e.push(t),n}function x(e,t){t&&(e.some(n=>n.contentId===t.contentId)||e.push(t))}function Y(e){const t=ye(e);return t?{...de(t),providerUsageRaw:e}:void 0}function we(e){return{providerTurnId:m(e.boundary.providerTurnId)??m(e.boundary.turnId)??e.turnId,providerThreadId:m(e.boundary.providerThreadId)??m(e.boundary.threadId)}}function b(e,t){const n=m(e.turnId??e.turn_id);if(n&&n!==t.providerTurnId)return!1;const r=m(e.threadId??e.thread_id);return!(t.providerThreadId&&r&&r!==t.providerThreadId)}function k(e,t,n,r){e.push({code:t,message:n,providerIds:r})}function X(e,t,n){try{const r=Y(e);if(!r){k(n,"codex_usage_missing",`${t.nativeEventType} did not contain a usable usage payload`);return}return{...t,usage:r,providerUsageRaw:e,usageKey:J(r),reconciledWithTokenSnapshot:!1}}catch(r){if(r instanceof z){k(n,"codex_usage_invalid",r.message,t.responseId?{responseId:t.responseId}:void 0);return}throw r}}function K(e){const t=w(e);if(!t)return{events:[]};const n=m(t.modelId);return{...n?{modelId:n}:{},events:Array.isArray(t.events)?t.events.filter(r=>{const s=w(r);return!!(s&&typeof s.method=="string"&&w(s.params))}):[],rolloutEntries:Array.isArray(t.rolloutEntries)?t.rolloutEntries:[],...w(t.rawApiCapture)&&Array.isArray(w(t.rawApiCapture)?.exchanges)?{rawApiCapture:t.rawApiCapture}:{}}}function Z(e){const t=e?.toLowerCase()??"";return t.includes("ndjson")?"text":t.includes("json")?"json":(t.includes("event-stream"),"text")}function j(e){return e.correlation.providerResponseId??(e.upstream.body.value===void 0?void 0:ce(e.upstream.body.value))}function qe(e){const t=e.downstream.method.toUpperCase();if(t!=="POST"&&t!=="WEBSOCKET")return!1;const n=e.downstream.path.toLowerCase().replace(/\/+$/,"");return n.endsWith("/responses")||n.endsWith("/responses/compact")||n.endsWith("/chat/completions")||n.endsWith("/completions")}function xe(e,t,n,r){const s=t.correlation.providerRequestId;return e.find(a=>!r.has(a.spanId)&&(n&&(a.provider.nativeIds.responseId===n||a.provider.nativeIds.requestId===n)||s&&(a.provider.nativeIds.requestId===s||a.provider.nativeIds.responseId===s)))}function Te(e,t){const n=new Map,r=new Set;for(const p of t){const d=xe(e,p,j(p),r);d&&(n.set(p.exchangeId,d),r.add(d.spanId))}const s=t.filter(p=>!n.has(p.exchangeId)),u=e.filter(p=>!r.has(p.spanId));if(s.length!==u.length)return n;s.sort((p,d)=>Date.parse(p.startedAt)-Date.parse(d.startedAt)),u.sort((p,d)=>p.sequence-d.sequence);const a=s.every((p,d)=>{const o=Date.parse(p.completedAt??p.startedAt),c=Date.parse(u[d].startedAt);return Number.isFinite(o)&&Number.isFinite(c)&&o<=c});return s.length>1&&!a||s.forEach((p,d)=>{n.set(p.exchangeId,u[d])}),n}function Ae(e,t,n,r,s){const u=t.completedAt??t.startedAt;return{spanId:`codex-raw-${R(`${e.traceId}|${t.exchangeId}`)}`,traceId:e.traceId,turnId:e.turnId,sessionId:e.sessionId,parentSpanId:`codex:${e.turnId}:turn`,kind:"llm_request",name:"codex provider request",sequence:n,status:t.status==="cancelled"?"cancelled":t.status==="failed"?"failed":"completed",startedAt:t.startedAt,endedAt:u,durationMs:Math.max(0,Date.parse(u)-Date.parse(t.startedAt)),...r?{modelId:r}:{},inputRefs:[],outputRefs:[],provider:{provider:"codex",nativeEventType:"provider_raw_api_exchange",nativeIds:{requestId:t.correlation.providerRequestId??t.exchangeId,exchangeId:t.exchangeId,...s?{responseId:s}:{}}},provenance:{source:"provider_raw_body",accuracy:"runtime_exact"}}}function Se(e,t,n,r,s){if(!t)return;if(t.status==="unavailable"){k(s,"codex_raw_api_capture_unavailable",t.unavailableReason??"Codex raw API capture is unavailable");return}for(const i of t.errors)k(s,"codex_raw_api_capture_partial",i);const u=n.filter(i=>i.kind==="llm_request"),a=t.exchanges.filter(qe),p=Te(u,a),d=new Set([...p.values()].map(i=>i.spanId)),o=u.filter(i=>!d.has(i.spanId)).length,c=a.filter(i=>!p.has(i.exchangeId)).length;a.length>0&&o!==c&&k(s,"codex_raw_api_capture_partial",`Codex raw API exchanges and leaf usage requests do not align (${c} exchange(s), ${o} request(s) unmatched)`);let h=n.reduce((i,l)=>Math.max(i,l.sequence),0)+1;for(const i of a){const l=i.downstream.body.value,I=i.upstream.body.value,_=j(i),g=l?pe(l):void 0,q=p.get(i.exchangeId);!q&&o>0&&c>0&&k(s,"codex_raw_api_correlation_ambiguous",`Raw API exchange ${i.exchangeId} has no stable request identifier`,{exchangeId:i.exchangeId});const v=q??Ae(e,i,h++,g,_);n.includes(v)||n.push(v);const y=l===void 0?void 0:S(r,{role:"model_request",format:Z(i.downstream.body.contentType),value:l,sourcePath:i.downstream.body.sourcePath,captureLevel:"provider_exact"}),f=I===void 0?void 0:S(r,{role:"model_response",format:Z(i.upstream.body.contentType),value:I,sourcePath:i.upstream.body.sourcePath,captureLevel:"provider_exact"}),T=l?le(l):void 0;T&&S(r,{role:"system_prompt",format:"json",value:T,sourcePath:i.downstream.body.sourcePath,captureLevel:"provider_exact"}),x(v.inputRefs,y),x(v.outputRefs,f),g&&!v.modelId&&(v.modelId=g),v.provider.nativeIds.exchangeId=i.exchangeId,_&&(v.provider.nativeIds.responseId=_),v.provider.rawAttributes={...v.provider.rawAttributes,rawApiExchange:{method:i.downstream.method,path:i.downstream.path,query:i.downstream.query,requestHeaders:i.downstream.redactedHeaders,responseStatus:i.upstream.statusCode,responseHeaders:i.upstream.redactedHeaders,requestSha256:i.downstream.body.sha256,responseSha256:i.upstream.body.sha256,requestBytes:i.downstream.body.bytes,responseBytes:i.upstream.body.bytes}},(!y||!f||i.errors.length>0)&&k(s,"codex_raw_api_capture_partial",`Raw API exchange ${i.exchangeId} is incomplete`,{exchangeId:i.exchangeId})}}function Ce(e,t,n){const r=new Map;let s=0;for(const u of e){if(!fe.has(u.method)||!b(u.params,t))continue;const a=m(u.params.turnId??u.params.turn_id)??t.providerTurnId,p=m(u.params.threadId??u.params.thread_id)??t.providerThreadId,d=m(u.params.responseId??u.params.response_id),o=X(u.params.usage,{sequence:A(u.sequence)??s,observedAt:O(u.observedAt),providerTurnId:a,threadId:p,responseId:d,nativeEventType:u.method,source:"provider_raw_body"},n);if(s+=1,!o)continue;const c=d?`response:${d}`:`anonymous:${o.sequence}:${o.usageKey}`,h=r.get(c);if(h&&!Q(h.usage,o.usage)){k(n,"codex_response_usage_conflict",`Response ${d??c} reported conflicting usage`,d?{responseId:d}:void 0);continue}h||r.set(c,o)}return[...r.values()].sort((u,a)=>u.sequence-a.sequence)}function ee(e,t,n,r){const s=X(e,n,r);if(!s)return;let u;try{const a=Y(t);a&&(u=[n.threadId??"unknown-thread",n.providerTurnId,J(a)].join("|"))}catch(a){if(a instanceof z)k(r,"codex_total_snapshot_invalid",a.message);else throw a}return{...s,providerUsageRaw:{last:e,total:t},usage:{...s.usage,providerUsageRaw:{last:e,total:t}},snapshotKey:u}}function Re(e,t,n){const r=[];for(const s of e){if(!me.has(s.method)||!b(s.params,t))continue;const u=w(s.params.tokenUsage??s.params.token_usage);if(!u){k(n,"codex_usage_missing",`${s.method} did not contain tokenUsage`);continue}const a=m(s.params.turnId??s.params.turn_id)??t.providerTurnId,p=m(s.params.threadId??s.params.thread_id)??t.providerThreadId,d=ee(u.last??u.last_token_usage,u.total??u.total_token_usage,{sequence:A(s.sequence)??r.length,observedAt:O(s.observedAt),providerTurnId:a,threadId:p,responseId:m(s.params.responseId??s.params.response_id),nativeEventType:s.method,source:"provider_event"},n);d&&r.push(d)}return r}function ke(e,t,n,r){const s=[];return e.forEach((u,a)=>{const p=w(u),d=w(p?.payload);if(p?.type!=="event_msg"||d?.type!=="token_count")return;const o=w(d.info);if(!o)return;const c=ee(o.last_token_usage??o.lastTokenUsage,o.total_token_usage??o.totalTokenUsage,{sequence:A(p?.sequence)??n+a,observedAt:O(p?.timestamp),providerTurnId:t.providerTurnId,threadId:t.providerThreadId,nativeEventType:"rollout/event_msg/token_count",source:"provider_transcript"},r);c&&s.push(c)}),s}function Ee(e){const t=new Set;return e.filter(n=>n.snapshotKey?t.has(n.snapshotKey)?!1:(t.add(n.snapshotKey),!0):!0)}function be(e,t){const n=new Set(e),r=new Set(t);for(const s of t){const u=e.find(a=>!n.has(a)||s.responseId&&a.responseId&&s.responseId!==a.responseId?!1:a.providerTurnId===s.providerTurnId&&Q(a.usage,s.usage));u&&(u.reconciledWithTokenSnapshot=!0,u.snapshotKey=s.snapshotKey,u.threadId??=s.threadId,u.providerUsageRaw={rawResponse:u.providerUsageRaw,tokenUsage:s.providerUsageRaw},u.usage={...u.usage,providerUsageRaw:u.providerUsageRaw},n.delete(u),r.delete(s))}return[...e,...t.filter(s=>r.has(s))].sort((s,u)=>s.sequence-u.sequence)}function $e(e){if(e.responseId)return e.responseId;const t=e.snapshotKey??[e.threadId??"unknown-thread",e.providerTurnId,e.sequence,e.usageKey].join("|");return`codex-usage-${R(t)}`}function Me(e,t,n){const r=$e(t),s={requestId:r,turnId:t.providerTurnId};t.threadId&&(s.threadId=t.threadId),t.responseId&&(s.responseId=t.responseId),t.snapshotKey&&(s.usageSnapshotId=R(t.snapshotKey));const u=t.observedAt??e.startedAt;return{spanId:`codex-llm-${R(`${e.traceId}|${r}`)}`,traceId:e.traceId,turnId:e.turnId,sessionId:e.sessionId,parentSpanId:`codex:${e.turnId}:turn`,kind:"llm_request",name:"codex response",sequence:t.sequence,status:"completed",startedAt:u,endedAt:u,...n?{modelId:n}:{},inputRefs:[],outputRefs:[],usage:t.usage,provider:{provider:"codex",nativeEventType:t.nativeEventType,nativeIds:s,rawAttributes:{usageSource:t.source,reconciledWithTokenSnapshot:t.reconciledWithTokenSnapshot}},provenance:{source:t.source,accuracy:"provider_reported"}}}function W(e,t){const n=A(e.params.completedAtMs);if(n!==void 0){const r=new Date(n);if(!Number.isNaN(r.getTime()))return r.toISOString()}return O(e.observedAt)??t.endedAt}function N(e,t){const n=A(e.params.startedAtMs);if(n!==void 0){const r=new Date(n);if(!Number.isNaN(r.getTime()))return r.toISOString()}return O(e.observedAt)??t}function te(e){const t=m(e.status)?.toLowerCase();return t==="inprogress"||t==="in_progress"||t==="running"?"running":t==="failed"||t==="declined"||t==="error"||A(e.exitCode)!==void 0&&A(e.exitCode)!==0?"failed":t==="cancelled"||t==="canceled"?"cancelled":"completed"}function ne(e){const t=m(e.type)??"tool";if(t==="mcpToolCall"){const n=m(e.server),r=m(e.tool);return[n,r].filter(Boolean).join("/")||t}return m(e.tool)??t}function re(e){switch(m(e.type)){case"commandExecution":return typeof e.command=="string"?{format:"text",value:String(e.command)}:void 0;case"fileChange":return Object.hasOwn(e,"changes")?{format:"json",value:C(e.changes)}:void 0;case"mcpToolCall":case"dynamicToolCall":return Object.hasOwn(e,"arguments")?{format:"json",value:C(e.arguments)}:void 0;case"webSearch":return typeof e.query=="string"?{format:"text",value:String(e.query)}:void 0;default:return{format:"json",value:C(e)}}}function Oe(e){switch(m(e.type)){case"commandExecution":return typeof e.aggregatedOutput=="string"?{format:"text",value:e.aggregatedOutput}:e.status!==void 0||e.exitCode!==void 0?{format:"json",value:C({status:e.status,exitCode:e.exitCode})}:void 0;case"fileChange":return{format:"json",value:C({status:e.status})};case"mcpToolCall":return Object.hasOwn(e,"result")?{format:"json",value:C(e.result)}:Object.hasOwn(e,"error")?{format:"json",value:C(e.error)}:void 0;case"dynamicToolCall":return Object.hasOwn(e,"contentItems")?{format:"json",value:C(e.contentItems)}:void 0;default:return{format:"json",value:C(e)}}}function Pe(e,t,n,r,s){if(!P(e).tools)return[];const u=new Set,a=[],p=new Map;for(const d of t){if(!H.has(d.method)||!b(d.params,n))continue;const o=w(d.params.item),c=m(o?.id);c&&p.set(c,d)}for(const d of t){if(!D.has(d.method)||!b(d.params,n))continue;const o=w(d.params.item),c=m(o?.type);if(!o||!c||!V.has(c))continue;const h=m(o.id)??`sequence-${d.sequence}`;if(u.has(h))continue;u.add(h);const i=W(d,e),l=p.get(h),I=A(o.durationMs),_=Date.parse(i),g=l?N(l,i):I!==void 0&&Number.isFinite(_)?new Date(Math.max(0,_-I)).toISOString():i,q=Date.parse(i)-Date.parse(g),v=Number.isFinite(q)&&q>0?q:I,y=[...r].filter($=>$.sequence<=d.sequence).sort(($,U)=>U.sequence-$.sequence)[0],f=[...r].filter($=>$.sequence>d.sequence).sort(($,U)=>$.sequence-U.sequence)[0],T=y??f,E={spanId:`codex-tool-${R(`${e.traceId}|${h}`)}`,traceId:e.traceId,turnId:e.turnId,sessionId:e.sessionId,parentSpanId:T?.spanId??`codex:${e.turnId}:turn`,kind:"tool_call",name:ne(o),sequence:d.sequence,status:te(o),startedAt:g,endedAt:i,...v!==void 0?{durationMs:Math.max(0,v)}:{},inputRefs:[],outputRefs:[],provider:{provider:"codex",nativeEventType:d.method,nativeIds:{toolCallId:h,turnId:n.providerTurnId,...n.providerThreadId?{threadId:n.providerThreadId}:{}},rawAttributes:{itemType:c,auditEventSequence:d.sequence,startEventSequence:l?.sequence,...m(o.cwd)?{cwd:o.cwd}:{},...A(o.exitCode)!==void 0?{exitCode:o.exitCode}:{}}},provenance:{source:"provider_event",accuracy:"provider_reported"}},B=re(o);B&&x(E.inputRefs,S(s,{role:"tool_arguments",...B,captureLevel:"provider_exact"}));const F=Oe(o);F&&x(E.outputRefs,S(s,{role:"tool_result",...F,captureLevel:"provider_exact"})),a.push(E)}for(const[d,o]of p){if(u.has(d))continue;const c=w(o.params.item),h=m(c?.type);if(!c||!h||!V.has(h))continue;const i=N(o,e.startedAt),l=[...r].filter(g=>g.sequence<=o.sequence).sort((g,q)=>q.sequence-g.sequence)[0]??r[0],I={spanId:`codex-tool-${R(`${e.traceId}|${d}`)}`,traceId:e.traceId,turnId:e.turnId,sessionId:e.sessionId,parentSpanId:l?.spanId??`codex:${e.turnId}:turn`,kind:"tool_call",name:ne(c),sequence:o.sequence,status:"running",startedAt:i,endedAt:e.endedAt,durationMs:Math.max(0,Date.parse(e.endedAt)-Date.parse(i)),inputRefs:[],outputRefs:[],provider:{provider:"codex",nativeEventType:o.method,nativeIds:{toolCallId:d,turnId:n.providerTurnId,...n.providerThreadId?{threadId:n.providerThreadId}:{}},rawAttributes:{itemType:h,auditEventSequence:o.sequence,hasCompletion:!1}},provenance:{source:"provider_event",accuracy:"provider_reported"}},_=re(c);_&&x(I.inputRefs,S(s,{role:"tool_arguments",..._,captureLevel:"provider_exact"})),a.push(I)}return a}function De(e,t,n,r,s){if(!P(e).subagents)return[];const u=[],a=new Set,p=new Map;for(const d of t){if(!H.has(d.method)||!b(d.params,n))continue;const o=w(d.params.item),c=m(o?.id);c&&p.set(c,d)}for(const d of t){if(!D.has(d.method)||!b(d.params,n))continue;const o=w(d.params.item),c=m(o?.type);if(!o||!c||!G.has(c))continue;const h=m(o.id)??`sequence-${d.sequence}`;if(a.has(h))continue;a.add(h);const i=[...r].filter(f=>f.sequence<=d.sequence).sort((f,T)=>T.sequence-f.sequence)[0],l=W(d,e),I=p.get(h),_=I?N(I,l):l,g=Date.parse(l)-Date.parse(_),q={spanId:`codex-subagent-${R(`${e.traceId}|${h}`)}`,traceId:e.traceId,turnId:e.turnId,sessionId:e.sessionId,parentSpanId:i?.spanId??`codex:${e.turnId}:turn`,kind:"subagent",name:m(o.tool)??c,sequence:d.sequence,status:te(o),startedAt:_,endedAt:l,...Number.isFinite(g)?{durationMs:Math.max(0,g)}:{},inputRefs:[],outputRefs:[],provider:{provider:"codex",nativeEventType:d.method,nativeIds:{subagentCallId:h,turnId:n.providerTurnId,...n.providerThreadId?{threadId:n.providerThreadId}:{},...m(o.senderThreadId)?{senderThreadId:String(o.senderThreadId)}:{}},rawAttributes:{itemType:c,auditEventSequence:d.sequence,startEventSequence:I?.sequence,receiverThreadIds:o.receiverThreadIds,agentsStates:o.agentsStates,model:o.model,reasoningEffort:o.reasoningEffort}},provenance:{source:"provider_event",accuracy:"provider_reported"}},v=m(o.prompt);v&&x(q.inputRefs,S(s,{role:"subagent_prompt",format:"text",value:v,captureLevel:"provider_exact"}));const y=o.result??o.agentsStates??o.status;y!==void 0&&x(q.outputRefs,S(s,{role:"subagent_result",format:typeof y=="string"?"text":"json",value:C(y),captureLevel:"provider_exact"})),u.push(q)}for(const[d,o]of p){if(a.has(d))continue;const c=w(o.params.item),h=m(c?.type);if(!c||!h||!G.has(h))continue;const i=N(o,e.startedAt),l=[...r].filter(g=>g.sequence<=o.sequence).sort((g,q)=>q.sequence-g.sequence)[0]??r[0],I={spanId:`codex-subagent-${R(`${e.traceId}|${d}`)}`,traceId:e.traceId,turnId:e.turnId,sessionId:e.sessionId,parentSpanId:l?.spanId??`codex:${e.turnId}:turn`,kind:"subagent",name:m(c.tool)??h,sequence:o.sequence,status:"running",startedAt:i,endedAt:e.endedAt,durationMs:Math.max(0,Date.parse(e.endedAt)-Date.parse(i)),inputRefs:[],outputRefs:[],provider:{provider:"codex",nativeEventType:o.method,nativeIds:{subagentCallId:d,turnId:n.providerTurnId,...n.providerThreadId?{threadId:n.providerThreadId}:{},...m(c.senderThreadId)?{senderThreadId:String(c.senderThreadId)}:{}},rawAttributes:{itemType:h,auditEventSequence:o.sequence,hasCompletion:!1,receiverThreadIds:c.receiverThreadIds,model:c.model,reasoningEffort:c.reasoningEffort}},provenance:{source:"provider_event",accuracy:"provider_reported"}},_=m(c.prompt);_&&x(I.inputRefs,S(s,{role:"subagent_prompt",format:"text",value:_,captureLevel:"provider_exact"})),u.push(I)}return u}function Ne(e,t,n,r,s){const u=[];for(const a of t){if(!b(a.params,n))continue;if(Ie.has(a.method)&&a.params.willRetry===!0){const c=O(a.observedAt)??e.endedAt,h=w(a.params.error);u.push({spanId:`codex-retry-${R(`${e.traceId}|${a.sequence}`)}`,traceId:e.traceId,turnId:e.turnId,sessionId:e.sessionId,parentSpanId:`codex:${e.turnId}:turn`,kind:"retry",name:m(h?.message)??"Codex request retry",sequence:a.sequence,status:"completed",startedAt:c,endedAt:c,durationMs:0,inputRefs:[],outputRefs:[],provider:{provider:"codex",nativeEventType:a.method,nativeIds:{turnId:n.providerTurnId,...n.providerThreadId?{threadId:n.providerThreadId}:{}},rawAttributes:{error:a.params.error,willRetry:!0}},provenance:{source:"provider_event",accuracy:"provider_reported"}});continue}const p=w(a.params.item),d=D.has(a.method)&&p?.type==="contextCompaction";if(!ve.has(a.method)&&!d)continue;const o=W(a,e);u.push({spanId:`codex-compaction-${R(`${e.traceId}|${a.sequence}`)}`,traceId:e.traceId,turnId:e.turnId,sessionId:e.sessionId,parentSpanId:`codex:${e.turnId}:turn`,kind:"compaction",name:"Codex context compaction",sequence:a.sequence,status:"completed",startedAt:o,endedAt:o,durationMs:0,inputRefs:[],outputRefs:[],provider:{provider:"codex",nativeEventType:a.method,nativeIds:{turnId:n.providerTurnId,...n.providerThreadId?{threadId:n.providerThreadId}:{},...m(p?.id)?{itemId:String(p?.id)}:{}},rawAttributes:p?{item:p}:{params:a.params}},provenance:{source:"provider_event",accuracy:"provider_reported"}})}if(P(e).rawProviderBody)for(const a of t){if(!he.has(a.method)||!b(a.params,n))continue;const p=S(s,{role:"model_response",format:"json",value:C(a.params.item),captureLevel:"provider_exact"}),d=[...r].filter(o=>o.sequence>=a.sequence).sort((o,c)=>o.sequence-c.sequence)[0]??r.at(-1);d&&x(d.outputRefs,p)}return u}function se(e){return typeof e.text=="string"&&e.text.length>0?e.text:Array.isArray(e.content)&&e.content.map(n=>{if(typeof n=="string")return n;const r=w(n);return m(r?.text)??""}).join("")||void 0}function Ue(e,t,n,r,s,u){const a=[...r].sort((l,I)=>l.sequence-I.sequence),p=t.filter(l=>D.has(l.method)&&b(l.params,n)&&w(l.params.item)).sort((l,I)=>l.sequence-I.sequence),d=P(e);let o=Number.NEGATIVE_INFINITY,c=1;const h=new Set;for(const[l,I]of a.entries()){const _=I.sequence,g=p.filter(v=>v.sequence>o&&v.sequence<=_);if(d.inputOutput)for(const v of g){const y=w(v.params.item),f=m(y.type);if(f!=="userMessage"&&f!=="agentMessage")continue;const T=se(y);if(!T)continue;const E=m(y.phase)?.trim().toLowerCase();f==="agentMessage"&&E&&E!=="final_answer"||x(f==="userMessage"?I.inputRefs:I.outputRefs,S(u,{role:f==="userMessage"?"user_input":"assistant_text",format:"text",value:T,captureLevel:"provider_exact"}))}if(d.thinking)for(const v of g){const y=w(v.params.item),f=m(y.type),T=m(y.phase)?.trim().toLowerCase();if(f!=="reasoning"&&!(f==="agentMessage"&&T&&T!=="final_answer"))continue;const E=se(y);E&&x(I.outputRefs,S(u,{role:"thinking",format:"text",value:E,captureLevel:"provider_exact"}))}d.inputOutput&&l===0&&I.inputRefs.length===0&&e.input&&x(I.inputRefs,L(e.input)),d.inputOutput&&l===a.length-1&&I.outputRefs.length===0&&e.finalOutput&&x(I.outputRefs,L(e.finalOutput)),I.sequence=c++;const q=s.filter(v=>{const y=A(v.provider.rawAttributes?.auditEventSequence);return y!==void 0&&y>o&&y<=_}).sort((v,y)=>A(v.provider.rawAttributes?.auditEventSequence)-A(y.provider.rawAttributes?.auditEventSequence));for(const v of q)v.sequence=c++,h.add(v.spanId);o=_}const i=s.filter(l=>!h.has(l.spanId)).sort((l,I)=>l.sequence-I.sequence);for(const l of i)l.sequence=c++;for(const l of s){if(l.outputRefs.length===0)continue;const I=a.findIndex(g=>g.spanId===l.parentSpanId),_=I>=0?a[I+1]:void 0;if(_)for(const g of l.outputRefs)x(_.inputRefs,g)}}class ze{provider="codex";async collect(t){const n=K(t.boundary.codexEvidence),r=w(t.boundary.codexEvidence);return r?.rawApiCapture!==void 0&&(n.rawApiCapture=await ie(r.rawApiCapture)),n}async normalize(t,n){const r=K(n),s=we(t),u=[],a=Ce(r.events,s,u),p=Re(r.events,s,u),d=ke(r.rolloutEntries??[],s,r.events.length+1,u),o=Ee([...p,...d]),h=be(a,o).map(g=>Me(t,g,r.modelId)),i=[],l=Pe(t,r.events,s,h,i),I=De(t,r.events,s,h,i),_=Ne(t,r.events,s,h,i);return Ue(t,r.events,s,h,l,i),Se(t,r.rawApiCapture,h,i,u),{spans:[...h,...l,...I,..._],contents:i,anomalies:u}}async correlate(t,n){return n}validate(t,n){const r=n.spans.filter(f=>f.kind==="llm_request"&&f.usage),s=n.anomalies.some(f=>f.code==="codex_usage_invalid"||f.code==="codex_total_snapshot_invalid"||f.code==="codex_response_usage_conflict"),u=r.length>0&&!s&&r.every(f=>f.usage?.completeness==="complete"),a=P(t),p=!a.inputOutput||!!t.input,d=n.contents.some(f=>f.role==="assistant_text"||f.role==="model_response"||f.role==="final_response"),o=!a.inputOutput||!!t.finalOutput||d,c=oe(n.spans,a.tools),h=c.complete,i=n.spans.filter(f=>f.kind==="subagent"),l=!a.subagents||i.every(f=>f.status!=="running"),I=n.contents.filter(f=>f.role==="model_request"&&f.value!==void 0).length,_=n.contents.filter(f=>f.role==="model_response"&&f.value!==void 0).length,g=n.anomalies.some(f=>f.code==="codex_raw_api_capture_unavailable"||f.code==="codex_raw_api_capture_partial"||f.code==="codex_raw_api_correlation_ambiguous"),q=!a.rawProviderBody||I>0&&_>=I&&!g,v=[];return r.length===0&&v.push({category:"usage",reason:"provider_usage_missing",detail:"No Codex leaf request usage was found for the provider turn"}),r.length>0&&!u&&v.push({category:"provider_usage_cache_partition",reason:"provider_usage_missing",detail:"Codex reported request totals, but one or more cache or reasoning partitions were absent"}),a.subagents&&!l&&v.push({category:"subagents",reason:"correlation_failed",detail:"One or more Codex collaboration items did not reach a terminal state"}),a.rawProviderBody&&(I===0?v.push({category:"raw_provider_body",reason:"raw_capture_disabled",detail:"Codex raw API capture did not produce a request body"}):q||v.push({category:"raw_provider_body",reason:"correlation_failed",detail:"One or more Codex raw API exchanges are incomplete"})),v.push(...c.gaps),{status:u&&p&&o&&h&&l&&q?"complete":"partial",inputComplete:p,outputComplete:o,toolCallsComplete:h,subagentsComplete:l,usageComplete:u,rawRequestsComplete:q,gaps:ae(v)}}async cleanup(t,n){const r=K(n).rawApiCapture;r&&await ue(r)}}export{ze as CodexAuditAdapter};
@@ -1,2 +1,2 @@
1
- import{closeSync as L,openSync as P,readSync as F}from"node:fs";import{referenceCaptureContent as z}from"../../core/content-reference.js";import{appendUniqueReference as C,assessToolCallCompleteness as B,deduplicateGaps as E}from"../../core/tool-call-audit.js";import{mapDshSessionEvent as U,unwrapDshSessionEvent as b}from"../../../adapter/deepseek-harness/event-mapper.js";import{normalizeDshUsage as H}from"../../../adapter/deepseek-harness/usage.js";const J=Object.freeze({inputOutput:!0,tools:!0,subagents:!0,thinking:!0,rawProviderBody:!1});function O(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function $(e){return e.options?.enabled===!0?e.options.capture:J}function q(e,t){return Number.isFinite(e)?new Date(e).toISOString():t}function D(e){if(typeof e=="string")return e;try{const t=JSON.stringify(e);return t===void 0?"null":t}catch{return String(e)}}function k(e,t){if(t.value!==void 0)return e.push(t),z(t)}class Z{provider="deepseek-harness";async collect(t){const u=String(t.boundary.wirePath??""),a=Number(t.boundary.wireStartOffset??0),r=Number(t.boundary.wireEndOffset??a);if(!u||!Number.isSafeInteger(a)||!Number.isSafeInteger(r)||r<a||r-a>32*1024*1024)return[];let o;try{o=P(u,"r")}catch{return[]}try{const d=Buffer.alloc(r-a),g=F(o,d,0,d.length,a);return d.subarray(0,g).toString("utf8").split(`
2
- `).flatMap(S=>{if(!S.trim())return[];try{return[JSON.parse(S)]}catch{return[]}})}finally{L(o)}}async normalize(t,u){const a=Array.isArray(u)?u:[],r=$(t),o=[],d=[],g=new Map,S=new Map,i=`deepseek-harness:${t.turnId}:turn`,h=[W(t,i)],v=h[0];let c=1,f,w;const x=String(t.boundary.rootSessionId??"");r.inputOutput&&t.input&&C(v.inputRefs,k(o,{...t.input,captureLevel:t.input.captureLevel??"runtime_exact"})),r.inputOutput&&t.finalOutput&&C(v.outputRefs,k(o,{...t.finalOutput,captureLevel:t.finalOutput.captureLevel??"runtime_exact"}));for(const p of a){const y=p.frame??{},A=String(y.method??"");if(p.direction==="out"&&A==="session/prompt"){if(r.inputOutput){const s=O(y.params)?y.params:{},I=(Array.isArray(s.contentBlocks)?s.contentBlocks:[]).map(_=>O(_)?_:{}).filter(_=>_.type==="text").map(_=>String(_.text??"")).join("");C(v.inputRefs,k(o,{role:"user_input",format:"text",value:I,captureLevel:"runtime_exact"}))}continue}if(p.direction!=="in")continue;if(A==="subagent.started"||A==="subagent.finished"){const s=O(y.params)?y.params:{},l=String(s.childSessionId??s.sessionId??c);h.push(R(t,i,c++,"subagent",A,p.at,{nativeId:l})),A==="subagent.finished"&&r.subagents&&s.lastAssistantMessage!==void 0&&k(o,{role:"subagent_result",format:"text",value:String(s.lastAssistantMessage),captureLevel:"runtime_exact"});continue}if(A==="session.status"){const s=O(y.params)?y.params:{};h.push(R(t,i,c++,"agent",`session.status:${String(s.status??"unknown")}`,p.at,{nativeId:String(s.sessionId??c)}));continue}if(A!=="session.event")continue;const m=b(y.params);if(!m)continue;if(m.type==="step/start"){const s=O(m.data)?m.data:{};p.at!==void 0&&S.set(`${String(m.sessionId??"")}:${String(s.turn??"")}:${String(s.step??"")}`,p.at);continue}const n=U(m),T=String(m.sessionId??""),M=!!T&&!!x&&T!==x,N=q(p.at,t.startedAt);if(n.kind==="thinking"){r.thinking&&n.text&&k(o,{role:"thinking",format:"text",value:n.text,captureLevel:"runtime_exact"});continue}if(n.kind==="context"){const s=String(n.payload?.provider??""),l=String(n.payload?.model??"");s&&(w=s),l&&(f=l);continue}if(n.kind!=="usage"){if(n.kind==="text"&&n.payload?.committed){if(r.inputOutput&&!M&&n.text?C(v.outputRefs,k(o,{role:"assistant_text",format:"text",value:n.text,captureLevel:"runtime_exact"})):r.subagents&&M&&n.text&&k(o,{role:"subagent_result",format:"text",value:n.text,captureLevel:"runtime_exact"}),n.usage){const s=O(m.data)?m.data:{},l=S.get(`${String(m.sessionId??"")}:${String(s.turn??"")}:${String(s.step??"")}`);h.push(G(t,i,c++,p.at,n.usage,Number(m.seq??c),f,w,l))}continue}if(n.kind==="tool_call"){const s=n.callId||String(c),l=n.name||"tool",I=R(t,i,c++,"tool_call",l,p.at,{nativeId:s,toolCallId:s});I.status="running",r.tools&&C(I.inputRefs,k(o,{role:"tool_arguments",format:typeof n.input=="string"?"text":"json",value:D(n.input??{}),captureLevel:"runtime_exact"})),g.set(s,{span:I}),h.push(I);continue}if(n.kind==="tool_result"){const s=n.callId||"",l=s?g.get(s):void 0;if(!l){d.push({code:"dsh_tool_result_without_call",message:`No tool/call found for ${s||`seq-${m.seq??c}`}`,providerIds:s?{toolCallId:s}:void 0});continue}l.span.status=n.isError?"failed":"completed",l.span.endedAt=N;const I=Date.parse(l.span.startedAt),_=Date.parse(N);Number.isFinite(I)&&Number.isFinite(_)&&(l.span.durationMs=Math.max(0,_-I)),r.tools&&C(l.span.outputRefs,k(o,{role:"tool_result",format:typeof n.output=="string"?"text":"json",value:D(n.output??""),captureLevel:"runtime_exact"}));continue}if(n.kind==="compaction"){h.push(R(t,i,c++,"compaction",String(n.payload?.eventType??m.type),p.at,{nativeId:String(m.seq??c)}));continue}(n.kind==="todo"||n.kind==="turn_end")&&h.push(R(t,i,c++,"agent",n.kind==="todo"?"todo/write":`turn/end:${n.reason??"completed"}`,p.at,{nativeId:String(m.seq??c)}))}}for(const[p,y]of g)y.span.status==="running"&&d.push({code:"dsh_tool_result_missing",message:`Tool call ${p} has no result`,spanId:y.span.spanId,providerIds:{toolCallId:p}});return{spans:h,contents:o,anomalies:d,capture:r,recordCount:a.length}}async correlate(t,u){return u}validate(t,u){const a=u,r=a.capture??$(t),o=a.spans.filter(f=>f.kind==="llm_request"),d=a.spans.filter(f=>f.kind==="tool_call"),g=!r.inputOutput||!!t.input||a.contents.some(f=>f.role==="user_input"),S=!r.inputOutput||!!t.finalOutput||a.contents.some(f=>f.role==="assistant_text"),i=B(d,r.tools),h=o.length>0&&o.every(f=>f.usage?.completeness==="complete"),v=E([...i.gaps]);r.rawProviderBody&&v.push({category:"raw_provider_body",reason:"raw_capture_disabled",detail:"Harness JSON-RPC does not expose provider HTTP raw bodies"});const c=g&&S&&i.complete&&h&&!r.rawProviderBody&&v.length===0;return{status:a.recordCount===0?"metadata_only":c?"complete":"partial",inputComplete:g,outputComplete:S,toolCallsComplete:i.complete,subagentsComplete:!0,usageComplete:h,rawRequestsComplete:!1,gaps:v}}}function W(e,t){const u=Date.parse(e.startedAt),a=Date.parse(e.endedAt);return{spanId:t,traceId:e.traceId,turnId:e.turnId,sessionId:e.sessionId,kind:"turn",name:"DeepSeek Harness turn",sequence:0,status:e.outcome==="completed"?"completed":e.outcome==="cancelled"?"cancelled":"failed",startedAt:e.startedAt,endedAt:e.endedAt,inputRefs:[],outputRefs:[],...Number.isFinite(u)&&Number.isFinite(a)&&a>=u?{durationMs:a-u}:{},provider:{provider:"deepseek-harness",nativeIds:{runtimeSessionId:String(e.boundary.runtimeSessionId??""),messageId:String(e.boundary.messageId??"")}},provenance:{source:"provider_event",accuracy:"runtime_exact"}}}function R(e,t,u,a,r,o,d){const g=q(o,e.startedAt);return{spanId:`deepseek-harness:${e.turnId}:${u}`,traceId:e.traceId,turnId:e.turnId,sessionId:e.sessionId,parentSpanId:t,kind:a,name:r,sequence:u,status:"completed",startedAt:g,endedAt:g,inputRefs:[],outputRefs:[],provider:{provider:"deepseek-harness",nativeEventType:r,nativeIds:d},provenance:{source:"provider_event",accuracy:"runtime_exact"}}}function G(e,t,u,a,r,o,d,g,S){const i=H(r),h=i.inputTokens,v=i.cacheReadInputTokens,c=i.cacheCreationInputTokens,f=h+v+c,w={input:{total:f,uncached:h,cacheRead:v,cacheWrite:c,other:0},output:{total:i.outputTokens,reasoning:i.reasoningTokens,visible:Math.max(0,i.outputTokens-i.reasoningTokens)},totalProcessed:f+i.outputTokens,requestCount:1,accuracy:"provider_reported",completeness:"complete",provider:"deepseek-harness",providerUsageRaw:r,normalization:{adapter:"deepseek-harness-jsonrpc",version:2,formula:"uncached input + cacheRead + cacheWrite + output"}},x={...R(e,t,u,"llm_request","assistant/message",a,{nativeId:String(o),requestId:String(o),...d?{model:d}:{},...g?{providerId:g}:{}}),...d?{modelId:d}:{},usage:w};if(S!==void 0){const p=Date.parse(x.endedAt??"");Number.isFinite(p)&&(x.startedAt=new Date(S).toISOString(),x.durationMs=Math.max(0,p-S))}return x}export{Z as DeepSeekHarnessAuditAdapter};
1
+ import{closeSync as L,openSync as P,readSync as F}from"node:fs";import{referenceCaptureContent as z}from"../../core/content-reference.js";import{appendUniqueReference as C,assessToolCallCompleteness as B,deduplicateGaps as E}from"../../core/tool-call-audit.js";import{mapDshSessionEvent as U,unwrapDshSessionEvent as b}from"../../../adapter/deepseek-harness/event-mapper.js";import{normalizeDshUsage as H}from"../../../adapter/deepseek-harness/usage.js";const J=Object.freeze({inputOutput:!0,tools:!0,subagents:!0,thinking:!0,rawProviderBody:!1});function O(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function $(e){return e.options?.enabled===!0?e.options.capture:J}function q(e,t){return Number.isFinite(e)?new Date(e).toISOString():t}function D(e){if(typeof e=="string")return e;try{const t=JSON.stringify(e);return t===void 0?"null":t}catch{return String(e)}}function _(e,t){if(t.value!==void 0)return e.push(t),z(t)}class Z{provider="deepseek-harness";async collect(t){const u=String(t.boundary.wirePath??""),a=Number(t.boundary.wireStartOffset??0),s=Number(t.boundary.wireEndOffset??a);if(!u||!Number.isSafeInteger(a)||!Number.isSafeInteger(s)||s<a||s-a>32*1024*1024)return[];let o;try{o=P(u,"r")}catch{return[]}try{const l=Buffer.alloc(s-a),g=F(o,l,0,l.length,a);return l.subarray(0,g).toString("utf8").split(`
2
+ `).flatMap(v=>{if(!v.trim())return[];try{return[JSON.parse(v)]}catch{return[]}})}finally{L(o)}}async normalize(t,u){const a=Array.isArray(u)?u:[],s=$(t),o=[],l=[],g=new Map,v=new Map,i=`deepseek-harness:${t.turnId}:turn`,h=[W(t,i)],S=h[0];let c=1,f,R;const x=String(t.boundary.rootSessionId??"");s.inputOutput&&t.input&&C(S.inputRefs,_(o,{...t.input,captureLevel:t.input.captureLevel??"runtime_exact"})),s.inputOutput&&t.finalOutput&&C(S.outputRefs,_(o,{...t.finalOutput,captureLevel:t.finalOutput.captureLevel??"runtime_exact"}));for(const p of a){const y=p.frame??{},A=String(y.method??"");if(p.direction==="out"&&A==="session/prompt"){if(s.inputOutput){const r=O(y.params)?y.params:{},I=(Array.isArray(r.contentBlocks)?r.contentBlocks:[]).map(k=>O(k)?k:{}).filter(k=>k.type==="text").map(k=>String(k.text??"")).join("");C(S.inputRefs,_(o,{role:"user_input",format:"text",value:I,captureLevel:"runtime_exact"}))}continue}if(p.direction!=="in")continue;if(A==="subagent.started"||A==="subagent.finished"){const r=O(y.params)?y.params:{},d=String(r.childSessionId??r.sessionId??c);h.push(T(t,i,c++,"subagent",A,p.at,{nativeId:d})),A==="subagent.finished"&&s.subagents&&r.lastAssistantMessage!==void 0&&_(o,{role:"subagent_result",format:"text",value:String(r.lastAssistantMessage),captureLevel:"runtime_exact"});continue}if(A==="session.status"){const r=O(y.params)?y.params:{};h.push(T(t,i,c++,"agent",`session.status:${String(r.status??"unknown")}`,p.at,{nativeId:String(r.sessionId??c)}));continue}if(A!=="session.event")continue;const m=b(y.params);if(!m)continue;if(m.type==="step/start"){const r=O(m.data)?m.data:{};p.at!==void 0&&v.set(`${String(m.sessionId??"")}:${String(r.turn??"")}:${String(r.step??"")}`,p.at);continue}const n=U(m),w=String(m.sessionId??""),M=!!w&&!!x&&w!==x,N=q(p.at,t.startedAt);if(n.kind==="thinking"){s.thinking&&n.text&&_(o,{role:"thinking",format:"text",value:n.text,captureLevel:"runtime_exact"});continue}if(n.kind==="context"){const r=String(n.payload?.provider??""),d=String(n.payload?.model??"");r&&(R=r),d&&(f=d);continue}if(n.kind!=="usage"){if(n.kind==="text"&&n.payload?.committed){if(n.payload.hasToolCall===!0&&s.thinking&&n.text?_(o,{role:"thinking",format:"text",value:n.text,captureLevel:"runtime_exact"}):s.inputOutput&&!M&&n.text?C(S.outputRefs,_(o,{role:"assistant_text",format:"text",value:n.text,captureLevel:"runtime_exact"})):s.subagents&&M&&n.text&&_(o,{role:"subagent_result",format:"text",value:n.text,captureLevel:"runtime_exact"}),n.usage){const d=O(m.data)?m.data:{},I=v.get(`${String(m.sessionId??"")}:${String(d.turn??"")}:${String(d.step??"")}`);h.push(G(t,i,c++,p.at,n.usage,Number(m.seq??c),f,R,I))}continue}if(n.kind==="tool_call"){const r=n.callId||String(c),d=n.name||"tool",I=T(t,i,c++,"tool_call",d,p.at,{nativeId:r,toolCallId:r});I.status="running",s.tools&&C(I.inputRefs,_(o,{role:"tool_arguments",format:typeof n.input=="string"?"text":"json",value:D(n.input??{}),captureLevel:"runtime_exact"})),g.set(r,{span:I}),h.push(I);continue}if(n.kind==="tool_result"){const r=n.callId||"",d=r?g.get(r):void 0;if(!d){l.push({code:"dsh_tool_result_without_call",message:`No tool/call found for ${r||`seq-${m.seq??c}`}`,providerIds:r?{toolCallId:r}:void 0});continue}d.span.status=n.isError?"failed":"completed",d.span.endedAt=N;const I=Date.parse(d.span.startedAt),k=Date.parse(N);Number.isFinite(I)&&Number.isFinite(k)&&(d.span.durationMs=Math.max(0,k-I)),s.tools&&C(d.span.outputRefs,_(o,{role:"tool_result",format:typeof n.output=="string"?"text":"json",value:D(n.output??""),captureLevel:"runtime_exact"}));continue}if(n.kind==="compaction"){h.push(T(t,i,c++,"compaction",String(n.payload?.eventType??m.type),p.at,{nativeId:String(m.seq??c)}));continue}(n.kind==="todo"||n.kind==="turn_end")&&h.push(T(t,i,c++,"agent",n.kind==="todo"?"todo/write":`turn/end:${n.reason??"completed"}`,p.at,{nativeId:String(m.seq??c)}))}}for(const[p,y]of g)y.span.status==="running"&&l.push({code:"dsh_tool_result_missing",message:`Tool call ${p} has no result`,spanId:y.span.spanId,providerIds:{toolCallId:p}});return{spans:h,contents:o,anomalies:l,capture:s,recordCount:a.length}}async correlate(t,u){return u}validate(t,u){const a=u,s=a.capture??$(t),o=a.spans.filter(f=>f.kind==="llm_request"),l=a.spans.filter(f=>f.kind==="tool_call"),g=!s.inputOutput||!!t.input||a.contents.some(f=>f.role==="user_input"),v=!s.inputOutput||!!t.finalOutput||a.contents.some(f=>f.role==="assistant_text"),i=B(l,s.tools),h=o.length>0&&o.every(f=>f.usage?.completeness==="complete"),S=E([...i.gaps]);s.rawProviderBody&&S.push({category:"raw_provider_body",reason:"raw_capture_disabled",detail:"Harness JSON-RPC does not expose provider HTTP raw bodies"});const c=g&&v&&i.complete&&h&&!s.rawProviderBody&&S.length===0;return{status:a.recordCount===0?"metadata_only":c?"complete":"partial",inputComplete:g,outputComplete:v,toolCallsComplete:i.complete,subagentsComplete:!0,usageComplete:h,rawRequestsComplete:!1,gaps:S}}}function W(e,t){const u=Date.parse(e.startedAt),a=Date.parse(e.endedAt);return{spanId:t,traceId:e.traceId,turnId:e.turnId,sessionId:e.sessionId,kind:"turn",name:"DeepSeek Harness turn",sequence:0,status:e.outcome==="completed"?"completed":e.outcome==="cancelled"?"cancelled":"failed",startedAt:e.startedAt,endedAt:e.endedAt,inputRefs:[],outputRefs:[],...Number.isFinite(u)&&Number.isFinite(a)&&a>=u?{durationMs:a-u}:{},provider:{provider:"deepseek-harness",nativeIds:{runtimeSessionId:String(e.boundary.runtimeSessionId??""),messageId:String(e.boundary.messageId??"")}},provenance:{source:"provider_event",accuracy:"runtime_exact"}}}function T(e,t,u,a,s,o,l){const g=q(o,e.startedAt);return{spanId:`deepseek-harness:${e.turnId}:${u}`,traceId:e.traceId,turnId:e.turnId,sessionId:e.sessionId,parentSpanId:t,kind:a,name:s,sequence:u,status:"completed",startedAt:g,endedAt:g,inputRefs:[],outputRefs:[],provider:{provider:"deepseek-harness",nativeEventType:s,nativeIds:l},provenance:{source:"provider_event",accuracy:"runtime_exact"}}}function G(e,t,u,a,s,o,l,g,v){const i=H(s),h=i.inputTokens,S=i.cacheReadInputTokens,c=i.cacheCreationInputTokens,f=h+S+c,R={input:{total:f,uncached:h,cacheRead:S,cacheWrite:c,other:0},output:{total:i.outputTokens,reasoning:i.reasoningTokens,visible:Math.max(0,i.outputTokens-i.reasoningTokens)},totalProcessed:f+i.outputTokens,requestCount:1,accuracy:"provider_reported",completeness:"complete",provider:"deepseek-harness",providerUsageRaw:s,normalization:{adapter:"deepseek-harness-jsonrpc",version:2,formula:"uncached input + cacheRead + cacheWrite + output"}},x={...T(e,t,u,"llm_request","assistant/message",a,{nativeId:String(o),requestId:String(o),...l?{model:l}:{},...g?{providerId:g}:{}}),...l?{modelId:l}:{},usage:R};if(v!==void 0){const p=Date.parse(x.endedAt??"");Number.isFinite(p)&&(x.startedAt=new Date(v).toISOString(),x.durationMs=Math.max(0,p-v))}return x}export{Z as DeepSeekHarnessAuditAdapter};