@visulima/vis-mcp 1.0.17 → 1.0.19

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/CHANGELOG.md CHANGED
@@ -1,3 +1,23 @@
1
+ ## @visulima/vis-mcp [1.0.19](https://github.com/visulima/visulima/compare/@visulima/vis-mcp@1.0.18...@visulima/vis-mcp@1.0.19) (2026-09-03)
2
+
3
+ ### Bug Fixes
4
+
5
+ * stop vis ci, cache, preflight and inference failing silently ([#854](https://github.com/visulima/visulima/issues/854)) ([45a97b0](https://github.com/visulima/visulima/commit/45a97b02684c8336662f23a3f2cd2f7227c14692))
6
+
7
+
8
+ ### Dependencies
9
+
10
+ * **@visulima/fs:** upgraded to 6.0.6
11
+ * **@visulima/vis:** upgraded to 4.0.0
12
+
13
+ ## @visulima/vis-mcp [1.0.18](https://github.com/visulima/visulima/compare/@visulima/vis-mcp@1.0.17...@visulima/vis-mcp@1.0.18) (2026-08-19)
14
+
15
+
16
+ ### Dependencies
17
+
18
+ * **@visulima/fs:** upgraded to 6.0.5
19
+ * **@visulima/vis:** upgraded to 3.0.6
20
+
1
21
  ## @visulima/vis-mcp [1.0.17](https://github.com/visulima/visulima/compare/%40visulima%2Fvis-mcp%401.0.16...%40visulima%2Fvis-mcp%401.0.17) (2026-08-19)
2
22
 
3
23
 
package/README.md CHANGED
@@ -94,8 +94,8 @@ All tools are read-only (each is annotated `readOnlyHint: true`). The agent prep
94
94
  | `list_targets` | Flatten projects into per-target rows; optionally narrow to one project. |
95
95
  | `list_templates` | List scaffolding templates discovered in the workspace, with source and one-line description. |
96
96
  | `describe_template` | Return template metadata: description, default destination, and the variable schema for `vis generate`. |
97
- | `get_run_logs` | Read a run summary from `.task-runner/`; optionally filter to one task. |
98
- | `list_runs` | List recorded runs from `.task-runner/runs/` (newest first) with status and task counts to discover run IDs. |
97
+ | `get_run_logs` | Read a run summary from `.vis/`; optionally filter to one task. |
98
+ | `list_runs` | List recorded runs from `.vis/runs/` (newest first) with status and task counts to discover run IDs. |
99
99
  | `cache_why` | Diff a task's hash inputs against the previous run to explain a rotation. |
100
100
  | `cache_hash` | Print the recorded hash and per-input hash details for a task. |
101
101
  | `audit` | Audit installed packages for known vulnerabilities and supply-chain risk (`vis audit`). |
package/dist/bin.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import{realpathSync as t}from"node:fs";import{argv as e}from"node:process";import{fileURLToPath as o}from"node:url";import{startMcpServer as a}from"./packem_shared/createMcpServer-B0Io8ymj.js";const i=async()=>{try{await a()}catch(r){process.stderr.write(`[vis-mcp] failed to start: ${r instanceof Error?r.message:String(r)}
2
+ import{realpathSync as t}from"node:fs";import{argv as e}from"node:process";import{fileURLToPath as o}from"node:url";import{startMcpServer as a}from"./packem_shared/createMcpServer-C4LuWhpp.js";const i=async()=>{try{await a()}catch(r){process.stderr.write(`[vis-mcp] failed to start: ${r instanceof Error?r.message:String(r)}
3
3
  `),process.exit(1)}},s=(()=>{const r=e[1];if(r===void 0)return!1;try{return t(r)===t(o(import.meta.url))}catch{return!1}})();s&&await i();export{i as main};
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{execVis as t,execVisJson as o}from"./packem_shared/execVis-CInWWszP.js";import{clearListCache as i,listVisJson as p}from"./packem_shared/clearListCache-D-qeI660.js";import{errorResponse as f,okResponse as x,okStructuredResponse as a}from"./packem_shared/errorResponse-D1WOFYuT.js";import{createMcpServer as c,registerAllTools as l,startMcpServer as n}from"./packem_shared/createMcpServer-B0Io8ymj.js";import{registerAdvisoryStatus as d}from"./packem_shared/registerAdvisoryStatus-DnpRlAZ2.js";import{registerAudit as R}from"./packem_shared/registerAudit-ZskmQpJB.js";import{registerCacheHash as V}from"./packem_shared/registerCacheHash-CLFe-S23.js";import{registerCacheWhy as T}from"./packem_shared/registerCacheWhy-DBIgl8ww.js";import{registerDescribeProject as v}from"./packem_shared/registerDescribeProject-zZZrCz2G.js";import{registerDescribeTemplate as C}from"./packem_shared/registerDescribeTemplate-D1DYYNOB.js";import{registerFmt as b}from"./packem_shared/registerFmt-DYE0dqsx.js";import{registerGetRunLogs as y}from"./packem_shared/registerGetRunLogs-Em3MkMxy.js";import{registerLint as I}from"./packem_shared/registerLint-D_A4H5jb.js";import{registerListProjects as M}from"./packem_shared/registerListProjects-3dPVnYC9.js";import{registerListRuns as G}from"./packem_shared/registerListRuns-ESA88EcH.js";import{registerListTargets as O}from"./packem_shared/registerListTargets-95gAK_Bj.js";import{registerListTemplates as q}from"./packem_shared/registerListTemplates-LK8yLlVB.js";import{isSafeOptionValue as z,isSafePositional as B,isValidRunId as E,isValidTaskId as K}from"./packem_shared/isSafeOptionValue-BEUaZ7UP.js";export{i as clearListCache,c as createMcpServer,f as errorResponse,t as execVis,o as execVisJson,z as isSafeOptionValue,B as isSafePositional,E as isValidRunId,K as isValidTaskId,p as listVisJson,x as okResponse,a as okStructuredResponse,d as registerAdvisoryStatus,l as registerAllTools,R as registerAudit,V as registerCacheHash,T as registerCacheWhy,v as registerDescribeProject,C as registerDescribeTemplate,b as registerFmt,y as registerGetRunLogs,I as registerLint,M as registerListProjects,G as registerListRuns,O as registerListTargets,q as registerListTemplates,n as startMcpServer};
1
+ import{execVis as t,execVisJson as o}from"./packem_shared/execVis-CInWWszP.js";import{clearListCache as i,listVisJson as p}from"./packem_shared/clearListCache-D-qeI660.js";import{errorResponse as f,okResponse as x,okStructuredResponse as a}from"./packem_shared/errorResponse-D1WOFYuT.js";import{createMcpServer as c,registerAllTools as l,startMcpServer as n}from"./packem_shared/createMcpServer-C4LuWhpp.js";import{registerAdvisoryStatus as d}from"./packem_shared/registerAdvisoryStatus-DnpRlAZ2.js";import{registerAudit as R}from"./packem_shared/registerAudit-ZskmQpJB.js";import{registerCacheHash as V}from"./packem_shared/registerCacheHash-CLFe-S23.js";import{registerCacheWhy as T}from"./packem_shared/registerCacheWhy-DBIgl8ww.js";import{registerDescribeProject as v}from"./packem_shared/registerDescribeProject-zZZrCz2G.js";import{registerDescribeTemplate as C}from"./packem_shared/registerDescribeTemplate-D1DYYNOB.js";import{registerFmt as b}from"./packem_shared/registerFmt-DYE0dqsx.js";import{registerGetRunLogs as y}from"./packem_shared/registerGetRunLogs-CukA12J7.js";import{registerLint as I}from"./packem_shared/registerLint-D_A4H5jb.js";import{registerListProjects as M}from"./packem_shared/registerListProjects-3dPVnYC9.js";import{registerListRuns as G}from"./packem_shared/registerListRuns-BoZ7DRKb.js";import{registerListTargets as O}from"./packem_shared/registerListTargets-95gAK_Bj.js";import{registerListTemplates as q}from"./packem_shared/registerListTemplates-LK8yLlVB.js";import{isSafeOptionValue as z,isSafePositional as B,isValidRunId as E,isValidTaskId as K}from"./packem_shared/isSafeOptionValue-BEUaZ7UP.js";export{i as clearListCache,c as createMcpServer,f as errorResponse,t as execVis,o as execVisJson,z as isSafeOptionValue,B as isSafePositional,E as isValidRunId,K as isValidTaskId,p as listVisJson,x as okResponse,a as okStructuredResponse,d as registerAdvisoryStatus,l as registerAllTools,R as registerAudit,V as registerCacheHash,T as registerCacheWhy,v as registerDescribeProject,C as registerDescribeTemplate,b as registerFmt,y as registerGetRunLogs,I as registerLint,M as registerListProjects,G as registerListRuns,O as registerListTargets,q as registerListTemplates,n as startMcpServer};
@@ -1,4 +1,4 @@
1
- import"./execVis-CInWWszP.js";import"./clearListCache-D-qeI660.js";import"./errorResponse-D1WOFYuT.js";import{readFile as g}from"node:fs/promises";import{createRequire as l}from"node:module";import{resolve as u,dirname as v}from"node:path";import{pathToFileURL as d,fileURLToPath as h}from"node:url";import{McpServer as b}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as w}from"@modelcontextprotocol/sdk/server/stdio.js";import{findUp as N}from"@visulima/fs";import{registerAdvisoryStatus as I}from"./registerAdvisoryStatus-DnpRlAZ2.js";import{registerAudit as S}from"./registerAudit-ZskmQpJB.js";import{registerCacheHash as y}from"./registerCacheHash-CLFe-S23.js";import{registerCacheWhy as k}from"./registerCacheWhy-DBIgl8ww.js";import{registerDescribeProject as P}from"./registerDescribeProject-zZZrCz2G.js";import{registerDescribeTemplate as R}from"./registerDescribeTemplate-D1DYYNOB.js";import{registerFmt as V}from"./registerFmt-DYE0dqsx.js";import{registerGetRunLogs as _}from"./registerGetRunLogs-Em3MkMxy.js";import{registerLint as L}from"./registerLint-D_A4H5jb.js";import{registerListProjects as C}from"./registerListProjects-3dPVnYC9.js";import{registerListRuns as T}from"./registerListRuns-ESA88EcH.js";import{registerListTargets as j}from"./registerListTargets-95gAK_Bj.js";import{registerListTemplates as M}from"./registerListTemplates-LK8yLlVB.js";import"./isSafeOptionValue-BEUaZ7UP.js";const c="1.0.0-alpha.35",f=r=>{const[e,o=""]=r.split("-",2);return{core:(e??"").split(".").map(t=>Number.parseInt(t,10)||0),pre:o.length>0?o.split("."):[]}},q=(r,e)=>{if(r===void 0)return e===void 0?0:-1;if(e===void 0)return 1;const o=Number.parseInt(r,10),t=Number.parseInt(e,10);return!Number.isNaN(o)&&!Number.isNaN(t)?o-t:r.localeCompare(e)},E=(r,e)=>{if(r.length===0&&e.length>0)return 1;if(r.length>0&&e.length===0)return-1;const o=Math.max(r.length,e.length);for(let t=0;t<o;t+=1){const i=q(r[t],e[t]);if(i!==0)return i}return 0},$=(r,e)=>{const o=f(r),t=f(e);for(let i=0;i<3;i+=1){const s=(o.core[i]??0)-(t.core[i]??0);if(s!==0)return s}return E(o.pre,t.pre)},O=r=>{!r||$(r,c)>=0||process.stderr.write(`[vis-mcp] warning: @visulima/vis ${r} is older than the required ${c}; lint/fmt/audit tools may fail with opaque errors. Upgrade @visulima/vis to >= ${c}.
1
+ import"./execVis-CInWWszP.js";import"./clearListCache-D-qeI660.js";import"./errorResponse-D1WOFYuT.js";import{readFile as g}from"node:fs/promises";import{createRequire as l}from"node:module";import{resolve as u,dirname as v}from"node:path";import{pathToFileURL as d,fileURLToPath as h}from"node:url";import{McpServer as b}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as w}from"@modelcontextprotocol/sdk/server/stdio.js";import{findUp as N}from"@visulima/fs";import{registerAdvisoryStatus as I}from"./registerAdvisoryStatus-DnpRlAZ2.js";import{registerAudit as S}from"./registerAudit-ZskmQpJB.js";import{registerCacheHash as y}from"./registerCacheHash-CLFe-S23.js";import{registerCacheWhy as k}from"./registerCacheWhy-DBIgl8ww.js";import{registerDescribeProject as P}from"./registerDescribeProject-zZZrCz2G.js";import{registerDescribeTemplate as R}from"./registerDescribeTemplate-D1DYYNOB.js";import{registerFmt as V}from"./registerFmt-DYE0dqsx.js";import{registerGetRunLogs as _}from"./registerGetRunLogs-CukA12J7.js";import{registerLint as L}from"./registerLint-D_A4H5jb.js";import{registerListProjects as C}from"./registerListProjects-3dPVnYC9.js";import{registerListRuns as T}from"./registerListRuns-BoZ7DRKb.js";import{registerListTargets as j}from"./registerListTargets-95gAK_Bj.js";import{registerListTemplates as M}from"./registerListTemplates-LK8yLlVB.js";import"./isSafeOptionValue-BEUaZ7UP.js";const c="1.0.0-alpha.35",f=r=>{const[e,o=""]=r.split("-",2);return{core:(e??"").split(".").map(t=>Number.parseInt(t,10)||0),pre:o.length>0?o.split("."):[]}},q=(r,e)=>{if(r===void 0)return e===void 0?0:-1;if(e===void 0)return 1;const o=Number.parseInt(r,10),t=Number.parseInt(e,10);return!Number.isNaN(o)&&!Number.isNaN(t)?o-t:r.localeCompare(e)},E=(r,e)=>{if(r.length===0&&e.length>0)return 1;if(r.length>0&&e.length===0)return-1;const o=Math.max(r.length,e.length);for(let t=0;t<o;t+=1){const i=q(r[t],e[t]);if(i!==0)return i}return 0},$=(r,e)=>{const o=f(r),t=f(e);for(let i=0;i<3;i+=1){const s=(o.core[i]??0)-(t.core[i]??0);if(s!==0)return s}return E(o.pre,t.pre)},O=r=>{!r||$(r,c)>=0||process.stderr.write(`[vis-mcp] warning: @visulima/vis ${r} is older than the required ${c}; lint/fmt/audit tools may fail with opaque errors. Upgrade @visulima/vis to >= ${c}.
2
2
  `)},A=r=>{const e=process.env.VIS_MCP_VIS_BIN;if(e)return{binPath:u(e)};const o=[{label:r,require:l(d(`${r}/package.json`))},{label:"vis-mcp install location",require:l(import.meta.url)}],t=[];let i,s;for(const{label:a,require:n}of o)try{i=n.resolve("@visulima/vis/package.json"),s=n("@visulima/vis/package.json");break}catch(m){t.push({error:m,label:a})}if(!i||!s){const a=t.at(-1)?.error,n=t.map(m=>m.label).join(", ");throw new Error(`Cannot resolve \`@visulima/vis\` (tried: ${n}). Install it as a workspace dependency, or set VIS_MCP_VIS_BIN to a vis CLI path.`,{cause:a})}const p=typeof s.bin=="string"?s.bin:s.bin?.vis;if(!p)throw new Error("`@visulima/vis` is installed but does not declare a `vis` bin entry — install a current version.");return{binPath:u(v(i),p),version:s.version}},B=async()=>{try{const r=await N("package.json",{cwd:v(h(import.meta.url))});return r?JSON.parse(await g(r,"utf8")).version??"0.0.0":"0.0.0"}catch(r){return process.stderr.write(`[vis-mcp] failed to read package.json: ${r instanceof Error?r.message:String(r)}
3
3
  `),"0.0.0"}},U=(r,e)=>{C(r,e),P(r,e),j(r,e),M(r,e),R(r,e),_(r,e),T(r,e),k(r,e),y(r,e),S(r,e),I(r,e),L(r,e),V(r,e)},F=async r=>{const e=new b({name:"vis",version:await B()}),o={server:e};return U(o,r),{deps:o,server:e}},ur=async()=>{const r=process.env.VIS_MCP_WORKSPACE_ROOT??process.cwd(),{binPath:e,version:o}=A(r);O(o);const t={visBin:e,workspaceRoot:r},{server:i}=await F(t);await i.connect(new w),process.stderr.write(`[vis-mcp] ready (workspace: ${t.workspaceRoot})
4
4
  `)};export{c as MIN_VIS_VERSION,$ as compareVersions,F as createMcpServer,U as registerAllTools,ur as startMcpServer,O as warnIfVisTooOld};
@@ -0,0 +1 @@
1
+ import{readFile as f}from"node:fs/promises";import{join as u}from"@visulima/path";import*as l from"zod";import{errorResponse as e,okResponse as m}from"./errorResponse-D1WOFYuT.js";import{isValidRunId as c}from"./isSafeOptionValue-BEUaZ7UP.js";const R=({server:p},o)=>{p.registerTool("get_run_logs",{annotations:{readOnlyHint:!0},description:"Read a vis run summary from .vis/. Returns the most recent run by default, or a specific run when `runId` is set. Optionally filter to a single task with `taskId`.",inputSchema:{runId:l.string().optional().describe("Run ID (default: latest)"),taskId:l.string().optional().describe('Filter to a single task ID like "@my/app:build"')}},async({runId:r,taskId:n})=>{if(r!==void 0&&!c(r))return e(new Error(`Invalid runId "${r}". Expected filesystem-safe slug ([A-Za-z0-9_.-]).`));const i=r?u(o.workspaceRoot,".vis","runs",`${r}.json`):u(o.workspaceRoot,".vis","last-summary.json");try{const t=await f(i,"utf8"),s=JSON.parse(t);if(n){const a=s.tasks?.find(d=>d.taskId===n);return a?m({runId:s.runId,task:a}):e(new Error(`Task "${n}" not found in run "${s.runId??"(unknown)"}".`))}return m(s)}catch(t){return t.code==="ENOENT"?e(new Error(`No run summary at ${i}. Run a task first to populate it.`)):e(t)}})};export{R as registerGetRunLogs};
@@ -0,0 +1 @@
1
+ import{readdir as k,stat as w,readFile as y}from"node:fs/promises";import{join as d}from"@visulima/path";import*as g from"zod";import{okResponse as m,errorResponse as p}from"./errorResponse-D1WOFYuT.js";const _=/\.json$/,I=e=>{if(typeof e.status=="string")return e.status;if(e.tasks)return e.tasks.some(a=>a.status==="failure"||a.status==="failed")?"failure":"success"},R=({server:e},a)=>{e.registerTool("list_runs",{annotations:{readOnlyHint:!0},description:'List recorded vis runs from `.vis/runs/`, most recent first. Each entry includes the run ID, start timestamp, derived status, task count, and failed-task count — use it to discover run IDs for `get_run_logs`, `cache_hash`, or `cache_why` (e.g. "compare this run to the previous one").',inputSchema:{limit:g.int().positive().max(100).optional().describe("Maximum runs to return (default: 20, newest first).")}},async({limit:h})=>{const o=d(a.workspaceRoot,".vis","runs");let l;try{l=(await k(o)).filter(u=>u.endsWith(".json"))}catch(n){return n.code==="ENOENT"?m({count:0,runs:[]}):p(n)}try{const u=(await Promise.all(l.map(async t=>{try{const s=await w(d(o,t));return{file:t,modifiedMs:s.mtimeMs}}catch{return}}))).filter(t=>t!==void 0).toSorted((t,s)=>s.modifiedMs-t.modifiedMs).slice(0,h??20),f=(await Promise.all(u.map(async({file:t,modifiedMs:s})=>{try{const c=await y(d(o,t),"utf8"),r=JSON.parse(c);return{failedTasks:r.tasks?.filter(i=>i.status==="failure"||i.status==="failed").length,modifiedMs:s,runId:r.runId??t.replace(_,""),startedAt:r.startedAt,status:I(r),taskCount:r.tasks?.length}}catch{return}}))).filter(t=>t!==void 0).map(t=>{const{failedTasks:s,runId:c,startedAt:r,status:i,taskCount:v}=t;return{failedTasks:s,runId:c,startedAt:r,status:i,taskCount:v}});return m({count:f.length,runs:f})}catch(n){return p(n)}})};export{R as registerListRuns};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visulima/vis-mcp",
3
- "version": "1.0.17",
3
+ "version": "1.0.19",
4
4
  "description": "MCP (Model Context Protocol) server for @visulima/vis — exposes vis tooling to AI agents over stdio",
5
5
  "keywords": [
6
6
  "agent",
@@ -55,12 +55,12 @@
55
55
  ],
56
56
  "dependencies": {
57
57
  "@modelcontextprotocol/sdk": "^1.30.0",
58
- "@visulima/fs": "6.0.4",
58
+ "@visulima/fs": "6.0.6",
59
59
  "@visulima/path": "4.0.0",
60
60
  "zod": "4.4.3"
61
61
  },
62
62
  "peerDependencies": {
63
- "@visulima/vis": "3.0.5"
63
+ "@visulima/vis": "4.0.0"
64
64
  },
65
65
  "engines": {
66
66
  "node": "^22.14.0 || >=24.10.0"
@@ -1 +0,0 @@
1
- import{readFile as f}from"node:fs/promises";import{join as u}from"@visulima/path";import*as l from"zod";import{errorResponse as e,okResponse as m}from"./errorResponse-D1WOFYuT.js";import{isValidRunId as c}from"./isSafeOptionValue-BEUaZ7UP.js";const R=({server:p},o)=>{p.registerTool("get_run_logs",{annotations:{readOnlyHint:!0},description:"Read a vis run summary from .task-runner/. Returns the most recent run by default, or a specific run when `runId` is set. Optionally filter to a single task with `taskId`.",inputSchema:{runId:l.string().optional().describe("Run ID (default: latest)"),taskId:l.string().optional().describe('Filter to a single task ID like "@my/app:build"')}},async({runId:r,taskId:s})=>{if(r!==void 0&&!c(r))return e(new Error(`Invalid runId "${r}". Expected filesystem-safe slug ([A-Za-z0-9_.-]).`));const a=r?u(o.workspaceRoot,".task-runner","runs",`${r}.json`):u(o.workspaceRoot,".task-runner","last-summary.json");try{const t=await f(a,"utf8"),n=JSON.parse(t);if(s){const i=n.tasks?.find(d=>d.taskId===s);return i?m({runId:n.runId,task:i}):e(new Error(`Task "${s}" not found in run "${n.runId??"(unknown)"}".`))}return m(n)}catch(t){return t.code==="ENOENT"?e(new Error(`No run summary at ${a}. Run a task first to populate it.`)):e(t)}})};export{R as registerGetRunLogs};
@@ -1 +0,0 @@
1
- import{readdir as v,stat as w,readFile as y}from"node:fs/promises";import{join as d}from"@visulima/path";import*as g from"zod";import{okResponse as m,errorResponse as p}from"./errorResponse-D1WOFYuT.js";const _=/\.json$/,I=e=>{if(typeof e.status=="string")return e.status;if(e.tasks)return e.tasks.some(a=>a.status==="failure"||a.status==="failed")?"failure":"success"},R=({server:e},a)=>{e.registerTool("list_runs",{annotations:{readOnlyHint:!0},description:'List recorded vis runs from `.task-runner/runs/`, most recent first. Each entry includes the run ID, start timestamp, derived status, task count, and failed-task count — use it to discover run IDs for `get_run_logs`, `cache_hash`, or `cache_why` (e.g. "compare this run to the previous one").',inputSchema:{limit:g.int().positive().max(100).optional().describe("Maximum runs to return (default: 20, newest first).")}},async({limit:h})=>{const i=d(a.workspaceRoot,".task-runner","runs");let l;try{l=(await v(i)).filter(u=>u.endsWith(".json"))}catch(n){return n.code==="ENOENT"?m({count:0,runs:[]}):p(n)}try{const u=(await Promise.all(l.map(async t=>{try{const s=await w(d(i,t));return{file:t,modifiedMs:s.mtimeMs}}catch{return}}))).filter(t=>t!==void 0).toSorted((t,s)=>s.modifiedMs-t.modifiedMs).slice(0,h??20),f=(await Promise.all(u.map(async({file:t,modifiedMs:s})=>{try{const c=await y(d(i,t),"utf8"),r=JSON.parse(c);return{failedTasks:r.tasks?.filter(o=>o.status==="failure"||o.status==="failed").length,modifiedMs:s,runId:r.runId??t.replace(_,""),startedAt:r.startedAt,status:I(r),taskCount:r.tasks?.length}}catch{return}}))).filter(t=>t!==void 0).map(t=>{const{failedTasks:s,runId:c,startedAt:r,status:o,taskCount:k}=t;return{failedTasks:s,runId:c,startedAt:r,status:o,taskCount:k}});return m({count:f.length,runs:f})}catch(n){return p(n)}})};export{R as registerListRuns};