@lensmcp/protocol-types 1.25.36 → 1.25.37
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/lib/ai-call-groups.js +2 -2
- package/lib/ai-call-row.js +3 -3
- package/lib/ai-call.js +9 -9
- package/lib/ai-context.js +6 -6
- package/lib/ai-origins.js +9 -9
- package/lib/bounded-clone.js +1 -1
- package/lib/bounded-map.js +1 -1
- package/lib/bounded-writer.js +1 -1
- package/lib/capture-demand.js +1 -1
- package/lib/error-dismissal.js +1 -1
- package/lib/event-loop.js +1 -1
- package/lib/flood-guard.js +1 -1
- package/lib/log-query.js +1 -1
- package/lib/perf-rules.js +1 -1
- package/lib/pod-memory.js +1 -1
- package/lib/producer-health.js +1 -1
- package/lib/sources.js +1 -1
- package/lib/team.d.ts +170 -1
- package/package.json +1 -1
package/lib/ai-call-groups.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`).toLowerCase();return
|
|
1
|
+
"use strict";var m=Object.defineProperty;var i=(e,t)=>m(e,"name",{value:t,configurable:!0});var d=Object.defineProperty,l=i((e,t)=>d(e,"name",{value:t,configurable:!0}),"i"),p=Object.defineProperty,u=l((e,t)=>p(e,"name",{value:t,configurable:!0}),"i");export function aiTotalsOf(e){const t={calls:e.length,runs:new Set(e.map(a=>a.run.key)).size,failed:0,input:0,cached:0,written:0,output:0,split:{},costUsd:0,priced:0,first:1/0,last:0,models:[]},r=new Map;for(const a of e){a.failed&&t.failed++,t.input+=a.tokens?.input??0,t.cached+=a.tokens?.cached??0,t.written+=a.tokens?.written??0,t.output+=a.tokens?.output??0;for(const[n,o]of Object.entries(a.split??{}))t.split[n]=(t.split[n]??0)+o;a.costUsd!==void 0&&(t.costUsd+=a.costUsd,t.priced++),t.first=Math.min(t.first,a.at),t.last=Math.max(t.last,a.at),a.model&&r.set(a.model,(r.get(a.model)??0)+1)}return t.models=[...r].sort((a,n)=>n[1]-a[1]).map(([a])=>a),e.length||(t.first=0),t}i(aiTotalsOf,"aiTotalsOf"),l(aiTotalsOf,"aiTotalsOf"),u(aiTotalsOf,"aiTotalsOf");export function aiRunsOf(e,t=!1){const r=new Map;for(const a of e){const n=r.get(a.run.key);n?n.push(a):r.set(a.run.key,[a])}return[...r.entries()].map(([a,n])=>{n.sort((s,c)=>(s.step??0)-(c.step??0)||s.at-c.at);const o=aiTotalsOf(n);return{key:a,from:n[0].run.from,calls:n,at:o.first,last:o.last,totals:o}}).sort((a,n)=>t?a.at-n.at:n.last-a.last)}i(aiRunsOf,"aiRunsOf"),l(aiRunsOf,"aiRunsOf"),u(aiRunsOf,"aiRunsOf");const k="(none)";function f(e,t){if(t==="agent")return e.agent;if(t==="action")return e.action??{key:"action:",name:"(no action)"};if(t==="run")return{key:e.run.key,name:e.agent.name};if(t==="thread")return e.thread?{key:e.thread.key,name:`thread ${e.thread.name}`}:{key:"thread:",name:"(no thread)"};if(t==="flow")return e.flowId?{key:`flow:${e.flowId}`,name:e.flowId}:e.requestId?{key:`request:${e.requestId}`,name:`request ${e.requestId}`}:{key:"flow:",name:"(no flow)"};if(t==="model")return{key:`model:${e.model??""}`,name:e.model??"(unknown model)"};if(t==="service")return{key:`service:${e.service}`,name:e.service};const r=t.slice(5),a=e.meta?.[r];return{key:`${t}=${a??""}`,name:a??k}}i(f,"f"),l(f,"m"),u(f,"keyOf");export function groupAiCalls(e,t,r){const a=new Map;for(const o of e){const s=f(o,t),c=a.get(s.key);c?c.rows.push(o):a.set(s.key,{...s,rows:[o]})}const n=t==="agent"||t==="action";return[...a.values()].map(o=>({key:o.key,name:o.name,...o.from?{from:o.from}:{},nameable:n&&/^(agent|action):./.test(o.key),merged:r?Object.entries(r.merge).filter(([,s])=>s===o.key).map(([s])=>s).sort():[],runs:aiRunsOf(o.rows,t==="flow"),totals:aiTotalsOf(o.rows)})).sort((o,s)=>s.totals.last-o.totals.last||o.name.localeCompare(s.name))}i(groupAiCalls,"groupAiCalls"),l(groupAiCalls,"groupAiCalls"),u(groupAiCalls,"groupAiCalls");export function matchesAi(e,t){const r=t.toLowerCase().split(/\s+/).filter(Boolean);if(!r.length)return!0;const a=[e.id,e.agent.name,e.action?.name,e.model,e.service,e.flowId,e.requestId,e.schema,e.asked,e.said,...e.called??[],...Object.entries(e.meta??{}).map(([n,o])=>`${n}:${o}`)].filter(Boolean).join(`
|
|
2
|
+
`).toLowerCase();return r.every(n=>a.includes(n))}i(matchesAi,"matchesAi"),l(matchesAi,"matchesAi"),u(matchesAi,"matchesAi");
|
package/lib/ai-call-row.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`).map(t=>t.trim()).find(Boolean)??"",n=/^#{1,6}\s+(.+)$/.exec(
|
|
3
|
-
`).map(r=>r.trim()).find(Boolean);if(!
|
|
1
|
+
"use strict";var B=Object.defineProperty;var u=(e,o)=>B(e,"name",{value:o,configurable:!0});var S=Object.defineProperty,p=u((e,o)=>S(e,"name",{value:o,configurable:!0}),"u"),T=Object.defineProperty,l=p((e,o)=>T(e,"name",{value:o,configurable:!0}),"d");import{aiCallOf as z}from"./ai-call.js";import{aiContextOf as E,aiSplitOf as K}from"./ai-context.js";export const EMPTY_AI_NAMES={version:1,names:{},merge:{}};export function aiModelUses(e,o){const n=o.toLowerCase(),r=new Map;for(const t of e){if(t.host.toLowerCase()!==n)continue;const s=t.model??"unknown";let a=r.get(s);a||(a={use:{model:s,calls:0,failed:0,unmetered:0,input:0,cached:0,output:0,costUsd:0,priced:0,agents:0,first:t.at,last:t.at},agents:new Set},r.set(s,a));const i=a.use;i.calls+=1,t.failed&&(i.failed+=1),t.tokens?(i.input+=t.tokens.input??0,i.cached+=t.tokens.cached??0,i.output+=t.tokens.output??0):i.unmetered+=1,t.costUsd!==void 0&&(i.costUsd+=t.costUsd,i.priced+=1),a.agents.add(t.agent.key),i.first=Math.min(i.first,t.at),i.last=Math.max(i.last,t.at)}return[...r.values()].map(({use:t,agents:s})=>({...t,agents:s.size})).sort((t,s)=>s.calls-t.calls||s.last-t.last)}u(aiModelUses,"aiModelUses"),p(aiModelUses,"aiModelUses"),l(aiModelUses,"aiModelUses");export function aiAgentUses(e,o){const n=o?.toLowerCase(),r=new Map;for(const t of e){if(n!==void 0&&t.host.toLowerCase()!==n)continue;let s=r.get(t.agent.key);s||(s={use:{key:t.agent.key,name:t.agent.name,from:t.agent.from,calls:0,runs:0,failed:0,input:0,cached:0,written:0,output:0,costUsd:0,priced:0,split:{},models:[],last:t.at},runs:new Set,models:new Map},r.set(t.agent.key,s));const a=s.use;a.calls+=1,s.runs.add(t.run.key),t.failed&&(a.failed+=1),a.input+=t.tokens?.input??0,a.cached+=t.tokens?.cached??0,a.written+=t.tokens?.written??0,a.output+=t.tokens?.output??0,t.costUsd!==void 0&&(a.costUsd+=t.costUsd,a.priced+=1);for(const[i,d]of Object.entries(t.split??{}))a.split[i]=(a.split[i]??0)+d;t.model&&s.models.set(t.model,(s.models.get(t.model)??0)+1),a.last=Math.max(a.last,t.at)}return[...r.values()].map(({use:t,runs:s,models:a})=>({...t,runs:s.size,models:[...a].sort((i,d)=>d[1]-i[1]).map(([i])=>i)})).sort((t,s)=>s.input-t.input||s.calls-t.calls)}u(aiAgentUses,"aiAgentUses"),p(aiAgentUses,"aiAgentUses"),l(aiAgentUses,"aiAgentUses");export const MAX_TOOLS=40,MAX_THREAD_CALLS=300,MAX_META=24;const q=160,_="unknown service";export const aiKeyOf=l((e,o)=>`${e}:${o.normalize("NFKD").toLowerCase().replace(/[^a-z0-9:.]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"unnamed"}`,"aiKeyOf");export function humanName(e){const o=e.trim();if(/[A-Z]/.test(o)||/ /.test(o))return o;const n=o.replace(/[-_.]+/g," ").trim();return n?n[0].toUpperCase()+n.slice(1):o}u(humanName,"humanName"),p(humanName,"humanName"),l(humanName,"humanName");const g=l((e,o=q)=>{if(!e)return;const n=e.replace(/\s+/g," ").trim();if(n)return n.length>o?`${n.slice(0,o-1)}\u2026`:n},"line");export function promptTitle(e){const o=e.split(`
|
|
2
|
+
`).map(t=>t.trim()).find(Boolean)??"",n=/^#{1,6}\s+(.+)$/.exec(o);if(n){const t=n[1].split(/\s+[—–]\s+|\s+-\s+|:\s/)[0].replace(/[*_`]/g,"").trim();return t?t.slice(0,60):void 0}const r=/^you are (?:an? |the )?(.+?)(?:[.,;:!]|\s+(?:who|that|which|for|in|on|whose|with|and|following|using|working|based|at|to)\b|$)/i.exec(o);if(r){const t=r[1].trim().split(/\s+/);if(t.length>6||/^(?:going|about|given|now|here|responsible|able|allowed|expected|tasked|asked|helping|working|being|not)$/i.test(t[0]))return;const s=t.join(" ");return s[0].toUpperCase()+s.slice(1)}}u(promptTitle,"promptTitle"),p(promptTitle,"promptTitle"),l(promptTitle,"promptTitle");export function promptOpening(e){const o=e.split(`
|
|
3
|
+
`).map(r=>r.trim()).find(Boolean);if(!o)return;const n=o.replace(/^[#>*\s-]+/,"").split(/\s+/).filter(Boolean);if(!(n.length<3))return n.length>7?`${n.slice(0,7).join(" ")} \u2026`:n.join(" ")}u(promptOpening,"promptOpening"),p(promptOpening,"promptOpening"),l(promptOpening,"promptOpening");export function actionName(e){const o=e.split("::")[0],n=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|[0-9a-f]{8,}|\d{4,})$/i;return o.split(":").map(r=>r.split(".").filter(t=>!n.test(t)).join(".")).filter((r,t,s)=>r||t<s.length-1).join(":").slice(0,120)}u(actionName,"actionName"),p(actionName,"actionName"),l(actionName,"actionName");const h=l((e,o)=>{const n=e.request.headers.find(([r])=>r.toLowerCase()===o)?.[1];if(n===void 0||!o.startsWith("x-lensmcp-")||!n.includes("%"))return n;try{return decodeURIComponent(n)}catch{return n}},"header"),R=l(e=>e!==void 0&&/^\d{1,6}$/.test(e.trim())?Number(e.trim()):void 0,"intOf"),k=l((e,...o)=>{for(const n of o)if(e[n]?.trim())return e[n].trim()},"first");function x(e){const o={};for(const n of e.settings)if(n.name.startsWith("metadata.")){if(Object.keys(o).length>=MAX_META)break;o[n.name.slice(9)]=n.value.slice(0,200)}return o}u(x,"j"),p(x,"S"),l(x,"metaOf");function $(e,o,n){const r=l((f,w)=>({key:aiKeyOf("agent",f),name:humanName(f),from:w}),"named"),t=k(n,"agent","agent_name","agentName","assistant");if(t)return r(t,"metadata");const s=h(e,"x-lensmcp-agent");if(s?.trim())return r(s.trim(),"header");const a=o.system.map(f=>promptTitle(f.text)).find(Boolean);if(a)return r(a,"prompt");const i=o.answer.format?.name;if(i)return r(i,"schema");const d=[...o.tools,...o.answer.toolCalls].map(f=>f.server).find(Boolean);if(d)return r(d,"tools");const c=o.system.map(f=>promptOpening(f.text)).find(Boolean);return c?{key:aiKeyOf("agent",`prompt ${c.replace(/ …$/,"")}`),name:c,from:"prompt"}:r(`${e.service??_} ${o.api==="embeddings"?"embeddings":o.model??o.api}`,"service")}u($,"U"),p($,"B"),l($,"agentOf");function O(e,o,n){const r=l((a,i)=>({key:aiKeyOf("action",a),name:a,from:i}),"named"),t=k(n,"act","action","task","step","operation");if(t&&actionName(t))return r(actionName(t),"metadata");const s=h(e,"x-lensmcp-action");if(s?.trim())return r(actionName(s.trim()),"header");if(o.answer.format?.name)return r(o.answer.format.name,"schema")}u(O,"_"),p(O,"E"),l(O,"actionOf");function I(e){if(e.kind==="message")return g(e.text);if(e.kind==="tool")return g(e.output!==void 0?`${e.tool} \u2192 ${e.output}`:`${e.tool}(${e.arguments})`)}u(I,"N"),p(I,"z"),l(I,"turnLine");function y(e){const o=e.answer;return o.error?g(`error: ${o.error}`):o.refusal?g(`refused: ${o.refusal}`):o.toolCalls.length?g(o.toolCalls.map(n=>`${n.tool}(${n.arguments})`).join(" \xB7 ")):e.embedding?`${e.embedding.vectors??e.embedding.count} vector${(e.embedding.vectors??e.embedding.count)===1?"":"s"}${e.embedding.dimensions?` \xD7 ${e.embedding.dimensions}`:""}`:g(o.text)}u(y,"v"),p(y,"A"),l(y,"saidLine");export function aiCallRow(e,o){const n=z(e);if(!n||!e.ai)return;const r=x(n),t=new Map(n.settings.map(m=>[m.name,m.value])),s=k(r,"run","run_id","runId"),a=h(e,"x-lensmcp-run")?.trim(),i=n.turns.filter(m=>m.kind==="tool").filter(m=>m.output!==void 0&&m.callId).map(m=>m.callId),d=n.answer.toolCalls.map(m=>m.callId).filter(m=>!!m),c=n.usage,f=c?{...c.input!==void 0?{input:c.input}:{},...c.cached?{cached:c.cached}:{},...c.written?{written:c.written}:{},...c.output!==void 0?{output:c.output}:{},...c.reasoning?{reasoning:c.reasoning}:{}}:void 0,w=n.shape==="embedding"||c?.input===void 0?{}:K(E(n,{sections:!1})),v=k(r,"thread","thread_id","threadId","conversation","conversation_id","conversationId","case","case_id","caseId"),b=h(e,"x-lensmcp-thread")?.trim(),M=k(r,"parent_run","parentRun","parent")??h(e,"x-lensmcp-parent")?.trim(),A=O(e,n,r),C=R(r.round),j=R(r.attempt),U=t.get("continues response"),N=[...n.turns].reverse().map(I).find(Boolean),L=n.answer.status==="failed"||!!n.answer.error||(e.status??0)>=400||!!e.error;return{id:e.id,at:e.startedAt,...e.durationMs!==void 0?{durationMs:e.durationMs}:{},...e.status!==void 0?{status:e.status}:{},...L?{failed:!0}:{},service:e.service??_,...e.flowId?{flowId:e.flowId}:{},...e.requestId?{requestId:e.requestId}:{},provider:e.ai.provider,host:e.host,api:n.api,shape:n.shape,...n.model?{model:n.model}:{},...e.response.stream?{streamed:!0}:{},...f&&Object.keys(f).length?{tokens:f}:{},...Object.keys(w).length?{split:w}:{},agent:$(e,n,r),run:s?{key:`run:${s}`,from:"metadata"}:a?{key:`run:${a}`,from:"header"}:{key:`run:${e.id}`,from:"alone"},...v?{thread:{key:`thread:${v}`,name:v,from:"metadata"}}:b?{thread:{key:`thread:${b}`,name:b,from:"header"}}:{},...M?{parent:`run:${M}`}:{},...C!==void 0?{round:C}:{},...j!==void 0?{attempt:j}:{},...A?{action:A}:{},...n.answer.format?.name?{schema:n.answer.format.name}:{},...n.tools.length?{tools:n.tools.slice(0,MAX_TOOLS).map(m=>m.name)}:{},...n.answer.toolCalls.length?{called:n.answer.toolCalls.map(m=>m.name)}:{},...d.length?{callIds:d}:{},...i.length?{answers:i}:{},...n.responseId?{responseId:n.responseId}:{},...U?{previousResponseId:U}:{},...Object.keys(r).length?{meta:r}:{},...n.gaps.some(m=>/kept to its first|cut/.test(m))?{cut:!0}:{},...o.content&&N?{asked:N}:{},...o.content&&y(n)?{said:y(n)}:{}}}u(aiCallRow,"aiCallRow"),p(aiCallRow,"aiCallRow"),l(aiCallRow,"aiCallRow");export function linkAiRuns(e){const o=[...e].sort((s,a)=>s.at-a.at||s.id.localeCompare(a.id)),n=new Map,r=new Map;for(const s of o){if(s.run.from==="alone"){const a=s.previousResponseId?n.get(s.previousResponseId):void 0,i=a?void 0:s.answers?.map(c=>r.get(c)).find(Boolean),d=a??i;if(d){const c=a?"chain":"tools";s.run={key:d.run.key,from:d.run.from==="alone"||d.run.from===c?c:d.run.from},d.run.from==="alone"&&(d.run={key:d.run.key,from:c})}}s.responseId&&n.set(s.responseId,s);for(const a of s.callIds??[])r.set(a,s)}const t=new Map;for(const s of o){const a=(t.get(s.run.key)??0)+1;t.set(s.run.key,a),s.step=a}return e}u(linkAiRuns,"linkAiRuns"),p(linkAiRuns,"linkAiRuns"),l(linkAiRuns,"linkAiRuns");export function mergedKey(e,o){let n=o;for(let r=0;r<8&&e.merge[n]&&e.merge[n]!==o;r++)n=e.merge[n];return n}u(mergedKey,"mergedKey"),p(mergedKey,"mergedKey"),l(mergedKey,"mergedKey");export function applyAiNames(e,o){if(!Object.keys(o.names).length&&!Object.keys(o.merge).length)return e;const n=new Map;for(const t of e)n.has(t.agent.key)||n.set(t.agent.key,t.agent),t.action&&!n.has(t.action.key)&&n.set(t.action.key,t.action);const r=l(t=>{const s=mergedKey(o,t.key),a=o.names[s];if(a)return{key:s,name:a,from:"renamed"};if(s===t.key)return t;const i=n.get(s);return{key:s,name:i?.name??humanName(s.replace(/^[a-z]+:/,"")),from:i?.from??t.from}},"resolve");for(const t of e)t.agent=r(t.agent),t.action&&(t.action=r(t.action));return e}u(applyAiNames,"applyAiNames"),p(applyAiNames,"applyAiNames"),l(applyAiNames,"applyAiNames");export function aiNamesOf(e){const o=e&&typeof e=="object"?e:{},n=l(r=>{const t={};if(r&&typeof r=="object"&&!Array.isArray(r))for(const[s,a]of Object.entries(r))/^(agent|action):/.test(s)&&typeof a=="string"&&a.trim()&&(t[s]=a.trim().slice(0,120));return t},"pick");return{version:1,names:n(o.names),merge:n(o.merge)}}u(aiNamesOf,"aiNamesOf"),p(aiNamesOf,"aiNamesOf"),l(aiNamesOf,"aiNamesOf");
|
package/lib/ai-call.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
"use strict";var se=Object.defineProperty;var v=(t,
|
|
2
|
-
`||d==="\r"||d===" ")continue;const f=
|
|
3
|
-
\r `.includes(t[g]);)g++;if(g>=
|
|
1
|
+
"use strict";var se=Object.defineProperty;var v=(t,o)=>se(t,"name",{value:o,configurable:!0});var ne=Object.defineProperty,k=v((t,o)=>ne(t,"name",{value:o,configurable:!0}),"v"),re=Object.defineProperty,_=k((t,o)=>re(t,"name",{value:o,configurable:!0}),"d");const $=_(t=>!!t&&typeof t=="object"&&!Array.isArray(t),"isObj"),e=_(t=>typeof t=="string"?t:void 0,"str"),h=_(t=>typeof t=="number"&&Number.isFinite(t)?t:void 0,"num"),w=_(t=>Array.isArray(t)?t:[],"arr"),c=_(t=>$(t)?t:{},"obj"),O=_(t=>typeof t=="string"?t:t===void 0?"":JSON.stringify(t),"json"),te=_(t=>t>=1024*1024?`${(t/1024/1024).toFixed(1)} MB`:`${Math.round(t/1024)} KB`,"kb");export const CUT_MARK="\u2026";export function parseJsonPrefix(t){try{return{value:JSON.parse(t),cut:!1}}catch{}const o=[];let n=0,l=!1,a=!1,r=!1;const s=t.length,i=_(m=>{const d=o[o.length-1];d&&(d.state="after"),n=m},"ended");for(let m=0;m<s;m++){const d=t[m];if(l){r?r=!1:d==="\\"?r=!0:d==='"'&&(l=!1,a?o[o.length-1].state="colon":i(m+1));continue}if(d===" "||d===`
|
|
2
|
+
`||d==="\r"||d===" ")continue;const f=o[o.length-1];if(d==='"'){l=!0,a=!!f&&f.c==="{"&&f.state==="key";continue}if(d==="{"||d==="["){o.push({c:d,state:d==="{"?"key":"value"}),n=m+1;continue}if(d==="}"||d==="]"){o.pop(),i(m+1);continue}if(d===":"){f&&(f.state="value");continue}if(d===","){f&&(f.state=f.c==="{"?"key":"value");continue}let g=m;for(;g<s&&!`,}]
|
|
3
|
+
\r `.includes(t[g]);)g++;if(g>=s)break;i(g),m=g-1}const u=o.map(m=>m.c==="{"?"}":"]").reverse().join("");if(l&&!a)for(let m=0;m<=6;m++)try{return{value:JSON.parse(`${t.slice(0,s-m)}${CUT_MARK}"${u}`),cut:!0}}catch{}if(n)try{return{value:JSON.parse(`${t.slice(0,n)}${u}`),cut:!0}}catch{return}}v(parseJsonPrefix,"parseJsonPrefix"),k(parseJsonPrefix,"parseJsonPrefix"),_(parseJsonPrefix,"parseJsonPrefix");export function aiApiOf(t){const o=t.split("?")[0].replace(/\/+$/,"");if(/\/responses$/.test(o))return"responses";if(/\/chat\/completions$/.test(o))return"chat";if(/\/embeddings$/.test(o))return"embeddings";if(/\/messages$/.test(o))return"messages"}v(aiApiOf,"aiApiOf"),k(aiApiOf,"aiApiOf"),_(aiApiOf,"aiApiOf");export function splitToolName(t,o){if(o)return{server:o,tool:t};const n=/^(?:mcp__)?([A-Za-z0-9-]+(?:_[A-Za-z0-9-]+)*)__(.+)$/.exec(t);return n?{server:n[1],tool:n[2]}:{tool:t}}v(splitToolName,"splitToolName"),k(splitToolName,"splitToolName"),_(splitToolName,"splitToolName");const A=_((t,o,n={})=>({...n.callId?{callId:n.callId}:{},name:t,...splitToolName(t,n.server),arguments:o,...n.output!==void 0?{output:n.output}:{},...n.error?{error:n.error}:{}}),"toolCall");function J(t,o,n){if(!t)return;if(t.omitted==="ai"){n.push(`The ${o==="request"?"prompt":"answer"} was not kept \u2014 an AI provider\u2019s bodies are kept only when asked for: Settings \u203A Features \u203A Capture \u203A AI calls, for the calls made after.`);return}if(t.omitted||t.text===void 0)return;const l=parseJsonPrefix(t.text);if(l)return(l.cut||t.truncated)&&n.push(`The ${o} was kept to its first ${te(t.kept)} of ${te(t.size)} \u2014 read as far as it goes; what follows is not shown (the ${o==="request"?"end of the conversation":"rest of the answer"}, marked ${CUT_MARK}).`),l.value}v(J,"M"),k(J,"E"),_(J,"readBody");function M(t){if(t.data===void 0||t.data==="[DONE]")return;const o=parseJsonPrefix(t.data);return o&&$(o.value)?{v:o.value,cut:o.cut}:void 0}v(M,"J"),k(M,"M"),_(M,"eventJson");function I(t){if(typeof t=="string")return{text:t,attachments:[]};const o=[],n=[];for(const l of w(t)){if(typeof l=="string"){o.push(l);continue}const a=c(l),r=e(a.type)??"",s=e(a.text)??e(a.refusal);s!==void 0?o.push(s):/image/.test(r)?n.push(e(a.detail)?`image (${e(a.detail)})`:"image"):/file|document/.test(r)?n.push(`file ${e(a.filename)??e(c(a.source).media_type)??e(a.file_id)??""}`.trim()):/audio/.test(r)?n.push("audio"):r&&n.push(r)}return{text:o.join(`
|
|
4
4
|
|
|
5
|
-
`),attachments:n}}v(I,"I"),_(I,"contentOf");const
|
|
5
|
+
`),attachments:n}}v(I,"I"),k(I,"I"),_(I,"contentOf");const q=_(t=>typeof t=="string"?t:Array.isArray(t)&&I(t).text||O(t),"outputOf");function C(t,o){const n=[];for(const[a,r]of o){let s=t;for(const u of a.split("."))s=c(s)[u];if(s==null)continue;const i=typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):$(s)&&e(s.name)?`${e(s.type)??"tool"} ${e(s.name)}`:$(s)&&e(s.type)?e(s.type):JSON.stringify(s);n.push({name:r,value:i})}const l=c(t.metadata);for(const[a,r]of Object.entries(l))n.push({name:`metadata.${a}`,value:typeof r=="string"?r:JSON.stringify(r)});return n}v(C,"C"),k(C,"O"),_(C,"settingsOf");function S(t,o,n,l){const a=o?t.byCallId.get(o):void 0;if(a){a.output=n,l&&(a.error=l);return}t.call.turns.push({kind:"tool",...A("(an earlier call)","",{callId:o,output:n,error:l})})}v(S,"O"),k(S,"T"),_(S,"addOutput");function j(t,o){const n={kind:"tool",...o};t.call.turns.push(n),o.callId&&t.byCallId.set(o.callId,n)}v(j,"j"),k(j,"S"),_(j,"addCall");const ae=[["reasoning.effort","reasoning effort"],["reasoning.summary","reasoning summary"],["max_output_tokens","max output tokens"],["temperature","temperature"],["top_p","top_p"],["tool_choice","tool choice"],["parallel_tool_calls","parallel tool calls"],["text.verbosity","verbosity"],["truncation","truncation"],["previous_response_id","continues response"],["store","store"],["service_tier","service tier"],["stream","stream"],["prompt_cache_key","prompt cache key"],["user","user"],["safety_identifier","safety identifier"]],oe=_(t=>O(Object.fromEntries(Object.entries(t).filter(([o])=>o!=="type"&&o!=="id"&&o!=="status"))),"builtInCall");function L(t,o){const n=e(o.type)??(o.role?"message":"");if(n==="message"){const l=e(o.role)??"user",{text:a,attachments:r}=I(o.content);l==="system"?t.call.system.push({source:"system message",text:a}):t.call.turns.push({kind:"message",role:l,text:a,...r.length?{attachments:r}:{}})}else if(n==="function_call"||n==="custom_tool_call")j(t,A(e(o.name)??"?",e(o.arguments)??O(o.input),{callId:e(o.call_id)}));else if(n==="function_call_output"||n==="custom_tool_call_output"||n==="computer_call_output"||n==="local_shell_call_output")S(t,e(o.call_id),q(o.output));else if(n==="mcp_call")j(t,A(e(o.name)??"?",e(o.arguments)??"",{callId:e(o.id),server:e(o.server_label),...o.output!==void 0&&o.output!==null?{output:q(o.output)}:{},error:e(o.error)}));else if(n==="mcp_list_tools"){const l=w(o.tools).map(a=>e(c(a).name)).filter(Boolean);j(t,A("list_tools","",{server:e(o.server_label),output:l.join(", ")}))}else if(n==="reasoning"){const l=w(o.summary).map(a=>e(c(a).text)).filter(Boolean).join(`
|
|
6
6
|
|
|
7
|
-
`);t.call.turns.push({kind:"reasoning",...l?{text:l}:{}})}else n&&j(t
|
|
7
|
+
`);t.call.turns.push({kind:"reasoning",...l?{text:l}:{}})}else n&&j(t,A(n.replace(/_call$/,""),oe(o),{callId:e(o.call_id)??e(o.id)}))}v(L,"Z"),k(L,"R"),_(L,"responsesItem");function U(t){return w(t.tools).map(o=>{const n=c(o),l=e(n.type)??"function";if(l==="mcp"){const r=e(n.server_label)??"mcp",s=w(n.allowed_tools).map(i=>e(i)).filter(Boolean);return{name:r,server:r,tool:s.length?s.join(", "):"every tool",type:l,...e(n.server_description)??e(n.server_url)?{description:e(n.server_description)??e(n.server_url)}:{},called:0}}const a=e(n.name)??l;return{name:a,...splitToolName(a),type:l,...e(n.description)?{description:e(n.description)}:{},...n.parameters!==void 0?{parameters:n.parameters}:{},...typeof n.strict=="boolean"?{strict:n.strict}:{},called:0}})}v(U,"D"),k(U,"W"),_(U,"responsesTools");function P(t,o){const n=t.call.answer;e(o.status)&&(n.status=e(o.status));const l=e(c(o.incomplete_details).reason);l&&(n.finish=l);const a=c(o.error);e(a.message)&&(n.error=e(a.message)),e(o.model)&&(t.call.model??=e(o.model)),e(o.id)&&(t.call.responseId=e(o.id)),E(t,w(o.output).map(c));const r=c(o.usage);Object.keys(r).length&&(t.call.usage={...h(r.input_tokens)!==void 0?{input:h(r.input_tokens)}:{},...h(c(r.input_tokens_details).cached_tokens)!==void 0?{cached:h(c(r.input_tokens_details).cached_tokens)}:{},...h(c(r.input_tokens_details).cache_write_tokens)?{written:h(c(r.input_tokens_details).cache_write_tokens)}:{},...h(r.output_tokens)!==void 0?{output:h(r.output_tokens)}:{},...h(c(r.output_tokens_details).reasoning_tokens)!==void 0?{reasoning:h(c(r.output_tokens_details).reasoning_tokens)}:{},...h(r.total_tokens)!==void 0?{total:h(r.total_tokens)}:{}})}v(P,"q"),k(P,"z"),_(P,"responsesAnswer");function E(t,o){const n=t.call.answer,l=[],a=[];for(const r of o){const s=e(r.type);if(s==="message")for(const i of w(r.content).map(c))e(i.refusal)?n.refusal=e(i.refusal):e(i.text)!==void 0&&l.push(e(i.text));else if(s==="function_call"||s==="custom_tool_call")n.toolCalls.push(A(e(r.name)??"?",e(r.arguments)??O(r.input),{callId:e(r.call_id)}));else if(s==="mcp_call")n.toolCalls.push(A(e(r.name)??"?",e(r.arguments)??"",{callId:e(r.id),server:e(r.server_label),...r.output!==void 0&&r.output!==null?{output:q(r.output)}:{},error:e(r.error)}));else if(s==="reasoning"){const i=w(r.summary).map(u=>e(c(u).text)).filter(Boolean).join(`
|
|
8
8
|
|
|
9
|
-
`);i&&a.push(i)}else
|
|
9
|
+
`);i&&a.push(i)}else s&&s!=="mcp_list_tools"&&n.toolCalls.push(A(s.replace(/_call$/,""),oe(r),{callId:e(r.call_id)??e(r.id)}))}l.length&&(n.text=l.join(`
|
|
10
10
|
|
|
11
11
|
`)),a.length&&(n.reasoning=a.join(`
|
|
12
12
|
|
|
13
|
-
`))}v(E,"F"),_(E,"responsesOutput");function
|
|
13
|
+
`))}v(E,"E"),k(E,"F"),_(E,"responsesOutput");function W(t,o,n){let l,a=0;const r=new Map,s=new Set,i=new Map,u=new Map,m=new Map;for(const f of o){const g=M(f);if(!g)continue;g.cut&&a++;const p=g.v,y=e(p.type)??f.event,x=h(p.output_index)??0;if(y==="response.completed"||y==="response.incomplete"||y==="response.failed"){if(!g.cut&&$(p.response))l=p.response;else if($(p.response)){const b=p.response;e(b.status)&&(t.call.answer.status=e(b.status))}}else if(y==="response.created"||y==="response.in_progress"){const b=c(p.response);e(b.model)&&(t.call.model??=e(b.model)),e(b.id)&&(t.call.responseId??=e(b.id))}else y==="response.output_item.added"||y==="response.output_item.done"?$(p.item)&&(!s.has(x)||!g.cut)&&(r.set(x,{...r.get(x)??{},...p.item}),y.endsWith(".done")&&!g.cut&&s.add(x)):y==="response.output_text.delta"||y==="response.refusal.delta"?i.set(x,(i.get(x)??"")+(e(p.delta)??"")):y==="response.output_text.done"&&!g.cut&&e(p.text)!==void 0?i.set(x,e(p.text)):y==="response.function_call_arguments.delta"||y==="response.custom_tool_call_input.delta"||y==="response.mcp_call_arguments.delta"?u.set(x,(u.get(x)??"")+(e(p.delta)??"")):(y==="response.function_call_arguments.done"||y==="response.mcp_call_arguments.done")&&!g.cut&&e(p.arguments)!==void 0?u.set(x,e(p.arguments)):y==="response.reasoning_summary_text.delta"?m.set(x,(m.get(x)??"")+(e(p.delta)??"")):(y==="error"||y==="response.error")&&(t.call.answer.error=e(p.message)??e(c(p.error).message)??"the stream reported an error")}if(l){P(t,l);return}const d=[...r.entries()].sort(([f],[g])=>f-g).map(([f,g])=>{if(s.has(f))return g;const p=e(g.type);return p==="message"&&i.has(f)?{...g,content:[{type:"output_text",text:i.get(f)}]}:(p==="function_call"||p==="mcp_call")&&u.has(f)?{...g,arguments:u.get(f)}:p==="custom_tool_call"&&u.has(f)?{...g,input:u.get(f)}:p==="reasoning"&&m.has(f)?{...g,summary:[{type:"summary_text",text:m.get(f)}]}:g});for(const[f,g]of i)r.has(f)||d.push({type:"message",content:[{type:"output_text",text:g}]});E(t,d),t.call.answer.status||(t.call.answer.status=d.length?"completed":"unknown"),a&&n.push(`${a} of the stream\u2019s events were kept to their first 4 KB, so the answer was rebuilt from its pieces${t.call.usage?"":" \u2014 its token counts came in the last event, which was cut"}.`)}v(W,"H"),k(W,"Z"),_(W,"responsesStream");function Z(t,o,n,l){const a=t.call;e(o.model)&&(a.model=e(o.model)),e(o.instructions)&&a.system.push({source:"instructions",text:e(o.instructions)});const r=o.input;if(typeof r=="string")a.turns.push({kind:"message",role:"user",text:r});else for(const i of w(r))$(i)&&L(t,i);a.tools=U(o),a.settings=C(o,ae);const s=c(c(o.text).format);e(s.type)&&s.type!=="text"&&(a.answer.format={type:e(s.type),...e(s.name)?{name:e(s.name)}:{},...s.schema!==void 0?{schema:s.schema}:{},...typeof s.strict=="boolean"?{strict:s.strict}:{}}),B(t,n,l,i=>P(t,i),i=>W(t,i,l))}v(Z,"R"),k(Z,"D"),_(Z,"responsesCall");const ie=[["reasoning_effort","reasoning effort"],["max_completion_tokens","max completion tokens"],["max_tokens","max tokens"],["temperature","temperature"],["top_p","top_p"],["tool_choice","tool choice"],["parallel_tool_calls","parallel tool calls"],["n","n"],["seed","seed"],["stop","stop"],["presence_penalty","presence penalty"],["frequency_penalty","frequency penalty"],["verbosity","verbosity"],["store","store"],["service_tier","service tier"],["stream","stream"],["user","user"]];function z(t){const o=w(t.tool_calls).map(c).map(l=>{const a=c(l.function);return A(e(a.name)??e(c(l.custom).name)??"?",e(a.arguments)??e(c(l.custom).input)??"",{callId:e(l.id)})}),n=c(t.function_call);return e(n.name)&&o.push(A(e(n.name),e(n.arguments)??"",{})),o}v(z,"K"),k(z,"G"),_(z,"chatCalls");function F(t,o){const n=t.call.answer;e(o.model)&&(t.call.model??=e(o.model)),e(o.id)&&(t.call.responseId??=e(o.id));const l=c(w(o.choices)[0]),a=c(l.message),r=I(a.content).text;r&&(n.text=r),e(a.refusal)&&(n.refusal=e(a.refusal));const s=e(a.reasoning_content)??e(a.reasoning);s&&(n.reasoning=s),n.toolCalls.push(...z(a)),e(l.finish_reason)&&(n.finish=e(l.finish_reason)),n.status=n.finish?"completed":n.status??"unknown";const i=c(o.error);e(i.message)&&(n.error=e(i.message));const u=c(o.usage);Object.keys(u).length&&(t.call.usage={...h(u.prompt_tokens)!==void 0?{input:h(u.prompt_tokens)}:{},...h(c(u.prompt_tokens_details).cached_tokens)!==void 0?{cached:h(c(u.prompt_tokens_details).cached_tokens)}:{},...h(c(u.prompt_tokens_details).cache_write_tokens)?{written:h(c(u.prompt_tokens_details).cache_write_tokens)}:{},...h(u.completion_tokens)!==void 0?{output:h(u.completion_tokens)}:{},...h(c(u.completion_tokens_details).reasoning_tokens)!==void 0?{reasoning:h(c(u.completion_tokens_details).reasoning_tokens)}:{},...h(u.total_tokens)!==void 0?{total:h(u.total_tokens)}:{}})}v(F,"z"),k(F,"L"),_(F,"chatAnswer");function D(t,o,n){let l="",a="",r="",s,i,u,m,d=0;const f=new Map;for(const p of o){const y=M(p);if(!y)continue;y.cut&&d++,u??=e(y.v.model),m??=e(y.v.id),$(y.v.usage)&&(i=y.v.usage),$(y.v.error)&&(t.call.answer.error=e(y.v.error.message)??"the stream reported an error");const x=c(w(y.v.choices)[0]),b=c(x.delta);l+=e(b.content)??"",a+=e(b.reasoning_content)??e(b.reasoning)??"",r+=e(b.refusal)??"";for(const N of w(b.tool_calls).map(c)){const Y=h(N.index)??0,T=f.get(Y)??{name:"",args:""},ee=c(N.function);e(N.id)&&(T.id=e(N.id)),T.name+=e(ee.name)??"",T.args+=e(ee.arguments)??"",f.set(Y,T)}e(x.finish_reason)&&(s=e(x.finish_reason))}const g={content:l,...a?{reasoning_content:a}:{},...r?{refusal:r}:{},tool_calls:[...f.entries()].sort(([p],[y])=>p-y).map(([,p])=>({id:p.id,function:{name:p.name,arguments:p.args}}))};F(t,{...u?{model:u}:{},...m?{id:m}:{},choices:[{message:g,...s?{finish_reason:s}:{}}],...i?{usage:i}:{}}),d&&n.push(`${d} of the stream\u2019s chunks were kept to their first 4 KB \u2014 the answer was joined from what was kept of them.`)}v(D,"G"),k(D,"V"),_(D,"chatStream");function R(t,o,n,l){const a=t.call;e(o.model)&&(a.model=e(o.model));for(const s of w(o.messages).map(c)){const i=e(s.role)??"user",{text:u,attachments:m}=I(s.content);if(i==="system")a.system.push({source:"system message",text:u});else if(i==="tool")S(t,e(s.tool_call_id),u);else if(i==="function")S(t,void 0,u);else{(u||m.length||i!=="assistant")&&a.turns.push({kind:"message",role:i,text:u,...m.length?{attachments:m}:{}});for(const d of z(s))j(t,d)}}a.tools=[...w(o.tools).map(c),...w(o.functions).map(s=>({type:"function",function:s}))].map(s=>{const i=c(s.function),u=e(s.type)??"function",m=e(i.name)??e(c(s.custom).name)??u;return{name:m,...splitToolName(m),type:u,...e(i.description)??e(c(s.custom).description)?{description:e(i.description)??e(c(s.custom).description)}:{},...i.parameters!==void 0?{parameters:i.parameters}:{},...typeof i.strict=="boolean"?{strict:i.strict}:{},called:0}}),a.settings=C(o,ie);const r=c(o.response_format);if(e(r.type)&&r.type!=="text"){const s=c(r.json_schema);a.answer.format={type:e(r.type),...e(s.name)?{name:e(s.name)}:{},...s.schema!==void 0?{schema:s.schema}:{},...typeof s.strict=="boolean"?{strict:s.strict}:{}}}B(t,n,l,s=>F(t,s),s=>D(t,s,l))}v(R,"Q"),k(R,"X"),_(R,"chatCall");const le=[["max_tokens","max tokens"],["thinking.budget_tokens","thinking budget"],["temperature","temperature"],["top_p","top_p"],["top_k","top_k"],["tool_choice","tool choice"],["stop_sequences","stop sequences"],["stream","stream"],["metadata.user_id","user"]];function G(t,o,n){if(typeof n=="string"){t.call.turns.push({kind:"message",role:o,text:n});return}const l=[],a=[],r=_(()=>{(l.length||a.length)&&t.call.turns.push({kind:"message",role:o,text:l.join(`
|
|
14
14
|
|
|
15
|
-
`),...a.length?{attachments:[...a]}:{}}),l.length=0,a.length=0},"flush");for(const
|
|
15
|
+
`),...a.length?{attachments:[...a]}:{}}),l.length=0,a.length=0},"flush");for(const s of w(n).map(c)){const i=e(s.type)??"";i==="text"?l.push(e(s.text)??""):i==="tool_use"||i==="server_tool_use"||i==="mcp_tool_use"?(r(),j(t,A(e(s.name)??"?",O(s.input),{callId:e(s.id),server:e(s.server_name)}))):i==="tool_result"||i==="mcp_tool_result"||/_tool_result$/.test(i)?(r(),S(t,e(s.tool_use_id),q(s.content),s.is_error===!0?"the tool reported an error":void 0)):i==="thinking"||i==="redacted_thinking"?(r(),t.call.turns.push({kind:"reasoning",...e(s.thinking)?{text:e(s.thinking)}:{}})):a.push(i==="image"?"image":i==="document"?`document ${e(s.title)??""}`.trim():i)}r()}v(G,"V"),k(G,"ee"),_(G,"anthropicBlocks");function K(t,o){const n=t.call.answer;e(o.model)&&(t.call.model??=e(o.model)),e(o.id)&&(t.call.responseId??=e(o.id));const l=[],a=[];for(const i of w(o.content).map(c)){const u=e(i.type);u==="text"?l.push(e(i.text)??""):u==="tool_use"||u==="server_tool_use"||u==="mcp_tool_use"?n.toolCalls.push(A(e(i.name)??"?",O(i.input),{callId:e(i.id),server:e(i.server_name)})):u==="thinking"&&a.push(e(i.thinking)??"")}l.length&&(n.text=l.join(`
|
|
16
16
|
|
|
17
17
|
`)),a.length&&(n.reasoning=a.join(`
|
|
18
18
|
|
|
19
|
-
`)),e(
|
|
19
|
+
`)),e(o.stop_reason)&&(n.finish=e(o.stop_reason)),n.status=o.type==="error"?"failed":n.finish?"completed":n.status??"unknown";const r=c(o.error);e(r.message)&&(n.error=e(r.message));const s=c(o.usage);if(Object.keys(s).length){const i=h(s.input_tokens),u=h(s.cache_read_input_tokens),m=h(s.output_tokens);t.call.usage={...i!==void 0?{input:i+(u??0)+(h(s.cache_creation_input_tokens)??0)}:{},...u!==void 0?{cached:u}:{},...h(s.cache_creation_input_tokens)?{written:h(s.cache_creation_input_tokens)}:{},...m!==void 0?{output:m}:{}}}}v(K,"F"),k(K,"P"),_(K,"anthropicAnswer");function H(t,o,n){let l={};const a=new Map,r=new Map;let s={},i=0;for(const u of o){const m=M(u);if(!m)continue;m.cut&&i++;const d=m.v,f=e(d.type)??u.event,g=h(d.index)??0;if(f==="message_start")l=c(d.message),s={...c(l.usage)};else if(f==="content_block_start")a.set(g,{...c(d.content_block)});else if(f==="content_block_delta"){const p=c(d.delta),y=a.get(g)??{};e(p.text)!==void 0&&(y.text=(e(y.text)??"")+e(p.text)),e(p.thinking)!==void 0&&(y.thinking=(e(y.thinking)??"")+e(p.thinking)),e(p.partial_json)!==void 0&&r.set(g,(r.get(g)??"")+e(p.partial_json)),a.set(g,y)}else f==="message_delta"?(l={...l,...c(d.delta)},s={...s,...c(d.usage)}):f==="error"&&(t.call.answer.error=e(c(d.error).message)??"the stream reported an error")}for(const[u,m]of r){const d=a.get(u);d&&(d.input=parseJsonPrefix(m)?.value??m)}K(t,{...l,content:[...a.entries()].sort(([u],[m])=>u-m).map(([,u])=>u),usage:s}),i&&n.push(`${i} of the stream\u2019s events were kept to their first 4 KB \u2014 the answer was joined from what was kept of them.`)}v(H,"X"),k(H,"te"),_(H,"anthropicStream");function V(t,o,n,l){const a=t.call;e(o.model)&&(a.model=e(o.model));const r=o.system;if(typeof r=="string"&&r)a.system.push({source:"system",text:r});else for(const s of w(r).map(c))e(s.text)&&a.system.push({source:"system",text:e(s.text)});for(const s of w(o.messages).map(c))G(t,e(s.role)??"user",s.content);a.tools=[...w(o.tools).map(c).map(s=>{const i=e(s.name)??e(s.type)??"tool";return{name:i,...splitToolName(i),type:e(s.type)??"custom",...e(s.description)?{description:e(s.description)}:{},...s.input_schema!==void 0?{parameters:s.input_schema}:{},called:0}}),...w(o.mcp_servers).map(c).map(s=>({name:e(s.name)??"mcp",server:e(s.name)??"mcp",tool:"every tool",type:"mcp",...e(s.url)?{description:e(s.url)}:{},called:0}))],a.settings=C(o,le),B(t,n,l,s=>K(t,s),s=>H(t,s,l))}v(V,"Y"),k(V,"ne"),_(V,"anthropicCall");function X(t,o,n,l){const a=t.call;e(o.model)&&(a.model=e(o.model));const r=o.input,s=typeof r=="string"?[r]:w(r),i=s.slice(0,200).map(p=>typeof p=="string"?p:typeof p=="number"?`token ${p}`:Array.isArray(p)?`${p.length} tokens`:O(p)),u=s.length>0&&s.every(p=>typeof p=="number");a.embedding={inputs:u?[`${s.length} tokens`]:i,count:u?1:s.length,...h(o.dimensions)!==void 0?{dimensions:h(o.dimensions)}:{}},a.settings=C(o,[["dimensions","dimensions"],["encoding_format","encoding"],["user","user"]]);const m=c(J(n.response.body,"answer",[])),d=w(m.data);if(d.length){a.embedding.vectors=d.length;const p=c(d[0]).embedding;Array.isArray(p)&&a.embedding.dimensions===void 0&&(a.embedding.dimensions=p.length)}const f=c(m.usage);h(f.prompt_tokens)!==void 0&&(a.usage={input:h(f.prompt_tokens),...h(f.total_tokens)!==void 0?{total:h(f.total_tokens)}:{}}),a.answer.status=n.status!==void 0&&n.status<400?"completed":"failed";const g=c(m.error);e(g.message)&&(a.answer.error=e(g.message))}v(X,"ee"),k(X,"se"),_(X,"embeddingsCall");function B(t,o,n,l,a){const r=o.response.stream;if(r){if(r.events.length&&r.events.every(i=>i.data===void 0)){n.push("The answer streamed, and only each event\u2019s name, time and size were kept \u2014 an AI provider\u2019s bodies are kept only when asked for: Settings \u203A Features \u203A Capture \u203A AI calls.");return}a(r.events),r.cut&&n.push(`The stream was cut after ${r.events.length.toLocaleString("en-US")} of its ${r.total.toLocaleString("en-US")} events \u2014 what came after is not shown.`);return}const s=J(o.response.body,"answer",n);$(s)?l(s):o.error&&(t.call.answer.error=o.error),t.call.answer.status||(t.call.answer.status=o.error||(o.status??0)>=400?"failed":"unknown")}v(B,"T"),k(B,"N"),_(B,"answerOf");function Q(t){return t.api==="embeddings"?"embedding":t.answer.format&&/json/.test(t.answer.format.type)?"decision":t.tools.length||t.answer.toolCalls.length||t.turns.some(o=>o.kind==="tool")?"tools":t.turns.filter(o=>o.kind==="message"&&(o.role==="user"||o.role==="assistant")).length>1?"chat":"prompt"}v(Q,"te"),k(Q,"oe"),_(Q,"shapeOf");export function aiCallOf(t){if(!t.ai)return;const o=aiApiOf(t.path);if(!o)return;const n=[],l={call:{provider:t.ai.provider,api:o,shape:"prompt",settings:[],system:[],turns:[],tools:[],answer:{toolCalls:[]},gaps:n},byCallId:new Map},a=c(J(t.request.body,"request",n));o==="responses"?Z(l,a,t,n):o==="chat"?R(l,a,t,n):o==="messages"?V(l,a,t,n):X(l,a,t,n);const r=l.call;if(r.answer.text!==void 0&&(r.answer.format?/json/.test(r.answer.format.type):/^\s*[{[]/.test(r.answer.text))){const i=parseJsonPrefix(r.answer.text);i&&($(i.value)||Array.isArray(i.value))&&(r.answer.json=i.value)}!r.answer.finish&&r.answer.toolCalls.length&&(r.answer.finish="tool calls");const s=new Map;for(const i of r.turns)i.kind==="tool"&&s.set(i.name,(s.get(i.name)??0)+1);for(const i of r.answer.toolCalls)s.set(i.name,(s.get(i.name)??0)+1);for(const i of r.tools)i.called=s.get(i.name)??0;r.shape=Q(r);for(const i of r.system)i.text.endsWith(CUT_MARK)&&(i.cut=!0);return r}v(aiCallOf,"aiCallOf"),k(aiCallOf,"aiCallOf"),_(aiCallOf,"aiCallOf");export const SHAPE_LABEL={prompt:"Single prompt",chat:"Conversation",tools:"Tool calling",decision:"Structured decision",embedding:"Embedding"};export function prettyJson(t){const o=t.trim()?parseJsonPrefix(t):void 0;return o&&($(o.value)||Array.isArray(o.value))?{value:o.value,text:t}:{text:t}}v(prettyJson,"prettyJson"),k(prettyJson,"prettyJson"),_(prettyJson,"prettyJson");
|
package/lib/ai-context.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`),h=r>0?
|
|
3
|
-
`)return!0;if(
|
|
4
|
-
${t.output}`:""}`;return{kind:"tool",label:`tool \xB7 ${t.tool}${t.output!==void 0?" \u2014 called, and its result":" \u2014 called"}`,role:"tool",ref:{turn:e},text:
|
|
5
|
-
`),
|
|
6
|
-
`),n=estimateTokens(
|
|
1
|
+
"use strict";var G=Object.defineProperty;var $=(t,e)=>G(t,"name",{value:e,configurable:!0});var R=Object.defineProperty,y=$((t,e)=>R(t,"name",{value:e,configurable:!0}),"$"),W=Object.defineProperty,g=y((t,e)=>W(t,"name",{value:e,configurable:!0}),"g");export const AI_PART_KINDS=["system","tools","schema","context","history","tool","turn","carried","unkept"],AI_PART_LABEL={system:"System prompt",tools:"Tool definitions",schema:"Answer schema",context:"Context",history:"Earlier turns",tool:"Tool calls & results",turn:"This turn",carried:"Held by the provider",unkept:"Not kept"},AI_PART_SAID={system:"The instructions every call of this agent starts with",tools:"The tools it was offered, as defined \u2014 sent with every call, called or not",schema:"The JSON schema its answer had to fit",context:"What the app put in beside the conversation (developer messages)",history:"The conversation before this turn \u2014 what was said, and answered",tool:"The tools it called earlier in this run, what it sent them and what came back",turn:"What this call asks \u2014 the latest message",carried:"The conversation of the response it continues (previous_response_id): counted by the provider, not in this request",unkept:"The end of the request, which the capture did not keep (a lens before 1.25.32 kept its first 64 KB): counted by the provider, not known here"};const Z=/[\p{L}\p{M}]/u,D=/[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}]/u,U=/(\s*)([A-Za-z]+|[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}]+|[\p{L}\p{M}]+|[0-9]+|[^\s\p{L}\p{M}0-9]+)|(\s+)/gu,B=4,z=.7;export function estimateTokens(t){let e=0;for(const s of t.matchAll(U)){const o=s[1],n=s[2];if(s[3]!==void 0){/\n| {2,}/.test(s[3])&&(e+=1);continue}if(o&&/\n| {2,}/.test(o)&&(e+=1),!n)continue;const r=n.charCodeAt(0);r>=65&&r<=90||r>=97&&r<=122?e+=1+(n.length>8?(n.length-8)/4:0):r>=48&&r<=57?e+=Math.ceil(n.length/3):D.test(n)?e+=[...n].length*.9:Z.test(n)?e+=[...n].length*.66:e+=n.length*.75}return e}$(estimateTokens,"estimateTokens"),y(estimateTokens,"estimateTokens"),g(estimateTokens,"estimateTokens");const F=/^[ \t]*-{3,}[ \t]*(.+?)[ \t]*-{3,}[ \t]*$/gm,Q=/^(#{1,4})[ \t]+(.+?)[ \t]*#*[ \t]*$/gm,I=60;function C(t,e){const s=[],o=t.slice(0,e[0].at);return o.trim().length>40&&s.push({title:"(opening)",chars:o.length,tokens:0,at:0,end:e[0].at}),e.forEach((n,r)=>{const h=r+1<e.length?e[r+1].at:t.length;s.push({title:n.title.slice(0,120),chars:h-n.at,tokens:0,at:n.at,end:h})}),s}$(C,"C"),y(C,"P"),g(C,"cutAt");function T(t){const e=t.trim();if(!e.startsWith("{")&&!e.startsWith("["))return[];let s;try{s=JSON.parse(e)}catch{return[]}const o=s&&typeof s=="object"&&!Array.isArray(s)?s.properties:void 0,n=o&&typeof o=="object"&&!Array.isArray(o)?o:s,r=Array.isArray(n)?n.map((h,u)=>[`[${u}]`,h]):n&&typeof n=="object"?Object.entries(n):[];return r.length<2?[]:r.slice(0,I).map(([h,u])=>{const c=JSON.stringify(u,null,2)??"";return{title:h,chars:c.length,tokens:estimateTokens(c)}})}$(T,"M"),y(T,"M"),g(T,"jsonSections");export function sectionsOf(t){const e=taggedSections(t);return e.length?e:_(t)}$(sectionsOf,"sectionsOf"),y(sectionsOf,"sectionsOf"),g(sectionsOf,"sectionsOf");function _(t){if(t.length<200)return[];let e=g((o,n,r=()=>!0)=>[...t.matchAll(o)].filter(r).map(h=>({at:h.index,title:n(h)})),"pick")(F,o=>o[1]);if(e.length<2){const o=[...t.matchAll(Q)],n=[1,2,3,4].find(r=>o.filter(h=>h[1].length===r).length>=2);e=n?o.filter(r=>r[1].length===n).map(r=>({at:r.index,title:r[2]})):[]}if(e.length<2)return T(t);const s=C(t,e.slice(0,I));for(const o of s){const n=t.slice(o.at,o.end);o.tokens=estimateTokens(n);const r=n.indexOf(`
|
|
2
|
+
`),h=r>0?T(n.slice(r+1)):[];h.length&&(o.children=h)}return s}$(_,"j"),y(_,"N"),g(_,"plainSections");export const STABLE_TAGS=new Set(["instructions","rules","output","examples"]),CHANGING_TAGS=new Set(["memory","status","data","task"]);const X=/<([a-z][a-z0-9_-]{0,40})((?:\s+[A-Za-z_][\w.:-]*\s*=\s*(?:"[^"]*"|'[^']*'))*)\s*>/g,V=/([A-Za-z_][\w.:-]*)\s*=\s*(?:"([^"]*)"|'([^']*)')/g,Y=g(t=>t.replace(/"/g,'"').replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&"),"unescape");function H(t){const e={};for(const s of t.matchAll(V))e[s[1]]=Y(s[2]??s[3]??"");return e}$(H,"H"),y(H,"q"),g(H,"attrsOf");function L(t,e,s,o){const n=`<${e}`,r=`</${e}>`;let h=1,u=s;for(;u<o;){const c=t.indexOf(r,u);if(c<0||c>=o)return-1;let f=t.indexOf(n,u);for(;f>=0&&f<c&&!/[\s>]/.test(t[f+n.length]??"");)f=t.indexOf(n,f+1);if(f>=0&&f<c){h++,u=f+n.length;continue}if(--h===0)return c;u=c+r.length}return-1}$(L,"L"),y(L,"z"),g(L,"closeOf");const tt=g((t,e)=>{for(let s=e-1;s>=0;s--){const o=t[s];if(o===`
|
|
3
|
+
`)return!0;if(o!==" "&&o!==" ")return!1}return!0},"atLineStart");export function taggedSections(t,e=0,s=t.length,o=0){const n=[],r=new RegExp(X.source,"g");let h=e;for(;h<s&&n.length<I;){r.lastIndex=h;const l=r.exec(t);if(!l||l.index>=s)break;const p=l[1],k=l.index+l[0].length,x=tt(t,l.index)?L(t,p,k,s):-1;if(x<0){h=k;continue}const a=x+p.length+3,d=H(l[2]??""),v={title:p,tag:p,...Object.keys(d).length?{attrs:d}:{},chars:a-l.index,tokens:estimateTokens(t.slice(l.index,a)),at:l.index,end:a};if(o<1){const w=taggedSections(t,k,x,o+1).filter(i=>i.tag),S=w.length?w:_(t.slice(k,x)).map(i=>i.at===void 0?i:{...i,at:i.at+k,end:i.end+k});S.length&&(v.children=S)}n.push(v),h=a}if(!n.length)return[];const u=[];let c=e;const f=g((l,p)=>{const k=t.slice(l,p);k.trim().length>20&&u.push({title:"(untagged)",chars:p-l,tokens:estimateTokens(k),at:l,end:p})},"gap");for(const l of n)f(c,l.at),u.push(l),c=l.end;f(c,s);const b=new Map;for(const l of u){if(!l.tag)continue;const p=l.attrs?.id?`${l.tag} \xB7 ${l.attrs.id}`:l.tag,k=(b.get(p)??0)+1;b.set(p,k),l.title=k>1?`${p} #${k}`:p}return u}$(taggedSections,"taggedSections"),y(taggedSections,"taggedSections"),g(taggedSections,"taggedSections");function M(t,e){const s=t.reduce((o,n)=>o+n.tokens,0);for(const o of t)o.tokens=s>0?Math.round(o.tokens/s*e):0,o.children&&M(o.children,o.tokens)}$(M,"N"),y(M,"I"),g(M,"scaleSections");const et={user:"user",assistant:"assistant",developer:"Context \xB7 developer message",system:"system message"};function E(t,e,s){if(t.kind==="reasoning")return t.text?{kind:"history",label:"reasoning \xB7 sent back",role:"assistant",ref:{turn:e},text:t.text,estimate:estimateTokens(t.text)+B}:void 0;if(t.kind==="tool"){const o=`${t.name}(${t.arguments})${t.output!==void 0?`
|
|
4
|
+
${t.output}`:""}`;return{kind:"tool",label:`tool \xB7 ${t.tool}${t.output!==void 0?" \u2014 called, and its result":" \u2014 called"}`,role:"tool",ref:{turn:e},text:o,estimate:estimateTokens(o)+B*(t.output!==void 0?2:1)}}return{kind:s,label:et[t.role],role:t.role,ref:{turn:e},text:t.text,estimate:estimateTokens(t.text)+B}}$(E,"E"),y(E,"Z"),g(E,"turnDraft");function J(t){const e=t.turns;let s=e.length;for(;s>0&&e[s-1].kind==="message"&&e[s-1].role!=="assistant";)s--;return e.map((o,n)=>o.kind==="tool"?"tool":o.kind==="reasoning"?"history":o.role==="developer"||o.role==="system"?"context":n>=s&&o.role==="user"?"turn":"history")}$(J,"J"),y(J,"F"),g(J,"turnKinds");function K(t){const e=t.system.map((c,f)=>({kind:"system",label:c.source==="instructions"?"System prompt \xB7 instructions":`System prompt \xB7 ${c.source}`,ref:{system:f},text:c.text,estimate:estimateTokens(c.text)+B})),s=t.tools.map(c=>JSON.stringify({name:c.name,description:c.description,parameters:c.parameters})).join(`
|
|
5
|
+
`),o=t.tools.length?[{kind:"tools",label:`${t.tools.length} tool${t.tools.length===1?"":"s"} offered`,ref:{tools:!0},text:s,estimate:estimateTokens(s)*z}]:[],n=t.answer.format?.schema!==void 0?JSON.stringify(t.answer.format.schema):"",r=n?[{kind:"schema",label:`Answer schema${t.answer.format?.name?` \xB7 ${t.answer.format.name}`:""}`,ref:{schema:!0},text:n,estimate:estimateTokens(n)*z}]:[],h=J(t),u=t.turns.map((c,f)=>E(c,f,h[f])).filter(c=>!!c);for(const c of u){const f=t.turns[c.ref.turn];f.kind==="message"&&f.attachments?.length&&(c.label+=` \xB7 ${f.attachments.join(", ")}`)}return t.provider==="anthropic"?[...o,...e,...r,...u]:[...e,...o,...r,...u]}$(K,"K"),y(K,"U"),g(K,"draftsOf");export function aiContextOf(t,e={}){const s=e.sections!==!1,o=K(t),n=Math.round(o.reduce((i,m)=>i+m.estimate,0)),r=t.usage,h=r?.input!==void 0&&r.input>0,u=h?r.input:n,c=t.settings.some(i=>i.name==="continues response"),f=t.gaps.some(i=>/^The (request was kept to its first|prompt was not kept)/.test(i)),b=h&&(c||f)&&u>n*1.05?u-n:0,l=c?b:0,p=c?0:b,k=n>0?(u-b)/n:0,x=o.map((i,m)=>({i:m,kind:i.kind,label:i.label,...i.role?{role:i.role}:{},ref:i.ref,chars:i.text.length,tokens:Math.round(i.estimate*k),cached:0,sections:!s||i.kind==="tools"?[]:sectionsOf(i.text)}));l&&x.unshift({i:-1,kind:"carried",label:"The conversation it continues",ref:{carried:!0},chars:0,tokens:l,cached:0,sections:[]}),p&&x.push({i:-1,kind:"unkept",label:"The rest of the request \u2014 not kept",ref:{unkept:!0},chars:0,tokens:p,cached:0,sections:[]});const a=u-x.reduce((i,m)=>i+m.tokens,0);a&&x.length&&(x.reduce((i,m)=>m.tokens>i.tokens?m:i).tokens+=a);for(const i of x)i.kind==="tools"&&s&&(i.sections=t.tools.map(m=>({title:m.server?`${m.server} \u203A ${m.tool}`:m.tool,chars:0,tokens:estimateTokens(JSON.stringify({d:m.description,p:m.parameters}))}))),M(i.sections,i.tokens);x.forEach((i,m)=>i.i=m);const d=Math.min(r?.cached??0,u);let v=d;for(const i of x)i.cached=Math.min(i.tokens,v),v-=i.cached;const w=AI_PART_KINDS.map(i=>{const m=x.filter(O=>O.kind===i);return{kind:i,tokens:m.reduce((O,N)=>O+N.tokens,0),cached:m.reduce((O,N)=>O+N.cached,0),parts:m.length}}).filter(i=>i.parts),S=P(t);return{parts:x,byKind:w,input:u,counted:h,cached:d,...r?.written?{written:r.written}:{},estimated:n,output:S,findings:q(t,x,u,d,S)}}$(aiContextOf,"aiContextOf"),y(aiContextOf,"aiContextOf"),g(aiContextOf,"aiContextOf");function P(t){const e=t.answer,s=e.json!==void 0?JSON.stringify(e.json):e.text??e.refusal??"",o=e.toolCalls.map(p=>`${p.name}(${p.arguments})`).join(`
|
|
6
|
+
`),n=estimateTokens(s),r=estimateTokens(o)+e.toolCalls.length*B,h=t.usage,u=h?.output!==void 0,c=u?h.output:Math.round(n+r),f=Math.min(h?.reasoning??0,c),b=c-f,l=n+r>0?Math.round(r/(n+r)*b):0;return{total:c,reasoning:f,answer:b-l,tools:l,counted:u}}$(P,"q"),y(P,"X"),g(P,"outputOf");const A=g(t=>Math.round(t).toLocaleString("en-US"),"fmt"),j=g((t,e)=>`${e>0?Math.round(t/e*100):0}%`,"pct");function q(t,e,s,o,n){const r=[],h=t.answer;if(h.status==="incomplete"||/max_output_tokens|length|max_tokens/.test(h.finish??"")){const a=t.settings.find(d=>/max output|max_tokens|max_completion/.test(d.name));r.push({tone:"bad",text:`It stopped at its output cap${a?` (${a.name} ${a.value})`:""} \u2014 the answer is cut.`})}t.gaps.length&&r.push({tone:"warn",text:"Part of the call was not kept \u2014 the split covers what was."});const u=t.turns.reduce((a,d)=>a+(d.kind==="message"?d.attachments?.length??0:0),0);u&&r.push({tone:"info",text:`${u} image${u===1?"":"s"} or file${u===1?"":"s"} went with its messages: their tokens are counted by the provider but not read from the text, so the split spreads them over the parts.`});const c=t.usage;if(c?.input!==void 0&&s>=1024){if(!o)r.push({tone:"warn",text:`None of its ${A(s)} input tokens came from the prompt cache${c.written?` \u2014 ${A(c.written)} were written to it, for a later call that opens the same way`:""}.`});else if(o<s*.9){const w=e.find(S=>S.cached<S.tokens);w&&r.push({tone:"info",text:`${j(o,s)} cached \u2014 the cache stopped in \xAB${w.label}\xBB: from there on the prompt differed from the last call that opened the same way.`})}const a=e.findIndex(w=>w.kind==="context"),d=a>=0?e.slice(a+1).filter(w=>w.kind==="history"||w.kind==="tool"):[],v=d.reduce((w,S)=>w+S.tokens,0);a>=0&&d.length>=2&&e[a].cached<e[a].tokens&&v>0&&r.push({tone:"info",text:`The context the app put in sits before ${d.length} earlier turns (${A(v)} tokens): when it changes between calls, nothing after it can be read from the cache.`})}const f=e.flatMap(a=>a.sections.filter(d=>d.tag).map(d=>({p:a,x:d}))),b=f.findIndex(({x:a})=>CHANGING_TAGS.has(a.tag)),l=b>=0?f.slice(b+1).filter(({x:a})=>STABLE_TAGS.has(a.tag)):[];if(b>=0&&l.length){const a=f[b].x,d=l.reduce((v,{x:w})=>v+w.tokens,0);r.push({tone:"info",text:`\xAB${a.title}\xBB changes from call to call and comes before ${l.length} section${l.length===1?"":"s"} that should not (\xAB${l[0].x.title}\xBB\u2026, ${A(d)} tokens): put the stable ones first, or they cannot be read from the cache.`})}const p=e.filter(a=>a.kind!=="carried").reduce((a,d)=>!a||d.tokens>a.tokens?d:a,void 0);if(p&&s>2e3&&p.tokens>s*.5){const a=p.sections.reduce((d,v)=>!d||v.tokens>d.tokens?v:d,void 0);r.push({tone:"info",text:`\xAB${p.label}\xBB is ${j(p.tokens,s)} of the input${a&&a.tokens>p.tokens*.4?` \u2014 most of it \xAB${a.title}\xBB (${A(a.tokens)} tokens)`:""}.`})}const k=e.find(a=>a.kind==="tools"),x=h.toolCalls.length;return k&&k.tokens>s*.2&&!x&&!t.turns.some(a=>a.kind==="tool")&&r.push({tone:"info",text:`${t.tools.length} tool definitions are ${j(k.tokens,s)} of the input, and it called none of them.`}),n.total>=200&&n.reasoning>n.total*.7&&r.push({tone:"info",text:`${j(n.reasoning,n.total)} of its output was reasoning (${A(n.reasoning)} tokens).`}),r}$(q,"z"),y(q,"Q"),g(q,"findingsOf");export function aiSplitOf(t){return Object.fromEntries(t.byKind.filter(e=>e.tokens>0).map(e=>[e.kind,e.tokens]))}$(aiSplitOf,"aiSplitOf"),y(aiSplitOf,"aiSplitOf"),g(aiSplitOf,"aiSplitOf");
|
package/lib/ai-origins.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`);if("schema"in
|
|
3
|
-
${
|
|
1
|
+
"use strict";var Mt=Object.defineProperty;var v=(t,e)=>Mt(t,"name",{value:e,configurable:!0});var Tt=Object.defineProperty,y=v((t,e)=>Tt(t,"name",{value:e,configurable:!0}),"v"),Nt=Object.defineProperty,c=y((t,e)=>Nt(t,"name",{value:e,configurable:!0}),"a");import{aiContextOf as ht}from"./ai-context.js";const pt=8,gt=24,wt=32,qt=80,mt=400,Jt=200,Ct=1e6,Wt=12;export function normText(t){return(t.includes("\\")?t.replace(/\\[nrt]/g," ").replace(/\\(["\\/])/g,"$1"):t).replace(/\s\s+|[^\S ]/g," ").trim()}v(normText,"normText"),y(normText,"normText"),c(normText,"normText");function b(t){const e=t.trim();if(e.startsWith("{")&&e.endsWith("}")||e.startsWith("[")&&e.endsWith("]"))try{return JSON.stringify(JSON.parse(e))}catch{}return normText(e)}v(b,"S"),y(b,"I"),c(b,"canonical");const P=wt,Y=16777619,_t=(()=>{let t=1;for(let e=1;e<P;e++)t=Math.imul(t,Y);return t})(),$t=1<<18,vt=$t-1;function D(t){let e=0;for(let r=0;r<P;r++)e=Math.imul(e,Y)+t.charCodeAt(r)|0;return e}v(D,"Q"),y(D,"ue"),c(D,"headHash");class zt{static{v(this,"Wt")}static{y(this,"Ne")}static{c(this,"PassageIndex")}constructor(){this.by=new Map,this.bits=new Uint32Array($t>>>5),this.n=0}add(e){const r=D(e.text),o=this.by.get(r);o?o.push(e):this.by.set(r,[e]),this.bits[(r&vt)>>>5]|=1<<(r&31),this.n++}get size(){return this.n}find(e,r){if(!this.n||e.length<P)return;const o=new Set,n=this.bits;let i=D(e);for(let u=0;;u++){const h=(n[(i&vt)>>>5]&1<<(i&31))!==0?this.by.get(i):void 0;if(h)for(const w of h)!o.has(w)&&e.startsWith(w.text,u)&&(o.add(w),r(w));if(u+P>=e.length)break;i=Math.imul(i-Math.imul(e.charCodeAt(u),_t)|0,Y)+e.charCodeAt(u+P)|0}}}const yt=c(t=>t.replace(/^(?:mcp__)?[A-Za-z0-9-]+(?:_[A-Za-z0-9-]+)*__/,""),"toolName");function N(t,e,r,o=0){if(!(o>Wt)){if(typeof t=="string")e(t,r);else if(Array.isArray(t))for(const n of t)N(n,e,r,o+1);else if(t&&typeof t=="object")for(const[n,i]of Object.entries(t))N(i,e,n,o+1)}}v(N,"C"),y(N,"T"),c(N,"strings");const tt=c(t=>{const e=t.trim();if(!(!e.startsWith("{")&&!e.startsWith("[")))try{return JSON.parse(e)}catch{return}},"parseJson");function et(t){const e=t.answer,r=[],o=c((n,i)=>{const u=b(n);u.length>=pt&&r.push({key:u,text:normText(n),...i?{what:i}:{}})},"add");e.text!==void 0&&o(e.text),e.json!==void 0&&(e.text===void 0&&o(JSON.stringify(e.json)),N(e.json,(n,i)=>{n.trim().length>=gt&&o(n,i?`its \xAB${i}\xBB`:void 0)}));for(const n of e.toolCalls){const i=n.tool||yt(n.name);o(n.arguments,`its call of ${i}`),N(tt(n.arguments),(u,h)=>{u.trim().length>=gt&&o(u,h?`${i}\u2019s \xAB${h}\xBB`:`its call of ${i}`)})}return r}v(et,"gt"),y(et,"_e"),c(et,"answerKeys");function nt(t){const e=[],r=new Set,o=c((h,w,x)=>{if(e.length>=Jt||r.has(h))return;r.add(h);const A={text:h,e:t,...w?{what:w}:{},...x?{parent:x}:{}};return e.push(A),A},"push"),n=c((h,w,x,A)=>{const[B,...R]=A;if(B)for(const z of h.split(B)){const q=normText(z);if(q.length<qt||q===x?.text)continue;const U=o(q,w,x)??x;q.length>mt&&n(z,w,U,R)}},"pieces"),i=c((h,w)=>{const x=normText(h);if(x.length<wt)return;const A=o(x,w);x.length>mt&&n(h,w,A,[/\n\s*\n/,/\n/,/(?<=[.!?:;])\s+/])},"text"),u=t.call.answer;u.json!==void 0?N(u.json,(h,w)=>i(h,w?`its \xAB${w}\xBB`:void 0)):u.text!==void 0&&i(u.text);for(const h of u.toolCalls){const w=h.tool||yt(h.name),x=tt(h.arguments);x!==void 0?N(x,(A,B)=>i(A,B?`${w}\u2019s \xAB${B}\xBB`:`its call of ${w}`)):i(h.arguments,`its call of ${w}`)}return e}v(nt,"wt"),y(nt,"je"),c(nt,"passagesOf");function st(t){const e=[];let r=Ct;const o=c(n=>{if(r<=0||!n)return;const i=n.length>r?n.slice(0,r):n;r-=i.length,e.push(i)},"take");for(const n of t.system)o(n.text);for(const n of t.turns)n.kind==="tool"?(o(n.arguments),o(n.output??"")):o(n.text??"");return e}v(st,"mt"),y(st,"Te"),c(st,"inputTexts");function C(t,e){const r=e.ref;if("system"in r)return t.system[r.system]?.text??"";if("tools"in r)return t.tools.map(o=>JSON.stringify({name:o.name,description:o.description,parameters:o.parameters})).join(`
|
|
2
|
+
`);if("schema"in r)return t.answer.format?.schema!==void 0?JSON.stringify(t.answer.format.schema):"";if("turn"in r){const o=t.turns[r.turn];return o?o.kind==="tool"?`${o.name}(${o.arguments})${o.output!==void 0?`
|
|
3
|
+
${o.output}`:""}`:o.text??"":""}return""}v(C,"_"),y(C,"K"),c(C,"partText");export const aiPartText=c((t,e)=>C(t,e),"aiPartText"),aiSectionTexts=c((t,e)=>W(t,e,C(t,e)),"aiSectionTexts");function ot(t){const e=tt(t);if(e===void 0)return[];const r=e&&typeof e=="object"&&!Array.isArray(e)?e.properties:void 0,o=r&&typeof r=="object"&&!Array.isArray(r)?r:e;return(Array.isArray(o)?o:o&&typeof o=="object"?Object.values(o):[]).map(n=>typeof n=="string"?n:JSON.stringify(n,null,2)??"")}v(ot,"$t"),y(ot,"Ee"),c(ot,"jsonMemberTexts");function W(t,e,r){if(e.kind==="tools")return t.tools.map(n=>JSON.stringify({d:n.description,p:n.parameters}));let o;return e.sections.map((n,i)=>n.at!==void 0&&n.end!==void 0?r.slice(n.at,n.end):(o??=ot(r),o[i]??""))}v(W,"z"),y(W,"B"),c(W,"sectionTexts");function _(t){const e=new Map;return t.sections.map(r=>{const o=e.get(r.title)??0;return e.set(r.title,o+1),`${r.title}#${o}`})}v(_,"E"),y(_,"F"),c(_,"titled");function G(t){return t?t.kind==="tool"?`tool
|
|
4
4
|
${t.name}
|
|
5
|
-
${
|
|
6
|
-
${
|
|
7
|
-
${
|
|
8
|
-
${
|
|
9
|
-
${
|
|
10
|
-
`):-1,
|
|
5
|
+
${b(t.arguments)}
|
|
6
|
+
${b(t.output??"")}`:t.kind==="reasoning"?`reasoning
|
|
7
|
+
${b(t.text??"")}`:`${t.role}
|
|
8
|
+
${b(t.text)}`:""}v(G,"X"),y(G,"le"),c(G,"turnKey");const Kt=new Set(["system","tools","schema","context"]),xt=new Set(["history","tool","turn"]);function Q(t){const e=new Map,r=new Map;for(const o of t){if(!Kt.has(o.kind))continue;const n=`${o.kind}:${o.role??""}`,i=e.get(n)??0;e.set(n,i+1),r.set(o,`${n}#${i}`)}return r}v(Q,"Y"),y(Q,"pe"),c(Q,"structureKeys");const kt=c(t=>t.toLocaleString("en-US"),"fmt"),V=c(t=>t.k===1?"the call before":`${t.k} calls earlier`,"ago"),E=c(t=>({id:t.row.id,agent:t.row.agent.name,...t.row.step!==void 0?{step:t.row.step}:{},at:t.row.at,service:t.row.service}),"fromOf"),bt={answer:6,"tool-output":6,quoted:5,carried:4,changed:3,unchanged:2,new:1};function rt(t,e){const r=e.filter(n=>n.row.agent.key===t.agent.key),o=[["thread",t.thread?n=>n.thread?.key===t.thread.key:void 0],["run",n=>n.run.key===t.run.key],["flow",t.flowId?n=>n.flowId===t.flowId:void 0],["request",t.requestId?n=>n.requestId===t.requestId:void 0]];for(const[n,i]of o)if(i){for(let u=r.length-1;u>=0;u--)if(i(r[u].row))return{e:r[u],by:n}}}v(rt,"kt"),y(rt,"We"),c(rt,"previousOf");export function aiOriginsOf(t,e,r){const o=r.filter(s=>s.row.id!==e.id&&s.row.at<=e.at).sort((s,a)=>s.row.at-a.row.at||s.row.id.localeCompare(a.row.id)),n=o.map((s,a)=>({row:s.row,call:s.call,k:o.length-a})),i=rt(e,n),u={compared:n.length,...i?{previous:{id:i.e.row.id,at:i.e.row.at,by:i.by}}:{},items:[]};if(!n.length)return u;const h=new Map,w=new zt;for(const s of n){for(const a of et(s.call)){const d=h.get(a.key);d?d.push({...a,e:s}):h.set(a.key,[{...a,e:s}])}for(const a of nt(s))w.add(a)}const x=new Map,A=new Map,B=c((s,a)=>{const d=`${s.k}
|
|
9
|
+
${a}`;let m=A.get(d);if(m===void 0){let l=x.get(s);l||x.set(s,l=st(s.call).map(normText)),m=l.some(f=>f.includes(a)),A.set(d,m)}return m},"given"),R=c((s,...a)=>{for(const d of a){if(d===void 0)continue;const m=b(d),l=m.length>=pt?h.get(m):void 0;for(let f=(l?.length??0)-1;f>=0;f--){const k=l[f];if(s||!B(k.e,k.text))return{e:k.e,...k.what?{what:k.what}:{}}}}},"answerOf"),z=c((s,a=!1)=>{if(!w.size)return;const d=new Set;if(w.find(normText(s),f=>d.add(f)),!a)for(const f of d)B(f.e,f.text)&&d.delete(f);if(!d.size)return;const m=new Map;for(const f of d){let k=f.parent;for(;k&&!d.has(k);)k=k.parent;if(k)continue;const M=m.get(f.e)??{e:f.e,n:0,what:new Set};M.n++,f.what&&M.what.add(f.what),m.set(f.e,M)}let l;for(const f of m.values())(!l||f.n>l.n||f.n===l.n&&f.e.k<l.e.k)&&(l=f);return l},"quoteIn"),q=c(s=>({how:"answer",from:E(s.e),said:`the answer of ${s.e.row.agent.name}${s.what?` (${s.what})`:""}, ${V(s.e)}`}),"answered"),U=c(s=>({how:"quoted",from:E(s.e),passages:s.n,said:`quotes ${s.n===1?"a passage":`${s.n} passages`} of ${s.e.row.agent.name}\u2019s answer${s.what.size===1?` (${[...s.what][0]})`:""}, ${V(s.e)}`}),"quoted"),at=ht(t);let Z,it=[];if(i){const s=ht(i.e.call);Z=new Map;for(const[a,d]of Q(s.parts))Z.set(d,{part:a,text:C(i.e.call,a)});it=s.parts.filter(a=>xt.has(a.kind)&&"turn"in a.ref).map(a=>G(i.e.call.turns[a.ref.turn]))}const Ot=c(s=>{const a=Z?.get(s);if(a){if(!a.sections){const d=W(i.e.call,a.part,a.text);a.sections=new Map(_(a.part).map((m,l)=>[m,{text:d[l]??"",canon:b(d[l]??"")}]))}return a.sections}},"prevSections"),St=i?`the previous call of this ${i.by}`:"",I=i?E(i.e):void 0,ct=c((s,a)=>`changed since the previous call \u2014 ${kt(s)} \u2192 ${kt(a)} chars`,"changedSaid"),At=Q(at.parts),lt=[...n].reverse();let ft=0;return at.parts.forEach((s,a)=>{if(s.kind==="carried"){const p=e.previousResponseId??t.settings.find(g=>g.name==="continues response")?.value,$=p?lt.find(g=>(g.row.responseId??g.call.responseId)===p):void 0;$&&u.items.push({part:a,how:"carried",from:E($),said:`the conversation of ${$.row.agent.name}\u2019s response it continues, ${V($)} \u2014 held by the provider, not sent again`});return}const d=C(t,s),m="turn"in s.ref?t.turns[s.ref.turn]:void 0;let l,f;const k=At.get(s);if(i&&k){const p=Z.get(k);p?b(p.text)===b(d)?l={part:a,how:"unchanged",from:I,said:`unchanged since ${St}`}:(l={part:a,how:"changed",from:I,said:ct(p.text.length,d.length),chars:{before:p.text.length,after:d.length}},f=Ot(k)):l={part:a,how:"new",from:I,said:"new since the previous call"}}else if(i&&xt.has(s.kind)){const p=G(m),$=it.indexOf(p,ft);$>=0?(ft=$+1,l={part:a,how:"carried",from:I,said:"carried from the previous call"}):l={part:a,how:"new",from:I,said:"new since the previous call"}}const M=l&&l.how!=="carried"?l.how:l?"unchanged":void 0;let O;if(m?.kind==="tool"&&m.callId){const p=m.callId,$=lt.find(g=>g.row.callIds?.includes(p)||g.call.answer.toolCalls.some(S=>S.callId===p));if($){const g=$.row.step!==void 0&&$.row.run.key===e.run.key?`called in step ${$.row.step}`:`called by ${$.row.agent.name}, ${V($)}`;O={part:a,how:"tool-output",from:E($),said:`returned by tool ${m.tool} (${g})`}}}const F=m?.kind==="message"&&m.role==="assistant";if(!O){const p=R(F,m?.kind==="tool"?m.output:d);p&&(O={part:a,...q(p)})}const X=O?void 0:z(d,F);X&&(O={part:a,...U(X)}),O&&M&&(O.since=M),O&&l?.chars&&(O.chars=l.chars);const J=O&&(!l||bt[O.how]>=bt[l.how])?O:l;if(J&&f&&J.how==="changed"){const p=new Set(_(s)),$=[...f.keys()].filter(j=>!p.has(j)).map(j=>j.replace(/#\d+$/,"")),g={changed:0,new:0},S=W(t,s,d);_(s).forEach((j,H)=>{const T=f.get(j);T?T.canon!==b(S[H]??"")&&g.changed++:g.new++});const K=[g.changed?`${g.changed} of ${s.sections.length} sections changed`:"",g.new?`${g.new} new`:"",$.length?`${$.length} gone (${$.slice(0,3).map(j=>`\xAB${j}\xBB`).join(", ")}${$.length>3?", \u2026":""})`:""].filter(Boolean);K.length&&(J.said+=`: ${K.join(", ")}`)}if(J&&u.items.push(J),!s.sections.length||J?.how==="answer"||J?.how==="tool-output")return;const jt=W(t,s,d),Bt=_(s),It=!!X;s.sections.forEach((p,$)=>{const g=jt[$]??"";if(!g)return;let S;if(f){const L=f.get(Bt[$]);L?L.canon===b(g)?S={part:a,section:p.title,how:"unchanged",from:I,said:"unchanged since the previous call"}:S={part:a,section:p.title,how:"changed",from:I,said:ct(L.text.length,g.length),chars:{before:L.text.length,after:g.length}}:S={part:a,section:p.title,how:"new",from:I,said:"new since the previous call"}}const K=p.at!==void 0&&p.title!=="(opening)"?g.indexOf(`
|
|
10
|
+
`):-1,j=R(F,g,K>0?g.slice(K+1):void 0),H=j?void 0:It?z(g,F):void 0,T=j?{part:a,section:p.title,...q(j)}:H?{part:a,section:p.title,...U(H)}:void 0,ut=S?S.how:M!=="changed"?M:void 0;T&&ut&&(T.since=ut),T&&S?.chars&&(T.chars=S.chars);const dt=T??S;dt&&u.items.push(dt)})}),u}v(aiOriginsOf,"aiOriginsOf"),y(aiOriginsOf,"aiOriginsOf"),c(aiOriginsOf,"aiOriginsOf");
|
package/lib/bounded-clone.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var T=Object.defineProperty;var
|
|
1
|
+
"use strict";var T=Object.defineProperty;var c=(t,e)=>T(t,"name",{value:e,configurable:!0});var h=Object.defineProperty,l=c((t,e)=>h(t,"name",{value:e,configurable:!0}),"i"),_=Object.defineProperty,y=l((t,e)=>_(t,"name",{value:e,configurable:!0}),"_");export const DEFAULT_RAW_BYTE_LIMIT=32768,DEFAULT_MAX_STRING_BYTES=4096,DEFAULT_MAX_ARRAY_ITEMS=64,DEFAULT_MAX_DEPTH=12,CHEAP_ENTRY_BYTES=512,NOMINAL_DEEP_BYTES=32,DEEP_REPORT_DEPTH=64,SKELETON_STRING_BYTES=256,MAX_RECORDED_PATHS=20,TRUNCATION_MARKER_KEY="__lensmcpTruncation",TRUNCATED_VALUE_KEY="__lensmcpTruncated";export function estimateJsonBytes(t,e=Number.POSITIVE_INFINITY,n=12){return g(t,e,n,32)}c(estimateJsonBytes,"estimateJsonBytes"),l(estimateJsonBytes,"estimateJsonBytes"),y(estimateJsonBytes,"estimateJsonBytes");export function exceedsJsonByteBudget(t,e,n=12){return g(t,e,n,Number.POSITIVE_INFINITY)>e}c(exceedsJsonByteBudget,"exceedsJsonByteBudget"),l(exceedsJsonByteBudget,"exceedsJsonByteBudget"),y(exceedsJsonByteBudget,"exceedsJsonByteBudget");function g(t,e,n,a){switch(typeof t){case"undefined":case"function":case"symbol":return 0;case"boolean":return 5;case"number":return Number.isFinite(t)?8:4;case"bigint":return 20;case"string":return t.length+2;default:break}if(t===null)return 4;if(n<=0)return a;if(t instanceof Date)return 26;if(Array.isArray(t)){let r=2;for(let u=0;u<t.length;u++)if(r+=g(t[u],e-r,n-1,a)+1,r>e)return r;return r}let s=2;const o=t;for(const r in o){if(!Object.prototype.hasOwnProperty.call(o,r))continue;const u=g(o[r],e-s,n-1,a);if(u!==0&&(s+=r.length+4+u,s>e))return s}return s}c(g,"y"),l(g,"T"),y(g,"walk");function f(t,e){t.truncatedAnything=!0,t.paths.length<20&&t.paths.push(e||"<root>")}c(f,"g"),l(f,"A"),y(f,"record");function p(t,e,n){return f(t,n),{[TRUNCATED_VALUE_KEY]:!0,originalBytes:estimateJsonBytes(e,Number.POSITIVE_INFINITY,64)}}c(p,"f"),l(p,"I"),y(p,"stub");function m(t){if(t===null)return!0;const e=typeof t;return e==="number"||e==="boolean"||e==="string"||e==="bigint"}c(m,"p"),l(m,"y"),y(m,"isScalar");export function clampValue(t,e,n,a){if(typeof t=="string"){const s=e.budget<=0?256:e.maxStringBytes;if(t.length+2<=s)return e.budget-=t.length+2,t;const o=Math.max(0,s-64);return f(e,a),e.budget-=o,`${t.slice(0,o)}\u2026[lensmcp truncated: ${t.length-o} more chars]`}return t===null||typeof t!="object"?(e.budget-=g(t,Number.POSITIVE_INFINITY,1,32),t):n<=0?p(e,t,a):t instanceof Date?(e.budget-=26,t):Array.isArray(t)?b(t,e,n,a):d(t,e,n,a)}c(clampValue,"clampValue"),l(clampValue,"clampValue"),y(clampValue,"clampValue");function b(t,e,n,a){const s=[],o=Math.min(t.length,e.maxArrayItems);for(let r=0;r<o&&!(e.budget<=0);r++)s.push(clampValue(t[r],e,n-1,`${a}[${r}]`));return s.length<t.length&&f(e,`${a}[] (+${t.length-s.length} items dropped)`),s}c(b,"m"),l(b,"f"),y(b,"clampArray");function d(t,e,n,a){const s={};let o;const r=e.budget<=0;for(const u in t){if(!Object.prototype.hasOwnProperty.call(t,u))continue;const i=t[u],I=g(i,512,n-1,Number.POSITIVE_INFINITY);if(I<=512&&(!r||m(i))){s[u]=i,e.budget-=u.length+4+I;continue}(o??=[]).push({key:u,bytes:I})}if(!o)return s;o.sort((u,i)=>u.bytes===i.bytes?0:u.bytes<i.bytes?-1:1);for(const{key:u}of o){const i=a?`${a}.${u}`:u;s[u]=clampValue(t[u],e,n-1,i)}return s}c(d,"b"),l(d,"m"),y(d,"clampObject");export function boundedClone(t,e={}){const n=e.rawByteLimit??32768,a=e.maxDepth??12;if(n<=0)return{value:void 0,truncated:!1,originalBytes:0,keptBytes:0,paths:[]};if(t==null)return{value:t,truncated:!1,originalBytes:0,keptBytes:0,paths:[]};if(!exceedsJsonByteBudget(t,n,a)){const i=estimateJsonBytes(t,n,a),I={budget:n,maxStringBytes:e.maxStringBytes??4096,maxArrayItems:e.maxArrayItems??64,paths:[],truncatedAnything:!1};return{value:clampValue(t,I,a,""),truncated:!1,originalBytes:i,keptBytes:i,paths:[]}}const s=estimateJsonBytes(t,Number.POSITIVE_INFINITY,64),o={budget:n,maxStringBytes:e.maxStringBytes??4096,maxArrayItems:e.maxArrayItems??64,paths:[],truncatedAnything:!1},r=clampValue(t,o,a,""),u=estimateJsonBytes(r,Number.POSITIVE_INFINITY,a);if(o.truncatedAnything&&r!==null&&typeof r=="object"&&!Array.isArray(r)){const i={truncated:!0,originalBytes:s,keptBytes:u,paths:o.paths};r[TRUNCATION_MARKER_KEY]=i}return{value:r,truncated:o.truncatedAnything,originalBytes:s,keptBytes:u,paths:o.paths}}c(boundedClone,"boundedClone"),l(boundedClone,"boundedClone"),y(boundedClone,"boundedClone");
|
package/lib/bounded-map.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var i=Object.defineProperty;var t=(e,a)=>i(e,"name",{value:a,configurable:!0});var p=Object.defineProperty,o=t((e,a)=>p(e,"name",{value:a,configurable:!0}),"t"),s=Object.defineProperty,u=o((e,a)=>s(e,"name",{value:a,configurable:!0}),"o");export function capMap(e,a){if(e.size<=a)return 0;let r=0;const c=e.keys();for(;e.size>a;){const n=c.next();if(n.done)break;e.delete(n.value)&&(r+=1)}return r}t(capMap,"capMap"),o(capMap,"capMap"),u(capMap,"capMap");export const MAX_PRODUCER_KEYS=256;
|
package/lib/bounded-writer.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var m=Object.defineProperty;var r=(t,e)=>m(t,"name",{value:e,configurable:!0});var f=Object.defineProperty,o=r((t,e)=>f(t,"name",{value:e,configurable:!0}),"r"),x=Object.defineProperty,s=o((t,e)=>x(t,"name",{value:e,configurable:!0}),"c");import{renameSync as v,statSync as M,unlinkSync as E}from"node:fs";export function eventMaxBytes(t=process.env){const e=Number(t.LENSMCP_EVENT_MAX_BYTES);return Number.isFinite(e)&&e>0?e:50*1024*1024}r(eventMaxBytes,"eventMaxBytes"),o(eventMaxBytes,"eventMaxBytes"),s(eventMaxBytes,"eventMaxBytes");export function eventMaxFiles(t=process.env){const e=Number(t.LENSMCP_EVENT_MAX_FILES);return Number.isFinite(e)&&e>=1&&e<=20?Math.floor(e):5}r(eventMaxFiles,"eventMaxFiles"),o(eventMaxFiles,"eventMaxFiles"),s(eventMaxFiles,"eventMaxFiles");const b=1024*1024,a=new Map;export function maybeRotateEventFile(t,e,c){const i=(a.get(t)??0)+e,l=c?.maxBytes??eventMaxBytes(),u=c?.maxFiles??eventMaxFiles(),y=Math.min(b,l);if(i<y){a.set(t,i);return}try{const n=M(t).size;if(a.set(t,0),n<=l)return}catch{a.set(t,i);return}try{E(`${t}.${u}`)}catch{}for(let n=u-1;n>=1;n--)try{v(`${t}.${n}`,`${t}.${n+1}`)}catch{}try{v(t,`${t}.1`)}catch{}}r(maybeRotateEventFile,"maybeRotateEventFile"),o(maybeRotateEventFile,"maybeRotateEventFile"),s(maybeRotateEventFile,"maybeRotateEventFile");export function resetRotationThrottle(t){t===void 0?a.clear():a.delete(t)}r(resetRotationThrottle,"resetRotationThrottle"),o(resetRotationThrottle,"resetRotationThrottle"),s(resetRotationThrottle,"resetRotationThrottle");
|
package/lib/capture-demand.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var s=Object.defineProperty;var a=(r,e)=>s(r,"name",{value:e,configurable:!0});var p=Object.defineProperty,c=a((r,e)=>p(r,"name",{value:e,configurable:!0}),"o"),u=Object.defineProperty,E=c((r,e)=>u(r,"name",{value:e,configurable:!0}),"s");export const CAPTURE_REQUEST_FILENAME="capture-request.json",CAPTURE_PRESENCE_FILENAME="capture-runner.json";export function appMatchesPage(r,e){const t=r.trim().toLowerCase();if(!t)return!1;if(e.project&&e.project.toLowerCase()===t)return!0;const o=e.url.toLowerCase();if(o===t||o.replace(/\/+$/,"")===t.replace(/\/+$/,""))return!0;try{const n=new URL(e.url);return/^\d+$/.test(t)?n.port===t:n.origin.toLowerCase()===t.replace(/\/+$/,"")}catch{return!1}}a(appMatchesPage,"appMatchesPage"),c(appMatchesPage,"appMatchesPage"),E(appMatchesPage,"appMatchesPage");export const CAPTURE_RULES_FILENAME="capture-rules.json";
|
package/lib/error-dismissal.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var E=Object.defineProperty;var s=(e,r)=>E(e,"name",{value:r,configurable:!0});var m=Object.defineProperty,c=s((e,r)=>m(e,"name",{value:r,configurable:!0}),"s"),p=Object.defineProperty,l=c((e,r)=>p(e,"name",{value:r,configurable:!0}),"s");export const ERROR_DISMISSED="error-dismissed",ERROR_RESTORED="error-restored",LENS_EVENT_SOURCE="lens",MAX_DISMISSAL_EVENT_IDS=200;const y=2048;export const MAX_DISMISSAL_REASON_CHARS=500;const b=300,I=new Set(["dashboard","cli","agent"]);export function readErrorDismissal(e){if(e.source!==LENS_EVENT_SOURCE||!e.raw||typeof e.raw!="object")return;const r=e.raw,i=r.groupId;if(typeof i!="string"||i.length===0||i.length>2048)return;if(r.kind===ERROR_RESTORED)return{kind:ERROR_RESTORED,groupId:i};if(r.kind!==ERROR_DISMISSED)return;const n=r.until;if(typeof n!="number"||!Number.isFinite(n))return;const f=Array.isArray(r.eventIds)?r.eventIds.filter(t=>typeof t=="string"&&t.length>0).slice(0,200):[],o=I.has(r.by)?r.by:void 0,a=l((t,S)=>typeof t=="string"&&t.trim()?t.trim().slice(0,S):void 0,"text"),d=a(r.reason,500),u=a(r.title,300);return{kind:ERROR_DISMISSED,groupId:i,until:Math.min(n,e.timestamp),eventIds:f,...o?{by:o}:{},...d?{reason:d}:{},...u?{title:u}:{}}}s(readErrorDismissal,"readErrorDismissal"),c(readErrorDismissal,"readErrorDismissal"),l(readErrorDismissal,"readErrorDismissal");
|
package/lib/event-loop.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var s=Object.defineProperty;var r=(e,t)=>s(e,"name",{value:t,configurable:!0});var u=Object.defineProperty,o=r((e,t)=>u(e,"name",{value:t,configurable:!0}),"r"),c=Object.defineProperty,i=o((e,t)=>c(e,"name",{value:t,configurable:!0}),"e");export const LOOP_STARTUP_MS=6e4;export function loopStartedAt(e){if(!e.startsWith("node:"))return;const t=Number(e.slice(e.lastIndexOf(":")+1));return Number.isFinite(t)&&t>0?t:void 0}r(loopStartedAt,"loopStartedAt"),o(loopStartedAt,"loopStartedAt"),i(loopStartedAt,"loopStartedAt");export function loopPhaseAt(e,t){const n=loopStartedAt(e);if(n===void 0)return;const a=Math.max(0,Math.round(t-n));return{phase:a<6e4?"startup":"running",sinceStartMs:a}}r(loopPhaseAt,"loopPhaseAt"),o(loopPhaseAt,"loopPhaseAt"),i(loopPhaseAt,"loopPhaseAt");
|
package/lib/flood-guard.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var S=Object.defineProperty;var i=(t,
|
|
1
|
+
"use strict";var S=Object.defineProperty;var i=(t,s)=>S(t,"name",{value:s,configurable:!0});var A=Object.defineProperty,f=i((t,s)=>A(t,"name",{value:s,configurable:!0}),"i"),k=Object.defineProperty,u=f((t,s)=>k(t,"name",{value:s,configurable:!0}),"o");function l(){const t=typeof process<"u"?process.env?.LENSMCP_EVENT_MAX_EPS:void 0;if(t===void 0||t==="")return;if(t==="off")return"off";const s=Number(t);if(Number.isFinite(s))return s<=0?"off":s}i(l,"d"),f(l,"S"),u(l,"envPerSec");export function createEventFloodGuard(t){const s=t?.envOverride===!1?void 0:l();if(s==="off")return{admit:u(()=>({ok:!0,suppressed:0}),"admit")};const c=s??t?.perSec??5,d=Math.max(1,t?.burst??Math.max(30,c*4)),p=t?.maxKeys??2048,n=new Map,v=u(o=>{for(const[r,e]of n)o-e.lastSeenAt>6e4&&n.delete(r);if(n.size>p){const r=[...n.entries()].sort((e,a)=>e[1].lastSeenAt-a[1].lastSeenAt);for(let e=0;e<r.length>>1;e++)n.delete(r[e][0])}},"evictStale");return{admit(o){const r=Date.now();let e=n.get(o);e||(n.size>=p&&v(r),e={tokens:d,lastRefillAt:r,suppressed:0,lastSeenAt:r},n.set(o,e)),e.lastSeenAt=r;const a=r-e.lastRefillAt;if(a>0&&(e.tokens=Math.min(d,e.tokens+a/1e3*c),e.lastRefillAt=r),e.tokens>=1){e.tokens-=1;const m=e.suppressed;return e.suppressed=0,{ok:!0,suppressed:m}}return e.suppressed+=1,{ok:!1,suppressed:0}}}}i(createEventFloodGuard,"createEventFloodGuard"),f(createEventFloodGuard,"createEventFloodGuard"),u(createEventFloodGuard,"createEventFloodGuard");
|
package/lib/log-query.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var L=Object.defineProperty;var a=(e,t)=>L(e,"name",{value:t,configurable:!0});var d=Object.defineProperty,c=a((e,t)=>d(e,"name",{value:t,configurable:!0}),"a"),h=Object.defineProperty,u=c((e,t)=>h(e,"name",{value:t,configurable:!0}),"c");const p={level:"level",severity:"level",service:"service",svc:"service",src:"service",source:"service",flow:"flow",trace:"trace",request:"trace",category:"category",cat:"category",ms:"ms"},C={warn:"warning",err:"error"},k=/(-?)(?:([A-Za-z]+):)?(?:"([^"]*)"|(\S+))/g;export function parseLogQuery(e){const t=[],r=[];for(const s of e.matchAll(k)){const[o,n,g,y,w]=s,i=(y??w??"").trim(),l=g?p[g.toLowerCase()]:void 0;if(l&&i){const m=l==="level"?C[i.toLowerCase()]??i.toLowerCase():i;t.push({key:l,value:m,negate:n==="-"})}else o.trim()&&r.push(o.trim())}return{tokens:t,text:r.join(" ")}}a(parseLogQuery,"parseLogQuery"),c(parseLogQuery,"parseLogQuery"),u(parseLogQuery,"parseLogQuery");export function formatLogQuery(e){const t=u(r=>/\s/.test(r)?`"${r}"`:r,"quote");return[...e.tokens.map(r=>`${r.negate?"-":""}${r.key}:${t(r.value)}`),e.text].filter(Boolean).join(" ")}a(formatLogQuery,"formatLogQuery"),c(formatLogQuery,"formatLogQuery"),u(formatLogQuery,"formatLogQuery");function v(e,t){if(e===void 0)return!1;const r=/^(>=|<=|>|<|=)?\s*(\d+(?:\.\d+)?)$/.exec(t);if(!r)return!1;const s=Number(r[2]);switch(r[1]){case">":return e>s;case"<":return e<s;case"<=":return e<=s;case"=":return e===s;default:return e>=s}}a(v,"v"),c(v,"h"),u(v,"msMatches");function f(e,t){const r=t.value.toLowerCase();switch(t.key){case"level":return e.severity.toLowerCase()===r;case"service":return e.source.toLowerCase()===r;case"flow":return!!e.flowId&&e.flowId.toLowerCase().startsWith(r);case"trace":return!!e.requestId&&e.requestId.toLowerCase().startsWith(r);case"category":return e.category.toLowerCase()===r;case"ms":return v(e.durationMs,t.value)}}a(f,"l"),c(f,"i"),u(f,"tokenMatches");export function matchesLogQuery(e,t,r){const s=new Map;for(const o of t.tokens){if(o.negate){if(f(e,o))return!1;continue}const n=s.get(o.key);n?n.push(o):s.set(o.key,[o])}for(const o of s.values())if(!o.some(n=>f(e,n)))return!1;if(t.text){const o=`${e.title} ${e.message??""} ${e.source} ${e.flowId??""}`;return r?r(o):o.toLowerCase().includes(t.text.toLowerCase())}return!0}a(matchesLogQuery,"matchesLogQuery"),c(matchesLogQuery,"matchesLogQuery"),u(matchesLogQuery,"matchesLogQuery");
|
package/lib/perf-rules.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var c=Object.defineProperty;var a=(r,e)=>c(r,"name",{value:e,configurable:!0});var l=Object.defineProperty,o=a((r,e)=>l(r,"name",{value:e,configurable:!0}),"o"),f=Object.defineProperty,p=o((r,e)=>f(r,"name",{value:e,configurable:!0}),"o");export const PERF_RULE_IDS=["bundle/heavy-barrel-import","pod/heap-budget","pod/retained-generation"],PERF_RULE_EVENT_KINDS=["perf-rule-finding","perf-rule-retracted","perf-rule-scan"],PERF_RULES_DOC="https://github.com/kiwiapps-ltd/lensmcp/blob/main/docs/lensmcp/concepts/memory-and-build-cost.mdx",PERF_RULE_DOCS={"bundle/heavy-barrel-import":`${PERF_RULES_DOC}#bundleheavy-barrel-import`,"pod/heap-budget":`${PERF_RULES_DOC}#podheap-budget`,"pod/retained-generation":`${PERF_RULES_DOC}#podretained-generation`};export function perfRuleFingerprint(r,e,n){return`perf-rule:${r}:${e}:${n}`}a(perfRuleFingerprint,"perfRuleFingerprint"),o(perfRuleFingerprint,"perfRuleFingerprint"),p(perfRuleFingerprint,"perfRuleFingerprint");export function perfRuleScanFingerprint(r,e){return`perf-rule-scan:${r}:${e}`}a(perfRuleScanFingerprint,"perfRuleScanFingerprint"),o(perfRuleScanFingerprint,"perfRuleScanFingerprint"),p(perfRuleScanFingerprint,"perfRuleScanFingerprint");const s=/^[a-z][a-z0-9-]*\/[a-z0-9][a-z0-9-]*$/,d=12,y=4e3,t=p((r,e=y)=>typeof r=="string"&&r.length>0&&r.length<=e,"isText");export function asPerfRuleRaw(r){if(!r||typeof r!="object")return;const e=r;if(!PERF_RULE_EVENT_KINDS.includes(e.kind)||typeof e.rule!="string"||!s.test(e.rule)||!t(e.project,512))return;if(e.kind==="perf-rule-scan"){const i=e.open;return!Array.isArray(i)||i.length>256||!i.every(u=>t(u,512))?void 0:r}if(!t(e.subject,512))return;if(e.kind==="perf-rule-retracted")return r;if(e.severity!=="warning"&&e.severity!=="error"||!t(e.title)||!t(e.summary)||!t(e.verify)||!t(e.docs,1024))return;const n=e.fix;if(!(!Array.isArray(n)||n.length===0||n.length>d||!n.every(i=>t(i)))&&!(!e.evidence||typeof e.evidence!="object"||Array.isArray(e.evidence))&&!(!e.cost||typeof e.cost!="object"||Array.isArray(e.cost)))return r}a(asPerfRuleRaw,"asPerfRuleRaw"),o(asPerfRuleRaw,"asPerfRuleRaw"),p(asPerfRuleRaw,"asPerfRuleRaw");
|
package/lib/pod-memory.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var n=Object.defineProperty;var o=(r,e)=>n(r,"name",{value:e,configurable:!0});var d=Object.defineProperty,t=o((r,e)=>d(r,"name",{value:e,configurable:!0}),"r"),m=Object.defineProperty,i=t((r,e)=>m(r,"name",{value:e,configurable:!0}),"r");export const POD_MEMORY_KINDS=["pod-memory","pod-memory-retained","pod-memory-released","pod-memory-exited"];export function asPodMemoryRaw(r){if(!r||typeof r!="object")return;const e=r;if(POD_MEMORY_KINDS.includes(e.kind)&&!(typeof e.project!="string"||!e.project)&&!(typeof e.pod!="number"||typeof e.pid!="number")&&!(e.kind==="pod-memory"&&(typeof e.live!="number"||!Number.isFinite(e.live)))&&!((e.kind==="pod-memory-retained"||e.kind==="pod-memory-released")&&typeof e.gen!="number"))return r}o(asPodMemoryRaw,"asPodMemoryRaw"),t(asPodMemoryRaw,"asPodMemoryRaw"),i(asPodMemoryRaw,"asPodMemoryRaw");
|
package/lib/producer-health.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var R=Object.defineProperty;var i=(e,o)=>R(e,"name",{value:o,configurable:!0});var $=Object.defineProperty,d=i((e,o)=>$(e,"name",{value:o,configurable:!0}),"i"),b=Object.defineProperty,m=d((e,o)=>b(e,"name",{value:o,configurable:!0}),"u");import{z as r}from"zod";export const ProducerStateSchema=r.enum(["none","connected"]),ProducerRunStatusSchema=r.enum(["running","clean","failing","error"]),ProducerReportSchema=r.object({id:r.string(),tool:r.string(),project:r.string().optional(),firstReportedAt:r.number().int().nonnegative(),lastReportedAt:r.number().int().nonnegative(),lastRunStatus:ProducerRunStatusSchema,lastRunDurationMs:r.number().int().nonnegative().optional(),errorCount:r.number().int().nonnegative(),warningCount:r.number().int().nonnegative().optional(),error:r.string().optional()}),ProducerHealthSchema=r.object({producer:ProducerStateSchema,producers:r.array(ProducerReportSchema),lastReportedAt:r.number().int().nonnegative().optional(),ageMs:r.number().int().nonnegative().optional(),stale:r.boolean(),detail:r.string()}),PRODUCER_STALE_AFTER_MS=10*6e4;export function summariseProducers(e){const o=e.now??Date.now(),t=[...e.producers].sort((n,h)=>h.lastReportedAt-n.lastReportedAt);if(t.length===0)return{producer:"none",producers:[],stale:!1,detail:`No ${e.domain} producer has ever reported into this session \u2014 this is NOT a clean result, nothing is watching. ${e.noProducerHint}`};const l=t[0].lastReportedAt,u=Math.max(0,o-l),p=u>PRODUCER_STALE_AFTER_MS,g=t.filter(n=>n.lastRunStatus==="failing"),s=t.filter(n=>n.lastRunStatus==="error"),a=[`${t.length} ${e.domain} producer${t.length===1?"":"s"} reporting (${t.map(n=>n.id).join(", ")}); newest report ${c(u)}.`];return s.length>0&&a.push(`${s.length} produced NO verdict (the tool itself failed): ${s.map(n=>`${n.id} \u2014 ${n.error??"unknown error"}`).join("; ")}.`),g.length>0&&a.push(`${g.length} reporting errors.`),p&&a.push(`Older than ${Math.round(PRODUCER_STALE_AFTER_MS/6e4)}m \u2014 the verdict may predate the current source.`),{producer:"connected",producers:t,lastReportedAt:l,ageMs:u,stale:p,detail:a.join(" ")}}i(summariseProducers,"summariseProducers"),d(summariseProducers,"summariseProducers"),m(summariseProducers,"summariseProducers");function c(e){return e<1e3?"just now":e<6e4?`${Math.round(e/1e3)}s ago`:e<36e5?`${Math.round(e/6e4)}m ago`:`${Math.round(e/36e5)}h ago`}i(c,"g"),d(c,"g"),m(c,"describeAge");
|
package/lib/sources.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var U=Object.defineProperty;var u=(e,r)=>U(e,"name",{value:r,configurable:!0});var v=Object.defineProperty,c=u((e,r)=>v(e,"name",{value:r,configurable:!0}),"a"),I=Object.defineProperty,n=c((e,r)=>I(e,"name",{value:r,configurable:!0}),"r");export const SOURCE_KINDS=["queue","loop","store","traffic"],SOURCE_KINDS_READ=["queue","loop","store","traffic"],sourceWireSchema=n(e=>`lensmcp.${e}/v1`,"sourceWireSchema"),QUEUE_WIRE_SCHEMA="lensmcp.queue/v1",LOOP_WIRE_SCHEMA="lensmcp.loop/v1",STORE_WIRE_SCHEMA="lensmcp.store/v1",TRAFFIC_WIRE_SCHEMA="lensmcp.traffic/v1",SOURCE_SNAPSHOT_FIELD={queue:"snapshot",loop:"loop",store:"store",traffic:"traffic"},URI_SOURCES="process://sources",SOURCE_PROVENANCE="reported",QUEUE_OLDEST_WAIT_RULE="queue/oldest-wait",QUEUE_STALLED_RULE="queue/stalled",LOOP_OVERDUE_RULE="loop/overdue",LOOP_FAILING_RULE="loop/failing",LOOP_IDLE_RULE="loop/idle-while-fed",STORE_QUOTA_RULE="store/near-quota",STORE_ERRORS_RULE="store/errors",STORE_ORPHANS_RULE="store/orphans",TRAFFIC_FAILURES_RULE="traffic/failures",TRAFFIC_LATENCY_RULE="traffic/latency",TRAFFIC_RATE_LIMITED_RULE="traffic/rate-limited",SOURCE_RULES=[QUEUE_OLDEST_WAIT_RULE,QUEUE_STALLED_RULE,LOOP_OVERDUE_RULE,LOOP_FAILING_RULE,LOOP_IDLE_RULE,STORE_QUOTA_RULE,STORE_ERRORS_RULE,STORE_ORPHANS_RULE,TRAFFIC_FAILURES_RULE,TRAFFIC_LATENCY_RULE,TRAFFIC_RATE_LIMITED_RULE],SOURCE_EVENT_KINDS=["source-poll","source-declaration","source-event"],CUSTOM_EVENT_SOURCE="custom",QUEUE_EVENTS=["enqueued","admitted","completed","failed","parked"],LOOP_EVENTS=["run-start","run-end"],LOOP_OUTCOMES=["ok","failed","skipped"],STORE_EVENTS=["write","delete","error"],TRAFFIC_EVENTS=["inbound","outbound"],TRAFFIC_OUTCOMES=["ok","failed","rate-limited"],SOURCE_PUSH_EVENTS={queue:QUEUE_EVENTS,loop:LOOP_EVENTS,store:STORE_EVENTS,traffic:TRAFFIC_EVENTS},SOURCE_PUSH_OUTCOMES={queue:[],loop:LOOP_OUTCOMES,store:[],traffic:TRAFFIC_OUTCOMES},SOURCE_POLL_STATES=["current","unreachable","refused","malformed","not-running"],SOURCE_STATES=[...SOURCE_POLL_STATES,"stale","never-polled"],SOURCE_DEFAULT_INTERVAL_SEC=10,SOURCE_MIN_INTERVAL_SEC=2,QUEUE_DEFAULT_OLDEST_WAIT_MIN=10,QUEUE_DEFAULT_STALLED_MIN=15,LOOP_DEFAULT_IDLE_MIN=10,LOOP_OVERDUE_INTERVALS=2,LOOP_FAILING_RUNS=3,SOURCE_FULL_REPORT_MS=6e4,SOURCE_HISTORY_POINTS=60,SOURCE_RUNS_KEPT=30,SOURCE_PUSHED_KEPT=20,STORE_DEFAULT_QUOTA_PCT=90,STORE_DEFAULT_ERROR_RATE_PCT=5,STORE_DEFAULT_ORPHAN_MIN=60,TRAFFIC_DEFAULT_FAILURE_PCT=5,TRAFFIC_DEFAULT_P95_MS=2e3,TRAFFIC_DEFAULT_RATE_LIMITED=1,TRAFFIC_MIN_MESSAGES=10,TRAFFIC_PUSH_WINDOW_MS=10*6e4,TRAFFIC_PUSH_CHANNELS=50,TRAFFIC_PUSH_EVENTS_PER_CHANNEL=1e3,SOURCE_MAX_GROUPS=500,SOURCE_MAX_BYTES=256*1024,SOURCE_STALE_PERIODS=3,SOURCE_STALE_MIN_MS=3e4;export function sourceStaleAfterMs(e){return Math.max(SOURCE_STALE_MIN_MS,SOURCE_STALE_PERIODS*Math.max(0,e))}u(sourceStaleAfterMs,"sourceStaleAfterMs"),c(sourceStaleAfterMs,"sourceStaleAfterMs"),n(sourceStaleAfterMs,"sourceStaleAfterMs");const i=n(e=>typeof e=="object"&&e!==null&&!Array.isArray(e),"isObj"),t=n(e=>typeof e=="number"&&Number.isInteger(e)&&e>=0,"isCount"),E=n(e=>typeof e=="number"&&Number.isFinite(e)&&e>0,"isTime"),a=n((e,r)=>typeof e=="string"&&e.length>0&&e.length<=r,"isStr"),L=n(e=>e===void 0||typeof e=="number"&&e>0,"isMin");function _(e){if(!SOURCE_KINDS_READ.includes(e.sourceKind)||typeof e.path!="string"&&!(e.path===void 0&&(e.sourceKind==="traffic"||e.sourceKind==="loop"))||!a(e.name,200)||typeof e.intervalSec!="number"||e.feeds!==void 0&&!a(e.feeds,200))return!1;const r=e.thresholds;if(!i(r))return!1;for(const o of["stalledMin","idleMin","oldestWaitMin","quotaPct","errorRatePct","orphanMin","failurePct","p95Ms","rateLimited"])if(!L(r[o]))return!1;return e.sourceKind!=="queue"||typeof r.oldestWaitMin=="number"}u(_,"_"),c(_,"l"),n(_,"asDecl");const d=n(e=>e===null||typeof e=="string","isIsoOrNull"),l=n(e=>e===void 0||t(e),"isOptCount");function f(e){if(!i(e)||typeof e.at!="string"||!E(e.receivedAt)||!E(e.intervalSec)||!d(e.lastRunAt)||e.nextRunAt!==void 0&&!d(e.nextRunAt))return!1;for(const r of["lastDurationMs","lastItems","runsInWindow","itemsInWindow","failuresInWindow","windowSec"])if(!l(e[r]))return!1;return e.lastOutcome!==void 0&&!LOOP_OUTCOMES.includes(e.lastOutcome)?!1:e.lastError===void 0||typeof e.lastError=="string"}u(f,"d"),c(f,"_"),n(f,"asLoopSnapshot");const T=n(e=>e===void 0||i(e)&&Object.values(e).every(r=>typeof r=="string"),"isLabels");function S(e){if(!i(e)||typeof e.at!="string"||!E(e.receivedAt)||!t(e.objects)||!t(e.bytes)||e.quotaBytes!==void 0&&e.quotaBytes!==null&&!t(e.quotaBytes))return!1;for(const s of["opsInWindow","writesInWindow","deletesInWindow","errorsInWindow","windowSec"])if(!l(e[s]))return!1;if(e.lastWriteAt!==void 0&&!d(e.lastWriteAt)||e.lastError!==void 0&&typeof e.lastError!="string")return!1;const r=e.truncated;if(r!==void 0&&!(i(r)&&t(r.groups)))return!1;const o=e.groups;return o===void 0?!0:Array.isArray(o)&&o.length<=SOURCE_MAX_GROUPS&&o.every(s=>i(s)&&a(s.group,1e3)&&t(s.objects)&&t(s.bytes)&&T(s.labels))}u(S,"S"),c(S,"S"),n(S,"asStoreSnapshot");function R(e){if(!i(e)||typeof e.at!="string"||!E(e.receivedAt)||!Array.isArray(e.channels)||!l(e.windowSec))return!1;const r=e.truncated;return r!==void 0&&!(i(r)&&t(r.channels))?!1:e.channels.length<=SOURCE_MAX_GROUPS&&e.channels.every(o=>{if(!i(o)||!a(o.channel,1e3)||!T(o.labels)||o.direction!==void 0&&o.direction!=="inbound"&&o.direction!=="outbound"||o.counterpart!==void 0&&!a(o.counterpart,200))return!1;for(const s of["messagesInWindow","failuresInWindow","rateLimitedInWindow"])if(!l(o[s]))return!1;return o.p95Ms!==void 0&&!(typeof o.p95Ms=="number"&&Number.isFinite(o.p95Ms)&&o.p95Ms>=0)||o.lastAt!==void 0&&!d(o.lastAt)?!1:o.lastError===void 0||typeof o.lastError=="string"})}u(R,"p"),c(R,"R"),n(R,"asTrafficSnapshot");function p(e){return i(e)&&a(e.digest,100)&&typeof e.at=="string"&&E(e.receivedAt)}u(p,"R"),c(p,"A"),n(p,"asSame");function A(e){if(!i(e)||!a(e.group,1e3)||!t(e.pending))return!1;for(const s of["inFlight","failed","completedInWindow"])if(e[s]!==void 0&&!t(e[s]))return!1;const r=e.oldestPendingAt;if(r!=null&&typeof r!="string")return!1;const o=e.labels;return o===void 0||i(o)&&Object.values(o).every(s=>typeof s=="string")}u(A,"A"),c(A,"O"),n(A,"asGroup");function O(e){if(!i(e)||typeof e.at!="string"||!E(e.receivedAt)||!Array.isArray(e.groups))return!1;const r=e.totals;if(!i(r)||!t(r.groups)||!t(r.pending)||!t(r.inFlight)||!t(r.failed))return!1;const o=e.truncated;return o!==void 0&&!(i(o)&&t(o.groups))?!1:e.groups.length<=SOURCE_MAX_GROUPS&&e.groups.every(A)}u(O,"O"),c(O,"T"),n(O,"asSnapshot");export function asSourcePollRaw(e){if(!i(e)||e.kind!=="source-poll"||!a(e.project,200)||!_(e)||!SOURCE_POLL_STATES.includes(e.state)||!E(e.polledAt)||!E(e.reportEveryMs)||e.path===void 0)return;const r=SOURCE_SNAPSHOT_FIELD[e.sourceKind];for(const s of Object.values(SOURCE_SNAPSHOT_FIELD))if(s!==r&&e[s]!==void 0)return;const o={snapshot:O,loop:f,store:S,traffic:R}[r];if(!(e[r]!==void 0&&!o(e[r]))&&!(e.same!==void 0&&(!p(e.same)||e[r]!==void 0))&&!(e.state==="current"&&e[r]===void 0&&e.same===void 0))return e}u(asSourcePollRaw,"asSourcePollRaw"),c(asSourcePollRaw,"asSourcePollRaw"),n(asSourcePollRaw,"asSourcePollRaw");export function asSourceEventRaw(e){if(!i(e)||e.kind!=="source-event"||!a(e.project,200)||!a(e.name,200))return;const r=e.sourceKind;if(SOURCE_KINDS_READ.includes(r)&&SOURCE_PUSH_EVENTS[r].includes(e.event)&&!(e.item!==void 0&&!a(e.item,200)||e.group!==void 0&&!a(e.group,200))&&!(!l(e.items)||!l(e.durationMs)||!l(e.bytes))&&!(e.outcome!==void 0&&!SOURCE_PUSH_OUTCOMES[r].includes(e.outcome))){for(const o of["object","channel","counterpart","correlation"])if(e[o]!==void 0&&!a(e[o],200))return;if(!(e.error!==void 0&&typeof e.error!="string"))return e}}u(asSourceEventRaw,"asSourceEventRaw"),c(asSourceEventRaw,"asSourceEventRaw"),n(asSourceEventRaw,"asSourceEventRaw");export function asSourceDeclarationRaw(e){if(!(!i(e)||e.kind!=="source-declaration"||!a(e.project,200))&&!(!Array.isArray(e.sources)||!e.sources.every(r=>i(r)&&_(r)))&&!(!Array.isArray(e.problems)||!e.problems.every(r=>typeof r=="string")))return e}u(asSourceDeclarationRaw,"asSourceDeclarationRaw"),c(asSourceDeclarationRaw,"asSourceDeclarationRaw"),n(asSourceDeclarationRaw,"asSourceDeclarationRaw");
|
package/lib/team.d.ts
CHANGED
|
@@ -274,6 +274,8 @@ export interface DashTeamAgentDetail extends DashTeamAgentBrief {
|
|
|
274
274
|
/** The transcript file (absolute). */
|
|
275
275
|
file?: string;
|
|
276
276
|
bytes?: number;
|
|
277
|
+
/** Too long to read whole: read from this byte on — its newest part; the counts below are of that part. */
|
|
278
|
+
readFrom?: number;
|
|
277
279
|
threadId?: string;
|
|
278
280
|
parentThreadId?: string;
|
|
279
281
|
/** How it was started: `cli`, `vscode`, `exec`, `subagent` (Codex); the entrypoint (Claude Code). */
|
|
@@ -302,7 +304,10 @@ export interface DashTeamAgentDetail extends DashTeamAgentBrief {
|
|
|
302
304
|
output: number;
|
|
303
305
|
total: number;
|
|
304
306
|
};
|
|
305
|
-
/**
|
|
307
|
+
/**
|
|
308
|
+
* Agents it spawned (Codex subagents; Claude Code subagents), newest last — when (`at`), the task name it gave
|
|
309
|
+
* (`task`) and the start of what it told the agent (`message`), when the transcript says.
|
|
310
|
+
*/
|
|
306
311
|
spawned: Array<{
|
|
307
312
|
threadId: string;
|
|
308
313
|
nickname?: string;
|
|
@@ -310,7 +315,171 @@ export interface DashTeamAgentDetail extends DashTeamAgentBrief {
|
|
|
310
315
|
sessionId?: string;
|
|
311
316
|
model?: string;
|
|
312
317
|
effort?: string;
|
|
318
|
+
at?: number;
|
|
319
|
+
task?: string;
|
|
320
|
+
message?: string;
|
|
313
321
|
}>;
|
|
314
322
|
/** Its newest lines, oldest first. */
|
|
315
323
|
tail: DashTeamAgentLine[];
|
|
316
324
|
}
|
|
325
|
+
/** `who` in a review: a session id, `user` (the person) or `lensmcp` (the team flow, the operator CLI). */
|
|
326
|
+
export type DashTeamReviewActor = string;
|
|
327
|
+
/** A task of the run: the task reviewed (depth 0) or one under it, whole — with its timings. */
|
|
328
|
+
export interface DashTeamReviewTask extends DashTeamTask {
|
|
329
|
+
/** 0: the task reviewed; 1: its children; … */
|
|
330
|
+
depth: number;
|
|
331
|
+
/** The first claim, and when it was completed or cancelled. */
|
|
332
|
+
claimedAt?: number;
|
|
333
|
+
closedAt?: number;
|
|
334
|
+
/** created → first claim; first claim → closed (or now while held) — ms. */
|
|
335
|
+
waited?: number;
|
|
336
|
+
worked?: number;
|
|
337
|
+
/** How many times it was claimed (a recovery or take-back makes a second). */
|
|
338
|
+
claims: number;
|
|
339
|
+
/** The task whose outcome the team flow made it from, and the tasks its own outcome made. */
|
|
340
|
+
handedFrom?: string;
|
|
341
|
+
handedTo?: string[];
|
|
342
|
+
}
|
|
343
|
+
/** An agent of the run: a session that worked on its tasks, or an agent one of them spawned (with or without a session). */
|
|
344
|
+
export interface DashTeamReviewAgent {
|
|
345
|
+
/** Its team session — absent: a spawned agent that never joined the team (known from its spawner's transcript). */
|
|
346
|
+
sessionId?: string;
|
|
347
|
+
/** Codex thread / Claude Code session or agent id, when its transcript is linked or its spawner named it. */
|
|
348
|
+
threadId?: string;
|
|
349
|
+
client: string;
|
|
350
|
+
name?: string;
|
|
351
|
+
nickname?: string;
|
|
352
|
+
/** Its role now, and every role it joined in the window, in order. */
|
|
353
|
+
role?: string;
|
|
354
|
+
roles: Array<{
|
|
355
|
+
role: string;
|
|
356
|
+
at: number;
|
|
357
|
+
}>;
|
|
358
|
+
/** Who it reports to (`user` or a session) and the agent whose transcript spawned it. */
|
|
359
|
+
manager?: DashTeamReviewActor;
|
|
360
|
+
spawnedBy?: DashTeamReviewActor;
|
|
361
|
+
objective?: string;
|
|
362
|
+
step?: string;
|
|
363
|
+
createdAt?: number;
|
|
364
|
+
lastSeenAt?: number;
|
|
365
|
+
/** In this run: tasks it created, claimed, completed; ms it held tasks; messages it sent and got. */
|
|
366
|
+
created: number;
|
|
367
|
+
claimed: number;
|
|
368
|
+
completed: number;
|
|
369
|
+
held: number;
|
|
370
|
+
sent: number;
|
|
371
|
+
received: number;
|
|
372
|
+
/** The tasks it claimed, by kind (`build: 2`), and the outcomes it gave. */
|
|
373
|
+
kinds: Partial<Record<DashTeamKind, number>>;
|
|
374
|
+
outcomes: Partial<Record<DashTeamOutcome, number>>;
|
|
375
|
+
/** Its own transcript, folded — `tail` left out (the zip has its lines in the window). */
|
|
376
|
+
transcript?: Omit<DashTeamAgentDetail, 'tail'>;
|
|
377
|
+
}
|
|
378
|
+
/** One thing that happened, in time order. */
|
|
379
|
+
export interface DashTeamReviewEvent {
|
|
380
|
+
at: number;
|
|
381
|
+
kind: 'task.created' | 'task.claimed' | 'task.log' | 'task.handoff' | 'task.completed' | 'task.cancelled' | 'task.recovery' | 'task.checkpoint' | 'message' | 'joined' | 'spawn' | 'model';
|
|
382
|
+
by?: DashTeamReviewActor;
|
|
383
|
+
/** The task it is about, the session or thread it went to. */
|
|
384
|
+
taskId?: string;
|
|
385
|
+
to?: string;
|
|
386
|
+
/** One line, at most 400 characters. */
|
|
387
|
+
text: string;
|
|
388
|
+
}
|
|
389
|
+
/** A message of the run: through LensMCP (agent_message — a note to all when `to` is absent) or between a client's own agents (Codex send_message). */
|
|
390
|
+
export interface DashTeamReviewMessage {
|
|
391
|
+
at: number;
|
|
392
|
+
from: DashTeamReviewActor;
|
|
393
|
+
to?: string;
|
|
394
|
+
via: 'lensmcp' | 'client';
|
|
395
|
+
kind: 'message' | 'note';
|
|
396
|
+
body: string;
|
|
397
|
+
}
|
|
398
|
+
/** Work given to someone else: a task created for a role or an agent, a hand-off, an assignment, a spawned agent, a re-route. */
|
|
399
|
+
export interface DashTeamReviewDelegation {
|
|
400
|
+
at: number;
|
|
401
|
+
kind: 'create' | 'assign' | 'handoff' | 'spawn' | 'reroute' | 'take-back' | 'cancel';
|
|
402
|
+
from: DashTeamReviewActor;
|
|
403
|
+
/** A session, a thread (spawned), or `role:<id>`. */
|
|
404
|
+
to: string;
|
|
405
|
+
taskId?: string;
|
|
406
|
+
/** For a spawn: the model and effort it was spawned with (absent: its spawner's). */
|
|
407
|
+
model?: string;
|
|
408
|
+
effort?: string;
|
|
409
|
+
text?: string;
|
|
410
|
+
}
|
|
411
|
+
/** What the run says about the process — a hint for the person reviewing it, never a verdict. */
|
|
412
|
+
export interface DashTeamReviewFlag {
|
|
413
|
+
kind: 'self-review' | 'manager-did-work' | 'same-model' | 'role-model-mismatch' | 'unjoined-agent' | 'long-wait' | 'silent-claim' | 'rework' | 'no-evidence' | 'recovery' | 'open-under-closed' | 'serial' | 'idle-agent';
|
|
414
|
+
severity: 'info' | 'warn';
|
|
415
|
+
text: string;
|
|
416
|
+
taskId?: string;
|
|
417
|
+
sessionId?: string;
|
|
418
|
+
}
|
|
419
|
+
export interface DashTeamReviewMetrics {
|
|
420
|
+
/** The window's length — ms. */
|
|
421
|
+
elapsed: number;
|
|
422
|
+
tasks: number;
|
|
423
|
+
byKind: Partial<Record<DashTeamKind, number>>;
|
|
424
|
+
byState: Partial<Record<DashTeamTaskState, number>>;
|
|
425
|
+
byOutcome: Partial<Record<DashTeamOutcome, number>>;
|
|
426
|
+
/** Agents with a session; spawned agents that never joined. */
|
|
427
|
+
agents: number;
|
|
428
|
+
unjoined: number;
|
|
429
|
+
/** The most tasks held at once, and the ms with none held while the run was open. */
|
|
430
|
+
maxParallel: number;
|
|
431
|
+
idle: number;
|
|
432
|
+
/** created → first claim, ms: the median and the longest. */
|
|
433
|
+
waitMedian?: number;
|
|
434
|
+
waitMax?: number;
|
|
435
|
+
/** changes-requested reviews, failed tests, bugs filed, recoveries, hand-offs, messages (direct and notes). */
|
|
436
|
+
rework: number;
|
|
437
|
+
failed: number;
|
|
438
|
+
bugs: number;
|
|
439
|
+
recoveries: number;
|
|
440
|
+
handoffs: number;
|
|
441
|
+
messages: number;
|
|
442
|
+
notes: number;
|
|
443
|
+
/** Summed over the agents' whole transcripts (a transcript can span more than this run). */
|
|
444
|
+
tokens?: number;
|
|
445
|
+
}
|
|
446
|
+
/** `GET /api/team/review?id=` — a task's run whole: the task, the tasks under it, its agents, the flow, messages and delegations. */
|
|
447
|
+
export interface DashTeamReview {
|
|
448
|
+
version: 1;
|
|
449
|
+
generatedAt: number;
|
|
450
|
+
repoId: string;
|
|
451
|
+
/** The task reviewed — usually a goal. */
|
|
452
|
+
taskId: string;
|
|
453
|
+
title: string;
|
|
454
|
+
/** From 5 minutes before the task was created to 5 minutes after it closed — `open`: still running, to now. */
|
|
455
|
+
window: {
|
|
456
|
+
from: number;
|
|
457
|
+
to: number;
|
|
458
|
+
open: boolean;
|
|
459
|
+
};
|
|
460
|
+
/** The task reviewed first, then the tasks under it in creation order. */
|
|
461
|
+
tasks: DashTeamReviewTask[];
|
|
462
|
+
agents: DashTeamReviewAgent[];
|
|
463
|
+
timeline: DashTeamReviewEvent[];
|
|
464
|
+
messages: DashTeamReviewMessage[];
|
|
465
|
+
delegations: DashTeamReviewDelegation[];
|
|
466
|
+
flags: DashTeamReviewFlag[];
|
|
467
|
+
metrics: DashTeamReviewMetrics;
|
|
468
|
+
/** The team as it is now: each role, its cap, model and effort; where the flow came from. */
|
|
469
|
+
team: {
|
|
470
|
+
roles: Array<{
|
|
471
|
+
id: string;
|
|
472
|
+
title: string;
|
|
473
|
+
agents?: number;
|
|
474
|
+
model?: string;
|
|
475
|
+
effort?: string;
|
|
476
|
+
}>;
|
|
477
|
+
flowFrom: string;
|
|
478
|
+
};
|
|
479
|
+
/** Items left out past a cap. */
|
|
480
|
+
truncated?: {
|
|
481
|
+
timeline?: number;
|
|
482
|
+
messages?: number;
|
|
483
|
+
tasks?: number;
|
|
484
|
+
};
|
|
485
|
+
}
|