diff --git a/ts/packages/agents/github-cli/README.md b/ts/packages/agents/github-cli/README.md new file mode 100644 index 0000000000..092e3dca86 --- /dev/null +++ b/ts/packages/agents/github-cli/README.md @@ -0,0 +1,73 @@ +# GitHub CLI Agent + +πŸ™ A TypeAgent agent for interacting with GitHub via the [GitHub CLI (`gh`)](https://cli.github.com/). + +## Prerequisites + +- [GitHub CLI](https://cli.github.com/) installed and on your `PATH` +- Authenticated via `gh auth login` + +## Supported Actions + +| Category | Actions | +| ----------------- | ----------------------------------------------------------------------------------------------------- | +| **Auth** | Login, logout, check status | +| **Issues** | Create, close, reopen, list, view, browse | +| **Pull Requests** | Create (including draft), close, merge, list, view, checkout, browse | +| **Repos** | Create, clone, delete, view (with field-specific queries like stars/forks), fork, star/unstar, browse | +| **Search** | Search repositories by keyword | +| **Status** | Dashboard summary of notifications, PRs, and issues | +| **Contributors** | Top N contributors for a repo | +| **Dependabot** | List alerts with severity/state filters | +| **Workflows** | View workflow runs and workflow details | +| **Other** | Codespaces, gists, releases, projects, labels, secrets, SSH keys, config, orgs | + +## Example Phrases + +``` +show my GitHub status +list open PRs in microsoft/TypeAgent +how many stars does microsoft/TypeAgent have +show top 10 contributors for microsoft/TypeAgent +create issue "Fix login bug" in microsoft/TypeAgent +close issue 42 in microsoft/TypeAgent +open a draft PR for my-feature branch +show newest 5 dependabot alerts in microsoft/TypeAgent +fork microsoft/TypeAgent +star microsoft/TypeAgent +``` + +## Output Formatting + +- PR, issue, and repo listings include clickable **hyperlinks** +- `repo view` answers specific questions (e.g., "how many stars") with a distilled one-line response +- Status output uses **bold section headers** for readability +- Dependabot alerts are color-coded by severity (πŸ”΄ critical, 🟠 high, 🟑 medium, 🟒 low) +- Mutation actions (create, close, star, fork) return friendly emoji confirmation messages + +## Demo + +Demo scripts are available for replay in the TypeAgent shell and CLI: + +```bash +# Shell (interactive) +@demo github_cli + +# CLI +npx agent-cli --demo demo/github_cli.txt +``` + +## Building + +```bash +pnpm install +pnpm run build +``` + +## Trademarks + +This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft +trademarks or logos is subject to and must follow +[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). +Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. +Any use of third-party trademarks or logos are subject to those third-party's policies. diff --git a/ts/packages/agents/github-cli/package.json b/ts/packages/agents/github-cli/package.json new file mode 100644 index 0000000000..6581f6bf11 --- /dev/null +++ b/ts/packages/agents/github-cli/package.json @@ -0,0 +1,36 @@ +{ + "name": "github-cli-agent", + "version": "0.0.1", + "private": true, + "description": "TypeAgent agent for github-cli", + "homepage": "https://github.com/microsoft/TypeAgent#readme", + "repository": { + "type": "git", + "url": "https://github.com/microsoft/TypeAgent.git", + "directory": "ts/packages/agents/github-cli" + }, + "license": "MIT", + "author": "Microsoft", + "type": "module", + "exports": { + "./agent/manifest": "./src/github-cliManifest.json", + "./agent/handlers": "./dist/github-cliActionHandler.js" + }, + "scripts": { + "agc": "agc -i ./src/github-cliSchema.agr -o ./dist/github-cliSchema.ag.json", + "asc": "asc -i ./src/github-cliSchema.ts -o ./dist/github-cliSchema.pas.json -t GithubCliActions", + "build": "concurrently npm:tsc npm:asc npm:agc", + "clean": "rimraf --glob dist *.tsbuildinfo *.done.build.log", + "tsc": "tsc -b" + }, + "dependencies": { + "@typeagent/agent-sdk": "workspace:*" + }, + "devDependencies": { + "@typeagent/action-schema-compiler": "workspace:*", + "action-grammar-compiler": "workspace:*", + "concurrently": "^9.1.2", + "rimraf": "^6.0.1", + "typescript": "~5.4.5" + } +} diff --git a/ts/packages/agents/github-cli/src/github-cliActionHandler.ts b/ts/packages/agents/github-cli/src/github-cliActionHandler.ts new file mode 100644 index 0000000000..3cfc899347 --- /dev/null +++ b/ts/packages/agents/github-cli/src/github-cliActionHandler.ts @@ -0,0 +1,904 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { + ActionContext, + AppAgent, + TypeAgentAction, + ActionResult, +} from "@typeagent/agent-sdk"; +import { + createActionResultFromTextDisplay, + createActionResultFromMarkdownDisplay, +} from "@typeagent/agent-sdk/helpers/action"; +import { GithubCliActions } from "./github-cliSchema.js"; +import { execFile } from "node:child_process"; +import { promisify } from "node:util"; + +const execFileAsync = promisify(execFile); + +export function instantiate(): AppAgent { + return { + initializeAgentContext, + executeAction, + }; +} + +async function initializeAgentContext(): Promise { + return {}; +} + +// Run a gh CLI command and return stdout. Throws on non-zero exit. +async function runGh(args: string[], timeoutMs = 30_000): Promise { + const { stdout } = await execFileAsync("gh", args, { + timeout: timeoutMs, + maxBuffer: 1024 * 1024, + windowsHide: true, + }); + return stdout.trim(); +} + +// Build gh CLI args from an action name and parameters. +function buildArgs( + action: TypeAgentAction, +): string[] | undefined { + const p = action.parameters as Record; + + switch (action.actionName) { + // ── Auth ── + case "authLogin": { + const args = ["auth", "login"]; + if (p.hostname) args.push("--hostname", String(p.hostname)); + if (p.web) args.push("--web"); + if (p.token) args.push("--with-token"); + return args; + } + case "authLogout": { + const args = ["auth", "logout"]; + if (p.hostname) args.push("--hostname", String(p.hostname)); + return args; + } + case "authStatus": { + const args = ["auth", "status"]; + if (p.hostname) args.push("--hostname", String(p.hostname)); + if (p.showToken) args.push("--show-token"); + return args; + } + + // ── Browse ── + case "browseRepo": { + const args = ["browse"]; + if (p.branch) args.push("--branch", String(p.branch)); + if (p.commit) args.push("--commit", String(p.commit)); + if (p.tag) args.push("--tag", String(p.tag)); + args.push("--no-browser"); // return URL instead of opening + return args; + } + case "browseIssue": { + const args = ["browse"]; + if (p.number) args.push(String(p.number)); + args.push("--no-browser"); + return args; + } + case "browsePr": { + const args = ["browse"]; + if (p.number) args.push(String(p.number)); + args.push("--no-browser"); + return args; + } + + // ── Codespace ── + case "codespaceCreate": { + const args = ["codespace", "create"]; + if (p.repo) args.push("--repo", String(p.repo)); + if (p.branch) args.push("--branch", String(p.branch)); + if (p.location) args.push("--location", String(p.location)); + return args; + } + case "codespaceDelete": { + const args = ["codespace", "delete"]; + if (p.name) args.push("--codespace", String(p.name)); + return args; + } + case "codespaceList": + return ["codespace", "list"]; + + // ── Gist ── + case "gistCreate": { + const args = ["gist", "create"]; + if (p.public) args.push("--public"); + if (p.description) args.push("--desc", String(p.description)); + return args; + } + case "gistDelete": { + const args = ["gist", "delete"]; + if (p.id) args.push(String(p.id)); + return args; + } + case "gistList": { + const args = ["gist", "list"]; + if (p.public) args.push("--public"); + return args; + } + + // ── Issue ── + case "issueCreate": { + const args = ["issue", "create"]; + if (p.repo) args.push("--repo", String(p.repo)); + if (p.title) args.push("--title", String(p.title)); + args.push("--body", p.body ? String(p.body) : ""); + if (p.assignee) args.push("--assignee", String(p.assignee)); + if (p.label) args.push("--label", String(p.label)); + return args; + } + case "issueClose": { + const args = ["issue", "close"]; + if (p.number) args.push(String(p.number)); + if (p.repo) args.push("--repo", String(p.repo)); + return args; + } + case "issueReopen": { + const args = ["issue", "reopen"]; + if (p.number) args.push(String(p.number)); + if (p.repo) args.push("--repo", String(p.repo)); + return args; + } + case "issueList": { + const args = ["issue", "list"]; + if (p.repo) args.push("--repo", String(p.repo)); + if (p.state) args.push("--state", String(p.state)); + if (p.label) args.push("--label", String(p.label)); + if (p.assignee) args.push("--assignee", String(p.assignee)); + if (p.limit) args.push("--limit", String(p.limit)); + args.push("--json", "number,title,state,url,createdAt,labels"); + return args; + } + case "issueView": { + const args = ["issue", "view"]; + if (p.number) args.push(String(p.number)); + if (p.repo) args.push("--repo", String(p.repo)); + args.push( + "--json", + "number,title,state,body,author,labels,assignees,comments,url,createdAt,closedAt", + ); + return args; + } + + // ── Org ── + case "orgList": + return ["org", "list"]; + case "orgView": { + const args = ["org", "view"]; + if (p.name) args.push(String(p.name)); + return args; + } + + // ── PR ── + case "prCreate": { + const args = ["pr", "create"]; + if (p.title) args.push("--title", String(p.title)); + args.push("--body", p.body ? String(p.body) : ""); + if (p.base) args.push("--base", String(p.base)); + if (p.head) args.push("--head", String(p.head)); + if (p.draft) args.push("--draft"); + return args; + } + case "prClose": { + const args = ["pr", "close"]; + if (p.number) args.push(String(p.number)); + return args; + } + case "prMerge": { + const args = ["pr", "merge"]; + if (p.number) args.push(String(p.number)); + if (p.mergeMethod) args.push(`--${String(p.mergeMethod)}`); + return args; + } + case "prList": { + const args = ["pr", "list"]; + if (p.repo) args.push("--repo", String(p.repo)); + if (p.state) args.push("--state", String(p.state)); + if (p.label) args.push("--label", String(p.label)); + if (p.assignee) args.push("--assignee", String(p.assignee)); + if (p.limit) args.push("--limit", String(p.limit)); + args.push( + "--json", + "number,title,state,url,createdAt,headRefName,isDraft", + ); + return args; + } + case "prView": { + const args = ["pr", "view"]; + if (p.number) args.push(String(p.number)); + if (p.repo) args.push("--repo", String(p.repo)); + args.push( + "--json", + "number,title,state,body,author,labels,url,createdAt,headRefName,baseRefName,isDraft,additions,deletions,changedFiles", + ); + return args; + } + case "prCheckout": { + const args = ["pr", "checkout"]; + if (p.number) args.push(String(p.number)); + if (p.branch) args.push("--branch", String(p.branch)); + return args; + } + + // ── Project ── + case "projectCreate": { + const args = ["project", "create"]; + if (p.name) args.push("--title", String(p.name)); + if (p.body) args.push("--body", String(p.body)); + return args; + } + case "projectDelete": { + const args = ["project", "delete"]; + if (p.id) args.push(String(p.id)); + return args; + } + case "projectList": + return ["project", "list"]; + + // ── Release ── + case "releaseCreate": { + const args = ["release", "create"]; + if (p.tag) args.push(String(p.tag)); + if (p.title) args.push("--title", String(p.title)); + if (p.notes) args.push("--notes", String(p.notes)); + return args; + } + case "releaseDelete": { + const args = ["release", "delete"]; + if (p.id) args.push(String(p.id)); + return args; + } + case "releaseList": { + const args = ["release", "list"]; + if (p.repo) args.push("--repo", String(p.repo)); + return args; + } + + // ── Repo ── + case "repoCreate": { + const args = ["repo", "create"]; + if (p.name) args.push(String(p.name)); + if (p.description) + args.push("--description", String(p.description)); + if (p.public) args.push("--public"); + if (p.private) args.push("--private"); + return args; + } + case "repoClone": { + const args = ["repo", "clone"]; + if (p.repo) args.push(String(p.repo)); + if (p.branch) args.push("--", "--branch", String(p.branch)); + return args; + } + case "repoDelete": { + const args = ["repo", "delete"]; + if (p.repo) args.push(String(p.repo)); + args.push("--yes"); + return args; + } + case "repoView": { + const args = ["repo", "view"]; + if (p.repo) args.push(String(p.repo)); + args.push( + "--json", + "name,owner,description,stargazerCount,forkCount,watchers,defaultBranchRef,createdAt,updatedAt,url,primaryLanguage,visibility", + ); + return args; + } + case "repoFork": { + const args = ["repo", "fork"]; + if (p.repo) args.push(String(p.repo)); + if (p.name) args.push("--fork-name", String(p.name)); + args.push("--clone=false"); + return args; + } + case "starRepo": { + if (p.unstar) { + const args = ["api", "-X", "DELETE"]; + if (p.repo) args.push(`/user/starred/${String(p.repo)}`); + return args; + } + const args = ["api", "-X", "PUT"]; + if (p.repo) args.push(`/user/starred/${String(p.repo)}`); + return args; + } + + // ── Cache ── + case "cacheList": + return ["cache", "list"]; + case "cacheDelete": { + const args = ["cache", "delete"]; + if (p.id) args.push(String(p.id)); + return args; + } + + // ── Run / Workflow ── + case "runView": { + const args = ["run", "view"]; + if (p.id) args.push(String(p.id)); + return args; + } + case "workflowView": { + const args = ["workflow", "view"]; + if (p.id) args.push(String(p.id)); + return args; + } + + // ── Misc ── + case "agentTaskRun": { + const args = ["agent-task", "run"]; + if (p.task) args.push(String(p.task)); + return args; + } + case "aliasSet": { + const args = ["alias", "set"]; + if (p.name) args.push(String(p.name)); + if (p.command) args.push(String(p.command)); + return args; + } + case "apiRequest": { + const args = ["api"]; + if (p.endpoint) { + let endpoint = String(p.endpoint); + // If it looks like "owner/repo" (no leading slash, single slash), + // assume /repos/{owner}/{repo}/contributors for contributor queries + if ( + !endpoint.startsWith("/") && + endpoint.split("/").length === 2 + ) { + endpoint = `/repos/${endpoint}/contributors`; + } + if (p.limit) { + const sep = endpoint.includes("?") ? "&" : "?"; + endpoint += `${sep}per_page=${String(p.limit)}`; + } + args.push(endpoint); + } + if (p.method) args.push("--method", String(p.method)); + return args; + } + case "attestationCreate": { + const args = ["attestation", "create"]; + if (p.artifact) args.push(String(p.artifact)); + if (p.type) args.push("--type", String(p.type)); + return args; + } + case "completionGenerate": { + const args = ["completion"]; + if (p.shell) args.push("--shell", String(p.shell)); + return args; + } + case "configSet": { + const args = ["config", "set"]; + if (p.name) args.push(String(p.name)); + if (p.value) args.push(String(p.value)); + return args; + } + case "copilotRun": { + const args = ["copilot"]; + if (p.task) args.push(String(p.task)); + return args; + } + case "extensionInstall": { + const args = ["extension", "install"]; + if (p.name) args.push(String(p.name)); + return args; + } + case "gpgKeyAdd": { + const args = ["gpg-key", "add"]; + if (p.key) args.push(String(p.key)); + return args; + } + case "labelCreate": { + const args = ["label", "create"]; + if (p.name) args.push(String(p.name)); + if (p.color) args.push("--color", String(p.color)); + return args; + } + case "licensesView": + return ["repo", "license", "view"]; + case "previewExecute": { + const args = ["preview"]; + if (p.feature) args.push(String(p.feature)); + return args; + } + case "rulesetView": { + const args = ["ruleset", "view"]; + if (p.repo) args.push("--repo", String(p.repo)); + return args; + } + case "searchRepos": { + const args = ["search", "repos"]; + if (p.query) args.push(String(p.query)); + args.push( + "--json", + "fullName,description,stargazersCount,url,updatedAt", + ); + return args; + } + case "secretCreate": { + const args = ["secret", "set"]; + if (p.name) args.push(String(p.name)); + if (p.value) args.push("--body", String(p.value)); + return args; + } + case "sshKeyAdd": { + const args = ["ssh-key", "add"]; + if (p.key) args.push(String(p.key)); + return args; + } + case "statusPrint": + return ["status"]; + case "variableCreate": { + const args = ["variable", "set"]; + if (p.name) args.push(String(p.name)); + if (p.value) args.push("--body", String(p.value)); + return args; + } + case "dependabotAlerts": { + // gh api /repos/{owner}/{repo}/dependabot/alerts + let repo = p.repo ? String(p.repo) : ""; + if (!repo) return undefined; + let endpoint = `/repos/${repo}/dependabot/alerts`; + const params: string[] = []; + if (p.severity) params.push(`severity=${String(p.severity)}`); + if (p.state) params.push(`state=${String(p.state)}`); + else params.push("state=open"); + if (params.length) endpoint += `?${params.join("&")}`; + return ["api", endpoint]; + } + default: + return undefined; + } +} + +function formatValue(v: unknown): string { + if (v === null || v === undefined) return "β€”"; + if (typeof v === "object") { + if (Array.isArray(v)) return v.map(formatValue).join(", ") || "β€”"; + const obj = v as Record; + if ("name" in obj) return String(obj.name); + if ("login" in obj) return String(obj.login); + if ("totalCount" in obj) return String(obj.totalCount); + return JSON.stringify(v); + } + return String(v); +} + +// Return a focused, natural-language answer for a specific repo field. +function distillRepoField( + field: string, + data: Record, + repo: string, +): string | undefined { + const label = repo || formatValue(data.owner) + "/" + data.name; + switch (field) { + case "stars": + return `⭐ **${label}** has **${data.stargazerCount?.toLocaleString?.() ?? data.stargazerCount}** stars.`; + case "forks": + return `🍴 **${label}** has **${data.forkCount?.toLocaleString?.() ?? data.forkCount}** forks.`; + case "language": + return `πŸ’» **${label}** is primarily written in **${formatValue(data.primaryLanguage)}**.`; + case "watchers": + return `πŸ‘€ **${label}** has **${formatValue(data.watchers)}** watchers.`; + case "description": + return `πŸ“‹ **${label}**: ${data.description}`; + default: + return undefined; + } +} + +// Format gh status output β€” parse the β”‚-table into clean markdown sections +function formatStatusOutput(raw: string): string { + const lines = raw.split("\n"); + + const knownHeaders = new Set([ + "Assigned Issues", + "Assigned Pull Requests", + "Review Requests", + "Mentions", + "Repository Activity", + ]); + + // gh status uses a two-column layout with β”‚ separator, then a single-column section. + const sections: Record = {}; + let currentLeft = ""; + let currentRight = ""; + + for (const line of lines) { + if (!line.trim()) continue; + + if (line.includes("β”‚")) { + const [left, right] = line.split("β”‚").map((s) => s.trim()); + + if (left && knownHeaders.has(left)) currentLeft = left; + if (right && knownHeaders.has(right)) currentRight = right; + + const leftIsHeader = left ? knownHeaders.has(left) : false; + const rightIsHeader = right ? knownHeaders.has(right) : false; + + if (left && !leftIsHeader) { + if (!currentLeft) currentLeft = "Activity"; + if (!sections[currentLeft]) sections[currentLeft] = []; + sections[currentLeft].push(left); + } + if (right && !rightIsHeader) { + if (!currentRight) currentRight = "Activity"; + if (!sections[currentRight]) sections[currentRight] = []; + sections[currentRight].push(right); + } + } else { + const trimmed = line.trim(); + if (trimmed && knownHeaders.has(trimmed)) { + currentLeft = trimmed; + currentRight = ""; + } else if (trimmed) { + if (!currentLeft) currentLeft = "Activity"; + if (!sections[currentLeft]) sections[currentLeft] = []; + sections[currentLeft].push(trimmed); + } + } + } + + // Render as clean markdown + const result: string[] = []; + for (const [header, items] of Object.entries(sections)) { + if (!header) continue; + result.push(`**${header}**`); + if ( + items.length === 0 || + (items.length === 1 && items[0].includes("Nothing here")) + ) { + result.push(" *Nothing here* πŸŽ‰\n"); + continue; + } + for (const item of items) { + // Parse "owner/repo#123 description..." into a clickable link + const match = item.match(/^(\S+\/\S+)#(\d+)\s+(.*)/); + if (match) { + const [, repo, num, desc] = match; + const activity = desc.match( + /^(comment on|new PR|new issue)\s*(.*)/, + ); + if (activity) { + const [, verb, rest] = activity; + const preview = + rest.length > 80 ? rest.slice(0, 80) + "…" : rest; + result.push( + ` - [${repo}#${num}](https://github.com/${repo}/issues/${num}) β€” *${verb}* ${preview}`, + ); + } else { + const preview = + desc.length > 80 ? desc.slice(0, 80) + "…" : desc; + result.push( + ` - [${repo}#${num}](https://github.com/${repo}/issues/${num}) ${preview}`, + ); + } + } else { + result.push(` - ${item}`); + } + } + result.push(""); + } + return result.join("\n"); +} + +// Format a single issue view from JSON into rich markdown +function formatIssueView(data: Record): string { + const author = data.author ? formatValue(data.author) : "unknown"; + const labels = Array.isArray(data.labels) + ? (data.labels as Record[]) + .map((l) => `\`${l.name}\``) + .join(" ") + : ""; + const assignees = Array.isArray(data.assignees) + ? (data.assignees as Record[]) + .map((a) => formatValue(a)) + .join(", ") + : ""; + const commentCount = Array.isArray(data.comments) + ? data.comments.length + : (data.comments ?? 0); + const body = data.body ? String(data.body).slice(0, 1000) : ""; + const bodySection = body + ? `\n\n---\n\n${body}${String(data.body).length > 1000 ? "\n\n*…truncated*" : ""}` + : ""; + + let header = `### [#${data.number} ${data.title}](${data.url})\n\n`; + header += `**State:** ${data.state}`; + header += ` Β· **Author:** ${author}`; + if (labels) header += ` Β· **Labels:** ${labels}`; + if (assignees) header += `\n**Assignees:** ${assignees}`; + header += ` Β· **Comments:** ${commentCount}`; + header += ` Β· **Created:** ${String(data.createdAt).slice(0, 10)}`; + if (data.closedAt) + header += ` Β· **Closed:** ${String(data.closedAt).slice(0, 10)}`; + + return header + bodySection; +} + +// Format a single PR view from JSON into rich markdown +function formatPrView(data: Record): string { + const author = data.author ? formatValue(data.author) : "unknown"; + const labels = Array.isArray(data.labels) + ? (data.labels as Record[]) + .map((l) => `\`${l.name}\``) + .join(" ") + : ""; + const status = data.isDraft ? "DRAFT" : String(data.state); + const body = data.body ? String(data.body).slice(0, 1000) : ""; + const bodySection = body + ? `\n\n---\n\n${body}${String(data.body).length > 1000 ? "\n\n*…truncated*" : ""}` + : ""; + + let header = `### [#${data.number} ${data.title}](${data.url})\n\n`; + header += `**State:** ${status}`; + header += ` Β· **Author:** ${author}`; + if (data.headRefName) + header += ` Β· **Branch:** \`${data.headRefName}\` β†’ \`${data.baseRefName}\``; + if (labels) header += ` Β· **Labels:** ${labels}`; + if (data.additions !== undefined) { + header += `\n**Changes:** +${data.additions} βˆ’${data.deletions} across ${data.changedFiles} files`; + } + header += ` Β· **Created:** ${String(data.createdAt).slice(0, 10)}`; + + return header + bodySection; +} + +function formatListResults( + items: Record[], + actionName: string, +): string | undefined { + if (items.length === 0) return "No results found."; + + // Issues + if (actionName === "issueList" && "number" in items[0]) { + return items + .map((i) => { + const labels = Array.isArray(i.labels) + ? (i.labels as Record[]) + .map((l) => l.name) + .join(", ") + : ""; + const labelStr = labels ? ` \`${labels}\`` : ""; + return `- [#${i.number} ${i.title}](${i.url}) β€” ${i.state}${labelStr}`; + }) + .join("\n"); + } + + // Pull requests + if (actionName === "prList" && "number" in items[0]) { + return items + .map((pr) => { + const status = pr.isDraft ? "DRAFT" : String(pr.state); + const branch = pr.headRefName ? ` \`${pr.headRefName}\`` : ""; + return `- [#${pr.number} ${pr.title}](${pr.url}) β€” ${status}${branch}`; + }) + .join("\n"); + } + + // Search repos + if (actionName === "searchRepos" && "fullName" in items[0]) { + return items + .map((r) => { + const stars = + r.stargazersCount || r.stargazerCount + ? ` ⭐ ${r.stargazersCount ?? r.stargazerCount}` + : ""; + const desc = r.description ? ` β€” ${r.description}` : ""; + return `- [${r.fullName}](${r.url})${stars}${desc}`; + }) + .join("\n"); + } + + return undefined; +} + +// Friendly success messages for mutation actions that return no output +function getMutationSuccessMessage( + action: TypeAgentAction, +): string | undefined { + const p = action.parameters as Record; + switch (action.actionName) { + case "starRepo": + return p.unstar + ? `⭐ Unstarred **${p.repo}**.` + : `⭐ Starred **${p.repo}**!`; + case "repoFork": + return `🍴 Forked **${p.repo}** to your account!`; + case "prCheckout": + return `βœ… Checked out PR **#${p.number}** locally.`; + case "issueClose": + return `βœ… Closed issue **#${p.number}**.`; + case "issueReopen": + return `βœ… Reopened issue **#${p.number}**.`; + case "prClose": + return `βœ… Closed PR **#${p.number}**.`; + case "prMerge": + return `βœ… Merged PR **#${p.number}**!`; + default: + return undefined; + } +} + +async function executeAction( + action: TypeAgentAction, + context: ActionContext, +): Promise { + const args = buildArgs(action); + if (!args) { + return createActionResultFromTextDisplay( + `Unknown action: ${action.actionName}`, + ); + } + + const p = action.parameters as Record; + + try { + const output = await runGh(args); + if (!output) { + // Friendly success messages for write/mutation actions + const msg = getMutationSuccessMessage(action); + if (msg) { + return createActionResultFromMarkdownDisplay(msg); + } + return createActionResultFromTextDisplay( + `\`gh ${args.join(" ")}\` completed with no output.`, + ); + } + + // Format JSON output from --json flag nicely + if (args.includes("--json")) { + try { + const data = JSON.parse(output); + const cmdLabel = `\`gh ${args.slice(0, args.indexOf("--json")).join(" ")}\``; + + // If a specific field was requested, return a focused answer + if (p.field) { + const answer = distillRepoField( + String(p.field), + data, + String(p.repo ?? data.name ?? ""), + ); + if (answer) { + return createActionResultFromMarkdownDisplay(answer); + } + } + + // Array results: issues, PRs, search repos + if (Array.isArray(data)) { + const rows = formatListResults(data, action.actionName); + if (rows) { + return createActionResultFromMarkdownDisplay( + `**${cmdLabel}** β€” ${data.length} result${data.length === 1 ? "" : "s"}\n\n${rows}`, + ); + } + } + + // Single issue view β€” rich formatted output + if (action.actionName === "issueView" && "number" in data) { + return createActionResultFromMarkdownDisplay( + formatIssueView(data), + ); + } + + // Single PR view β€” rich formatted output + if (action.actionName === "prView" && "number" in data) { + return createActionResultFromMarkdownDisplay( + formatPrView(data), + ); + } + + // Single object (e.g., repo view) + const lines = Object.entries(data) + .map(([k, v]) => `- **${k}**: ${formatValue(v)}`) + .join("\n"); + return createActionResultFromMarkdownDisplay( + `**${cmdLabel}**\n\n${lines}`, + ); + } catch { + // Fall through to raw output + } + } + + // Format JSON arrays (e.g., API contributor responses, dependabot alerts) + if (output.startsWith("[")) { + try { + const arr = JSON.parse(output) as Record[]; + + // Empty array β€” friendly message for dependabot/list actions + if (arr.length === 0) { + if (action.actionName === "dependabotAlerts") { + return createActionResultFromMarkdownDisplay( + "βœ… **No matching Dependabot alerts found!**", + ); + } + return createActionResultFromTextDisplay( + "No results found.", + ); + } + + // Dependabot alerts + if (arr.length > 0 && "security_advisory" in arr[0]) { + const rows = arr + .map((a) => { + const adv = a.security_advisory as Record< + string, + unknown + >; + const sev = String( + adv.severity ?? "unknown", + ).toUpperCase(); + const pkg = a.dependency + ? (a.dependency as Record) + .package + ? ( + ( + a.dependency as Record< + string, + unknown + > + ).package as Record + ).name + : "unknown" + : "unknown"; + const sevEmoji = + sev === "CRITICAL" + ? "πŸ”΄" + : sev === "HIGH" + ? "🟠" + : sev === "MEDIUM" + ? "🟑" + : "🟒"; + return `- ${sevEmoji} **${sev}** β€” \`${pkg}\` β€” [${adv.summary}](${a.html_url})`; + }) + .join("\n"); + const header = `πŸ”’ **${arr.length} Dependabot alert${arr.length === 1 ? "" : "s"}**`; + return createActionResultFromMarkdownDisplay( + `${header}\n\n${rows}`, + ); + } + + // Contributors + if (arr.length > 0 && "login" in arr[0]) { + const rows = arr + .map( + (u, i) => + `${i + 1}. [**${u.login}**](https://github.com/${u.login}) β€” ${u.contributions} contributions`, + ) + .join("\n"); + const header = + arr.length === 1 + ? "Top contributor" + : `Top ${arr.length} contributors`; + return createActionResultFromMarkdownDisplay( + `**${header}**\n\n${rows}`, + ); + } + } catch { + // Fall through to raw output + } + } + + // Bold section headers in gh status output + if (action.actionName === "statusPrint") { + const formatted = formatStatusOutput(output); + return createActionResultFromMarkdownDisplay( + `**\`gh status\`**\n\n${formatted}`, + ); + } + + return createActionResultFromMarkdownDisplay( + `**\`gh ${args.join(" ")}\`**\n\n\`\`\`\n${output}\n\`\`\``, + ); + } catch (err: any) { + const stderr = err?.stderr ?? err?.message ?? String(err); + return { + error: `gh ${args.join(" ")} failed:\n${stderr}`, + }; + } +} diff --git a/ts/packages/agents/github-cli/src/github-cliManifest.json b/ts/packages/agents/github-cli/src/github-cliManifest.json new file mode 100644 index 0000000000..4aca11097e --- /dev/null +++ b/ts/packages/agents/github-cli/src/github-cliManifest.json @@ -0,0 +1,12 @@ +{ + "emojiChar": "πŸ™", + "description": "Agent for github-cli", + "defaultEnabled": true, + "schema": { + "description": "GithubCli agent actions", + "originalSchemaFile": "./github-cliSchema.ts", + "schemaFile": "../dist/github-cliSchema.pas.json", + "grammarFile": "../dist/github-cliSchema.ag.json", + "schemaType": "GithubCliActions" + } +} diff --git a/ts/packages/agents/github-cli/src/github-cliSchema.agr b/ts/packages/agents/github-cli/src/github-cliSchema.agr new file mode 100644 index 0000000000..e3a2a42088 --- /dev/null +++ b/ts/packages/agents/github-cli/src/github-cliSchema.agr @@ -0,0 +1,335 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + + = log me into GitHub -> { + actionName: "authLogin", + parameters: {} +}; + + = log me out of GitHub -> { + actionName: "authLogout", + parameters: {} +}; + + = check my GitHub authentication -> { + actionName: "authStatus", + parameters: {} +}; + + = create issue $(title:wildcard) -> { + actionName: "issueCreate", + parameters: { + title + } +} + | file an issue about $(title:wildcard) -> { + actionName: "issueCreate", + parameters: { + title + } +}; + + = close issue $(number:number) -> { + actionName: "issueClose", + parameters: { + number + } +}; + + = reopen issue $(number:number) -> { + actionName: "issueReopen", + parameters: { + number + } +}; + + = show open issues in $(repo:wildcard) -> { + actionName: "issueList", + parameters: { + repo, + state: "open" + } +} + | list issues in $(repo:wildcard) -> { + actionName: "issueList", + parameters: { + repo + } +} + | get latest $(limit:number) issues in $(repo:wildcard) -> { + actionName: "issueList", + parameters: { + repo, + limit + } +}; + + = show issue $(number:number) -> { + actionName: "issueView", + parameters: { + number + } +} + | show issue $(number:number) in $(repo:wildcard) -> { + actionName: "issueView", + parameters: { + number, + repo + } +}; + + = create a pull request titled $(title:wildcard) -> { + actionName: "prCreate", + parameters: { + title + } +} + | open a draft PR for branch $(head:word) -> { + actionName: "prCreate", + parameters: { + head, + draft: true + } +} + | create a PR from $(head:word) to $(base:word) -> { + actionName: "prCreate", + parameters: { + head, + base + } +}; + + = close PR $(number:number) -> { + actionName: "prClose", + parameters: { + number + } +}; + + = merge PR $(number:number) -> { + actionName: "prMerge", + parameters: { + number + } +}; + + = list open PRs in $(repo:wildcard) -> { + actionName: "prList", + parameters: { + repo, + state: "open" + } +} + | list PRs in $(repo:wildcard) -> { + actionName: "prList", + parameters: { + repo + } +} + | get latest $(limit:number) PRs in $(repo:wildcard) -> { + actionName: "prList", + parameters: { + repo, + limit + } +}; + + = show PR $(number:number) -> { + actionName: "prView", + parameters: { + number + } +} + | show PR $(number:number) in $(repo:wildcard) -> { + actionName: "prView", + parameters: { + number, + repo + } +}; + + = checkout PR $(number:number) -> { + actionName: "prCheckout", + parameters: { + number + } +}; + + = create a new repository named $(name:wildcard) -> { + actionName: "repoCreate", + parameters: { + name + } +}; + + = clone repository $(repo:wildcard) -> { + actionName: "repoClone", + parameters: { + repo + } +}; + + = show repository $(repo:wildcard) -> { + actionName: "repoView", + parameters: { + repo + } +} + | how many stars does $(repo:wildcard) have -> { + actionName: "repoView", + parameters: { + repo, + field: "stars" + } +}; + + = fork $(repo:wildcard) -> { + actionName: "repoFork", + parameters: { + repo + } +}; + + = star $(repo:wildcard) -> { + actionName: "starRepo", + parameters: { + repo + } +} + | unstar $(repo:wildcard) -> { + actionName: "starRepo", + parameters: { + repo, + unstar: true + } +}; + + = list contributors to $(endpoint:wildcard) -> { + actionName: "apiRequest", + parameters: { + endpoint + } +} + | top $(limit:number) contributors to $(endpoint:wildcard) -> { + actionName: "apiRequest", + parameters: { + endpoint, + limit + } +}; + + = search repositories for $(query:wildcard) -> { + actionName: "searchRepos", + parameters: { + query + } +}; + + = show my GitHub status -> { + actionName: "statusPrint", + parameters: {} +} + | (show | give | what's) (me)? (the)? (current)? status of (my)? (issues and pull requests | issues and PRs | notifications and PRs | notifications) -> { + actionName: "statusPrint", + parameters: {} +} + | (print | show) (the)? latest updates on my repositories -> { + actionName: "statusPrint", + parameters: {} +} + | (give me)? (a)? summary of (relevant | my)? issues and (pull requests | PRs | notifications) -> { + actionName: "statusPrint", + parameters: {} +}; + + = view workflow run $(id:word) -> { + actionName: "runView", + parameters: { + id + } +}; + + = show me workflow $(id:word) -> { + actionName: "workflowView", + parameters: { + id + } +}; + + = set the GitHub CLI configuration for $(name:word) to $(value:word) -> { + actionName: "configSet", + parameters: { + name, + value + } +}; + + = add an SSH key for me -> { + actionName: "sshKeyAdd", + parameters: {} +}; + + = list my gists -> { + actionName: "gistList", + parameters: {} +}; + + = list releases in $(repo:wildcard) -> { + actionName: "releaseList", + parameters: { + repo + } +}; + + = show dependabot alerts in $(repo:wildcard) -> { + actionName: "dependabotAlerts", + parameters: { + repo + } +} + | show high severity dependabot alerts in $(repo:wildcard) -> { + actionName: "dependabotAlerts", + parameters: { + repo, + severity: "high" + } +} + | show critical dependabot alerts in $(repo:wildcard) -> { + actionName: "dependabotAlerts", + parameters: { + repo, + severity: "critical" + } +}; + +import { GithubCliActions } from "./github-cliSchema.ts"; + + : GithubCliActions = + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | ; diff --git a/ts/packages/agents/github-cli/src/github-cliSchema.ts b/ts/packages/agents/github-cli/src/github-cliSchema.ts new file mode 100644 index 0000000000..682871865b --- /dev/null +++ b/ts/packages/agents/github-cli/src/github-cliSchema.ts @@ -0,0 +1,570 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +export type GithubCliActions = + | AuthLoginAction + | AuthLogoutAction + | AuthStatusAction + | BrowseRepoAction + | BrowseIssueAction + | BrowsePrAction + | CodespaceCreateAction + | CodespaceDeleteAction + | CodespaceListAction + | GistCreateAction + | GistDeleteAction + | GistListAction + | IssueCreateAction + | IssueCloseAction + | IssueReopenAction + | IssueListAction + | IssueViewAction + | OrgListAction + | OrgViewAction + | PrCreateAction + | PrCloseAction + | PrMergeAction + | PrListAction + | PrViewAction + | PrCheckoutAction + | ProjectCreateAction + | ProjectDeleteAction + | ProjectListAction + | ReleaseCreateAction + | ReleaseDeleteAction + | ReleaseListAction + | RepoCreateAction + | RepoCloneAction + | RepoDeleteAction + | RepoViewAction + | RepoForkAction + | StarRepoAction + | CacheListAction + | CacheDeleteAction + | RunViewAction + | WorkflowViewAction + | AgentTaskRunAction + | AliasSetAction + | ApiRequestAction + | AttestationCreateAction + | CompletionGenerateAction + | ConfigSetAction + | CopilotRunAction + | ExtensionInstallAction + | GpgKeyAddAction + | LabelCreateAction + | LicensesViewAction + | PreviewExecuteAction + | RulesetViewAction + | SearchReposAction + | SecretCreateAction + | SshKeyAddAction + | StatusPrintAction + | VariableCreateAction + | DependabotAlertsAction; + +export type AuthLoginAction = { + actionName: "authLogin"; + parameters: { + hostname?: string; + + web?: boolean; + + token?: string; + }; +}; + +export type AuthLogoutAction = { + actionName: "authLogout"; + parameters: { + hostname?: string; + }; +}; + +export type AuthStatusAction = { + actionName: "authStatus"; + parameters: { + hostname?: string; + + showToken?: boolean; + }; +}; + +export type BrowseRepoAction = { + actionName: "browseRepo"; + parameters: { + branch?: string; + + commit?: string; + + tag?: string; + }; +}; + +export type BrowseIssueAction = { + actionName: "browseIssue"; + parameters: { + number?: number; + }; +}; + +export type BrowsePrAction = { + actionName: "browsePr"; + parameters: { + number?: number; + }; +}; + +export type CodespaceCreateAction = { + actionName: "codespaceCreate"; + parameters: { + repo?: string; + + branch?: string; + + location?: string; + }; +}; + +export type CodespaceDeleteAction = { + actionName: "codespaceDelete"; + parameters: { + name?: string; + }; +}; + +export type CodespaceListAction = { + actionName: "codespaceList"; + parameters: {}; +}; + +export type GistCreateAction = { + actionName: "gistCreate"; + parameters: { + public?: boolean; + + description?: string; + }; +}; + +export type GistDeleteAction = { + actionName: "gistDelete"; + parameters: { + id?: string; + }; +}; + +export type GistListAction = { + actionName: "gistList"; + parameters: { + public?: boolean; + }; +}; + +export type IssueCreateAction = { + actionName: "issueCreate"; + parameters: { + // owner/repo + repo?: string; + + title?: string; + + body?: string; + + assignee?: string; + + label?: string; + }; +}; + +export type IssueCloseAction = { + actionName: "issueClose"; + parameters: { + number?: number; + }; +}; + +export type IssueReopenAction = { + actionName: "issueReopen"; + parameters: { + number?: number; + }; +}; + +export type IssueListAction = { + actionName: "issueList"; + parameters: { + repo?: string; + + state?: string; + + label?: string; + + assignee?: string; + + limit?: number; + }; +}; + +export type IssueViewAction = { + actionName: "issueView"; + parameters: { + number?: number; + + repo?: string; + }; +}; + +export type OrgListAction = { + actionName: "orgList"; + parameters: {}; +}; + +export type OrgViewAction = { + actionName: "orgView"; + parameters: { + name?: string; + }; +}; + +export type PrCreateAction = { + actionName: "prCreate"; + parameters: { + title?: string; + + body?: string; + + base?: string; + + head?: string; + + draft?: boolean; + }; +}; + +export type PrCloseAction = { + actionName: "prClose"; + parameters: { + number?: number; + }; +}; + +export type PrMergeAction = { + actionName: "prMerge"; + parameters: { + number?: number; + + mergeMethod?: string; + }; +}; + +export type PrListAction = { + actionName: "prList"; + parameters: { + repo?: string; + + state?: string; + + label?: string; + + assignee?: string; + + limit?: number; + }; +}; + +export type PrViewAction = { + actionName: "prView"; + parameters: { + number?: number; + + repo?: string; + }; +}; + +export type PrCheckoutAction = { + actionName: "prCheckout"; + parameters: { + number?: number; + + branch?: string; + }; +}; + +export type ProjectCreateAction = { + actionName: "projectCreate"; + parameters: { + name?: string; + + body?: string; + }; +}; + +export type ProjectDeleteAction = { + actionName: "projectDelete"; + parameters: { + id?: string; + }; +}; + +export type ProjectListAction = { + actionName: "projectList"; + parameters: {}; +}; + +export type ReleaseCreateAction = { + actionName: "releaseCreate"; + parameters: { + tag?: string; + + title?: string; + + notes?: string; + }; +}; + +export type ReleaseDeleteAction = { + actionName: "releaseDelete"; + parameters: { + id?: string; + }; +}; + +export type ReleaseListAction = { + actionName: "releaseList"; + parameters: { + repo?: string; + }; +}; + +export type RepoCreateAction = { + actionName: "repoCreate"; + parameters: { + name?: string; + + description?: string; + + public?: boolean; + + private?: boolean; + }; +}; + +export type RepoCloneAction = { + actionName: "repoClone"; + parameters: { + repo?: string; + + branch?: string; + }; +}; + +export type RepoDeleteAction = { + actionName: "repoDelete"; + parameters: { + repo?: string; + }; +}; + +export type CacheListAction = { + actionName: "cacheList"; + parameters: {}; +}; + +export type CacheDeleteAction = { + actionName: "cacheDelete"; + parameters: { + id?: string; + }; +}; + +export type RunViewAction = { + actionName: "runView"; + parameters: { + id?: string; + }; +}; + +export type WorkflowViewAction = { + actionName: "workflowView"; + parameters: { + id?: string; + }; +}; + +export type AgentTaskRunAction = { + actionName: "agentTaskRun"; + parameters: { + task?: string; + }; +}; + +export type AliasSetAction = { + actionName: "aliasSet"; + parameters: { + name?: string; + + command?: string; + }; +}; + +export type ApiRequestAction = { + actionName: "apiRequest"; + parameters: { + method?: string; + + endpoint?: string; + + limit?: number; + }; +}; + +export type AttestationCreateAction = { + actionName: "attestationCreate"; + parameters: { + artifact?: string; + + type?: string; + }; +}; + +export type CompletionGenerateAction = { + actionName: "completionGenerate"; + parameters: { + shell?: string; + }; +}; + +export type ConfigSetAction = { + actionName: "configSet"; + parameters: { + name?: string; + + value?: string; + }; +}; + +export type CopilotRunAction = { + actionName: "copilotRun"; + parameters: { + task?: string; + }; +}; + +export type ExtensionInstallAction = { + actionName: "extensionInstall"; + parameters: { + name?: string; + }; +}; + +export type GpgKeyAddAction = { + actionName: "gpgKeyAdd"; + parameters: { + key?: string; + }; +}; + +export type LabelCreateAction = { + actionName: "labelCreate"; + parameters: { + name?: string; + + color?: string; + }; +}; + +export type LicensesViewAction = { + actionName: "licensesView"; + parameters: {}; +}; + +export type PreviewExecuteAction = { + actionName: "previewExecute"; + parameters: { + feature?: string; + }; +}; + +export type RulesetViewAction = { + actionName: "rulesetView"; + parameters: { + repo?: string; + }; +}; + +export type RepoViewAction = { + actionName: "repoView"; + parameters: { + repo?: string; + + field?: string; + }; +}; + +export type RepoForkAction = { + actionName: "repoFork"; + parameters: { + repo?: string; + + name?: string; + }; +}; + +export type StarRepoAction = { + actionName: "starRepo"; + parameters: { + repo?: string; + + unstar?: boolean; + }; +}; + +export type SearchReposAction = { + actionName: "searchRepos"; + parameters: { + query?: string; + }; +}; + +export type SecretCreateAction = { + actionName: "secretCreate"; + parameters: { + name?: string; + + value?: string; + }; +}; + +export type SshKeyAddAction = { + actionName: "sshKeyAdd"; + parameters: { + key?: string; + }; +}; + +export type StatusPrintAction = { + actionName: "statusPrint"; + parameters: {}; +}; + +export type VariableCreateAction = { + actionName: "variableCreate"; + parameters: { + name?: string; + + value?: string; + }; +}; + +export type DependabotAlertsAction = { + actionName: "dependabotAlerts"; + parameters: { + // owner/repo + repo?: string; + // Filter by severity: critical, high, medium, low + severity?: string; + // Filter by state: open, dismissed, fixed + state?: string; + }; +}; diff --git a/ts/packages/agents/github-cli/src/tsconfig.json b/ts/packages/agents/github-cli/src/tsconfig.json new file mode 100644 index 0000000000..85efcd566d --- /dev/null +++ b/ts/packages/agents/github-cli/src/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "composite": true, + "rootDir": ".", + "outDir": "../dist" + }, + "include": ["./**/*"], + "ts-node": { + "esm": true + } +} diff --git a/ts/packages/agents/github-cli/tsconfig.json b/ts/packages/agents/github-cli/tsconfig.json new file mode 100644 index 0000000000..1e14d73b9f --- /dev/null +++ b/ts/packages/agents/github-cli/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "composite": true + }, + "include": [], + "references": [ + { + "path": "./src" + } + ], + "ts-node": { + "esm": true + } +} diff --git a/ts/packages/agents/onboarding/README.md b/ts/packages/agents/onboarding/README.md index 1cd09843a4..01ecd9ad98 100644 --- a/ts/packages/agents/onboarding/README.md +++ b/ts/packages/agents/onboarding/README.md @@ -6,15 +6,15 @@ A TypeAgent agent that automates the end-to-end process of integrating a new app Integrating a new application into TypeAgent involves 7 phases: -| Phase | Sub-agent | What it does | -| ----- | ----------------------- | ------------------------------------------------------------------ | -| 1 | `onboarding-discovery` | Crawls docs or parses an OpenAPI spec to enumerate the API surface | -| 2 | `onboarding-phrasegen` | Generates natural language sample phrases for each action | -| 3 | `onboarding-schemagen` | Generates TypeScript action schemas from the API surface | -| 4 | `onboarding-grammargen` | Generates `.agr` grammar files from schemas and phrases | -| 5 | `onboarding-scaffolder` | Stamps out the agent package infrastructure | -| 6 | `onboarding-testing` | Generates test cases and runs a phraseβ†’action validation loop | -| 7 | `onboarding-packaging` | Packages the agent for distribution and registration | +| Phase | Sub-agent | What it does | +| ----- | ----------------------- | ----------------------------------------------------------------------------------------------- | +| 1 | `onboarding-discovery` | Crawls docs, parses an OpenAPI spec, or crawls CLI `--help` output to enumerate the API surface | +| 2 | `onboarding-phrasegen` | Generates natural language sample phrases for each action | +| 3 | `onboarding-schemagen` | Generates TypeScript action schemas from the API surface | +| 4 | `onboarding-grammargen` | Generates `.agr` grammar files from schemas and phrases | +| 5 | `onboarding-scaffolder` | Stamps out the agent package infrastructure | +| 6 | `onboarding-testing` | Generates test cases and runs a phraseβ†’action validation loop | +| 7 | `onboarding-packaging` | Packages the agent for distribution and registration | Each phase produces **artifacts saved to disk** at `~/.typeagent/onboarding//`, so work can be resumed across sessions. @@ -42,11 +42,29 @@ resume onboarding for slack ``` crawl docs at https://api.slack.com/docs for slack +crawl CLI help for gh as github-cli generate phrases for slack generate schema for slack run tests for slack ``` +### CLI help discovery + +The discovery phase can recursively crawl a CLI binary's `--help` output to discover all subcommands and their flags: + +``` +crawl CLI help for gh as github-cli +crawl CLI help for az as azure-cli +``` + +This spawns the binary with `--help` (falling back to `-h`), parses subcommands, and recursively discovers the full command tree. Each subcommand becomes a `DiscoveredAction` with: + +- `path`: the full command (e.g., `gh issue create`) +- `method`: `"CLI"` +- `parameters`: parsed `--flags` with types + +When the scaffolder detects CLI-sourced actions, it auto-generates a working handler with `buildArgs()` and `runCli()` functions instead of a stub. + ## Workspace layout ``` @@ -132,13 +150,16 @@ pnpm install pnpm run build ``` +## Architecture + +See [AGENTS.md](./AGENTS.md) for details on the agent structure, how to extend it, and how each phase's LLM prompting works. + ## TODO ### Additional discovery crawlers -The discovery phase currently supports web docs and OpenAPI specs. Planned crawlers: +The discovery phase currently supports web docs, OpenAPI specs, and CLI `--help` scraping. Planned crawlers: -- **CLI `--help` scraping** β€” invoke a command-line tool with `--help` / `--help ` and parse the output to enumerate commands, flags, and arguments - **`dumpbin` / PE inspection** β€” extract exported function names and signatures from Windows DLLs for native library integration - **.NET reflection** β€” load a managed assembly and enumerate public types, methods, and parameters via `System.Reflection` - **Man pages** β€” parse `man` output for POSIX CLI tools @@ -148,10 +169,6 @@ The discovery phase currently supports web docs and OpenAPI specs. Planned crawl Each new crawler should implement the same `DiscoveryResult` contract so downstream phases (phrase gen, schema gen) remain crawler-agnostic. -## Architecture - -See [AGENTS.md](./AGENTS.md) for details on the agent structure, how to extend it, and how each phase's LLM prompting works. - ## Trademarks This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft diff --git a/ts/packages/agents/onboarding/package.json b/ts/packages/agents/onboarding/package.json index d7a09a6d90..cbca8859ea 100644 --- a/ts/packages/agents/onboarding/package.json +++ b/ts/packages/agents/onboarding/package.json @@ -44,11 +44,14 @@ "@typeagent/dispatcher-types": "workspace:*", "agent-dispatcher": "workspace:*", "aiclient": "workspace:*", + "debug": "^4.3.4", "dispatcher-node-providers": "workspace:*", + "typeagent": "workspace:*", "typechat": "^0.1.1" }, "devDependencies": { "@typeagent/action-schema-compiler": "workspace:*", + "@types/debug": "^4.1.12", "action-grammar-compiler": "workspace:*", "concurrently": "^9.1.2", "prettier": "^3.5.3", diff --git a/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts b/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts index ff70cf0351..ce33bc936b 100644 --- a/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts +++ b/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts @@ -19,6 +19,18 @@ import { readArtifactJson, } from "../lib/workspace.js"; import { getDiscoveryModel } from "../lib/llm.js"; +import { execFile } from "child_process"; +import { promisify } from "util"; +import path from "path"; +import { fileURLToPath } from "url"; +import registerDebug from "debug"; +import { createJsonTranslator, TypeChatJsonTranslator } from "typechat"; +import { createTypeScriptJsonValidator } from "typechat/ts"; +import { loadSchema } from "typeagent"; +import { CliDiscoveryResult } from "./discoveryLlmSchema.js"; + +const execFileAsync = promisify(execFile); +const debug = registerDebug("typeagent:onboarding:discovery"); // Represents a single discovered API action export type DiscoveredAction = { @@ -41,16 +53,39 @@ export type DiscoveredParameter = { required?: boolean; }; +export type DiscoveredEntity = { + name: string; + description?: string; + examples?: string[]; +}; + export type ApiSurface = { integrationName: string; discoveredAt: string; source: string; actions: DiscoveredAction[]; + entities?: DiscoveredEntity[]; approved?: boolean; approvedAt?: string; approvedActions?: string[]; }; +// TypeChat translator for structured CLI help extraction +function createCliDiscoveryTranslator(): TypeChatJsonTranslator { + const model = getDiscoveryModel(); + // At runtime __dirname is dist/discovery/; resolve back to src/discovery/ + const schemaPath = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + "../../src/discovery/discoveryLlmSchema.ts", + ); + const schema = loadSchema([schemaPath]); + const validator = createTypeScriptJsonValidator( + schema, + "CliDiscoveryResult", + ); + return createJsonTranslator(model, validator); +} + export async function executeDiscoveryAction( action: TypeAgentAction, _context: ActionContext, @@ -69,6 +104,13 @@ export async function executeDiscoveryAction( action.parameters.specSource, ); + case "crawlCliHelp": + return handleCrawlCliHelp( + action.parameters.integrationName, + action.parameters.command, + action.parameters.maxDepth, + ); + case "listDiscoveredActions": return handleListDiscoveredActions( action.parameters.integrationName, @@ -473,6 +515,266 @@ async function handleParseOpenApiSpec( ); } +// ── CLI Help Crawler ────────────────────────────────────────────────────── + +// CLIs where both --help and -h are known to be safe help flags. +// For unlisted commands only --help is attempted (since -h can mean +// something else, e.g. -h is "human-readable" in some Unix tools). +const SAFE_SHORT_HELP_CLIS = new Set([ + "gh", + "git", + "az", + "kubectl", + "docker", + "npm", + "pnpm", + "yarn", + "node", + "python", + "pip", + "dotnet", + "cargo", + "go", + "terraform", + "helm", + "aws", + "gcloud", + "heroku", +]); + +async function runHelp( + command: string, + args: string[], +): Promise { + const flags = SAFE_SHORT_HELP_CLIS.has(command) + ? ["--help", "-h"] + : ["--help"]; + if (!SAFE_SHORT_HELP_CLIS.has(command)) { + debug( + "Skipping -h fallback for unknown CLI %s (only --help is tried)", + command, + ); + } + for (const flag of flags) { + try { + const { stdout, stderr } = await execFileAsync( + command, + [...args, flag], + { + timeout: 15_000, + windowsHide: true, + }, + ); + const output = (stdout || stderr).trim(); + if (output.length > 0) return output; + } catch (err: any) { + // Many CLIs print help to stderr and exit non-zero; capture that + const output = ((err.stdout ?? "") + (err.stderr ?? "")).trim(); + if (output.length > 0) return output; + } + } + return undefined; +} + +// Parse subcommand names from help text heuristically +function parseSubcommands(helpText: string): string[] { + const subcommands: string[] = []; + + // Common patterns: + // "Available Commands:" / "Commands:" / "COMMANDS:" section + // Each line starts with optional whitespace then a command name + const sectionRe = + /(?:available\s+)?(?:commands|subcommands):\s*\n((?:[ \t]+\S.*\n?)+)/gi; + let match: RegExpExecArray | null; + while ((match = sectionRe.exec(helpText)) !== null) { + const block = match[1]; + for (const line of block.split("\n")) { + const m = line.match(/^\s{2,}(\S+)/); + if (m && !m[1].startsWith("-") && !m[1].startsWith("[")) { + subcommands.push(m[1]); + } + } + } + + return [...new Set(subcommands)]; +} + +async function crawlCliRecursive( + command: string, + args: string[], + depth: number, + maxDepth: number, + visited: Set = new Set(), +): Promise<{ command: string; helpText: string }[]> { + const cmdKey = [command, ...args].join(" "); + if (depth > maxDepth || visited.has(cmdKey)) return []; + visited.add(cmdKey); + + const helpText = await runHelp(command, args); + if (!helpText) return []; + + const results: { command: string; helpText: string }[] = [ + { command: [command, ...args].join(" "), helpText }, + ]; + + const subcommands = parseSubcommands(helpText); + for (const sub of subcommands) { + const childResults = await crawlCliRecursive( + command, + [...args, sub], + depth + 1, + maxDepth, + visited, + ); + results.push(...childResults); + } + + return results; +} + +async function handleCrawlCliHelp( + integrationName: string, + command: string, + maxDepth?: number, +): Promise { + const state = await loadState(integrationName); + if (!state) { + return { + error: `Integration "${integrationName}" not found. Run startOnboarding first.`, + }; + } + + await updatePhase(integrationName, "discovery", { status: "in-progress" }); + + // Crawl the CLI help recursively + const helpEntries = await crawlCliRecursive(command, [], 0, maxDepth ?? 4); + if (helpEntries.length === 0) { + return { + error: `Could not retrieve help output from "${command}". Ensure the command is installed and accessible.`, + }; + } + + // Combine all help text for LLM extraction + const combinedHelp = helpEntries + .map((e) => `### ${e.command}\n\n${e.helpText}`) + .join("\n\n---\n\n"); + + const maxHelpChars = 12000; + const helpText = combinedHelp.slice(0, maxHelpChars); + if (combinedHelp.length > maxHelpChars) { + debug( + "Help output truncated from %d to %d chars for %s", + combinedHelp.length, + maxHelpChars, + command, + ); + } + + // Use TypeChat for structured LLM extraction with validation and retry + const translator = createCliDiscoveryTranslator(); + const request = + `Extract all leaf CLI actions from the following help output for "${integrationName}".\n\n` + + `Base command: ${command}\n` + + `Total subcommands crawled: ${helpEntries.length}\n` + + `Only include leaf commands that perform an action, not command groups.\n` + + `Derive camelCase names from the command path (e.g. "gh repo create" β†’ "repoCreate").\n` + + `Also identify the domain entities referenced across the CLI ` + + `(e.g. repositories, issues, pull requests, users).\n\n` + + `Help output:\n${helpText}`; + + const result = await translator.translate(request); + if (!result.success) { + return { error: `LLM extraction failed: ${result.message}` }; + } + + const source = `cli:${command}`; + let actions: DiscoveredAction[] = result.data.actions.map((a) => { + const action: DiscoveredAction = { + name: a.name, + description: a.description, + method: "CLI", + path: a.path, + sourceUrl: source, + }; + if (a.parameters && a.parameters.length > 0) { + action.parameters = a.parameters.map((p) => { + const param: DiscoveredParameter = { + name: p.name, + type: p.type, + }; + if (p.description) param.description = p.description; + if (p.required !== undefined) param.required = p.required; + return param; + }); + } + return action; + }); + + // Map extracted entities + const entities: DiscoveredEntity[] = (result.data.entities ?? []).map( + (e) => { + const entity: DiscoveredEntity = { name: e.name }; + if (e.description) entity.description = e.description; + if (e.examples && e.examples.length > 0) + entity.examples = e.examples; + return entity; + }, + ); + + // Merge with any existing discovered actions + const existing = await readArtifactJson( + integrationName, + "discovery", + "api-surface.json", + ); + const merged: ApiSurface = { + integrationName, + discoveredAt: new Date().toISOString(), + source, + actions: [ + ...(existing?.actions ?? []).filter( + (a) => !actions.find((n) => n.name === a.name), + ), + ...actions, + ], + }; + if (entities.length > 0) { + // Merge entities, deduplicating by name + const existingEntities = existing?.entities ?? []; + const entityMap = new Map(existingEntities.map((e) => [e.name, e])); + for (const e of entities) { + entityMap.set(e.name, e); + } + merged.entities = [...entityMap.values()]; + } + + await writeArtifactJson( + integrationName, + "discovery", + "api-surface.json", + merged, + ); + + return createActionResultFromMarkdownDisplay( + `## CLI discovery complete: ${integrationName}\n\n` + + `**Command:** \`${command}\`\n` + + `**Subcommands crawled:** ${helpEntries.length}\n` + + `**Actions found:** ${actions.length}\n` + + `**Entities found:** ${entities.length}\n\n` + + actions + .slice(0, 20) + .map((a) => `- **${a.name}** (\`${a.path}\`): ${a.description}`) + .join("\n") + + (actions.length > 20 + ? `\n\n_...and ${actions.length - 20} more_` + : "") + + (entities.length > 0 + ? `\n\n**Entities:** ${entities.map((e) => e.name).join(", ")}` + : "") + + `\n\nReview with \`listDiscoveredActions\`, then \`approveApiSurface\` to proceed.`, + ); +} + async function handleListDiscoveredActions( integrationName: string, ): Promise { diff --git a/ts/packages/agents/onboarding/src/discovery/discoveryLlmSchema.ts b/ts/packages/agents/onboarding/src/discovery/discoveryLlmSchema.ts new file mode 100644 index 0000000000..bae4956a0e --- /dev/null +++ b/ts/packages/agents/onboarding/src/discovery/discoveryLlmSchema.ts @@ -0,0 +1,45 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +// TypeChat schema for CLI discovery LLM extraction. +// This file is loaded as text by TypeChat's validator β€” keep it +// self-contained with no runtime imports. + +/** Result of extracting CLI actions from help output. */ +export type CliDiscoveryResult = { + /** Leaf CLI actions (commands that perform an action, not command groups). */ + actions: CliAction[]; + /** Domain entities referenced across the CLI (e.g. repos, issues, users). */ + entities?: CliEntity[]; +}; + +export type CliAction = { + /** camelCase name derived from the command path (e.g. "gh repo create" β†’ "repoCreate"). */ + name: string; + /** Brief description of what the command does. */ + description: string; + /** Full CLI command path (e.g. "gh repo create"). */ + path: string; + /** Discovered parameters (flags and positional arguments). */ + parameters?: CliParameter[]; +}; + +export type CliParameter = { + /** Parameter name (e.g. "--limit" or ""). */ + name: string; + /** Data type (string, number, boolean, etc.). */ + type: string; + /** Brief description of the parameter. */ + description?: string; + /** Whether the parameter is required. */ + required?: boolean; +}; + +export type CliEntity = { + /** Singular noun for this entity (e.g. "repository", "issue", "user"). */ + name: string; + /** Brief description of the entity. */ + description?: string; + /** Example values that appear in help text (e.g. "owner/repo", "#123"). */ + examples?: string[]; +}; diff --git a/ts/packages/agents/onboarding/src/discovery/discoverySchema.agr b/ts/packages/agents/onboarding/src/discovery/discoverySchema.agr index f130d13d93..f799be0d5f 100644 --- a/ts/packages/agents/onboarding/src/discovery/discoverySchema.agr +++ b/ts/packages/agents/onboarding/src/discovery/discoverySchema.agr @@ -63,9 +63,26 @@ } }; +// crawlCliHelp - discover actions by crawling a CLI binary's help output + = crawl (cli | command) (help | usage) (for | of)? $(command:wildcard) (as | for) $(integrationName:wildcard) -> { + actionName: "crawlCliHelp", + parameters: { + command, + integrationName + } +} + | (discover | scan | explore) (the)? $(command:wildcard) (cli | command) (help)? (as | for) $(integrationName:wildcard) -> { + actionName: "crawlCliHelp", + parameters: { + command, + integrationName + } +}; + import { DiscoveryActions } from "./discoverySchema.ts"; : DiscoveryActions = | + | | | ; diff --git a/ts/packages/agents/onboarding/src/discovery/discoverySchema.ts b/ts/packages/agents/onboarding/src/discovery/discoverySchema.ts index 44d27c9bcc..5455c264fc 100644 --- a/ts/packages/agents/onboarding/src/discovery/discoverySchema.ts +++ b/ts/packages/agents/onboarding/src/discovery/discoverySchema.ts @@ -3,6 +3,7 @@ export type DiscoveryActions = | CrawlDocUrlAction + | CrawlCliHelpAction | ParseOpenApiSpecAction | ListDiscoveredActionsAction | ApproveApiSurfaceAction; @@ -29,6 +30,18 @@ export type ParseOpenApiSpecAction = { }; }; +export type CrawlCliHelpAction = { + actionName: "crawlCliHelp"; + parameters: { + // Name of the integration being onboarded + integrationName: string; + // The CLI command to crawl (e.g. "gh", "az", "kubectl") + command: string; + // Maximum recursion depth into subcommands (default: 4) + maxDepth?: number; + }; +}; + export type ListDiscoveredActionsAction = { actionName: "listDiscoveredActions"; parameters: { diff --git a/ts/packages/agents/onboarding/src/lib/llm.ts b/ts/packages/agents/onboarding/src/lib/llm.ts index e79e6b6d06..0cc6e5c9b3 100644 --- a/ts/packages/agents/onboarding/src/lib/llm.ts +++ b/ts/packages/agents/onboarding/src/lib/llm.ts @@ -6,29 +6,44 @@ // with DEBUG=typeagent:openai:* environment variable. // // Credentials are read from ts/.env via the standard TypeAgent mechanism. +// Pass an optional endpoint (e.g. "openai:gpt-5") to override the default +// model. When omitted the model is determined by the OPENAI_MODEL / +// AZURE_OPENAI_CHAT_MODEL_DEPLOYMENT_NAME environment variable. import { ChatModel, openai } from "aiclient"; -export function getDiscoveryModel(): ChatModel { - return openai.createChatModelDefault("onboarding:discovery"); +export function getDiscoveryModel(endpoint?: string): ChatModel { + return openai.createChatModel(endpoint, undefined, undefined, [ + "onboarding:discovery", + ]); } -export function getPhraseGenModel(): ChatModel { - return openai.createChatModelDefault("onboarding:phrasegen"); +export function getPhraseGenModel(endpoint?: string): ChatModel { + return openai.createChatModel(endpoint, undefined, undefined, [ + "onboarding:phrasegen", + ]); } -export function getSchemaGenModel(): ChatModel { - return openai.createChatModelDefault("onboarding:schemagen"); +export function getSchemaGenModel(endpoint?: string): ChatModel { + return openai.createChatModel(endpoint, undefined, undefined, [ + "onboarding:schemagen", + ]); } -export function getGrammarGenModel(): ChatModel { - return openai.createChatModelDefault("onboarding:grammargen"); +export function getGrammarGenModel(endpoint?: string): ChatModel { + return openai.createChatModel(endpoint, undefined, undefined, [ + "onboarding:grammargen", + ]); } -export function getTestingModel(): ChatModel { - return openai.createChatModelDefault("onboarding:testing"); +export function getTestingModel(endpoint?: string): ChatModel { + return openai.createChatModel(endpoint, undefined, undefined, [ + "onboarding:testing", + ]); } -export function getPackagingModel(): ChatModel { - return openai.createChatModelDefault("onboarding:packaging"); +export function getPackagingModel(endpoint?: string): ChatModel { + return openai.createChatModel(endpoint, undefined, undefined, [ + "onboarding:packaging", + ]); } diff --git a/ts/packages/agents/onboarding/src/onboardingActionHandler.ts b/ts/packages/agents/onboarding/src/onboardingActionHandler.ts index b329a56f00..bd2f795b9b 100644 --- a/ts/packages/agents/onboarding/src/onboardingActionHandler.ts +++ b/ts/packages/agents/onboarding/src/onboardingActionHandler.ts @@ -70,6 +70,7 @@ async function executeAction( // Discovery phase if ( actionName === "crawlDocUrl" || + actionName === "crawlCliHelp" || actionName === "parseOpenApiSpec" || actionName === "listDiscoveredActions" || actionName === "approveApiSurface" @@ -180,7 +181,7 @@ async function executeOnboardingAction( return createActionResultFromMarkdownDisplay( `## Onboarding started: ${integrationName}\n\n` + `**Next step:** Phase 1 β€” Discovery\n\n` + - `Use \`crawlDocUrl\` or \`parseOpenApiSpec\` to enumerate the API surface.\n\n` + + `Use \`crawlDocUrl\`, \`crawlCliHelp\`, or \`parseOpenApiSpec\` to enumerate the API surface.\n\n` + `Workspace: \`~/.typeagent/onboarding/${integrationName}/\``, ); } @@ -257,7 +258,7 @@ async function executeOnboardingAction( function phaseNextStepHint(phase: string): string { const hints: Record = { discovery: - "Use `crawlDocUrl` or `parseOpenApiSpec` to enumerate the API surface.", + "Use `crawlDocUrl`, `crawlCliHelp`, or `parseOpenApiSpec` to enumerate the API surface.", phraseGen: "Use `generatePhrases` to create natural language samples for each action.", schemaGen: diff --git a/ts/packages/agents/onboarding/src/scaffolder/cliHandler.template b/ts/packages/agents/onboarding/src/scaffolder/cliHandler.template new file mode 100644 index 0000000000..a7491d6879 --- /dev/null +++ b/ts/packages/agents/onboarding/src/scaffolder/cliHandler.template @@ -0,0 +1,54 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +// +// Auto-generated CLI handler for {{NAME}} + +import { execFile } from "child_process"; +import { promisify } from "util"; +import { + ActionContext, + AppAgent, + TypeAgentAction, +} from "@typeagent/agent-sdk"; +import { + createActionResultFromTextDisplay, +} from "@typeagent/agent-sdk/helpers/action"; +import { {{PASCAL_NAME}}Actions } from "./{{NAME}}Schema.js"; + +const execFileAsync = promisify(execFile); + +async function runCli(...cliArgs: string[]): Promise { + const { stdout, stderr } = await execFileAsync("{{CLI_COMMAND}}", cliArgs, { + timeout: 30_000, + }); + return (stdout || stderr).trim(); +} + +function buildArgs(action: TypeAgentAction<{{PASCAL_NAME}}Actions>): string[] { + const args: string[] = []; + const params = action.parameters as Record; + switch (action.actionName) { +{{SWITCH_CASES}} + default: + throw new Error(`Unknown action: ${action.actionName}`); + } + return args; +} + +export function instantiate(): AppAgent { + return { + executeAction: async ( + action: TypeAgentAction<{{PASCAL_NAME}}Actions>, + context: ActionContext<{{PASCAL_NAME}}Actions>, + ) => { + try { + const args = buildArgs(action); + const output = await runCli(...args); + return createActionResultFromTextDisplay(output); + } catch (e: unknown) { + const msg = e instanceof Error ? e.message : String(e); + return createActionResultFromTextDisplay(`Error: ${msg}`); + } + }, + }; +} diff --git a/ts/packages/agents/onboarding/src/scaffolder/cliHandlerTemplate.ts b/ts/packages/agents/onboarding/src/scaffolder/cliHandlerTemplate.ts new file mode 100644 index 0000000000..ef0b4e7e9b --- /dev/null +++ b/ts/packages/agents/onboarding/src/scaffolder/cliHandlerTemplate.ts @@ -0,0 +1,74 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +// CLI handler template generator. +// Produces a complete TypeScript action handler that shells out to a CLI tool. +// Called by scaffolderHandler when the API surface contains CLI-sourced actions. +// The handler skeleton lives in cliHandler.template; this module builds the +// switch-case body and interpolates the placeholders. + +import type { DiscoveredAction } from "../discovery/discoveryHandler.js"; +import fs from "fs/promises"; +import path from "path"; +import { fileURLToPath } from "url"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +// Resolve template from src/ relative to the package root. +// At runtime __dirname is dist/scaffolder/, so go up two levels to package root. +function templatePath(): string { + return path.resolve(__dirname, "../../src/scaffolder/cliHandler.template"); +} + +function flagToCamel(flag: string): string { + return flag + .replace(/^--?/, "") + .replace(/-([a-z])/g, (_, c) => c.toUpperCase()); +} + +function buildSwitchCases(actions: DiscoveredAction[]): string { + const cases: string[] = []; + for (const action of actions) { + const subCmd = action.path ?? action.name; + const flagLines: string[] = []; + if (action.parameters) { + for (const p of action.parameters) { + const camel = flagToCamel(p.name); + const flag = p.name.startsWith("-") ? p.name : `--${p.name}`; + if (p.type === "boolean") { + flagLines.push( + ` if (params.${camel} === true) args.push("${flag}");`, + ); + } else { + flagLines.push( + ` if (params.${camel} !== undefined && params.${camel} !== null) args.push("${flag}", String(params.${camel}));`, + ); + } + } + } + const body = + flagLines.length > 0 + ? `\n${flagLines.join("\n")}\n ` + : " "; + cases.push( + ` case "${action.name}":\n args.push(...${JSON.stringify(subCmd.split(" "))});${body}break;`, + ); + } + return cases.join("\n"); +} + +export async function buildCliHandler( + name: string, + pascalName: string, + cliCommand: string, + actions: DiscoveredAction[], +): Promise { + const tpl = await fs.readFile(templatePath(), "utf-8"); + const switchCases = buildSwitchCases(actions); + return tpl + .replace(/\{\{NAME\}\}/g, name) + .replace(/\{\{PASCAL_NAME\}\}/g, pascalName) + .replace(/\{\{CLI_COMMAND\}\}/g, cliCommand) + .replace(/\{\{SWITCH_CASES\}\}/g, switchCases); +} diff --git a/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts b/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts index 96bb718f72..18a5e2661a 100644 --- a/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts +++ b/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts @@ -19,6 +19,8 @@ import { readArtifact, readArtifactJson, } from "../lib/workspace.js"; +import type { ApiSurface } from "../discovery/discoveryHandler.js"; +import { buildCliHandler } from "./cliHandlerTemplate.js"; import fs from "fs/promises"; import path from "path"; import { fileURLToPath } from "url"; @@ -51,6 +53,7 @@ export async function executeScaffolderAction( action.parameters.integrationName, action.parameters.pattern, action.parameters.outputDir, + action.parameters.emojiChar, ); case "scaffoldPlugin": return handleScaffoldPlugin( @@ -69,6 +72,7 @@ async function handleScaffoldAgent( integrationName: string, pattern: AgentPattern = "schema-grammar", outputDir?: string, + emojiChar?: string, ): Promise { const state = await loadState(integrationName); if (!state) return { error: `Integration "${integrationName}" not found.` }; @@ -94,6 +98,13 @@ async function handleScaffoldAgent( }; } + // Load discovery data to determine handler strategy (CLI vs stub) + const apiSurface = await readArtifactJson( + integrationName, + "discovery", + "api-surface.json", + ); + await updatePhase(integrationName, "scaffolder", { status: "in-progress" }); // Determine package name and Pascal-case type name @@ -179,6 +190,7 @@ async function handleScaffoldAgent( state.config.description ?? "", pattern, subGroups, + emojiChar, ), null, 2, @@ -189,7 +201,7 @@ async function handleScaffoldAgent( // Stamp out handler await writeFile( path.join(srcDir, `${integrationName}ActionHandler.ts`), - buildHandler(integrationName, pascalName, pattern), + await buildHandler(integrationName, pascalName, pattern, apiSurface), ); files.push(`src/${integrationName}ActionHandler.ts`); @@ -412,11 +424,12 @@ function buildManifest( description: string, pattern: AgentPattern = "schema-grammar", subGroups?: SubSchemaGroup[], + emojiChar?: string, ) { const manifest: Record = { - emojiChar: "πŸ”Œ", + emojiChar: emojiChar || "πŸ”Ž", description: description || `Agent for ${name}`, - defaultEnabled: false, + defaultEnabled: true, schema: { description: `${pascalName} agent actions`, originalSchemaFile: `./${name}Schema.ts`, @@ -455,11 +468,21 @@ function buildManifest( return manifest; } -function buildHandler( +async function buildHandler( name: string, pascalName: string, pattern: AgentPattern = "schema-grammar", -): string { + apiSurface?: ApiSurface, +): Promise { + // If discovery data contains CLI actions, generate a CLI handler + const cliActions = apiSurface?.actions?.filter((a) => + a.sourceUrl?.startsWith("cli:"), + ); + if (cliActions && cliActions.length > 0) { + const cliCommand = cliActions[0].sourceUrl!.split(":")[1]; + return await buildCliHandler(name, pascalName, cliCommand, cliActions); + } + switch (pattern) { case "external-api": return buildExternalApiHandler(name, pascalName); diff --git a/ts/packages/agents/onboarding/src/scaffolder/scaffolderSchema.ts b/ts/packages/agents/onboarding/src/scaffolder/scaffolderSchema.ts index 6de7584c34..2a0aa484c8 100644 --- a/ts/packages/agents/onboarding/src/scaffolder/scaffolderSchema.ts +++ b/ts/packages/agents/onboarding/src/scaffolder/scaffolderSchema.ts @@ -28,6 +28,8 @@ export type ScaffoldAgentAction = { pattern?: AgentPattern; // Target directory for the agent package (defaults to ts/packages/agents/) outputDir?: string; + // Emoji character for the agent icon (defaults to "πŸ”Ž") + emojiChar?: string; }; }; diff --git a/ts/packages/agents/onboarding/src/testing/runTests.ts b/ts/packages/agents/onboarding/src/testing/runTests.ts new file mode 100644 index 0000000000..2a0a83a672 --- /dev/null +++ b/ts/packages/agents/onboarding/src/testing/runTests.ts @@ -0,0 +1,196 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +// Quick test runner for onboarding agent tests +// Run from ts/ root: node --disable-warning=DEP0190 packages/agents/onboarding/dist/testing/runTests.js + +import { createDispatcher } from "agent-dispatcher"; +import { + createNpmAppAgentProvider, + getFsStorageProvider, +} from "dispatcher-node-providers"; +import { getInstanceDir } from "agent-dispatcher/helpers/data"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import fs from "node:fs"; +import os from "node:os"; + +// Load .env from ts/ root so API keys are available for LLM translation fallback +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const envPath = path.resolve(__dirname, "../../../../../../.env"); +if (fs.existsSync(envPath)) { + for (const line of fs.readFileSync(envPath, "utf-8").split("\n")) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const eqIdx = trimmed.indexOf("="); + if (eqIdx < 0) continue; + const key = trimmed.slice(0, eqIdx).trim(); + const val = trimmed + .slice(eqIdx + 1) + .trim() + .replace(/^["']|["']$/g, ""); + if (!process.env[key]) process.env[key] = val; + } + console.log(`Loaded env from ${envPath}`); +} + +const integrationName = process.argv[2] || "github-cli"; + +const AGENTS_DIR = path.resolve(__dirname, "../../../../../../packages/agents"); +const WORKSPACE_DIR = path.join( + os.homedir(), + ".typeagent", + "onboarding", + integrationName, +); + +const testCasesFile = path.join(WORKSPACE_DIR, "testing", "test-cases.json"); +if (!fs.existsSync(testCasesFile)) { + console.error(`No test cases at ${testCasesFile}`); + process.exit(1); +} +const testCases = JSON.parse(fs.readFileSync(testCasesFile, "utf-8")); +console.log(`Loaded ${testCases.length} test cases for "${integrationName}"`); + +const agentDir = path.resolve(AGENTS_DIR, integrationName); +const packageName = `${integrationName}-agent`; +const configs = { [integrationName]: { name: packageName, path: agentDir } }; +const provider = createNpmAppAgentProvider(configs, import.meta.url); + +const noop = () => {}; +const clientIO = { + clear: noop, + exit: () => process.exit(0), + setUserRequest: noop, + setDisplayInfo: noop, + setDisplay: noop, + appendDisplay: noop, + appendDiagnosticData: noop, + setDynamicDisplay: noop, + askYesNo: async (_id: any, _msg: any, def = false) => def, + proposeAction: async () => undefined, + popupQuestion: async () => { + throw new Error("not supported"); + }, + notify: noop, + openLocalView: async () => {}, + closeLocalView: async () => {}, + requestChoice: noop, + takeAction: noop, + requestInteraction: noop, + interactionResolved: noop, + interactionCancelled: noop, +}; + +const instanceDir = getInstanceDir(); +const tmpDir = path.join(instanceDir, "onboarding-test-tmp-" + Date.now()); + +// Diagnostic: check provider +console.log("Agent names from provider:", provider.getAppAgentNames()); +try { + const manifest = await provider.getAppAgentManifest(integrationName); + console.log( + "Manifest loaded:", + JSON.stringify( + { + desc: manifest.description, + schema: manifest.schema + ? { + schemaFile: manifest.schema.schemaFile, + grammarFile: manifest.schema.grammarFile, + schemaType: manifest.schema.schemaType, + } + : "NONE", + }, + null, + 2, + ), + ); +} catch (e: any) { + console.error("Failed to load manifest:", e.message); +} + +console.log("Creating test dispatcher..."); +const dispatcher = await createDispatcher("onboarding-test-runner", { + appAgentProviders: [provider], + agents: { + schemas: [integrationName], + actions: [integrationName], + commands: ["dispatcher", integrationName], + }, + explainer: { enabled: false }, + cache: { enabled: true }, + collectCommandResult: true, + persistDir: tmpDir, + storageProvider: getFsStorageProvider(), + clientIO, + dblogging: false, +}); + +console.log("Running tests..."); +const results = []; +let passed = 0; +for (let i = 0; i < testCases.length; i++) { + const tc = testCases[i]; + try { + const result = await dispatcher.processCommand(tc.phrase); + const actual = result?.actions?.[0]?.actionName; + const ok = actual === tc.expectedActionName; + if (ok) passed++; + results.push({ + phrase: tc.phrase, + expectedActionName: tc.expectedActionName, + actualActionName: actual, + passed: ok, + ...(ok + ? {} + : { + error: `Expected "${tc.expectedActionName}", got "${actual ?? "none"}"`, + }), + }); + if (!ok) { + console.log( + ` FAIL [${i + 1}/${testCases.length}]: "${tc.phrase.substring(0, 60)}" β†’ ${actual ?? "none"} (exp: ${tc.expectedActionName})`, + ); + } + } catch (err: any) { + results.push({ + phrase: tc.phrase, + expectedActionName: tc.expectedActionName, + passed: false, + error: err?.message ?? String(err), + }); + console.log( + ` ERROR [${i + 1}/${testCases.length}]: "${tc.phrase.substring(0, 60)}" β†’ ${err?.message?.substring(0, 80)}`, + ); + } +} + +const failed = results.length - passed; +const passRate = Math.round((passed / results.length) * 100); +console.log( + `\nResults: ${passed}/${results.length} (${passRate}%) β€” ${failed} failures`, +); + +const resultFile = path.join(WORKSPACE_DIR, "testing", "results.json"); +fs.writeFileSync( + resultFile, + JSON.stringify( + { + integrationName, + ranAt: new Date().toISOString(), + total: results.length, + passed, + failed, + results, + }, + null, + 2, + ), +); +console.log(`Results saved to ${resultFile}`); + +await dispatcher.close(); +fs.rmSync(tmpDir, { recursive: true, force: true }); +process.exit(0); diff --git a/ts/packages/agents/onboarding/src/testing/testingHandler.ts b/ts/packages/agents/onboarding/src/testing/testingHandler.ts index f182d7d80f..c645d0aa6f 100644 --- a/ts/packages/agents/onboarding/src/testing/testingHandler.ts +++ b/ts/packages/agents/onboarding/src/testing/testingHandler.ts @@ -30,8 +30,8 @@ import { createNpmAppAgentProvider, getFsStorageProvider, } from "dispatcher-node-providers"; -import fs from "node:fs"; import path from "node:path"; +import { fileURLToPath } from "node:url"; import { getInstanceDir } from "agent-dispatcher/helpers/data"; import type { ClientIO, @@ -192,7 +192,7 @@ async function handleRunTests( | Awaited> | undefined; try { - dispatcherSession = await createTestDispatcher(); + dispatcherSession = await createTestDispatcher(integrationName); } catch (err: any) { return { error: @@ -529,37 +529,49 @@ function createCapturingClientIO(buffer: string[]): ClientIO { } satisfies ClientIO; } -// Build a provider containing only the externally-registered agents. -// The scaffolded agent must be registered in the TypeAgent config before -// running tests (use `packageAgent --register` or add manually to config.json). -function getExternalAppAgentProviders(instanceDir: string) { - const configPath = path.join(instanceDir, "externalAgentsConfig.json"); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const agents = fs.existsSync(configPath) - ? ((JSON.parse(fs.readFileSync(configPath, "utf8")) as any).agents ?? - {}) - : {}; - return [ - createNpmAppAgentProvider( - agents, - path.join(instanceDir, "externalagents/package.json"), - ), - ]; +// Build an agent provider for the scaffolded agent under test. +// Uses path-based resolution so we don't need a direct npm dependency on +// the generated agent (which would create a circular dependency via +// default-agent-provider). +const AGENTS_DIR = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + "../../../../../../packages/agents", +); + +function getTestAgentProvider(integrationName: string) { + const packageName = `${integrationName}-agent`; + const agentDir = path.resolve(AGENTS_DIR, integrationName); + const configs: Record = { + [integrationName]: { name: packageName, path: agentDir }, + }; + // requirePath is only used when info.path is NOT set; with an absolute + // path the provider resolves the agent directory directly. + return createNpmAppAgentProvider(configs, import.meta.url); } -async function createTestDispatcher() { +async function createTestDispatcher(integrationName: string) { const instanceDir = getInstanceDir(); - const appAgentProviders = getExternalAppAgentProviders(instanceDir); + const appAgentProviders = [getTestAgentProvider(integrationName)]; const buffer: string[] = []; const clientIO = createCapturingClientIO(buffer); + // Use a temp directory for the test dispatcher so it starts with a + // fresh cache on every run β€” stale wildcard entries from prior runs + // can override newly-added grammar rules. + const tmpDir = path.join(instanceDir, "onboarding-test-tmp-" + Date.now()); + const dispatcher = await createDispatcher("onboarding-test-runner", { appAgentProviders, - agents: { commands: ["dispatcher"] }, + agents: { + schemas: [integrationName], + actions: [integrationName], + commands: ["dispatcher", integrationName], + }, explainer: { enabled: false }, - cache: { enabled: false }, + // Cache must be enabled for grammar matching to work. + cache: { enabled: true }, collectCommandResult: true, - persistDir: instanceDir, + persistDir: tmpDir, storageProvider: getFsStorageProvider(), clientIO, dblogging: false, @@ -573,8 +585,10 @@ async function runSingleTest( integrationName: string, dispatcher: Awaited>["dispatcher"], ): Promise { - // Route to the specific integration agent: "@ " - const command = `@${integrationName} ${tc.phrase}`; + // Send the phrase directly β€” the dispatcher grammar-matches it to the + // agent's action schema. Do NOT use the "@agent" prefix because that + // enters the command-handler path and requires executeCommand(). + const command = tc.phrase; let result: CommandResult | undefined; try { @@ -589,6 +603,23 @@ async function runSingleTest( } if (result?.lastError) { + // If an action was dispatched, check the action name first β€” the test + // validates phraseβ†’action routing, not execution of the stub handler. + const actualActionName = result?.actions?.[0]?.actionName; + if (actualActionName !== undefined) { + const passed = actualActionName === tc.expectedActionName; + return { + phrase: tc.phrase, + expectedActionName: tc.expectedActionName, + actualActionName, + passed, + ...(passed + ? undefined + : { + error: `Expected "${tc.expectedActionName}", got "${actualActionName}"`, + }), + }; + } return { phrase: tc.phrase, expectedActionName: tc.expectedActionName, diff --git a/ts/packages/cli/demo/github_cli.txt b/ts/packages/cli/demo/github_cli.txt new file mode 100644 index 0000000000..b14b17c3dc --- /dev/null +++ b/ts/packages/cli/demo/github_cli.txt @@ -0,0 +1,48 @@ +# ============================================= +# GitHub CLI Agent Demo (CLI version) +# ============================================= + +@config action -* github-cli +@config schema -* github-cli + +# My GitHub status at a glance +show my GitHub status + +# How popular is TypeAgent? +how many stars does microsoft/TypeAgent have + +# Who are the top contributors? +show top 10 contributors to microsoft/TypeAgent + +# What PRs are open? +list open PRs in microsoft/TypeAgent + +# Just the latest +get latest 5 PRs in microsoft/TypeAgent + +# Drill into a PR +show PR 2180 in microsoft/TypeAgent + +# What issues need attention? +get latest 5 issues in microsoft/TypeAgent + +# Drill into a specific issue +show issue 2170 in microsoft/TypeAgent + +# Check for security vulnerabilities +show high severity dependabot alerts in microsoft/TypeAgent + +# Star a repo +star microsoft/TypeAgent + +# Create an issue and close it +create issue "Demo test - safe to ignore" + +# Close it (presenter: update number from the output above) +close issue 2186 + +# Full repo overview +show repository microsoft/TypeAgent + +# Am I authenticated? +check my GitHub authentication diff --git a/ts/packages/defaultAgentProvider/data/config.json b/ts/packages/defaultAgentProvider/data/config.json index b4ada610f7..97e13afa86 100644 --- a/ts/packages/defaultAgentProvider/data/config.json +++ b/ts/packages/defaultAgentProvider/data/config.json @@ -70,6 +70,9 @@ }, "onboarding": { "name": "onboarding-agent" + }, + "github-cli": { + "name": "github-cli-agent" } }, "mcpServers": { diff --git a/ts/packages/defaultAgentProvider/package.json b/ts/packages/defaultAgentProvider/package.json index c71a01aa30..812522b884 100644 --- a/ts/packages/defaultAgentProvider/package.json +++ b/ts/packages/defaultAgentProvider/package.json @@ -57,6 +57,7 @@ "email": "workspace:*", "exifreader": "^4.30.1", "file-size": "^1.0.0", + "github-cli-agent": "workspace:*", "glob": "^13.0.0", "greeting-agent": "workspace:*", "image-agent": "workspace:*", diff --git a/ts/packages/shell/demo/github_cli.txt b/ts/packages/shell/demo/github_cli.txt new file mode 100644 index 0000000000..0316cac9c1 --- /dev/null +++ b/ts/packages/shell/demo/github_cli.txt @@ -0,0 +1,94 @@ +# ====== Init ======= +@config action -* github-cli +@config schema -* github-cli + +# ============================================= +# GitHub CLI Agent Demo +# Natural language β†’ real gh CLI execution +# ============================================= + +# ------------------------------------- +# Authentication & config +# ------------------------------------- + +# Verify we're logged in +check my GitHub authentication + +# ------------------------------------- +# Start with your personal GitHub status +# ------------------------------------- + +# What's happening across my repos? +show my GitHub status + +# ------------------------------------- +# Explore a repository +# ------------------------------------- + +# Get an overview of a project +how many stars does microsoft/TypeAgent have + +# What issues are being tracked? +show open issues in microsoft/TypeAgent + +# Who built this thing? +show top 10 contributors to microsoft/TypeAgent + +# ------------------------------------- +# Pull request workflows +# ------------------------------------- + +# See what's in flight +list open PRs in microsoft/TypeAgent + +# Just the most recent ones +get latest 5 PRs in microsoft/TypeAgent + +# Drill into a specific PR +show PR 2180 in microsoft/TypeAgent + +# ------------------------------------- +# Issue management +# ------------------------------------- + +# Get the latest issues +get latest 5 issues in microsoft/TypeAgent + +# Drill into a specific issue +show issue 2170 in microsoft/TypeAgent + +# ------------------------------------- +# Security +# ------------------------------------- + +# Check for vulnerabilities +show dependabot alerts in microsoft/TypeAgent + +# Filter by severity +show high severity dependabot alerts in microsoft/TypeAgent + +# ------------------------------------- +# Write actions +# ------------------------------------- + +# Star a repo you like +star microsoft/TypeAgent + +# Unstar it +unstar microsoft/TypeAgent + +# Create an issue +create issue "Demo test - safe to ignore" + +# Close it (presenter: update number from the output above) +close issue 2186 + +# ------------------------------------- +# Repository discovery +# ------------------------------------- + +# Find interesting projects +search repositories for TypeScript agent framework + +# Full repo overview +show repository microsoft/TypeAgent \ No newline at end of file diff --git a/ts/pnpm-lock.yaml b/ts/pnpm-lock.yaml index 6d91072476..7029b87662 100644 --- a/ts/pnpm-lock.yaml +++ b/ts/pnpm-lock.yaml @@ -150,7 +150,7 @@ importers: version: 8.18.1 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -527,7 +527,7 @@ importers: version: 16.5.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -758,7 +758,7 @@ importers: version: 12.0.2(webpack@5.105.0) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -899,7 +899,7 @@ importers: version: 12.0.2(webpack@5.105.0) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -926,7 +926,7 @@ importers: dependencies: '@anthropic-ai/claude-agent-sdk': specifier: ^0.2.92 - version: 0.2.92(zod@4.3.6) + version: 0.2.105(zod@4.3.6) '@typeagent/action-schema': specifier: workspace:* version: link:../actionSchema @@ -957,7 +957,7 @@ importers: version: 2.0.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -1007,7 +1007,7 @@ importers: version: 29.5.14 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -1051,7 +1051,7 @@ importers: version: 29.5.14 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -1079,7 +1079,7 @@ importers: version: 29.5.14 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -1094,7 +1094,7 @@ importers: dependencies: '@anthropic-ai/claude-agent-sdk': specifier: ^0.2.92 - version: 0.2.92(zod@4.3.6) + version: 0.2.105(zod@4.3.6) '@anthropic-ai/sdk': specifier: ^0.82.0 version: 0.82.0(zod@4.3.6) @@ -1137,7 +1137,7 @@ importers: devDependencies: '@types/node': specifier: ^20.17.28 - version: 20.19.39 + version: 20.19.25 prettier: specifier: ^3.2.5 version: 3.5.3 @@ -1330,7 +1330,7 @@ importers: version: 2.4.1 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -1361,7 +1361,7 @@ importers: dependencies: '@anthropic-ai/claude-agent-sdk': specifier: ^0.2.92 - version: 0.2.92(zod@4.3.6) + version: 0.2.105(zod@4.3.6) '@mozilla/readability': specifier: ^0.6.0 version: 0.6.0 @@ -1524,7 +1524,7 @@ importers: devDependencies: '@esbuild-plugins/node-globals-polyfill': specifier: ^0.2.3 - version: 0.2.3(esbuild@0.25.12) + version: 0.2.3(esbuild@0.25.11) '@fluidframework/build-tools': specifier: ^0.57.0 version: 0.57.0(@types/node@20.19.23) @@ -1599,10 +1599,10 @@ importers: version: 11.3.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.19.23) + version: 29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5)) jest-chrome: specifier: ^0.8.0 - version: 0.8.0(jest@29.7.0(@types/node@20.19.23)) + version: 0.8.0(jest@29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5))) jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 @@ -1614,10 +1614,10 @@ importers: version: 3.5.0 ts-jest: specifier: ^29.3.2 - version: 29.3.3(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(esbuild@0.25.12)(jest@29.7.0(@types/node@20.19.23))(typescript@5.4.5) + version: 29.3.3(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(esbuild@0.25.11)(jest@29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5)))(typescript@5.4.5) ts-loader: specifier: ^9.5.1 - version: 9.5.2(typescript@5.4.5)(webpack@5.105.0(esbuild@0.25.12)) + version: 9.5.2(typescript@5.4.5)(webpack@5.105.0(esbuild@0.25.11)) vite: specifier: ^6.4.2 version: 6.4.2(@types/node@20.19.23)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3) @@ -1846,7 +1846,7 @@ importers: dependencies: '@anthropic-ai/claude-agent-sdk': specifier: ^0.2.92 - version: 0.2.92(zod@4.3.6) + version: 0.2.105(zod@4.3.6) '@typeagent/agent-sdk': specifier: workspace:* version: link:../../agentSdk @@ -1888,6 +1888,28 @@ importers: specifier: ~5.4.5 version: 5.4.5 + packages/agents/github-cli: + dependencies: + '@typeagent/agent-sdk': + specifier: workspace:* + version: link:../../agentSdk + devDependencies: + '@typeagent/action-schema-compiler': + specifier: workspace:* + version: link:../../actionSchemaCompiler + action-grammar-compiler: + specifier: workspace:* + version: link:../../actionGrammarCompiler + concurrently: + specifier: ^9.1.2 + version: 9.1.2 + rimraf: + specifier: ^6.0.1 + version: 6.0.1 + typescript: + specifier: ~5.4.5 + version: 5.4.5 + packages/agents/greeting: dependencies: '@typeagent/agent-sdk': @@ -2118,7 +2140,7 @@ importers: version: 2.4.1 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -2209,7 +2231,7 @@ importers: version: 12.0.2(webpack@5.105.0) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.2.5 version: 3.5.3 @@ -2246,9 +2268,15 @@ importers: aiclient: specifier: workspace:* version: link:../../aiclient + debug: + specifier: ^4.3.4 + version: 4.4.3(supports-color@8.1.1) dispatcher-node-providers: specifier: workspace:* version: link:../../dispatcher/nodeProviders + typeagent: + specifier: workspace:* + version: link:../../typeagent typechat: specifier: ^0.1.1 version: 0.1.1(typescript@5.4.5)(zod@3.25.76) @@ -2256,6 +2284,9 @@ importers: '@typeagent/action-schema-compiler': specifier: workspace:* version: link:../../actionSchemaCompiler + '@types/debug': + specifier: ^4.1.12 + version: 4.1.12 action-grammar-compiler: specifier: workspace:* version: link:../../actionGrammarCompiler @@ -2384,7 +2415,7 @@ importers: version: 9.1.2 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.15.18) + version: 29.7.0(@types/node@22.15.18)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.4.5)) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -2396,7 +2427,7 @@ importers: dependencies: '@anthropic-ai/claude-agent-sdk': specifier: ^0.2.92 - version: 0.2.92(zod@4.3.6) + version: 0.2.105(zod@4.3.6) '@typeagent/agent-sdk': specifier: workspace:* version: link:../../agentSdk @@ -2516,7 +2547,7 @@ importers: version: 2.4.1 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -2588,7 +2619,7 @@ importers: version: 12.0.2(webpack@5.105.0) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -2615,7 +2646,7 @@ importers: dependencies: '@anthropic-ai/claude-agent-sdk': specifier: ^0.2.92 - version: 0.2.92(zod@4.3.6) + version: 0.2.105(zod@4.3.6) '@typeagent/agent-sdk': specifier: workspace:* version: link:../../agentSdk @@ -2742,7 +2773,7 @@ importers: version: 16.5.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -2827,7 +2858,7 @@ importers: version: 8.18.1 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -2888,7 +2919,7 @@ importers: version: 16.5.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -2949,7 +2980,7 @@ importers: version: 2.0.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -2989,7 +3020,7 @@ importers: version: 5.6.3(webpack@5.105.0) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -3301,7 +3332,7 @@ importers: version: 29.5.14 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.2.5 version: 3.5.3 @@ -3310,7 +3341,7 @@ importers: version: 5.0.10 ts-jest: specifier: ^29.1.2 - version: 29.3.3(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest@29.7.0(@types/node@25.5.2))(typescript@5.4.5) + version: 29.3.3(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest@29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)))(typescript@5.4.5) typescript: specifier: ~5.4.5 version: 5.4.5 @@ -3383,6 +3414,9 @@ importers: file-size: specifier: ^1.0.0 version: 1.0.0 + github-cli-agent: + specifier: workspace:* + version: link:../agents/github-cli glob: specifier: ^13.0.0 version: 13.0.6 @@ -3482,7 +3516,7 @@ importers: version: 16.5.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -3497,7 +3531,7 @@ importers: dependencies: '@anthropic-ai/claude-agent-sdk': specifier: ^0.2.92 - version: 0.2.92(zod@4.1.13) + version: 0.2.105(zod@4.1.13) '@azure/ai-agents': specifier: ^1.0.0-beta.3 version: 1.0.0-beta.3 @@ -3630,7 +3664,7 @@ importers: version: 16.5.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -3670,7 +3704,7 @@ importers: version: 29.5.14 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -3701,7 +3735,7 @@ importers: version: 22.15.18 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.15.18) + version: 29.7.0(@types/node@22.15.18)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -3785,7 +3819,7 @@ importers: version: 16.5.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -3880,7 +3914,7 @@ importers: version: 16.5.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -3920,7 +3954,7 @@ importers: version: 12.0.2(webpack@5.105.0) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -3947,7 +3981,7 @@ importers: dependencies: '@anthropic-ai/claude-agent-sdk': specifier: ^0.2.92 - version: 0.2.92(zod@4.1.13) + version: 0.2.105 aiclient: specifier: workspace:* version: link:../aiclient @@ -3981,7 +4015,7 @@ importers: dependencies: '@anthropic-ai/claude-agent-sdk': specifier: ^0.2.92 - version: 0.2.92(zod@4.3.6) + version: 0.2.105(zod@4.3.6) '@anthropic-ai/sdk': specifier: ^0.82.0 version: 0.82.0(zod@4.3.6) @@ -4064,7 +4098,7 @@ importers: version: 16.5.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -4180,7 +4214,7 @@ importers: version: 16.5.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.2.5 version: 3.5.3 @@ -4274,7 +4308,7 @@ importers: version: 16.5.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -4435,7 +4469,7 @@ importers: version: 4.0.1(vite@6.4.2(@types/node@25.5.2)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3)) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) less: specifier: ^4.2.0 version: 4.3.0 @@ -4484,7 +4518,7 @@ importers: version: 29.5.14 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -4515,7 +4549,7 @@ importers: version: 16.5.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -4583,7 +4617,7 @@ importers: version: 16.5.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -4611,7 +4645,7 @@ importers: version: 0.25.11 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -4642,7 +4676,7 @@ importers: version: 29.5.14 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -4691,7 +4725,7 @@ importers: version: 29.5.14 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@25.5.2) + version: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -4819,14 +4853,14 @@ packages: '@antfu/utils@8.1.1': resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} - '@anthropic-ai/claude-agent-sdk@0.2.92': - resolution: {integrity: sha512-loYyxVUC5gBwHjGi9Fv0b84mduJTp9Z3Pum+y/7IVQDb4NynKfVQl6l4VeDKZaW+1QTQtd25tY4hwUznD7Krqw==} + '@anthropic-ai/claude-agent-sdk@0.2.105': + resolution: {integrity: sha512-gPn7UEX6WrnIqCclNzfER6Of0mQ1ruxcNe0jrVXR9kOG09qFfaGzd6hy2qr3envCAB/dACkS7UDJoCm4/jg5Dg==} engines: {node: '>=18.0.0'} peerDependencies: zod: ^4.0.0 - '@anthropic-ai/sdk@0.80.0': - resolution: {integrity: sha512-WeXLn7zNVk3yjeshn+xZHvld6AoFUOR3Sep6pSoHho5YbSi6HwcirqgPA5ccFuW8QTVJAAU7N8uQQC6Wa9TG+g==} + '@anthropic-ai/sdk@0.81.0': + resolution: {integrity: sha512-D4K5PvEV6wPiRtVlVsJHIUhHAmOZ6IT/I9rKlTf84gR7GyyAurPJK7z9BOf/AZqC5d1DhYQGJNKRmV+q8dGhgw==} hasBin: true peerDependencies: zod: ^3.25.0 || ^4.0.0 @@ -5350,10 +5384,6 @@ packages: resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} - engines: {node: '>=6.9.0'} - '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} @@ -5627,12 +5657,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.12': - resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.25.4': resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} engines: {node: '>=18'} @@ -5645,12 +5669,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.12': - resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.25.4': resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} engines: {node: '>=18'} @@ -5663,12 +5681,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.12': - resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.25.4': resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} engines: {node: '>=18'} @@ -5681,12 +5693,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.12': - resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.25.4': resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} engines: {node: '>=18'} @@ -5699,12 +5705,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.12': - resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.25.4': resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} engines: {node: '>=18'} @@ -5717,12 +5717,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.12': - resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.25.4': resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} engines: {node: '>=18'} @@ -5735,12 +5729,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.12': - resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.25.4': resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} engines: {node: '>=18'} @@ -5753,12 +5741,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.12': - resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.25.4': resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} engines: {node: '>=18'} @@ -5771,12 +5753,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.12': - resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.25.4': resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} engines: {node: '>=18'} @@ -5789,12 +5765,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.12': - resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.25.4': resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} engines: {node: '>=18'} @@ -5807,12 +5777,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.12': - resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.25.4': resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} engines: {node: '>=18'} @@ -5825,12 +5789,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.12': - resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.25.4': resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} engines: {node: '>=18'} @@ -5843,12 +5801,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.12': - resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.25.4': resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} engines: {node: '>=18'} @@ -5861,12 +5813,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.12': - resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.25.4': resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} engines: {node: '>=18'} @@ -5879,12 +5825,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.12': - resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.25.4': resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} engines: {node: '>=18'} @@ -5897,12 +5837,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.12': - resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.25.4': resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} engines: {node: '>=18'} @@ -5915,12 +5849,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.25.4': resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} engines: {node: '>=18'} @@ -5933,12 +5861,6 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.25.12': - resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-arm64@0.25.4': resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} engines: {node: '>=18'} @@ -5951,12 +5873,6 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.12': - resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.25.4': resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} engines: {node: '>=18'} @@ -5969,12 +5885,6 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.25.12': - resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-arm64@0.25.4': resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} engines: {node: '>=18'} @@ -5987,12 +5897,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.25.4': resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} engines: {node: '>=18'} @@ -6005,24 +5909,12 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.25.12': - resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - '@esbuild/sunos-x64@0.25.11': resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.12': - resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.25.4': resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} engines: {node: '>=18'} @@ -6035,12 +5927,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.12': - resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.25.4': resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} engines: {node: '>=18'} @@ -6053,12 +5939,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.12': - resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.25.4': resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} engines: {node: '>=18'} @@ -6071,12 +5951,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.25.4': resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} engines: {node: '>=18'} @@ -6171,8 +6045,8 @@ packages: engines: {node: '>=6'} hasBin: true - '@hono/node-server@1.19.13': - resolution: {integrity: sha512-TsQLe4i2gvoTtrHje625ngThGBySOgSK3Xo2XRYOdqGN1teR8+I7vchQC46uLJi8OF62YTYA3AhSpumtkhsaKQ==} + '@hono/node-server@1.19.11': + resolution: {integrity: sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==} engines: {node: '>=18.14.1'} peerDependencies: hono: '>=4.12.8 <5.0.0' @@ -7202,141 +7076,141 @@ packages: '@remusao/trie@1.5.0': resolution: {integrity: sha512-UX+3utJKgwCsg6sUozjxd38gNMVRXrY4TNX9VvCdSrlZBS1nZjRPi98ON3QjRAdf6KCguJFyQARRsulTeqQiPg==} - '@rollup/rollup-android-arm-eabi@4.60.1': - resolution: {integrity: sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==} + '@rollup/rollup-android-arm-eabi@4.59.0': + resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.60.1': - resolution: {integrity: sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==} + '@rollup/rollup-android-arm64@4.59.0': + resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.60.1': - resolution: {integrity: sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==} + '@rollup/rollup-darwin-arm64@4.59.0': + resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.60.1': - resolution: {integrity: sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==} + '@rollup/rollup-darwin-x64@4.59.0': + resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.60.1': - resolution: {integrity: sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==} + '@rollup/rollup-freebsd-arm64@4.59.0': + resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.60.1': - resolution: {integrity: sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==} + '@rollup/rollup-freebsd-x64@4.59.0': + resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.60.1': - resolution: {integrity: sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==} + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.60.1': - resolution: {integrity: sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==} + '@rollup/rollup-linux-arm-musleabihf@4.59.0': + resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.60.1': - resolution: {integrity: sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==} + '@rollup/rollup-linux-arm64-gnu@4.59.0': + resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.60.1': - resolution: {integrity: sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==} + '@rollup/rollup-linux-arm64-musl@4.59.0': + resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.60.1': - resolution: {integrity: sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==} + '@rollup/rollup-linux-loong64-gnu@4.59.0': + resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.60.1': - resolution: {integrity: sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==} + '@rollup/rollup-linux-loong64-musl@4.59.0': + resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.60.1': - resolution: {integrity: sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==} + '@rollup/rollup-linux-ppc64-gnu@4.59.0': + resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.60.1': - resolution: {integrity: sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==} + '@rollup/rollup-linux-ppc64-musl@4.59.0': + resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.60.1': - resolution: {integrity: sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==} + '@rollup/rollup-linux-riscv64-gnu@4.59.0': + resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.60.1': - resolution: {integrity: sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==} + '@rollup/rollup-linux-riscv64-musl@4.59.0': + resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.60.1': - resolution: {integrity: sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==} + '@rollup/rollup-linux-s390x-gnu@4.59.0': + resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.60.1': - resolution: {integrity: sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==} + '@rollup/rollup-linux-x64-gnu@4.59.0': + resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.60.1': - resolution: {integrity: sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==} + '@rollup/rollup-linux-x64-musl@4.59.0': + resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.60.1': - resolution: {integrity: sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==} + '@rollup/rollup-openbsd-x64@4.59.0': + resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.60.1': - resolution: {integrity: sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==} + '@rollup/rollup-openharmony-arm64@4.59.0': + resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.60.1': - resolution: {integrity: sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==} + '@rollup/rollup-win32-arm64-msvc@4.59.0': + resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.60.1': - resolution: {integrity: sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==} + '@rollup/rollup-win32-ia32-msvc@4.59.0': + resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.60.1': - resolution: {integrity: sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==} + '@rollup/rollup-win32-x64-gnu@4.59.0': + resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.60.1': - resolution: {integrity: sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==} + '@rollup/rollup-win32-x64-msvc@4.59.0': + resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} cpu: [x64] os: [win32] @@ -8004,9 +7878,6 @@ packages: '@types/node@20.19.25': resolution: {integrity: sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==} - '@types/node@20.19.39': - resolution: {integrity: sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==} - '@types/node@22.15.18': resolution: {integrity: sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==} @@ -8670,8 +8541,8 @@ packages: resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} hasBin: true - basic-ftp@5.2.1: - resolution: {integrity: sha512-0yaL8JdxTknKDILitVpfYfV2Ob6yb3udX/hK97M7I3jOeznBNxQPtVvTUtnhUkyHlxFWyr5Lvknmgzoc7jf+1Q==} + basic-ftp@5.2.0: + resolution: {integrity: sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==} engines: {node: '>=10.0.0'} batch@0.6.1: @@ -8750,6 +8621,11 @@ packages: browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + browserslist@4.24.5: + resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + browserslist@4.28.1: resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -8863,6 +8739,9 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} + caniuse-lite@1.0.30001718: + resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} + caniuse-lite@1.0.30001769: resolution: {integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==} @@ -9786,6 +9665,9 @@ packages: electron-publish@26.8.1: resolution: {integrity: sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w==} + electron-to-chromium@1.5.155: + resolution: {integrity: sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==} + electron-to-chromium@1.5.286: resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} @@ -9929,11 +9811,6 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.25.12: - resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} - engines: {node: '>=18'} - hasBin: true - esbuild@0.25.4: resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} engines: {node: '>=18'} @@ -10569,8 +10446,8 @@ packages: highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - hono@4.12.12: - resolution: {integrity: sha512-p1JfQMKaceuCbpJKAPKVqyqviZdS0eUxH9v82oWo1kb9xjQ5wA6iP3FNVAPDFlz5/p7d45lO+BpSk1tuSZMF4Q==} + hono@4.12.8: + resolution: {integrity: sha512-VJCEvtrezO1IAR+kqEYnxUOoStaQPGrCmX3j4wDTNOcD1uRPFpGlwQUIW8niPuvHXaTUxeOUl5MMDGrl+tmO9A==} engines: {node: '>=16.9.0'} hosted-git-info@4.1.0: @@ -11600,8 +11477,8 @@ packages: lodash.union@4.6.0: resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} - lodash@4.18.1: - resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} @@ -12204,6 +12081,9 @@ packages: node-pty@1.1.0: resolution: {integrity: sha512-20JqtutY6JPXTUnL0ij1uad7Qe1baT46lyolh2sSENDd4sTzKZ4nmAFkeAARDKwmlLjPx6XKRlwRUxwjOy+lUg==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} @@ -12551,12 +12431,12 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} picospinner@2.0.0: @@ -12619,8 +12499,8 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss@8.5.8: - resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} postject@1.0.0-alpha.6: @@ -13115,8 +12995,8 @@ packages: resolution: {integrity: sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==} engines: {node: '>=8.3'} - rollup@4.60.1: - resolution: {integrity: sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==} + rollup@4.59.0: + resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -14067,8 +13947,8 @@ packages: undici-types@7.24.4: resolution: {integrity: sha512-cRaY9PagdEZoRmcwzk3tUV3SVGrVQkR6bcSilav/A0vXsfpW4Lvd0BvgRMwTEDTLLGN+QdyBTG+nnvTgJhdt6w==} - undici@7.24.7: - resolution: {integrity: sha512-H/nlJ/h0ggGC+uRL3ovD+G0i4bqhvsDOpbDv7At5eFLlj2b41L8QliGbnl2H7SnDiYhENphh1tQFJZf+MyfLsQ==} + undici@7.22.0: + resolution: {integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==} engines: {node: '>=20.18.1'} unicode-emoji-modifier-base@1.0.0: @@ -14138,6 +14018,12 @@ packages: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true @@ -14744,9 +14630,27 @@ snapshots: '@antfu/utils@8.1.1': {} - '@anthropic-ai/claude-agent-sdk@0.2.92(zod@4.1.13)': + '@anthropic-ai/claude-agent-sdk@0.2.105': + dependencies: + '@anthropic-ai/sdk': 0.81.0(zod@4.1.13) + '@modelcontextprotocol/sdk': 1.29.0 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + transitivePeerDependencies: + - '@cfworker/json-schema' + - supports-color + + '@anthropic-ai/claude-agent-sdk@0.2.105(zod@4.1.13)': dependencies: - '@anthropic-ai/sdk': 0.80.0(zod@4.1.13) + '@anthropic-ai/sdk': 0.81.0(zod@4.1.13) '@modelcontextprotocol/sdk': 1.29.0(zod@4.1.13) zod: 4.1.13 optionalDependencies: @@ -14763,9 +14667,9 @@ snapshots: - '@cfworker/json-schema' - supports-color - '@anthropic-ai/claude-agent-sdk@0.2.92(zod@4.3.6)': + '@anthropic-ai/claude-agent-sdk@0.2.105(zod@4.3.6)': dependencies: - '@anthropic-ai/sdk': 0.80.0(zod@4.3.6) + '@anthropic-ai/sdk': 0.81.0(zod@4.3.6) '@modelcontextprotocol/sdk': 1.29.0(zod@4.3.6) zod: 4.3.6 optionalDependencies: @@ -14782,13 +14686,13 @@ snapshots: - '@cfworker/json-schema' - supports-color - '@anthropic-ai/sdk@0.80.0(zod@4.1.13)': + '@anthropic-ai/sdk@0.81.0(zod@4.1.13)': dependencies: json-schema-to-ts: 3.1.1 optionalDependencies: zod: 4.1.13 - '@anthropic-ai/sdk@0.80.0(zod@4.3.6)': + '@anthropic-ai/sdk@0.81.0(zod@4.3.6)': dependencies: json-schema-to-ts: 3.1.1 optionalDependencies: @@ -15745,7 +15649,7 @@ snapshots: dependencies: '@babel/compat-data': 7.28.4 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 + browserslist: 4.24.5 lru-cache: 5.1.1 semver: 6.3.1 @@ -15878,8 +15782,6 @@ snapshots: dependencies: regenerator-runtime: 0.14.0 - '@babel/runtime@7.29.2': {} - '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 @@ -16255,7 +16157,7 @@ snapshots: ms: 2.1.3 secure-json-parse: 4.1.0 tslib: 2.8.1 - undici: 7.24.7 + undici: 7.22.0 transitivePeerDependencies: - supports-color @@ -16372,238 +16274,160 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.25.12)': + '@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.25.11)': dependencies: - esbuild: 0.25.12 + esbuild: 0.25.11 '@esbuild/aix-ppc64@0.25.11': optional: true - '@esbuild/aix-ppc64@0.25.12': - optional: true - '@esbuild/aix-ppc64@0.25.4': optional: true '@esbuild/android-arm64@0.25.11': optional: true - '@esbuild/android-arm64@0.25.12': - optional: true - '@esbuild/android-arm64@0.25.4': optional: true '@esbuild/android-arm@0.25.11': optional: true - '@esbuild/android-arm@0.25.12': - optional: true - '@esbuild/android-arm@0.25.4': optional: true '@esbuild/android-x64@0.25.11': optional: true - '@esbuild/android-x64@0.25.12': - optional: true - '@esbuild/android-x64@0.25.4': optional: true '@esbuild/darwin-arm64@0.25.11': optional: true - '@esbuild/darwin-arm64@0.25.12': - optional: true - '@esbuild/darwin-arm64@0.25.4': optional: true '@esbuild/darwin-x64@0.25.11': optional: true - '@esbuild/darwin-x64@0.25.12': - optional: true - '@esbuild/darwin-x64@0.25.4': optional: true '@esbuild/freebsd-arm64@0.25.11': optional: true - '@esbuild/freebsd-arm64@0.25.12': - optional: true - '@esbuild/freebsd-arm64@0.25.4': optional: true '@esbuild/freebsd-x64@0.25.11': optional: true - '@esbuild/freebsd-x64@0.25.12': - optional: true - '@esbuild/freebsd-x64@0.25.4': optional: true '@esbuild/linux-arm64@0.25.11': optional: true - '@esbuild/linux-arm64@0.25.12': - optional: true - '@esbuild/linux-arm64@0.25.4': optional: true '@esbuild/linux-arm@0.25.11': optional: true - '@esbuild/linux-arm@0.25.12': - optional: true - '@esbuild/linux-arm@0.25.4': optional: true '@esbuild/linux-ia32@0.25.11': optional: true - '@esbuild/linux-ia32@0.25.12': - optional: true - '@esbuild/linux-ia32@0.25.4': optional: true '@esbuild/linux-loong64@0.25.11': optional: true - '@esbuild/linux-loong64@0.25.12': - optional: true - '@esbuild/linux-loong64@0.25.4': optional: true '@esbuild/linux-mips64el@0.25.11': optional: true - '@esbuild/linux-mips64el@0.25.12': - optional: true - '@esbuild/linux-mips64el@0.25.4': optional: true '@esbuild/linux-ppc64@0.25.11': optional: true - '@esbuild/linux-ppc64@0.25.12': - optional: true - '@esbuild/linux-ppc64@0.25.4': optional: true '@esbuild/linux-riscv64@0.25.11': optional: true - '@esbuild/linux-riscv64@0.25.12': - optional: true - '@esbuild/linux-riscv64@0.25.4': optional: true '@esbuild/linux-s390x@0.25.11': optional: true - '@esbuild/linux-s390x@0.25.12': - optional: true - '@esbuild/linux-s390x@0.25.4': optional: true '@esbuild/linux-x64@0.25.11': optional: true - '@esbuild/linux-x64@0.25.12': - optional: true - '@esbuild/linux-x64@0.25.4': optional: true '@esbuild/netbsd-arm64@0.25.11': optional: true - '@esbuild/netbsd-arm64@0.25.12': - optional: true - '@esbuild/netbsd-arm64@0.25.4': optional: true '@esbuild/netbsd-x64@0.25.11': optional: true - '@esbuild/netbsd-x64@0.25.12': - optional: true - '@esbuild/netbsd-x64@0.25.4': optional: true '@esbuild/openbsd-arm64@0.25.11': optional: true - '@esbuild/openbsd-arm64@0.25.12': - optional: true - '@esbuild/openbsd-arm64@0.25.4': optional: true '@esbuild/openbsd-x64@0.25.11': optional: true - '@esbuild/openbsd-x64@0.25.12': - optional: true - '@esbuild/openbsd-x64@0.25.4': optional: true '@esbuild/openharmony-arm64@0.25.11': optional: true - '@esbuild/openharmony-arm64@0.25.12': - optional: true - '@esbuild/sunos-x64@0.25.11': optional: true - '@esbuild/sunos-x64@0.25.12': - optional: true - '@esbuild/sunos-x64@0.25.4': optional: true '@esbuild/win32-arm64@0.25.11': optional: true - '@esbuild/win32-arm64@0.25.12': - optional: true - '@esbuild/win32-arm64@0.25.4': optional: true '@esbuild/win32-ia32@0.25.11': optional: true - '@esbuild/win32-ia32@0.25.12': - optional: true - '@esbuild/win32-ia32@0.25.4': optional: true '@esbuild/win32-x64@0.25.11': optional: true - '@esbuild/win32-x64@0.25.12': - optional: true - '@esbuild/win32-x64@0.25.4': optional: true @@ -16654,7 +16478,7 @@ snapshots: lodash.isequal: 4.5.0 multimatch: 5.0.0 picocolors: 1.1.1 - picomatch: 2.3.2 + picomatch: 2.3.1 picospinner: 2.0.0 rimraf: 4.4.1 semver: 7.7.2 @@ -16721,9 +16545,9 @@ snapshots: protobufjs: 7.4.0 yargs: 17.7.2 - '@hono/node-server@1.19.13(hono@4.12.12)': + '@hono/node-server@1.19.11(hono@4.12.8)': dependencies: - hono: 4.12.12 + hono: 4.12.8 '@iconify/types@2.0.0': {} @@ -17026,11 +16850,116 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 20.19.39 + '@types/node': 20.19.25 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.19.25 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.4.5))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.19.25 + ansi-escapes: 4.3.2 chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.4.5)) + jest-haste-map: 29.7.0 jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.8 + pretty-format: 29.7.0 slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.4.5))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.19.25 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.4.5)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node '@jest/core@29.7.0(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5))': dependencies: @@ -17039,14 +16968,14 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.39 + '@types/node': 20.19.25 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.19.39)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -17071,7 +17000,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.39 + '@types/node': 20.19.25 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -17089,7 +17018,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.19.39 + '@types/node': 20.19.25 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -17111,7 +17040,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 20.19.39 + '@types/node': 20.19.25 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -17181,7 +17110,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.3 - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/yargs': 17.0.29 chalk: 4.1.2 @@ -17340,7 +17269,7 @@ snapshots: dependencies: debug: 4.4.3(supports-color@8.1.1) fs-extra: 9.1.0 - lodash: 4.18.1 + lodash: 4.17.23 tmp-promise: 3.0.3 transitivePeerDependencies: - supports-color @@ -17694,7 +17623,7 @@ snapshots: '@modelcontextprotocol/sdk@1.26.0(zod@4.1.13)': dependencies: - '@hono/node-server': 1.19.13(hono@4.12.12) + '@hono/node-server': 1.19.11(hono@4.12.8) ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) content-type: 1.0.5 @@ -17704,7 +17633,7 @@ snapshots: eventsource-parser: 3.0.6 express: 5.2.1 express-rate-limit: 8.3.1(express@5.2.1) - hono: 4.12.12 + hono: 4.12.8 jose: 6.1.3 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 @@ -17716,7 +17645,7 @@ snapshots: '@modelcontextprotocol/sdk@1.26.0(zod@4.3.6)': dependencies: - '@hono/node-server': 1.19.13(hono@4.12.12) + '@hono/node-server': 1.19.11(hono@4.12.8) ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) content-type: 1.0.5 @@ -17726,7 +17655,7 @@ snapshots: eventsource-parser: 3.0.6 express: 5.2.1 express-rate-limit: 8.3.1(express@5.2.1) - hono: 4.12.12 + hono: 4.12.8 jose: 6.1.3 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 @@ -17736,9 +17665,30 @@ snapshots: transitivePeerDependencies: - supports-color + '@modelcontextprotocol/sdk@1.29.0': + dependencies: + '@hono/node-server': 1.19.11(hono@4.12.8) + ajv: 8.18.0 + ajv-formats: 3.0.1(ajv@8.18.0) + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.2.1 + express-rate-limit: 8.3.1(express@5.2.1) + hono: 4.12.8 + jose: 6.1.3 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod-to-json-schema: 3.25.1(zod@4.3.6) + transitivePeerDependencies: + - supports-color + '@modelcontextprotocol/sdk@1.29.0(zod@4.1.13)': dependencies: - '@hono/node-server': 1.19.13(hono@4.12.12) + '@hono/node-server': 1.19.11(hono@4.12.8) ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) content-type: 1.0.5 @@ -17748,7 +17698,7 @@ snapshots: eventsource-parser: 3.0.6 express: 5.2.1 express-rate-limit: 8.3.1(express@5.2.1) - hono: 4.12.12 + hono: 4.12.8 jose: 6.1.3 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 @@ -17760,7 +17710,7 @@ snapshots: '@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)': dependencies: - '@hono/node-server': 1.19.13(hono@4.12.12) + '@hono/node-server': 1.19.11(hono@4.12.8) ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) content-type: 1.0.5 @@ -17770,7 +17720,7 @@ snapshots: eventsource-parser: 3.0.6 express: 5.2.1 express-rate-limit: 8.3.1(express@5.2.1) - hono: 4.12.12 + hono: 4.12.8 jose: 6.1.3 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 @@ -17923,7 +17873,7 @@ snapshots: dependencies: '@oclif/core': 4.8.0 '@oclif/table': 0.4.6 - lodash: 4.18.1 + lodash: 4.17.23 object-treeify: 4.0.1 transitivePeerDependencies: - bufferutil @@ -18199,79 +18149,79 @@ snapshots: '@remusao/trie@1.5.0': {} - '@rollup/rollup-android-arm-eabi@4.60.1': + '@rollup/rollup-android-arm-eabi@4.59.0': optional: true - '@rollup/rollup-android-arm64@4.60.1': + '@rollup/rollup-android-arm64@4.59.0': optional: true - '@rollup/rollup-darwin-arm64@4.60.1': + '@rollup/rollup-darwin-arm64@4.59.0': optional: true - '@rollup/rollup-darwin-x64@4.60.1': + '@rollup/rollup-darwin-x64@4.59.0': optional: true - '@rollup/rollup-freebsd-arm64@4.60.1': + '@rollup/rollup-freebsd-arm64@4.59.0': optional: true - '@rollup/rollup-freebsd-x64@4.60.1': + '@rollup/rollup-freebsd-x64@4.59.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.60.1': + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.60.1': + '@rollup/rollup-linux-arm-musleabihf@4.59.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.60.1': + '@rollup/rollup-linux-arm64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.60.1': + '@rollup/rollup-linux-arm64-musl@4.59.0': optional: true - '@rollup/rollup-linux-loong64-gnu@4.60.1': + '@rollup/rollup-linux-loong64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-loong64-musl@4.60.1': + '@rollup/rollup-linux-loong64-musl@4.59.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.60.1': + '@rollup/rollup-linux-ppc64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-ppc64-musl@4.60.1': + '@rollup/rollup-linux-ppc64-musl@4.59.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.60.1': + '@rollup/rollup-linux-riscv64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.60.1': + '@rollup/rollup-linux-riscv64-musl@4.59.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.60.1': + '@rollup/rollup-linux-s390x-gnu@4.59.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.60.1': + '@rollup/rollup-linux-x64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-x64-musl@4.60.1': + '@rollup/rollup-linux-x64-musl@4.59.0': optional: true - '@rollup/rollup-openbsd-x64@4.60.1': + '@rollup/rollup-openbsd-x64@4.59.0': optional: true - '@rollup/rollup-openharmony-arm64@4.60.1': + '@rollup/rollup-openharmony-arm64@4.59.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.60.1': + '@rollup/rollup-win32-arm64-msvc@4.59.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.60.1': + '@rollup/rollup-win32-ia32-msvc@4.59.0': optional: true - '@rollup/rollup-win32-x64-gnu@4.60.1': + '@rollup/rollup-win32-x64-gnu@4.59.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.60.1': + '@rollup/rollup-win32-x64-msvc@4.59.0': optional: true '@secretlint/config-creator@9.3.2': @@ -18727,7 +18677,7 @@ snapshots: chalk: 4.1.2 debug: 4.4.3(supports-color@8.1.1) js-yaml: 3.14.2 - lodash: 4.18.1 + lodash: 4.17.23 pluralize: 2.0.0 string-width: 4.2.3 strip-ansi: 6.0.1 @@ -18806,7 +18756,7 @@ snapshots: '@types/better-sqlite3@7.6.11': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/better-sqlite3@7.6.13': dependencies: @@ -18815,17 +18765,17 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/bonjour@3.5.13': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.2.0 '@types/keyv': 3.1.4 - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/responselike': 1.0.3 '@types/chrome@0.0.114': @@ -18850,15 +18800,15 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.6 - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/connect@3.4.38': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/cors@2.8.18': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/cytoscape-dagre@2.3.3': dependencies: @@ -19003,14 +18953,14 @@ snapshots: '@types/express-serve-static-core@4.17.41': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/qs': 6.15.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/qs': 6.15.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -19043,22 +18993,22 @@ snapshots: '@types/fs-extra@8.1.5': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/fs-extra@9.0.13': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/geojson@7946.0.16': {} '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/graceful-fs@4.1.8': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/har-format@1.2.15': {} @@ -19076,7 +19026,7 @@ snapshots: '@types/http-proxy@1.17.14': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/istanbul-lib-coverage@2.0.6': {} @@ -19099,13 +19049,13 @@ snapshots: '@types/jsdom@20.0.1': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 '@types/jsdom@28.0.0': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 undici-types: 7.24.4 @@ -19114,7 +19064,7 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/jsonpath@0.2.4': {} @@ -19122,7 +19072,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/linkify-it@5.0.0': {} @@ -19142,7 +19092,7 @@ snapshots: '@types/mailparser@3.4.6': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 iconv-lite: 0.6.3 '@types/markdown-it@14.1.2': @@ -19170,12 +19120,12 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 form-data: 4.0.4 '@types/node-forge@1.3.11': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/node@18.19.130': dependencies: @@ -19189,10 +19139,6 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@20.19.39': - dependencies: - undici-types: 6.21.0 - '@types/node@22.15.18': dependencies: undici-types: 6.21.0 @@ -19209,7 +19155,7 @@ snapshots: '@types/plist@3.0.5': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 xmlbuilder: 15.1.1 optional: true @@ -19236,7 +19182,7 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/retry@0.12.2': {} @@ -19245,7 +19191,7 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/serve-index@1.9.4': dependencies: @@ -19255,7 +19201,7 @@ snapshots: dependencies: '@types/http-errors': 2.0.4 '@types/mime': 3.0.4 - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/shimmer@1.2.0': {} @@ -19263,7 +19209,7 @@ snapshots: '@types/sockjs@0.3.36': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/spotify-api@0.0.25': {} @@ -19311,7 +19257,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 optional: true '@typespec/ts-http-runtime@0.2.2': @@ -19451,7 +19397,7 @@ snapshots: '@vue/shared': 3.5.16 estree-walker: 2.0.2 magic-string: 0.30.17 - postcss: 8.5.8 + postcss: 8.5.6 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.16': @@ -19717,14 +19663,14 @@ snapshots: anymatch@3.1.3: dependencies: normalize-path: 3.0.0 - picomatch: 2.3.2 + picomatch: 2.3.1 apache-arrow@18.1.0: dependencies: '@swc/helpers': 0.5.15 '@types/command-line-args': 5.2.3 '@types/command-line-usage': 5.0.4 - '@types/node': 20.19.39 + '@types/node': 20.19.25 command-line-args: 5.2.1 command-line-usage: 7.0.3 flatbuffers: 24.3.25 @@ -19795,7 +19741,7 @@ snapshots: graceful-fs: 4.2.11 is-stream: 2.0.1 lazystream: 1.0.1 - lodash: 4.18.1 + lodash: 4.17.23 normalize-path: 3.0.0 readable-stream: 4.5.2 @@ -19875,7 +19821,7 @@ snapshots: async@2.6.4: dependencies: - lodash: 4.18.1 + lodash: 4.17.23 async@3.2.6: {} @@ -19986,7 +19932,7 @@ snapshots: baseline-browser-mapping@2.9.19: {} - basic-ftp@5.2.1: {} + basic-ftp@5.2.0: {} batch@0.6.1: {} @@ -20089,6 +20035,13 @@ snapshots: browser-stdout@1.3.1: {} + browserslist@4.24.5: + dependencies: + caniuse-lite: 1.0.30001718 + electron-to-chromium: 1.5.155 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.5) + browserslist@4.28.1: dependencies: baseline-browser-mapping: 2.9.19 @@ -20243,6 +20196,8 @@ snapshots: camelcase@6.3.0: {} + caniuse-lite@1.0.30001718: {} + caniuse-lite@1.0.30001769: {} caseless@0.12.0: {} @@ -20304,7 +20259,7 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.24.7 + undici: 7.22.0 whatwg-mimetype: 4.0.0 chevrotain-allstar@0.3.1(chevrotain@11.0.3): @@ -20564,7 +20519,7 @@ snapshots: concurrently@9.1.2: dependencies: chalk: 4.1.2 - lodash: 4.18.1 + lodash: 4.17.23 rxjs: 7.8.1 shell-quote: 1.8.1 supports-color: 8.1.1 @@ -20671,13 +20626,13 @@ snapshots: dependencies: buffer: 5.7.1 - create-jest@29.7.0(@types/node@20.19.23): + create-jest@29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.19.23) + jest-config: 29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -20686,13 +20641,28 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@22.15.18): + create-jest@29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.4.5)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.15.18) + jest-config: 29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.4.5)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + create-jest@29.7.0(@types/node@22.15.18)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.4.5)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@22.15.18)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.4.5)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -20990,7 +20960,7 @@ snapshots: dagre@0.8.5: dependencies: graphlib: 2.1.8 - lodash: 4.18.1 + lodash: 4.17.23 data-uri-to-buffer@6.0.2: {} @@ -21297,6 +21267,8 @@ snapshots: transitivePeerDependencies: - supports-color + electron-to-chromium@1.5.155: {} + electron-to-chromium@1.5.286: {} electron-updater@6.6.2: @@ -21329,7 +21301,7 @@ snapshots: '@electron/asar': 3.4.1 debug: 4.4.3(supports-color@8.1.1) fs-extra: 7.0.1 - lodash: 4.18.1 + lodash: 4.17.23 temp: 0.9.4 optionalDependencies: '@electron/windows-sign': 1.2.2 @@ -21523,35 +21495,6 @@ snapshots: '@esbuild/win32-ia32': 0.25.11 '@esbuild/win32-x64': 0.25.11 - esbuild@0.25.12: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.12 - '@esbuild/android-arm': 0.25.12 - '@esbuild/android-arm64': 0.25.12 - '@esbuild/android-x64': 0.25.12 - '@esbuild/darwin-arm64': 0.25.12 - '@esbuild/darwin-x64': 0.25.12 - '@esbuild/freebsd-arm64': 0.25.12 - '@esbuild/freebsd-x64': 0.25.12 - '@esbuild/linux-arm': 0.25.12 - '@esbuild/linux-arm64': 0.25.12 - '@esbuild/linux-ia32': 0.25.12 - '@esbuild/linux-loong64': 0.25.12 - '@esbuild/linux-mips64el': 0.25.12 - '@esbuild/linux-ppc64': 0.25.12 - '@esbuild/linux-riscv64': 0.25.12 - '@esbuild/linux-s390x': 0.25.12 - '@esbuild/linux-x64': 0.25.12 - '@esbuild/netbsd-arm64': 0.25.12 - '@esbuild/netbsd-x64': 0.25.12 - '@esbuild/openbsd-arm64': 0.25.12 - '@esbuild/openbsd-x64': 0.25.12 - '@esbuild/openharmony-arm64': 0.25.12 - '@esbuild/sunos-x64': 0.25.12 - '@esbuild/win32-arm64': 0.25.12 - '@esbuild/win32-ia32': 0.25.12 - '@esbuild/win32-x64': 0.25.12 - esbuild@0.25.4: optionalDependencies: '@esbuild/aix-ppc64': 0.25.4 @@ -21826,9 +21769,9 @@ snapshots: dependencies: pend: 1.2.0 - fdir@6.5.0(picomatch@4.0.4): + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.3 file-size@1.0.0: {} @@ -22079,7 +22022,7 @@ snapshots: get-uri@6.0.4: dependencies: - basic-ftp: 5.2.1 + basic-ftp: 5.2.0 data-uri-to-buffer: 6.0.2 debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: @@ -22261,7 +22204,7 @@ snapshots: graphlib@2.1.8: dependencies: - lodash: 4.18.1 + lodash: 4.17.23 graphology-communities-louvain@2.0.2(graphology-types@0.24.8): dependencies: @@ -22371,7 +22314,7 @@ snapshots: highlight.js@10.7.3: {} - hono@4.12.12: {} + hono@4.12.8: {} hosted-git-info@4.1.0: dependencies: @@ -22428,7 +22371,7 @@ snapshots: dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 - lodash: 4.18.1 + lodash: 4.17.23 pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: @@ -22628,7 +22571,7 @@ snapshots: code-excerpt: 4.0.0 indent-string: 5.0.0 is-in-ci: 0.1.0 - lodash: 4.18.1 + lodash: 4.17.23 patch-console: 2.0.0 react: 18.3.1 react-reconciler: 0.29.2(react@18.3.1) @@ -22955,10 +22898,10 @@ snapshots: jest-util: 29.7.0 p-limit: 3.1.0 - jest-chrome@0.8.0(jest@29.7.0(@types/node@20.19.23)): + jest-chrome@0.8.0(jest@29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5))): dependencies: '@types/chrome': 0.0.114 - jest: 29.7.0(@types/node@20.19.23) + jest: 29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5)) jest-circus@29.7.0: dependencies: @@ -22966,7 +22909,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.39 + '@types/node': 20.19.25 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.0 @@ -22986,16 +22929,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.19.23): + jest-cli@29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.19.23) + create-jest: 29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.19.23) + jest-config: 29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -23005,16 +22948,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@22.15.18): + jest-cli@29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.4.5)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.4.5)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.15.18) + create-jest: 29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.4.5)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.15.18) + jest-config: 29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.4.5)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -23024,16 +22967,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@25.5.2): + jest-cli@29.7.0(@types/node@22.15.18)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.4.5)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.4.5)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) + create-jest: 29.7.0(@types/node@22.15.18)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.4.5)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@22.15.18)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.4.5)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -23062,7 +23005,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.19.23): + jest-config@29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5)): dependencies: '@babel/core': 7.28.4 '@jest/test-sequencer': 29.7.0 @@ -23088,11 +23031,105 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.19.23 + ts-node: 10.9.2(@types/node@20.19.23)(typescript@5.4.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5)): + dependencies: + '@babel/core': 7.28.4 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.28.4) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.19.25 + ts-node: 10.9.2(@types/node@20.19.23)(typescript@5.4.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.4.5)): + dependencies: + '@babel/core': 7.28.4 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.28.4) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.19.25 + ts-node: 10.9.2(@types/node@20.19.25)(typescript@5.4.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.4.5)): + dependencies: + '@babel/core': 7.28.4 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.28.4) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.19.25 + ts-node: 10.9.2(@types/node@22.15.18)(typescript@5.4.5) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.19.39)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)): + jest-config@29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)): dependencies: '@babel/core': 7.28.4 '@jest/test-sequencer': 29.7.0 @@ -23117,13 +23154,13 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 ts-node: 10.9.2(@types/node@25.5.2)(typescript@5.4.5) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@22.15.18): + jest-config@29.7.0(@types/node@22.15.18)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.4.5)): dependencies: '@babel/core': 7.28.4 '@jest/test-sequencer': 29.7.0 @@ -23149,6 +23186,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.15.18 + ts-node: 10.9.2(@types/node@22.15.18)(typescript@5.4.5) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -23209,7 +23247,7 @@ snapshots: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 20.19.39 + '@types/node': 20.19.25 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -23223,7 +23261,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.39 + '@types/node': 20.19.25 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -23233,7 +23271,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.8 - '@types/node': 20.19.39 + '@types/node': 20.19.25 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -23272,7 +23310,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.19.39 + '@types/node': 20.19.25 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -23307,7 +23345,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.39 + '@types/node': 20.19.25 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -23335,7 +23373,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.39 + '@types/node': 20.19.25 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 @@ -23381,11 +23419,11 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.19.39 + '@types/node': 20.19.25 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 - picomatch: 2.3.2 + picomatch: 2.3.1 jest-validate@29.7.0: dependencies: @@ -23400,7 +23438,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.39 + '@types/node': 20.19.25 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -23409,47 +23447,47 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.19.23): + jest@29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.19.23) + jest-cli: 29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - jest@29.7.0(@types/node@22.15.18): + jest@29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.4.5)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.4.5)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.15.18) + jest-cli: 29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.4.5)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - jest@29.7.0(@types/node@25.5.2): + jest@29.7.0(@types/node@22.15.18)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.4.5)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.4.5)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@25.5.2) + jest-cli: 29.7.0(@types/node@22.15.18)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.4.5)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -23517,7 +23555,7 @@ snapshots: whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - ws: 8.19.0 + ws: 8.18.2 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -23541,7 +23579,7 @@ snapshots: saxes: 6.0.0 symbol-tree: 3.2.4 tough-cookie: 6.0.1 - undici: 7.24.7 + undici: 7.22.0 w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 @@ -23567,7 +23605,7 @@ snapshots: json-schema-to-ts@3.1.1: dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.27.0 ts-algebra: 2.0.0 json-schema-traverse@0.4.1: {} @@ -23826,7 +23864,7 @@ snapshots: lodash.union@4.6.0: {} - lodash@4.18.1: {} + lodash@4.17.23: {} log-symbols@4.1.0: dependencies: @@ -24355,7 +24393,7 @@ snapshots: micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 2.3.2 + picomatch: 2.3.1 microsoft-cognitiveservices-speech-sdk@1.43.1: dependencies: @@ -24644,6 +24682,8 @@ snapshots: dependencies: node-addon-api: 7.1.1 + node-releases@2.0.19: {} + node-releases@2.0.27: {} node-rsa@1.1.1: @@ -25027,9 +25067,9 @@ snapshots: picocolors@1.1.1: {} - picomatch@2.3.2: {} + picomatch@2.3.1: {} - picomatch@4.0.4: {} + picomatch@4.0.3: {} picospinner@2.0.0: {} @@ -25087,7 +25127,7 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss@8.5.8: + postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -25117,7 +25157,7 @@ snapshots: pretty-error@4.0.0: dependencies: - lodash: 4.18.1 + lodash: 4.17.23 renderkid: 3.0.0 pretty-format@29.7.0: @@ -25251,7 +25291,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.19.39 + '@types/node': 20.19.25 long: 5.3.2 protocol-buffers-schema@3.6.0: {} @@ -25515,7 +25555,7 @@ snapshots: readdirp@3.6.0: dependencies: - picomatch: 2.3.2 + picomatch: 2.3.1 readdirp@4.1.2: {} @@ -25617,7 +25657,7 @@ snapshots: css-select: 4.3.0 dom-converter: 0.2.0 htmlparser2: 6.1.0 - lodash: 4.18.1 + lodash: 4.17.23 strip-ansi: 6.0.1 require-directory@2.1.1: {} @@ -25726,35 +25766,35 @@ snapshots: globby: 10.0.1 is-plain-object: 3.0.1 - rollup@4.60.1: + rollup@4.59.0: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.60.1 - '@rollup/rollup-android-arm64': 4.60.1 - '@rollup/rollup-darwin-arm64': 4.60.1 - '@rollup/rollup-darwin-x64': 4.60.1 - '@rollup/rollup-freebsd-arm64': 4.60.1 - '@rollup/rollup-freebsd-x64': 4.60.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.60.1 - '@rollup/rollup-linux-arm-musleabihf': 4.60.1 - '@rollup/rollup-linux-arm64-gnu': 4.60.1 - '@rollup/rollup-linux-arm64-musl': 4.60.1 - '@rollup/rollup-linux-loong64-gnu': 4.60.1 - '@rollup/rollup-linux-loong64-musl': 4.60.1 - '@rollup/rollup-linux-ppc64-gnu': 4.60.1 - '@rollup/rollup-linux-ppc64-musl': 4.60.1 - '@rollup/rollup-linux-riscv64-gnu': 4.60.1 - '@rollup/rollup-linux-riscv64-musl': 4.60.1 - '@rollup/rollup-linux-s390x-gnu': 4.60.1 - '@rollup/rollup-linux-x64-gnu': 4.60.1 - '@rollup/rollup-linux-x64-musl': 4.60.1 - '@rollup/rollup-openbsd-x64': 4.60.1 - '@rollup/rollup-openharmony-arm64': 4.60.1 - '@rollup/rollup-win32-arm64-msvc': 4.60.1 - '@rollup/rollup-win32-ia32-msvc': 4.60.1 - '@rollup/rollup-win32-x64-gnu': 4.60.1 - '@rollup/rollup-win32-x64-msvc': 4.60.1 + '@rollup/rollup-android-arm-eabi': 4.59.0 + '@rollup/rollup-android-arm64': 4.59.0 + '@rollup/rollup-darwin-arm64': 4.59.0 + '@rollup/rollup-darwin-x64': 4.59.0 + '@rollup/rollup-freebsd-arm64': 4.59.0 + '@rollup/rollup-freebsd-x64': 4.59.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 + '@rollup/rollup-linux-arm-musleabihf': 4.59.0 + '@rollup/rollup-linux-arm64-gnu': 4.59.0 + '@rollup/rollup-linux-arm64-musl': 4.59.0 + '@rollup/rollup-linux-loong64-gnu': 4.59.0 + '@rollup/rollup-linux-loong64-musl': 4.59.0 + '@rollup/rollup-linux-ppc64-gnu': 4.59.0 + '@rollup/rollup-linux-ppc64-musl': 4.59.0 + '@rollup/rollup-linux-riscv64-gnu': 4.59.0 + '@rollup/rollup-linux-riscv64-musl': 4.59.0 + '@rollup/rollup-linux-s390x-gnu': 4.59.0 + '@rollup/rollup-linux-x64-gnu': 4.59.0 + '@rollup/rollup-linux-x64-musl': 4.59.0 + '@rollup/rollup-openbsd-x64': 4.59.0 + '@rollup/rollup-openharmony-arm64': 4.59.0 + '@rollup/rollup-win32-arm64-msvc': 4.59.0 + '@rollup/rollup-win32-ia32-msvc': 4.59.0 + '@rollup/rollup-win32-x64-gnu': 4.59.0 + '@rollup/rollup-win32-x64-msvc': 4.59.0 fsevents: 2.3.3 rope-sequence@1.3.4: {} @@ -26490,16 +26530,16 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.3.16(esbuild@0.25.12)(webpack@5.105.0(esbuild@0.25.12)): + terser-webpack-plugin@5.3.16(esbuild@0.25.11)(webpack@5.105.0(esbuild@0.25.11)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 7.0.5 terser: 5.39.2 - webpack: 5.105.0(esbuild@0.25.12) + webpack: 5.105.0(esbuild@0.25.11) optionalDependencies: - esbuild: 0.25.12 + esbuild: 0.25.11 terser-webpack-plugin@5.3.16(webpack@5.105.0): dependencies: @@ -26571,18 +26611,18 @@ snapshots: tinyglobby@0.2.12: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 tinyglobby@0.2.14: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 tlds@1.261.0: {} @@ -26661,12 +26701,12 @@ snapshots: ts-deepmerge@7.0.2: {} - ts-jest@29.3.3(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(esbuild@0.25.12)(jest@29.7.0(@types/node@20.19.23))(typescript@5.4.5): + ts-jest@29.3.3(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(esbuild@0.25.11)(jest@29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5)))(typescript@5.4.5): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.19.23) + jest: 29.7.0(@types/node@20.19.23)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -26680,14 +26720,14 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.28.4) - esbuild: 0.25.12 + esbuild: 0.25.11 - ts-jest@29.3.3(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest@29.7.0(@types/node@25.5.2))(typescript@5.4.5): + ts-jest@29.3.3(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest@29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)))(typescript@5.4.5): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@25.5.2) + jest: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -26722,7 +26762,7 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.28.4) jest-util: 29.7.0 - ts-loader@9.5.2(typescript@5.4.5)(webpack@5.105.0(esbuild@0.25.12)): + ts-loader@9.5.2(typescript@5.4.5)(webpack@5.105.0(esbuild@0.25.11)): dependencies: chalk: 4.1.2 enhanced-resolve: 5.15.0 @@ -26730,7 +26770,7 @@ snapshots: semver: 7.5.4 source-map: 0.7.4 typescript: 5.4.5 - webpack: 5.105.0(esbuild@0.25.12) + webpack: 5.105.0(esbuild@0.25.11) ts-loader@9.5.2(typescript@5.4.5)(webpack@5.105.0): dependencies: @@ -26742,6 +26782,63 @@ snapshots: typescript: 5.4.5 webpack: 5.105.0(webpack-cli@5.1.4) + ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.19.23 + acorn: 8.11.1 + acorn-walk: 8.3.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.4 + make-error: 1.3.6 + typescript: 5.4.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + + ts-node@10.9.2(@types/node@20.19.25)(typescript@5.4.5): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.19.25 + acorn: 8.11.1 + acorn-walk: 8.3.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.4 + make-error: 1.3.6 + typescript: 5.4.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + + ts-node@10.9.2(@types/node@22.15.18)(typescript@5.4.5): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.15.18 + acorn: 8.11.1 + acorn-walk: 8.3.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.4 + make-error: 1.3.6 + typescript: 5.4.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -26886,7 +26983,7 @@ snapshots: undici-types@7.24.4: {} - undici@7.24.7: {} + undici@7.22.0: {} unicode-emoji-modifier-base@1.0.0: {} @@ -26961,6 +27058,12 @@ snapshots: untildify@4.0.0: {} + update-browserslist-db@1.1.3(browserslist@4.24.5): + dependencies: + browserslist: 4.24.5 + escalade: 3.2.0 + picocolors: 1.1.1 + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: browserslist: 4.28.1 @@ -27036,11 +27139,11 @@ snapshots: vite@6.4.2(@types/node@20.19.23)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3): dependencies: - esbuild: 0.25.12 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - postcss: 8.5.8 - rollup: 4.60.1 + esbuild: 0.25.11 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 20.19.23 @@ -27052,11 +27155,11 @@ snapshots: vite@6.4.2(@types/node@25.5.2)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3): dependencies: - esbuild: 0.25.12 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - postcss: 8.5.8 - rollup: 4.60.1 + esbuild: 0.25.11 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 25.5.2 @@ -27209,7 +27312,7 @@ snapshots: webpack-sources@3.3.3: {} - webpack@5.105.0(esbuild@0.25.12): + webpack@5.105.0(esbuild@0.25.11): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -27233,7 +27336,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(esbuild@0.25.12)(webpack@5.105.0(esbuild@0.25.12)) + terser-webpack-plugin: 5.3.16(esbuild@0.25.11)(webpack@5.105.0(esbuild@0.25.11)) watchpack: 2.5.1 webpack-sources: 3.3.3 transitivePeerDependencies: