From 96884ed9b01708a2745f8545d00c8802d3a4edfe Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Thu, 9 Apr 2026 17:24:25 -0700 Subject: [PATCH 01/34] Add CLI help crawl discovery to onboarding agent - Add crawlCliHelp action to discover actions from CLI --help output - Implement recursive help crawling with configurable depth - Parse subcommands and flags from help text - Fix LLM model selection for schema/grammar generation (use createChatModel instead of createChatModelDefault to avoid json_object format constraint) - Fix Windows path bug in scaffolder (use fileURLToPath instead of URL.pathname) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../src/discovery/discoveryHandler.ts | 195 ++++++++++++++++++ .../src/discovery/discoverySchema.agr | 17 ++ .../src/discovery/discoverySchema.ts | 13 ++ ts/packages/agents/onboarding/src/lib/llm.ts | 8 +- .../onboarding/src/onboardingActionHandler.ts | 5 +- 5 files changed, 234 insertions(+), 4 deletions(-) diff --git a/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts b/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts index ff70cf035..94a636193 100644 --- a/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts +++ b/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts @@ -19,6 +19,10 @@ import { readArtifactJson, } from "../lib/workspace.js"; import { getDiscoveryModel } from "../lib/llm.js"; +import { execFile } from "child_process"; +import { promisify } from "util"; + +const execFileAsync = promisify(execFile); // Represents a single discovered API action export type DiscoveredAction = { @@ -69,6 +73,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 +484,190 @@ async function handleParseOpenApiSpec( ); } +// ── CLI Help Crawler ────────────────────────────────────────────────────── + +async function runHelp( + command: string, + args: string[], +): Promise { + // Try --help first, fall back to -h + for (const flag of ["--help", "-h"]) { + 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 | undefined, +): Promise<{ command: string; helpText: string }[]> { + if (maxDepth !== undefined && depth > maxDepth) return []; + + 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, + ); + 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); + 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 model = getDiscoveryModel(); + + const prompt = [ + { + role: "system" as const, + content: + "You are a CLI documentation analyzer. Extract a list of CLI actions/commands from the provided help output. " + + "For each action, identify: name (camelCase derived from the command path, e.g. 'gh repo create' becomes 'repoCreate'), " + + "description, the full command path as the 'path' field, and parameters (flags/arguments with their types). " + + "Only include leaf commands (commands that perform an action, not command groups). " + + "Return a JSON array of actions.", + }, + { + role: "user" as const, + content: + `Extract all CLI actions from this help output for the "${integrationName}" integration.\n\n` + + `Base command: ${command}\n` + + `Total subcommands crawled: ${helpEntries.length}\n\n` + + `Help output (truncated to 12000 chars):\n${combinedHelp.slice(0, 12000)}`, + }, + ]; + + const result = await model.complete(prompt); + if (!result.success) { + return { error: `LLM extraction failed: ${result.message}` }; + } + + let actions: DiscoveredAction[] = []; + try { + const jsonMatch = result.data.match(/\[[\s\S]*\]/); + if (jsonMatch) { + actions = JSON.parse(jsonMatch[0]); + } + } catch { + return { error: "Failed to parse LLM response as JSON action list." }; + } + + const source = `cli:${command}`; + actions = actions.map((a) => ({ ...a, method: "CLI", sourceUrl: source })); + + // 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, + ], + }; + + 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\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_` + : "") + + `\n\nReview with \`listDiscoveredActions\`, then \`approveApiSurface\` to proceed.`, + ); +} + async function handleListDiscoveredActions( integrationName: string, ): Promise { diff --git a/ts/packages/agents/onboarding/src/discovery/discoverySchema.agr b/ts/packages/agents/onboarding/src/discovery/discoverySchema.agr index f130d13d9..f799be0d5 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 44d27c9bc..1b6e7096f 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 (omit for unlimited) + 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 e79e6b6d0..8edeebe6e 100644 --- a/ts/packages/agents/onboarding/src/lib/llm.ts +++ b/ts/packages/agents/onboarding/src/lib/llm.ts @@ -18,11 +18,15 @@ export function getPhraseGenModel(): ChatModel { } export function getSchemaGenModel(): ChatModel { - return openai.createChatModelDefault("onboarding:schemagen"); + return openai.createChatModel(undefined, undefined, undefined, [ + "onboarding:schemagen", + ]); } export function getGrammarGenModel(): ChatModel { - return openai.createChatModelDefault("onboarding:grammargen"); + return openai.createChatModel(undefined, undefined, undefined, [ + "onboarding:grammargen", + ]); } export function getTestingModel(): ChatModel { diff --git a/ts/packages/agents/onboarding/src/onboardingActionHandler.ts b/ts/packages/agents/onboarding/src/onboardingActionHandler.ts index b329a56f0..bd2f795b9 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: From 3bdbb12248ccffcb32dcb87a177a28a53474d4e4 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Thu, 9 Apr 2026 17:44:06 -0700 Subject: [PATCH 02/34] Fix testing model to use createChatModel (avoid json_object constraint) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ts/packages/agents/onboarding/src/lib/llm.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ts/packages/agents/onboarding/src/lib/llm.ts b/ts/packages/agents/onboarding/src/lib/llm.ts index 8edeebe6e..53bbffa75 100644 --- a/ts/packages/agents/onboarding/src/lib/llm.ts +++ b/ts/packages/agents/onboarding/src/lib/llm.ts @@ -30,7 +30,9 @@ export function getGrammarGenModel(): ChatModel { } export function getTestingModel(): ChatModel { - return openai.createChatModelDefault("onboarding:testing"); + return openai.createChatModel(undefined, undefined, undefined, [ + "onboarding:testing", + ]); } export function getPackagingModel(): ChatModel { From 2b645d5e54a69db56369714fc885db614aa69a5a Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Thu, 9 Apr 2026 21:39:19 -0700 Subject: [PATCH 03/34] Add github-cli agent and fix test dispatcher agent enablement - Scaffold github-cli agent with 51 actions from gh CLI help crawl - Fix schema (remove block comments for asc) and grammar (proper .agr format) - Register github-cli agent in config.json and defaultAgentProvider deps - Set defaultEnabled: true in manifest - Fix test dispatcher to enable target integration agent in commands list Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ts/packages/agents/github-cli/package.json | 30 + .../github-cli/src/github-cliActionHandler.ts | 32 + .../github-cli/src/github-cliManifest.json | 12 + .../github-cli/src/github-cliSchema.agr | 125 ++ .../agents/github-cli/src/github-cliSchema.ts | 500 +++++ .../agents/github-cli/src/tsconfig.json | 14 + ts/packages/agents/github-cli/tsconfig.json | 15 + .../onboarding/src/testing/testingHandler.ts | 6 +- .../defaultAgentProvider/data/config.json | 3 + ts/packages/defaultAgentProvider/package.json | 1 + ts/pnpm-lock.yaml | 1884 +++++++---------- 11 files changed, 1513 insertions(+), 1109 deletions(-) create mode 100644 ts/packages/agents/github-cli/package.json create mode 100644 ts/packages/agents/github-cli/src/github-cliActionHandler.ts create mode 100644 ts/packages/agents/github-cli/src/github-cliManifest.json create mode 100644 ts/packages/agents/github-cli/src/github-cliSchema.agr create mode 100644 ts/packages/agents/github-cli/src/github-cliSchema.ts create mode 100644 ts/packages/agents/github-cli/src/tsconfig.json create mode 100644 ts/packages/agents/github-cli/tsconfig.json diff --git a/ts/packages/agents/github-cli/package.json b/ts/packages/agents/github-cli/package.json new file mode 100644 index 000000000..deb67cc94 --- /dev/null +++ b/ts/packages/agents/github-cli/package.json @@ -0,0 +1,30 @@ +{ + "name": "github-cli-agent", + "version": "0.0.1", + "private": true, + "description": "TypeAgent agent for github-cli", + "license": "MIT", + "author": "Microsoft", + "type": "module", + "exports": { + "./agent/manifest": "./src/github-cliManifest.json", + "./agent/handlers": "./dist/github-cliActionHandler.js" + }, + "scripts": { + "asc": "asc -i ./src/github-cliSchema.ts -o ./dist/github-cliSchema.pas.json -t GithubCliActions", + "agc": "agc -i ./src/github-cliSchema.agr -o ./dist/github-cliSchema.ag.json", + "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" + } +} \ No newline at end of file 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 000000000..8296df459 --- /dev/null +++ b/ts/packages/agents/github-cli/src/github-cliActionHandler.ts @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { + ActionContext, + AppAgent, + TypeAgentAction, + ActionResult, +} from "@typeagent/agent-sdk"; +import { createActionResultFromTextDisplay } from "@typeagent/agent-sdk/helpers/action"; +import { GithubCliActions } from "./github-cliSchema.js"; + +export function instantiate(): AppAgent { + return { + initializeAgentContext, + executeAction, + }; +} + +async function initializeAgentContext(): Promise { + return {}; +} + +async function executeAction( + action: TypeAgentAction, + context: ActionContext, +): Promise { + // TODO: implement action handlers + return createActionResultFromTextDisplay( + `Executing ${action.actionName} — not yet implemented.`, + ); +} 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 000000000..7cc11c885 --- /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" + } +} \ No newline at end of file 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 000000000..d5877873c --- /dev/null +++ b/ts/packages/agents/github-cli/src/github-cliSchema.agr @@ -0,0 +1,125 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + + = log me into GitHub -> { + actionName: "authLogin", + parameters: {} +} + | authenticate my GitHub account with hostname $(hostname:word) -> { + actionName: "authLogin", + parameters: { + hostname + } +}; + + = log me out of GitHub -> { + actionName: "authLogout", + parameters: {} +} + | sign me out of GitHub -> { + actionName: "authLogout", + parameters: {} +}; + + = show my GitHub auth status -> { + actionName: "authStatus", + parameters: {} +} + | check my GitHub authentication -> { + actionName: "authStatus", + parameters: {} +}; + + = create an issue titled $(title:wildcard) -> { + actionName: "issueCreate", + parameters: { + title + } +} + | open a new issue called $(title:wildcard) -> { + actionName: "issueCreate", + parameters: { + title + } +}; + + = close issue number $(number:number) -> { + actionName: "issueClose", + parameters: { + number + } +}; + + = reopen issue number $(number:number) -> { + actionName: "issueReopen", + parameters: { + number + } +}; + + = create a pull request titled $(title:wildcard) -> { + actionName: "prCreate", + parameters: { + title + } +}; + + = close pull request number $(number:number) -> { + actionName: "prClose", + parameters: { + number + } +}; + + = merge pull request number $(number:number) -> { + actionName: "prMerge", + parameters: { + number + } +}; + + = create a new repository named $(name:wildcard) -> { + actionName: "repoCreate", + parameters: { + name + } +}; + + = clone repository $(repo:wildcard) -> { + actionName: "repoClone", + parameters: { + repo + } +}; + + = search repositories for $(query:wildcard) -> { + actionName: "searchRepos", + parameters: { + query + } +}; + + = show my GitHub status -> { + actionName: "statusPrint", + parameters: {} +} + | print my GitHub notifications -> { + actionName: "statusPrint", + parameters: {} +}; + +import { GithubCliActions } from "./github-cliSchema.ts"; + + : GithubCliActions = + | + | + | + | + | + | + | + | + | + | + | + | ; \ No newline at end of file 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 000000000..66fbffff1 --- /dev/null +++ b/ts/packages/agents/github-cli/src/github-cliSchema.ts @@ -0,0 +1,500 @@ +// 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 + | OrgListAction + | OrgViewAction + | PrCreateAction + | PrCloseAction + | PrMergeAction + | ProjectCreateAction + | ProjectDeleteAction + | ProjectListAction + | ReleaseCreateAction + | ReleaseDeleteAction + | ReleaseListAction + | RepoCreateAction + | RepoCloneAction + | RepoDeleteAction + | CacheListAction + | CacheDeleteAction + | RunViewAction + | WorkflowViewAction + | AgentTaskRunAction + | AliasSetAction + | ApiRequestAction + | AttestationCreateAction + | CompletionGenerateAction + | ConfigSetAction + | CopilotRunAction + | ExtensionInstallAction + | GpgKeyAddAction + | LabelCreateAction + | LicensesViewAction + | PreviewExecuteAction + | RulesetViewAction + | SearchReposAction + | SecretCreateAction + | SshKeyAddAction + | StatusPrintAction + | VariableCreateAction; + +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: { + + 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 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; + }; +}; + +export type PrCloseAction = { + actionName: "prClose"; + parameters: { + + number?: number; + }; +}; + +export type PrMergeAction = { + actionName: "prMerge"; + parameters: { + + number?: number; + + mergeMethod?: 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: {}; +}; + +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; + }; +}; + +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 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; + }; +}; \ No newline at end of file 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 000000000..4102207cb --- /dev/null +++ b/ts/packages/agents/github-cli/src/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "composite": true, + "rootDir": ".", + "outDir": "../dist" + }, + "include": [ + "./**/*" + ], + "ts-node": { + "esm": true + } +} \ No newline at end of file diff --git a/ts/packages/agents/github-cli/tsconfig.json b/ts/packages/agents/github-cli/tsconfig.json new file mode 100644 index 000000000..cfc403dee --- /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 + } +} \ No newline at end of file diff --git a/ts/packages/agents/onboarding/src/testing/testingHandler.ts b/ts/packages/agents/onboarding/src/testing/testingHandler.ts index 6dfd8c3a7..4cd0e98d0 100644 --- a/ts/packages/agents/onboarding/src/testing/testingHandler.ts +++ b/ts/packages/agents/onboarding/src/testing/testingHandler.ts @@ -192,7 +192,7 @@ async function handleRunTests( | Awaited> | undefined; try { - dispatcherSession = await createTestDispatcher(); + dispatcherSession = await createTestDispatcher(integrationName); } catch (err: any) { return { error: @@ -549,7 +549,7 @@ function getExternalAppAgentProviders(instanceDir: string) { ]; } -async function createTestDispatcher() { +async function createTestDispatcher(integrationName: string) { const instanceDir = getInstanceDir(); const appAgentProviders = getExternalAppAgentProviders(instanceDir); const buffer: string[] = []; @@ -557,7 +557,7 @@ async function createTestDispatcher() { const dispatcher = await createDispatcher("onboarding-test-runner", { appAgentProviders, - agents: { commands: ["dispatcher"] }, + agents: { commands: ["dispatcher", integrationName] }, explainer: { enabled: false }, cache: { enabled: false }, collectCommandResult: true, diff --git a/ts/packages/defaultAgentProvider/data/config.json b/ts/packages/defaultAgentProvider/data/config.json index b4ada610f..97e13afa8 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 c71a01aa3..be5c655f7 100644 --- a/ts/packages/defaultAgentProvider/package.json +++ b/ts/packages/defaultAgentProvider/package.json @@ -66,6 +66,7 @@ "montage-agent": "workspace:*", "music": "workspace:*", "music-local": "workspace:*", + "github-cli-agent": "workspace:*", "onboarding-agent": "workspace:*", "photo-agent": "workspace:*", "proper-lockfile": "^4.1.2", diff --git a/ts/pnpm-lock.yaml b/ts/pnpm-lock.yaml index b39dcd890..070a62983 100644 --- a/ts/pnpm-lock.yaml +++ b/ts/pnpm-lock.yaml @@ -28,6 +28,9 @@ importers: markdown-link-check: specifier: ^3.14.2 version: 3.14.2 + prebuild-install: + specifier: ^7.1.3 + version: 7.1.3 prettier: specifier: ^3.5.3 version: 3.5.3 @@ -150,7 +153,7 @@ importers: version: 8.18.1 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.19.39)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.4.5)) + 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 @@ -925,8 +928,8 @@ importers: packages/actionGrammar: dependencies: '@anthropic-ai/claude-agent-sdk': - specifier: ^0.2.92 - version: 0.2.92(zod@4.3.6) + specifier: ^0.2.12 + version: 0.2.12(zod@4.3.6) '@typeagent/action-schema': specifier: workspace:* version: link:../actionSchema @@ -1093,11 +1096,11 @@ importers: packages/agentSdkWrapper: dependencies: '@anthropic-ai/claude-agent-sdk': - specifier: ^0.2.92 - version: 0.2.92(zod@4.3.6) + specifier: ^0.2.12 + version: 0.2.12(zod@4.3.6) '@anthropic-ai/sdk': - specifier: ^0.82.0 - version: 0.82.0(zod@4.3.6) + specifier: ^0.35.0 + version: 0.35.0(encoding@0.1.13) '@modelcontextprotocol/sdk': specifier: ^1.26.0 version: 1.26.0(zod@4.3.6) @@ -1128,6 +1131,9 @@ importers: microsoft-cognitiveservices-speech-sdk: specifier: ^1.38.0 version: 1.43.1 + node-fetch: + specifier: ^3.3.2 + version: 3.3.2 openai: specifier: ^4.73.0 version: 4.103.0(encoding@0.1.13)(ws@8.19.0)(zod@4.3.6) @@ -1136,8 +1142,8 @@ importers: version: 4.3.6 devDependencies: '@types/node': - specifier: ^20.17.28 - version: 20.19.39 + specifier: ^18.19.3 + version: 18.19.130 prettier: specifier: ^3.2.5 version: 3.5.3 @@ -1187,9 +1193,6 @@ importers: '@typeagent/dispatcher-rpc': specifier: workspace:* version: link:../../dispatcher/rpc - '@typeagent/dispatcher-types': - specifier: workspace:* - version: link:../../dispatcher/types devDependencies: prettier: specifier: ^3.5.3 @@ -1218,9 +1221,6 @@ importers: '@typeagent/dispatcher-rpc': specifier: workspace:* version: link:../../dispatcher/rpc - '@typeagent/dispatcher-types': - specifier: workspace:* - version: link:../../dispatcher/types agent-dispatcher: specifier: workspace:* version: link:../../dispatcher/dispatcher @@ -1360,8 +1360,8 @@ importers: packages/agents/browser: dependencies: '@anthropic-ai/claude-agent-sdk': - specifier: ^0.2.92 - version: 0.2.92(zod@4.3.6) + specifier: ^0.2.12 + version: 0.2.12(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) @@ -1614,13 +1614,13 @@ 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)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5)))(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) + specifier: ^6.4.1 + version: 6.4.1(@types/node@20.19.23)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3) packages/agents/calendar: dependencies: @@ -1845,8 +1845,8 @@ importers: packages/agents/email: dependencies: '@anthropic-ai/claude-agent-sdk': - specifier: ^0.2.92 - version: 0.2.92(zod@4.3.6) + specifier: ^0.2.12 + version: 0.2.12(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': @@ -2083,8 +2105,8 @@ importers: specifier: ^1.0.5 version: 1.0.6(yjs@13.6.27) y-websocket: - specifier: ^3.0.0 - version: 3.0.0(yjs@13.6.27) + specifier: ^1.5.0 + version: 1.5.4(yjs@13.6.27) yjs: specifier: ^13.6.8 version: 13.6.27 @@ -2132,8 +2154,8 @@ importers: specifier: ~5.4.5 version: 5.4.5 vite: - specifier: ^6.4.2 - version: 6.4.2(@types/node@25.5.2)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3) + specifier: ^6.4.1 + version: 6.4.1(@types/node@25.5.2)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3) packages/agents/montage: dependencies: @@ -2395,8 +2417,8 @@ importers: packages/agents/scriptflow: dependencies: '@anthropic-ai/claude-agent-sdk': - specifier: ^0.2.92 - version: 0.2.92(zod@4.3.6) + specifier: ^0.2.12 + version: 0.2.12(zod@4.3.6) '@typeagent/agent-sdk': specifier: workspace:* version: link:../../agentSdk @@ -2508,15 +2530,9 @@ importers: '@types/better-sqlite3': specifier: 7.6.13 version: 7.6.13 - '@types/jest': - specifier: ^29.5.7 - version: 29.5.14 copyfiles: specifier: ^2.4.1 version: 2.4.1 - jest: - specifier: ^29.7.0 - 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 @@ -2614,8 +2630,8 @@ importers: packages/agents/utility: dependencies: '@anthropic-ai/claude-agent-sdk': - specifier: ^0.2.92 - version: 0.2.92(zod@4.3.6) + specifier: ^0.2.12 + version: 0.2.12(zod@4.3.6) '@typeagent/agent-sdk': specifier: workspace:* version: link:../../agentSdk @@ -3078,6 +3094,9 @@ importers: default-agent-provider: specifier: workspace:* version: link:../defaultAgentProvider + dispatcher-node-providers: + specifier: workspace:* + version: link:../dispatcher/nodeProviders dotenv: specifier: ^16.3.1 version: 16.5.0 @@ -3102,13 +3121,13 @@ importers: ts-node: specifier: ^10.9.1 version: 10.9.2(@types/node@25.5.2)(typescript@5.4.5) + typechat: + specifier: ^0.1.1 + version: 0.1.1(typescript@5.4.5)(zod@3.25.76) typechat-utils: specifier: workspace:* version: link:../utils/typechatUtils devDependencies: - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 '@types/debug': specifier: ^4.1.12 version: 4.1.12 @@ -3127,9 +3146,6 @@ importers: rimraf: specifier: ^6.0.1 version: 6.0.1 - ts-jest: - specifier: ^29.4.9 - version: 29.4.9(@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-util@29.7.0)(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 @@ -3177,8 +3193,8 @@ importers: specifier: ^8.5.10 version: 8.18.1 '@vscode/test-cli': - specifier: ^0.0.12 - version: 0.0.12 + specifier: ^0.0.8 + version: 0.0.8 '@vscode/test-electron': specifier: ^2.3.9 version: 2.5.2 @@ -3377,6 +3393,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 @@ -3490,8 +3509,8 @@ importers: packages/dispatcher/dispatcher: dependencies: '@anthropic-ai/claude-agent-sdk': - specifier: ^0.2.92 - version: 0.2.92(zod@4.1.13) + specifier: ^0.2.12 + version: 0.2.12(zod@4.1.13) '@azure/ai-agents': specifier: ^1.0.0-beta.3 version: 1.0.0-beta.3 @@ -3687,15 +3706,6 @@ importers: specifier: workspace:* version: link:../types devDependencies: - '@types/jest': - specifier: ^29.5.7 - version: 29.5.14 - '@types/node': - specifier: ^22.0.0 - version: 22.15.18 - jest: - specifier: ^29.7.0 - 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 @@ -3940,8 +3950,8 @@ importers: packages/kp: dependencies: '@anthropic-ai/claude-agent-sdk': - specifier: ^0.2.92 - version: 0.2.92 + specifier: ^0.2.12 + version: 0.2.12(zod@4.1.13) aiclient: specifier: workspace:* version: link:../aiclient @@ -3974,11 +3984,11 @@ importers: packages/mcp/thoughts: dependencies: '@anthropic-ai/claude-agent-sdk': - specifier: ^0.2.92 - version: 0.2.92(zod@4.3.6) + specifier: ^0.2.12 + version: 0.2.12(zod@4.3.6) '@anthropic-ai/sdk': - specifier: ^0.82.0 - version: 0.82.0(zod@4.3.6) + specifier: ^0.35.0 + version: 0.35.0(encoding@0.1.13) aiclient: specifier: workspace:* version: link:../../aiclient @@ -4426,7 +4436,7 @@ importers: version: 26.8.1(dmg-builder@26.8.1) electron-vite: specifier: ^4.0.1 - 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)) + version: 4.0.1(vite@6.4.1(@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)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) @@ -4446,8 +4456,8 @@ importers: specifier: ~5.4.5 version: 5.4.5 vite: - specifier: ^6.4.2 - version: 6.4.2(@types/node@25.5.2)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3) + specifier: ^6.4.1 + version: 6.4.1(@types/node@25.5.2)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3) packages/telemetry: dependencies: @@ -4813,29 +4823,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.12': + resolution: {integrity: sha512-lto5qlffODYa3He4jbSVdXtPCWVWUxEqWFj+8mWp4tSnY6tMsQBXjwalm7Bz8YgBsEbrCZrceYMcKSw0eL7H+A==} engines: {node: '>=18.0.0'} peerDependencies: zod: ^4.0.0 - '@anthropic-ai/sdk@0.80.0': - resolution: {integrity: sha512-WeXLn7zNVk3yjeshn+xZHvld6AoFUOR3Sep6pSoHho5YbSi6HwcirqgPA5ccFuW8QTVJAAU7N8uQQC6Wa9TG+g==} - hasBin: true - peerDependencies: - zod: ^3.25.0 || ^4.0.0 - peerDependenciesMeta: - zod: - optional: true - - '@anthropic-ai/sdk@0.82.0': - resolution: {integrity: sha512-xdHTjL1GlUlDugHq/I47qdOKp/ROPvuHl7ROJCgUQigbvPu7asf9KcAcU1EqdrP2LuVhEKaTs7Z+ShpZDRzHdQ==} - hasBin: true - peerDependencies: - zod: ^3.25.0 || ^4.0.0 - peerDependenciesMeta: - zod: - optional: true + '@anthropic-ai/sdk@0.35.0': + resolution: {integrity: sha512-JxVuNIRLjcXZbDW/rJa3vSIoYB5c0wgIQUPsjueeqli9OJyCJpInj0UlvKSSk6R2oCYyg0y2M0H8n8Wyt0l1IA==} '@asamuzakjp/css-color@5.0.1': resolution: {integrity: sha512-2SZFvqMyvboVV1d15lMf7XiI3m7SDqXUuKaTymJYLN6dSGadqp+fVojqJlVoMlbZnlTmu3S0TLwLTJpvBMO1Aw==} @@ -5344,10 +5339,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'} @@ -5621,12 +5612,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'} @@ -5639,12 +5624,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'} @@ -5657,12 +5636,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'} @@ -5675,12 +5648,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'} @@ -5693,12 +5660,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'} @@ -5711,12 +5672,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'} @@ -5729,12 +5684,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'} @@ -5747,12 +5696,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'} @@ -5765,12 +5708,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'} @@ -5783,12 +5720,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'} @@ -5801,12 +5732,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'} @@ -5819,12 +5744,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'} @@ -5837,12 +5756,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'} @@ -5855,12 +5768,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'} @@ -5873,12 +5780,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'} @@ -5891,12 +5792,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'} @@ -5909,12 +5804,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'} @@ -5927,12 +5816,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'} @@ -5945,12 +5828,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'} @@ -5963,12 +5840,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'} @@ -5981,12 +5852,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'} @@ -5999,24 +5864,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'} @@ -6029,12 +5882,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'} @@ -6047,12 +5894,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'} @@ -6065,12 +5906,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'} @@ -6165,8 +6000,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' @@ -6183,68 +6018,34 @@ packages: cpu: [arm64] os: [darwin] - '@img/sharp-darwin-arm64@0.34.5': - resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [darwin] - '@img/sharp-darwin-x64@0.33.5': resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-darwin-x64@0.34.5': - resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.0.4': resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.4': - resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} - cpu: [arm64] - os: [darwin] - '@img/sharp-libvips-darwin-x64@1.0.4': resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.4': - resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} - cpu: [x64] - os: [darwin] - '@img/sharp-libvips-linux-arm64@1.0.4': resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-arm64@1.2.4': - resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-arm@1.2.4': - resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} - cpu: [arm] - os: [linux] - libc: [glibc] - '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] @@ -6257,36 +6058,18 @@ packages: os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-x64@1.2.4': - resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} - cpu: [x64] - os: [linux] - libc: [glibc] - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': - resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} - cpu: [arm64] - os: [linux] - libc: [musl] - '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-libvips-linuxmusl-x64@1.2.4': - resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} - cpu: [x64] - os: [linux] - libc: [musl] - '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -6294,13 +6077,6 @@ packages: os: [linux] libc: [glibc] - '@img/sharp-linux-arm64@0.34.5': - resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -6308,13 +6084,6 @@ packages: os: [linux] libc: [glibc] - '@img/sharp-linux-arm@0.34.5': - resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm] - os: [linux] - libc: [glibc] - '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -6329,13 +6098,6 @@ packages: os: [linux] libc: [glibc] - '@img/sharp-linux-x64@0.34.5': - resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - libc: [glibc] - '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -6343,13 +6105,6 @@ packages: os: [linux] libc: [musl] - '@img/sharp-linuxmusl-arm64@0.34.5': - resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - libc: [musl] - '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -6357,24 +6112,11 @@ packages: os: [linux] libc: [musl] - '@img/sharp-linuxmusl-x64@0.34.5': - resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - libc: [musl] - '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.5': - resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [win32] - '@img/sharp-win32-ia32@0.33.5': resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -6387,12 +6129,6 @@ packages: cpu: [x64] os: [win32] - '@img/sharp-win32-x64@0.34.5': - resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [win32] - '@inquirer/checkbox@4.2.1': resolution: {integrity: sha512-bevKGO6kX1eM/N+pdh9leS5L7TBF4ICrzi9a+cbWkrxeAeIcwlo/7OfWGCDERdRCI2/Q6tjltX4bt07ALHDwFw==} engines: {node: '>=18'} @@ -6839,16 +6575,6 @@ packages: '@cfworker/json-schema': optional: true - '@modelcontextprotocol/sdk@1.29.0': - resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} - engines: {node: '>=18'} - peerDependencies: - '@cfworker/json-schema': ^4.1.1 - zod: ^3.25 || ^4.0 - peerDependenciesMeta: - '@cfworker/json-schema': - optional: true - '@modelcontextprotocol/server-filesystem@2025.8.21': resolution: {integrity: sha512-Kk+E+lAuAQPLhrJlrsboEdwTBxWU0DYfsuELIuP3Nvfn8Kvd72BU6KVjhEa5EjbC4YckQDCxH9VJK47x6psxow==} hasBin: true @@ -7196,141 +6922,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] @@ -7998,9 +7724,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==} @@ -8129,9 +7852,8 @@ packages: resolution: {integrity: sha512-91fp6CAAJSRtH5ja95T1FHSKa8aPW9/Zw6cta81jlZTUw/+Vq8jM/AfF/14h2b71wwR84JUTW/3Y8QPhDAawFA==} engines: {node: '>=20.0.0'} - '@vscode/test-cli@0.0.12': - resolution: {integrity: sha512-iYN0fDg29+a2Xelle/Y56Xvv7Nc8Thzq4VwpzAF/SIE6918rDicqfsQxV6w1ttr2+SOm+10laGuY9FG2ptEKsQ==} - engines: {node: '>=18'} + '@vscode/test-cli@0.0.8': + resolution: {integrity: sha512-sBSMSDzJChiiDjmys2Q6uI4SIoUYf0t6oDsQO3ypaQ7udha9YD4e2On9e9VE5OBayZMpxbgJX+NudmCwJMdOIg==} hasBin: true '@vscode/test-electron@2.5.2': @@ -8324,9 +8046,19 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + abstract-leveldown@6.2.3: + resolution: {integrity: sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==} + engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) + + abstract-leveldown@6.3.0: + resolution: {integrity: sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==} + engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} @@ -8417,6 +8149,10 @@ packages: ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -8565,6 +8301,9 @@ packages: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + async@2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} @@ -8664,8 +8403,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: @@ -8744,6 +8483,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} @@ -8814,6 +8558,11 @@ packages: monocart-coverage-reports: optional: true + c8@9.1.0: + resolution: {integrity: sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==} + engines: {node: '>=14.14.0'} + hasBin: true + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -8857,6 +8606,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==} @@ -8918,10 +8670,6 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} - chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} @@ -9490,6 +9238,10 @@ packages: dagre@0.8.5: resolution: {integrity: sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + data-uri-to-buffer@6.0.2: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} engines: {node: '>= 14'} @@ -9598,6 +9350,11 @@ packages: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} + deferred-leveldown@5.3.0: + resolution: {integrity: sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==} + engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -9678,10 +9435,6 @@ packages: resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} engines: {node: '>=0.3.1'} - diff@7.0.0: - resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} - engines: {node: '>=0.3.1'} - dir-compare@4.2.0: resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==} @@ -9780,6 +9533,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==} @@ -9830,6 +9586,11 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + encoding-down@6.3.0: + resolution: {integrity: sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==} + engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) + encoding-japanese@2.2.0: resolution: {integrity: sha512-EuJWwlHPZ1LbADuKTClvHtwbaFn4rOD+dRAbWysqEOXRc2Uui0hJInNJrsdH0c+OhJA4nrCBdSkW4DD5YxAo6A==} engines: {node: '>=8.10.0'} @@ -9923,11 +9684,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'} @@ -10134,6 +9890,10 @@ packages: picomatch: optional: true + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + file-size@1.0.0: resolution: {integrity: sha512-tLIdonWTpABkU6Axg2yGChYdrOsy4V8xcm0IcyAP8fSsu6jiXLm5pgs083e4sq5fzNRZuAYolUbZyYmPvCKfwQ==} @@ -10229,6 +9989,10 @@ packages: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -10395,6 +10159,11 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + glob@9.3.5: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} @@ -10520,11 +10289,6 @@ packages: handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - handlebars@4.7.9: - resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} - engines: {node: '>=0.4.7'} - hasBin: true - has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -10563,8 +10327,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: @@ -10731,6 +10495,9 @@ packages: immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + immediate@3.3.0: + resolution: {integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==} + import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -10949,10 +10716,6 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} @@ -11344,10 +11107,6 @@ packages: resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - json-schema-to-ts@3.1.1: - resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} - engines: {node: '>=16'} - json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -11470,6 +11229,52 @@ packages: engines: {node: '>=14'} hasBin: true + level-codec@9.0.2: + resolution: {integrity: sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==} + engines: {node: '>=6'} + deprecated: Superseded by level-transcoder (https://github.com/Level/community#faq) + + level-concat-iterator@2.0.1: + resolution: {integrity: sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==} + engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) + + level-errors@2.0.1: + resolution: {integrity: sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==} + engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) + + level-iterator-stream@4.0.2: + resolution: {integrity: sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==} + engines: {node: '>=6'} + + level-js@5.0.2: + resolution: {integrity: sha512-SnBIDo2pdO5VXh02ZmtAyPP6/+6YTJg2ibLtl9C34pWvmtMEmRTWpra+qO/hifkUtBTOtfx6S9vLDjBsBK4gRg==} + deprecated: Superseded by browser-level (https://github.com/Level/community#faq) + + level-packager@5.1.1: + resolution: {integrity: sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==} + engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) + + level-supports@1.0.1: + resolution: {integrity: sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==} + engines: {node: '>=6'} + + level@6.0.1: + resolution: {integrity: sha512-psRSqJZCsC/irNhfHzrVZbmPYXDcEYhA5TVNwr+V92jF44rbf86hqGp8fiT702FyiArScYIlPSBTDUASCVNSpw==} + engines: {node: '>=8.6.0'} + + leveldown@5.6.0: + resolution: {integrity: sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==} + engines: {node: '>=8.6.0'} + deprecated: Superseded by classic-level (https://github.com/Level/community#faq) + + levelup@4.4.0: + resolution: {integrity: sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==} + engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) + leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -11594,8 +11399,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==} @@ -11640,6 +11445,9 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} + ltgt@2.2.1: + resolution: {integrity: sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==} + magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} @@ -12029,9 +11837,9 @@ packages: mnemonist@0.39.8: resolution: {integrity: sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==} - mocha@11.7.5: - resolution: {integrity: sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + mocha@10.8.2: + resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} + engines: {node: '>= 14.0.0'} hasBin: true module-details-from-path@1.0.4: @@ -12104,6 +11912,9 @@ packages: napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + napi-macros@2.0.0: + resolution: {integrity: sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==} + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -12183,10 +11994,18 @@ packages: encoding: optional: true + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-forge@1.4.0: resolution: {integrity: sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==} engines: {node: '>= 6.13.0'} + node-gyp-build@4.1.1: + resolution: {integrity: sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==} + hasBin: true + node-gyp@12.2.0: resolution: {integrity: sha512-q23WdzrQv48KozXlr0U1v9dwO/k59NHeSzn6loGcasyf0UnSrtzs8kRxM+mfwJSf0DkX0s43hcqgnSO4/VNthQ==} engines: {node: ^20.17.0 || >=22.9.0} @@ -12198,6 +12017,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==} @@ -12545,12 +12367,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: @@ -12613,8 +12435,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: @@ -12947,10 +12769,6 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} - readline@1.3.0: resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} @@ -13109,8 +12927,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 @@ -13606,10 +13424,6 @@ packages: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} engines: {node: '>= 8.0'} - supports-color@10.2.2: - resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} - engines: {node: '>=18'} - supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -13622,6 +13436,10 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} + supports-color@9.4.0: + resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} + engines: {node: '>=12'} + supports-hyperlinks@2.3.0: resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} engines: {node: '>=8'} @@ -13845,9 +13663,6 @@ packages: truncate-utf8-bytes@1.0.2: resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} - ts-algebra@2.0.0: - resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} - ts-dedent@2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} @@ -13880,33 +13695,6 @@ packages: esbuild: optional: true - ts-jest@29.4.9: - resolution: {integrity: sha512-LTb9496gYPMCqjeDLdPrKuXtncudeV1yRZnF4Wo5l3SFi0RYEnYRNgMrFIdg+FHvfzjCyQk1cLncWVqiSX+EvQ==} - engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/transform': ^29.0.0 || ^30.0.0 - '@jest/types': ^29.0.0 || ^30.0.0 - babel-jest: ^29.0.0 || ^30.0.0 - esbuild: '*' - jest: ^29.0.0 || ^30.0.0 - jest-util: ^29.0.0 || ^30.0.0 - typescript: '>=4.3 <7' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/transform': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - jest-util: - optional: true - ts-loader@9.5.2: resolution: {integrity: sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==} engines: {node: '>=12.0.0'} @@ -14031,11 +13819,6 @@ packages: ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} - uglify-js@3.19.3: - resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} - engines: {node: '>=0.8.0'} - hasBin: true - unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -14061,8 +13844,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: @@ -14132,6 +13915,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 @@ -14211,8 +14000,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@6.4.2: - resolution: {integrity: sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==} + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -14307,6 +14096,10 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + web-streams-polyfill@4.0.0-beta.3: resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} engines: {node: '>= 14'} @@ -14486,8 +14279,8 @@ packages: resolution: {integrity: sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==} engines: {node: '>=12.17'} - workerpool@9.3.4: - resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} @@ -14512,6 +14305,17 @@ packages: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + ws@6.2.3: + resolution: {integrity: sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@7.5.10: resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} @@ -14600,6 +14404,11 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + y-leveldb@0.1.2: + resolution: {integrity: sha512-6ulEn5AXfXJYi89rXPEg2mMHAyyw8+ZfeMMdOtBbV8FJpQ1NOrcgi6DTAcXof0dap84NjHPT2+9d0rb6cFsjEg==} + peerDependencies: + yjs: ^13.0.0 + y-prosemirror@1.3.5: resolution: {integrity: sha512-qW8fXCb72L6H2BWiuhZdSJ6hiShHUog08gh6KvBqLjhK6Et9DxfDnMDvx6yyO3iCdnEhDfUJviRvaMAAXb0dNg==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} @@ -14616,9 +14425,10 @@ packages: peerDependencies: yjs: ^13.0.0 - y-websocket@3.0.0: - resolution: {integrity: sha512-mUHy7AzkOZ834T/7piqtlA8Yk6AchqKqcrCXjKW8J1w2lPtRDjz8W5/CvXz9higKAHgKRKqpI3T33YkRFLkPtg==} + y-websocket@1.5.4: + resolution: {integrity: sha512-Y3021uy0anOIHqAPyAZbNDoR05JuMEGjRNI8c+K9MHzVS8dWoImdJUjccljAznc8H2L7WkIXhRHZ1igWNRSgPw==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} + hasBin: true peerDependencies: yjs: ^13.5.6 @@ -14738,79 +14548,43 @@ snapshots: '@antfu/utils@8.1.1': {} - '@anthropic-ai/claude-agent-sdk@0.2.92': + '@anthropic-ai/claude-agent-sdk@0.2.12(zod@4.1.13)': dependencies: - '@anthropic-ai/sdk': 0.80.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.92(zod@4.1.13)': - dependencies: - '@anthropic-ai/sdk': 0.80.0(zod@4.1.13) - '@modelcontextprotocol/sdk': 1.29.0(zod@4.1.13) zod: 4.1.13 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 + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 - '@anthropic-ai/claude-agent-sdk@0.2.92(zod@4.3.6)': + '@anthropic-ai/claude-agent-sdk@0.2.12(zod@4.3.6)': dependencies: - '@anthropic-ai/sdk': 0.80.0(zod@4.3.6) - '@modelcontextprotocol/sdk': 1.29.0(zod@4.3.6) zod: 4.3.6 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/sdk@0.80.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)': - dependencies: - json-schema-to-ts: 3.1.1 - optionalDependencies: - zod: 4.3.6 + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 - '@anthropic-ai/sdk@0.82.0(zod@4.3.6)': + '@anthropic-ai/sdk@0.35.0(encoding@0.1.13)': dependencies: - json-schema-to-ts: 3.1.1 - optionalDependencies: - zod: 4.3.6 + '@types/node': 18.19.130 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding '@asamuzakjp/css-color@5.0.1': dependencies: @@ -15757,7 +15531,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 @@ -15890,8 +15664,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 @@ -15906,7 +15678,7 @@ snapshots: '@babel/parser': 7.28.4 '@babel/template': 7.27.2 '@babel/types': 7.28.4 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -16267,7 +16039,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 @@ -16293,7 +16065,7 @@ snapshots: '@electron/get@2.0.3': dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 @@ -16307,7 +16079,7 @@ snapshots: '@electron/get@3.1.0': dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 @@ -16321,7 +16093,7 @@ snapshots: '@electron/notarize@2.5.0': dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 fs-extra: 9.1.0 promise-retry: 2.0.1 transitivePeerDependencies: @@ -16330,7 +16102,7 @@ snapshots: '@electron/osx-sign@1.3.3': dependencies: compare-version: 0.1.2 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 fs-extra: 10.1.0 isbinaryfile: 4.0.10 minimist: 1.2.8 @@ -16341,7 +16113,7 @@ snapshots: '@electron/rebuild@4.0.3': dependencies: '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 detect-libc: 2.0.3 got: 11.8.6 graceful-fs: 4.2.11 @@ -16360,7 +16132,7 @@ snapshots: dependencies: '@electron/asar': 3.4.1 '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 dir-compare: 4.2.0 fs-extra: 11.3.4 minimatch: 9.0.9 @@ -16371,7 +16143,7 @@ snapshots: '@electron/windows-sign@1.2.2': dependencies: cross-dirname: 0.1.0 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 fs-extra: 11.3.4 minimist: 1.2.8 postject: 1.0.0-alpha.6 @@ -16384,238 +16156,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 @@ -16666,7 +16360,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 @@ -16733,9 +16427,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': {} @@ -16757,86 +16451,45 @@ snapshots: '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true - '@img/sharp-darwin-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.4 - optional: true - '@img/sharp-darwin-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true - '@img/sharp-darwin-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.4 - optional: true - '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true - '@img/sharp-libvips-darwin-arm64@1.2.4': - optional: true - '@img/sharp-libvips-darwin-x64@1.0.4': optional: true - '@img/sharp-libvips-darwin-x64@1.2.4': - optional: true - '@img/sharp-libvips-linux-arm64@1.0.4': optional: true - '@img/sharp-libvips-linux-arm64@1.2.4': - optional: true - '@img/sharp-libvips-linux-arm@1.0.5': optional: true - '@img/sharp-libvips-linux-arm@1.2.4': - optional: true - '@img/sharp-libvips-linux-s390x@1.0.4': optional: true '@img/sharp-libvips-linux-x64@1.0.4': optional: true - '@img/sharp-libvips-linux-x64@1.2.4': - optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': - optional: true - '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.4': - optional: true - '@img/sharp-linux-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true - '@img/sharp-linux-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.4 - optional: true - '@img/sharp-linux-arm@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.0.5 optional: true - '@img/sharp-linux-arm@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.4 - optional: true - '@img/sharp-linux-s390x@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.0.4 @@ -16847,48 +16500,27 @@ snapshots: '@img/sharp-libvips-linux-x64': 1.0.4 optional: true - '@img/sharp-linux-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.4 - optional: true - '@img/sharp-linuxmusl-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 optional: true - '@img/sharp-linuxmusl-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 - optional: true - '@img/sharp-linuxmusl-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.0.4 optional: true - '@img/sharp-linuxmusl-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 - optional: true - '@img/sharp-wasm32@0.33.5': dependencies: '@emnapi/runtime': 1.4.0 optional: true - '@img/sharp-win32-arm64@0.34.5': - optional: true - '@img/sharp-win32-ia32@0.33.5': optional: true '@img/sharp-win32-x64@0.33.5': optional: true - '@img/sharp-win32-x64@0.34.5': - optional: true - '@inquirer/checkbox@4.2.1(@types/node@20.19.23)': dependencies: '@inquirer/core': 10.1.15(@types/node@20.19.23) @@ -17038,7 +16670,7 @@ 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 @@ -17051,14 +16683,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@20.19.23)(typescript@5.4.5)) + 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 @@ -17079,21 +16711,21 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.4.5))': + '@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.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@20.19.39)(typescript@5.4.5)) + 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 @@ -17121,14 +16753,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@22.15.18)(typescript@5.4.5)) + 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 @@ -17156,14 +16788,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 @@ -17188,7 +16820,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': @@ -17206,7 +16838,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 @@ -17228,7 +16860,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 @@ -17298,7 +16930,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 @@ -17455,9 +17087,9 @@ snapshots: '@malept/flatpak-bundler@0.4.0': dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 fs-extra: 9.1.0 - lodash: 4.18.1 + lodash: 4.17.23 tmp-promise: 3.0.3 transitivePeerDependencies: - supports-color @@ -17804,79 +17436,14 @@ snapshots: '@milkdown/exception': 7.13.1 '@milkdown/prose': 7.13.1 '@milkdown/transformer': 7.13.1 - nanoid: 5.1.5 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - '@modelcontextprotocol/sdk@1.26.0(zod@4.1.13)': - dependencies: - '@hono/node-server': 1.19.13(hono@4.12.12) - 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.12 - jose: 6.1.3 - json-schema-typed: 8.0.2 - pkce-challenge: 5.0.1 - raw-body: 3.0.2 - zod: 4.1.13 - zod-to-json-schema: 3.25.1(zod@4.1.13) - transitivePeerDependencies: - - supports-color - - '@modelcontextprotocol/sdk@1.26.0(zod@4.3.6)': - dependencies: - '@hono/node-server': 1.19.13(hono@4.12.12) - 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.12 - jose: 6.1.3 - json-schema-typed: 8.0.2 - pkce-challenge: 5.0.1 - raw-body: 3.0.2 - zod: 4.3.6 - zod-to-json-schema: 3.25.1(zod@4.3.6) - transitivePeerDependencies: - - supports-color - - '@modelcontextprotocol/sdk@1.29.0': - dependencies: - '@hono/node-server': 1.19.13(hono@4.12.12) - 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.12 - 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) + nanoid: 5.1.5 + tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@modelcontextprotocol/sdk@1.29.0(zod@4.1.13)': + '@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 @@ -17886,7 +17453,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 @@ -17896,9 +17463,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)': + '@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 @@ -17908,7 +17475,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 @@ -18052,7 +17619,7 @@ snapshots: dependencies: '@oclif/core': 4.8.0 ansis: 3.17.0 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 ejs: 3.1.10 transitivePeerDependencies: - supports-color @@ -18061,7 +17628,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 @@ -18337,79 +17904,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': @@ -18422,7 +17989,7 @@ snapshots: '@secretlint/resolver': 9.3.2 '@secretlint/types': 9.3.2 ajv: 8.18.0 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 rc-config-loader: 4.1.3 transitivePeerDependencies: - supports-color @@ -18431,7 +17998,7 @@ snapshots: dependencies: '@secretlint/profiler': 9.3.2 '@secretlint/types': 9.3.2 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 structured-source: 4.0.0 transitivePeerDependencies: - supports-color @@ -18444,7 +18011,7 @@ snapshots: '@textlint/module-interop': 14.7.1 '@textlint/types': 14.7.1 chalk: 4.1.2 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 pluralize: 8.0.0 strip-ansi: 6.0.1 table: 6.9.0 @@ -18863,9 +18430,9 @@ snapshots: '@textlint/resolver': 14.7.1 '@textlint/types': 14.7.1 chalk: 4.1.2 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.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 @@ -18944,7 +18511,7 @@ snapshots: '@types/better-sqlite3@7.6.11': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.23 '@types/better-sqlite3@7.6.13': dependencies: @@ -18953,17 +18520,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': 24.12.2 '@types/responselike': 1.0.3 '@types/chrome@0.0.114': @@ -18988,15 +18555,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: @@ -19141,14 +18708,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 @@ -19181,22 +18748,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': 25.5.2 '@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.23 '@types/graceful-fs@4.1.8': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/har-format@1.2.15': {} @@ -19214,7 +18781,7 @@ snapshots: '@types/http-proxy@1.17.14': dependencies: - '@types/node': 20.19.39 + '@types/node': 25.5.2 '@types/istanbul-lib-coverage@2.0.6': {} @@ -19237,13 +18804,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 @@ -19252,7 +18819,7 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/jsonpath@0.2.4': {} @@ -19260,7 +18827,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/linkify-it@5.0.0': {} @@ -19280,7 +18847,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': @@ -19308,12 +18875,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': 25.5.2 '@types/node@18.19.130': dependencies: @@ -19327,10 +18894,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 @@ -19347,7 +18910,7 @@ snapshots: '@types/plist@3.0.5': dependencies: - '@types/node': 20.19.39 + '@types/node': 25.5.2 xmlbuilder: 15.1.1 optional: true @@ -19374,7 +18937,7 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 20.19.39 + '@types/node': 24.12.2 '@types/retry@0.12.2': {} @@ -19383,7 +18946,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: @@ -19393,7 +18956,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': {} @@ -19401,7 +18964,7 @@ snapshots: '@types/sockjs@0.3.36': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.25 '@types/spotify-api@0.0.25': {} @@ -19449,7 +19012,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 20.19.39 + '@types/node': 24.12.2 optional: true '@typespec/ts-http-runtime@0.2.2': @@ -19468,19 +19031,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@vscode/test-cli@0.0.12': + '@vscode/test-cli@0.0.8': dependencies: '@types/mocha': 10.0.10 - c8: 10.1.3 + c8: 9.1.0 chokidar: 3.6.0 - enhanced-resolve: 5.19.0 + enhanced-resolve: 5.15.0 glob: 10.5.0 minimatch: 9.0.9 - mocha: 11.7.5 - supports-color: 10.2.2 + mocha: 10.8.2 + supports-color: 9.4.0 yargs: 17.7.2 - transitivePeerDependencies: - - monocart-coverage-reports '@vscode/test-electron@2.5.2': dependencies: @@ -19589,7 +19150,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': @@ -19739,6 +19300,24 @@ snapshots: dependencies: event-target-shim: 5.0.1 + abstract-leveldown@6.2.3: + dependencies: + buffer: 5.7.1 + immediate: 3.3.0 + level-concat-iterator: 2.0.1 + level-supports: 1.0.1 + xtend: 4.0.2 + optional: true + + abstract-leveldown@6.3.0: + dependencies: + buffer: 5.7.1 + immediate: 3.3.0 + level-concat-iterator: 2.0.1 + level-supports: 1.0.1 + xtend: 4.0.2 + optional: true + accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -19820,6 +19399,8 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ansi-colors@4.1.3: {} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -19855,14 +19436,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 @@ -19933,7 +19514,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 @@ -20011,9 +19592,12 @@ snapshots: async-function@1.0.0: {} + async-limiter@1.0.1: + optional: true + async@2.6.4: dependencies: - lodash: 4.18.1 + lodash: 4.17.23 async@3.2.6: {} @@ -20124,7 +19708,7 @@ snapshots: baseline-browser-mapping@2.9.19: {} - basic-ftp@5.2.1: {} + basic-ftp@5.2.0: {} batch@0.6.1: {} @@ -20227,6 +19811,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 @@ -20325,6 +19916,20 @@ snapshots: yargs: 17.7.2 yargs-parser: 21.1.1 + c8@9.1.0: + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 3.3.1 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.1.6 + test-exclude: 6.0.0 + v8-to-istanbul: 9.1.3 + yargs: 17.7.2 + yargs-parser: 21.1.1 + cac@6.7.14: {} cacache@20.0.3: @@ -20381,6 +19986,8 @@ snapshots: camelcase@6.3.0: {} + caniuse-lite@1.0.30001718: {} + caniuse-lite@1.0.30001769: {} caseless@0.12.0: {} @@ -20442,7 +20049,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): @@ -20471,10 +20078,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chokidar@4.0.3: - dependencies: - readdirp: 4.1.2 - chownr@1.1.4: {} chownr@3.0.0: {} @@ -20702,7 +20305,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 @@ -20824,13 +20427,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@20.19.39)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.4.5)): + 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@20.19.39)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.4.5)) + 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: @@ -21143,7 +20746,9 @@ snapshots: dagre@0.8.5: dependencies: graphlib: 2.1.8 - lodash: 4.18.1 + lodash: 4.17.23 + + data-uri-to-buffer@4.0.1: {} data-uri-to-buffer@6.0.2: {} @@ -21233,6 +20838,12 @@ snapshots: defer-to-connect@2.0.1: {} + deferred-leveldown@5.3.0: + dependencies: + abstract-leveldown: 6.2.3 + inherits: 2.0.4 + optional: true + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -21291,8 +20902,6 @@ snapshots: diff@5.2.2: {} - diff@7.0.0: {} - dir-compare@4.2.0: dependencies: minimatch: 3.1.5 @@ -21450,6 +21059,8 @@ snapshots: transitivePeerDependencies: - supports-color + electron-to-chromium@1.5.155: {} + electron-to-chromium@1.5.286: {} electron-updater@6.6.2: @@ -21465,7 +21076,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron-vite@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)): + electron-vite@4.0.1(vite@6.4.1(@types/node@25.5.2)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3)): dependencies: '@babel/core': 7.28.4 '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.4) @@ -21473,7 +21084,7 @@ snapshots: esbuild: 0.25.11 magic-string: 0.30.17 picocolors: 1.1.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) + vite: 6.4.1(@types/node@25.5.2)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3) transitivePeerDependencies: - supports-color @@ -21482,7 +21093,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 @@ -21511,6 +21122,14 @@ snapshots: encodeurl@2.0.0: {} + encoding-down@6.3.0: + dependencies: + abstract-leveldown: 6.3.0 + inherits: 2.0.4 + level-codec: 9.0.2 + level-errors: 2.0.1 + optional: true + encoding-japanese@2.2.0: {} encoding-sniffer@0.2.1: @@ -21676,35 +21295,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 @@ -21912,7 +21502,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -21979,9 +21569,14 @@ 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 + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 file-size@1.0.0: {} @@ -22094,6 +21689,10 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 4.0.0-beta.3 + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + forwarded@0.2.0: {} fresh@0.5.2: {} @@ -22232,7 +21831,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: @@ -22287,6 +21886,14 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.9 + once: 1.4.0 + glob@9.3.5: dependencies: fs.realpath: 1.0.0 @@ -22414,7 +22021,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: @@ -22487,15 +22094,6 @@ snapshots: handle-thing@2.0.1: {} - handlebars@4.7.9: - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.19.3 - has-bigints@1.1.0: {} has-flag@3.0.0: {} @@ -22524,7 +22122,7 @@ snapshots: highlight.js@10.7.3: {} - hono@4.12.12: {} + hono@4.12.8: {} hosted-git-info@4.1.0: dependencies: @@ -22581,7 +22179,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: @@ -22679,7 +22277,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -22729,6 +22327,9 @@ snapshots: immediate@3.0.6: {} + immediate@3.3.0: + optional: true + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 @@ -22781,7 +22382,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) @@ -22930,8 +22531,6 @@ snapshots: is-number@7.0.0: {} - is-path-inside@3.0.3: {} - is-plain-obj@2.1.0: {} is-plain-obj@3.0.0: {} @@ -23119,7 +22718,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': 25.5.2 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.0 @@ -23158,16 +22757,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.19.39)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.4.5)): + 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@20.19.39)(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@20.19.39)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.4.5)) + 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@20.19.39)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.4.5)) + 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 @@ -23246,7 +22845,7 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.19.39)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5)): + 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 @@ -23271,13 +22870,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@20.19.23)(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@20.19.39)(typescript@5.4.5)): + 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 @@ -23302,13 +22901,13 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.19.39 - ts-node: 10.9.2(@types/node@20.19.39)(typescript@5.4.5) + '@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.39)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.4.5)): + 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 @@ -23333,13 +22932,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@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 @@ -23364,7 +22963,7 @@ 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 @@ -23457,7 +23056,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 @@ -23471,7 +23070,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': 25.5.2 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -23481,7 +23080,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 @@ -23520,7 +23119,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): @@ -23555,7 +23154,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 @@ -23583,7 +23182,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 @@ -23629,11 +23228,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: @@ -23648,7 +23247,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 @@ -23657,13 +23256,13 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 20.19.39 + '@types/node': 25.5.2 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 @@ -23680,12 +23279,12 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@20.19.39)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.4.5)): + 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@20.19.39)(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@20.19.39)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.4.5)) + 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 @@ -23765,7 +23364,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 @@ -23789,7 +23388,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 @@ -23813,11 +23412,6 @@ snapshots: json-parse-even-better-errors@3.0.2: {} - json-schema-to-ts@3.1.1: - dependencies: - '@babel/runtime': 7.29.2 - ts-algebra: 2.0.0 - json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -23969,6 +23563,68 @@ snapshots: needle: 3.3.1 source-map: 0.6.1 + level-codec@9.0.2: + dependencies: + buffer: 5.7.1 + optional: true + + level-concat-iterator@2.0.1: + optional: true + + level-errors@2.0.1: + dependencies: + errno: 0.1.8 + optional: true + + level-iterator-stream@4.0.2: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + xtend: 4.0.2 + optional: true + + level-js@5.0.2: + dependencies: + abstract-leveldown: 6.2.3 + buffer: 5.7.1 + inherits: 2.0.4 + ltgt: 2.2.1 + optional: true + + level-packager@5.1.1: + dependencies: + encoding-down: 6.3.0 + levelup: 4.4.0 + optional: true + + level-supports@1.0.1: + dependencies: + xtend: 4.0.2 + optional: true + + level@6.0.1: + dependencies: + level-js: 5.0.2 + level-packager: 5.1.1 + leveldown: 5.6.0 + optional: true + + leveldown@5.6.0: + dependencies: + abstract-leveldown: 6.2.3 + napi-macros: 2.0.0 + node-gyp-build: 4.1.1 + optional: true + + levelup@4.4.0: + dependencies: + deferred-leveldown: 5.3.0 + level-errors: 2.0.1 + level-iterator-stream: 4.0.2 + level-supports: 1.0.1 + xtend: 4.0.2 + optional: true + leven@3.1.0: {} lib0@0.2.108: @@ -24074,7 +23730,7 @@ snapshots: lodash.union@4.6.0: {} - lodash@4.18.1: {} + lodash@4.17.23: {} log-symbols@4.1.0: dependencies: @@ -24114,6 +23770,9 @@ snapshots: lru-cache@7.18.3: {} + ltgt@2.2.1: + optional: true + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -24581,7 +24240,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -24603,7 +24262,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: @@ -24732,28 +24391,27 @@ snapshots: dependencies: obliterator: 2.0.5 - mocha@11.7.5: + mocha@10.8.2: dependencies: + ansi-colors: 4.1.3 browser-stdout: 1.3.1 - chokidar: 4.0.3 + chokidar: 3.6.0 debug: 4.4.3(supports-color@8.1.1) - diff: 7.0.0 + diff: 5.2.2 escape-string-regexp: 4.0.0 find-up: 5.0.0 - glob: 10.5.0 + glob: 8.1.0 he: 1.2.0 - is-path-inside: 3.0.3 js-yaml: 4.1.1 log-symbols: 4.1.0 - minimatch: 9.0.9 + minimatch: 5.1.9 ms: 2.1.3 - picocolors: 1.1.1 serialize-javascript: 7.0.5 strip-json-comments: 3.1.1 supports-color: 8.1.1 - workerpool: 9.3.4 - yargs: 17.7.2 - yargs-parser: 21.1.1 + workerpool: 6.5.1 + yargs: 16.2.0 + yargs-parser: 20.2.9 yargs-unparser: 2.0.0 module-details-from-path@1.0.4: {} @@ -24804,6 +24462,9 @@ snapshots: napi-build-utils@2.0.0: {} + napi-macros@2.0.0: + optional: true + natural-compare@1.4.0: {} natural-orderby@3.0.2: {} @@ -24869,8 +24530,17 @@ snapshots: optionalDependencies: encoding: 0.1.13 + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + node-forge@1.4.0: {} + node-gyp-build@4.1.1: + optional: true + node-gyp@12.2.0: dependencies: env-paths: 2.2.1 @@ -24892,6 +24562,8 @@ snapshots: dependencies: node-addon-api: 7.1.1 + node-releases@2.0.19: {} + node-releases@2.0.27: {} node-rsa@1.1.1: @@ -25275,9 +24947,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: {} @@ -25335,7 +25007,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 @@ -25365,7 +25037,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: @@ -25499,7 +25171,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.19.39 + '@types/node': 25.5.2 long: 5.3.2 protocol-buffers-schema@3.6.0: {} @@ -25587,7 +25259,7 @@ snapshots: puppeteer-extra-plugin-user-data-dir@2.4.1(puppeteer-extra@3.3.6(puppeteer-core@24.37.5)(puppeteer@24.37.5(typescript@5.4.5))): dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 fs-extra: 10.1.0 puppeteer-extra-plugin: 3.2.3(puppeteer-extra@3.3.6(puppeteer-core@24.37.5)(puppeteer@24.37.5(typescript@5.4.5))) rimraf: 3.0.2 @@ -25683,7 +25355,7 @@ snapshots: rc-config-loader@4.1.3: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 js-yaml: 4.1.1 json5: 2.2.3 require-from-string: 2.0.2 @@ -25711,7 +25383,7 @@ snapshots: read-binary-file-arch@1.0.6: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -25763,9 +25435,7 @@ snapshots: readdirp@3.6.0: dependencies: - picomatch: 2.3.2 - - readdirp@4.1.2: {} + picomatch: 2.3.1 readline@1.3.0: {} @@ -25865,7 +25535,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: {} @@ -25874,7 +25544,7 @@ snapshots: require-in-the-middle@7.5.2: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 module-details-from-path: 1.0.4 resolve: 1.22.8 transitivePeerDependencies: @@ -25974,35 +25644,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: {} @@ -26635,12 +26305,10 @@ snapshots: sumchecker@3.0.1: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 transitivePeerDependencies: - supports-color - supports-color@10.2.2: {} - supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -26653,6 +26321,8 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-color@9.4.0: {} + supports-hyperlinks@2.3.0: dependencies: has-flag: 4.0.0 @@ -26738,16 +26408,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: @@ -26819,18 +26489,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: {} @@ -26903,13 +26573,11 @@ snapshots: dependencies: utf8-byte-length: 1.0.4 - ts-algebra@2.0.0: {} - ts-dedent@2.2.0: {} 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)(ts-node@10.9.2(@types/node@20.19.23)(typescript@5.4.5)))(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 @@ -26928,7 +26596,7 @@ 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)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)))(typescript@5.4.5): dependencies: @@ -26950,27 +26618,7 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.28.4) - ts-jest@29.4.9(@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-util@29.7.0)(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 - fast-json-stable-stringify: 2.1.0 - handlebars: 4.7.9 - jest: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.7.4 - type-fest: 4.41.0 - typescript: 5.4.5 - yargs-parser: 21.1.1 - optionalDependencies: - '@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-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 @@ -26978,7 +26626,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: @@ -27009,14 +26657,14 @@ snapshots: yn: 3.1.1 optional: true - ts-node@10.9.2(@types/node@20.19.39)(typescript@5.4.5): + 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.39 + '@types/node': 20.19.25 acorn: 8.11.1 acorn-walk: 8.3.0 arg: 4.1.3 @@ -27167,9 +26815,6 @@ snapshots: ufo@1.6.1: {} - uglify-js@3.19.3: - optional: true - unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -27191,7 +26836,7 @@ snapshots: undici-types@7.24.4: {} - undici@7.24.7: {} + undici@7.22.0: {} unicode-emoji-modifier-base@1.0.0: {} @@ -27266,6 +26911,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 @@ -27339,13 +26990,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - 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): + vite@6.4.1(@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 @@ -27355,13 +27006,13 @@ snapshots: terser: 5.39.2 yaml: 2.8.3 - 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): + vite@6.4.1(@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 @@ -27427,6 +27078,8 @@ snapshots: dependencies: defaults: 1.0.4 + web-streams-polyfill@3.3.3: {} + web-streams-polyfill@4.0.0-beta.3: {} webdriver-bidi-protocol@0.4.1: {} @@ -27514,7 +27167,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 @@ -27538,7 +27191,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: @@ -27700,7 +27353,7 @@ snapshots: wordwrapjs@5.1.0: {} - workerpool@9.3.4: {} + workerpool@6.5.1: {} wrap-ansi@6.2.0: dependencies: @@ -27733,6 +27386,11 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 + ws@6.2.3: + dependencies: + async-limiter: 1.0.1 + optional: true + ws@7.5.10: {} ws@8.18.0: {} @@ -27775,6 +27433,13 @@ snapshots: xtend@4.0.2: {} + y-leveldb@0.1.2(yjs@13.6.27): + dependencies: + level: 6.0.1 + lib0: 0.2.117 + yjs: 13.6.27 + optional: true + y-prosemirror@1.3.5(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27): dependencies: lib0: 0.2.117 @@ -27789,11 +27454,18 @@ snapshots: lib0: 0.2.108 yjs: 13.6.27 - y-websocket@3.0.0(yjs@13.6.27): + y-websocket@1.5.4(yjs@13.6.27): dependencies: - lib0: 0.2.117 + lib0: 0.2.108 + lodash.debounce: 4.0.8 y-protocols: 1.0.6(yjs@13.6.27) yjs: 13.6.27 + optionalDependencies: + ws: 6.2.3 + y-leveldb: 0.1.2(yjs@13.6.27) + transitivePeerDependencies: + - bufferutil + - utf-8-validate y18n@5.0.8: {} From 9eab2ba5d8008fe202f7f73dfdf4694d15f2fa39 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Fri, 10 Apr 2026 09:18:13 -0700 Subject: [PATCH 04/34] Fix test dispatcher to use path-based agent resolution - Replace getExternalAppAgentProviders with getTestAgentProvider using path-based resolution via createNpmAppAgentProvider, avoiding circular dependency with default-agent-provider - Fix AGENTS_DIR path resolution using path.resolve pattern (matches scaffolderHandler.ts) instead of new URL which strips filename - Remove @ prefix from test commands so phrases go through grammar matching instead of command handler routing - Enable cache for grammar matching (was disabled, which skipped grammar match and fell through to slow LLM translation) - Result: 248/258 tests pass (96%) for github-cli agent Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../onboarding/src/testing/testingHandler.ts | 48 +++++++++++-------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/ts/packages/agents/onboarding/src/testing/testingHandler.ts b/ts/packages/agents/onboarding/src/testing/testingHandler.ts index 4cd0e98d0..f500d51ef 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, @@ -531,27 +531,30 @@ 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( + 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(integrationName: string) { const instanceDir = getInstanceDir(); - const appAgentProviders = getExternalAppAgentProviders(instanceDir); + const appAgentProviders = [getTestAgentProvider(integrationName)]; const buffer: string[] = []; const clientIO = createCapturingClientIO(buffer); @@ -559,7 +562,8 @@ async function createTestDispatcher(integrationName: string) { appAgentProviders, agents: { 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, storageProvider: getFsStorageProvider(), @@ -575,8 +579,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 { From a2ed55e0018d749927a92ae571e9dab34fc4806e Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Fri, 10 Apr 2026 15:15:30 -0700 Subject: [PATCH 05/34] github-cli: Real gh CLI execution, new actions, and usability improvements - Implement full gh CLI execution handler with buildArgs() for all 55 actions - Add prList, prView, issueList, issueView, repoView action types to schema - Add grammar rules for PR/issue list/view, repo view, API request, contributors - Smart JSON formatting for repo view (--json) and API array responses - Auto-expand owner/repo to /repos/owner/repo/contributors for API requests - Fix test dispatcher: enable schemas+actions, use temp persistDir, validate routing - Add standalone test runner (runTests.ts) for bypassing MCP timeout Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../github-cli/src/github-cliActionHandler.ts | 448 +++++++++++++++++- .../github-cli/src/github-cliSchema.agr | 317 ++++++++++++- .../agents/github-cli/src/github-cliSchema.ts | 65 +++ .../agents/onboarding/src/testing/runTests.ts | 124 +++++ .../onboarding/src/testing/testingHandler.ts | 26 +- 5 files changed, 972 insertions(+), 8 deletions(-) create mode 100644 ts/packages/agents/onboarding/src/testing/runTests.ts diff --git a/ts/packages/agents/github-cli/src/github-cliActionHandler.ts b/ts/packages/agents/github-cli/src/github-cliActionHandler.ts index 8296df459..c405dfa49 100644 --- a/ts/packages/agents/github-cli/src/github-cliActionHandler.ts +++ b/ts/packages/agents/github-cli/src/github-cliActionHandler.ts @@ -7,8 +7,15 @@ import { TypeAgentAction, ActionResult, } from "@typeagent/agent-sdk"; -import { createActionResultFromTextDisplay } from "@typeagent/agent-sdk/helpers/action"; +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 { @@ -21,12 +28,443 @@ 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.title) args.push("--title", String(p.title)); + if (p.body) args.push("--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)); + return args; + } + case "issueReopen": { + const args = ["issue", "reopen"]; + if (p.number) args.push(String(p.number)); + 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)); + 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)); + 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)); + if (p.body) args.push("--body", String(p.body)); + if (p.base) args.push("--base", String(p.base)); + if (p.head) args.push("--head", String(p.head)); + 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)); + 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)); + 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": + return ["release", "list"]; + + // ── 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; + } + + // ── 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`; + } + 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)); + 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; + } + default: + return undefined; + } +} + async function executeAction( action: TypeAgentAction, context: ActionContext, ): Promise { - // TODO: implement action handlers - return createActionResultFromTextDisplay( - `Executing ${action.actionName} — not yet implemented.`, - ); + const args = buildArgs(action); + if (!args) { + return createActionResultFromTextDisplay( + `Unknown action: ${action.actionName}`, + ); + } + + try { + const output = await runGh(args); + if (!output) { + 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 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; + // Common gh patterns: {name: "..."}, {login: "..."} + 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); + }; + const lines = Object.entries(data) + .map(([k, v]) => `- **${k}**: ${formatValue(v)}`) + .join("\n"); + return createActionResultFromMarkdownDisplay( + `**\`gh ${args.slice(0, args.indexOf("--json")).join(" ")}\`**\n\n${lines}`, + ); + } catch { + // Fall through to raw output + } + } + + // Format JSON arrays (e.g., API contributor responses) + if (output.startsWith("[")) { + try { + const arr = JSON.parse(output) as Record[]; + if (arr.length > 0 && "login" in arr[0]) { + const rows = arr + .slice(0, 20) + .map((u, i) => `${i + 1}. **${u.login}** — ${u.contributions} contributions`) + .join("\n"); + return createActionResultFromMarkdownDisplay( + `**\`gh ${args.join(" ")}\`**\n\n${rows}`, + ); + } + } catch { + // Fall through to raw output + } + } + + 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-cliSchema.agr b/ts/packages/agents/github-cli/src/github-cliSchema.agr index d5877873c..aa0bd7604 100644 --- a/ts/packages/agents/github-cli/src/github-cliSchema.agr +++ b/ts/packages/agents/github-cli/src/github-cliSchema.agr @@ -92,6 +92,62 @@ } }; + = show repository $(repo:wildcard) -> { + actionName: "repoView", + parameters: { + repo + } +} + | view repo $(repo:wildcard) -> { + actionName: "repoView", + parameters: { + repo + } +} + | how many stars does $(repo:wildcard) have -> { + actionName: "repoView", + parameters: { + repo + } +} + | tell me about repository $(repo:wildcard) -> { + actionName: "repoView", + parameters: { + repo + } +} + | info about $(repo:wildcard) -> { + actionName: "repoView", + parameters: { + repo + } +} + | details for repository $(repo:wildcard) -> { + actionName: "repoView", + parameters: { + repo + } +}; + + = call the GitHub API endpoint $(endpoint:wildcard) -> { + actionName: "apiRequest", + parameters: { + endpoint + } +} + | list contributors to $(endpoint:wildcard) -> { + actionName: "apiRequest", + parameters: { + endpoint + } +} + | top contributors to $(endpoint:wildcard) -> { + actionName: "apiRequest", + parameters: { + endpoint + } +}; + = search repositories for $(query:wildcard) -> { actionName: "searchRepos", parameters: { @@ -99,6 +155,119 @@ } }; + = list issues -> { + actionName: "issueList", + parameters: {} +} + | list issues in $(repo:wildcard) -> { + actionName: "issueList", + parameters: { + repo + } +} + | show open issues -> { + actionName: "issueList", + parameters: { + state: "open" + } +} + | show open issues in $(repo:wildcard) -> { + actionName: "issueList", + parameters: { + repo, + state: "open" + } +} + | show closed issues in $(repo:wildcard) -> { + actionName: "issueList", + parameters: { + repo, + state: "closed" + } +}; + + = show issue $(number:number) -> { + actionName: "issueView", + parameters: { + number + } +} + | view issue $(number:number) in $(repo:wildcard) -> { + actionName: "issueView", + parameters: { + number, + repo + } +}; + + = list pull requests -> { + actionName: "prList", + parameters: {} +} + | list pull requests in $(repo:wildcard) -> { + actionName: "prList", + parameters: { + repo + } +} + | show open pull requests -> { + actionName: "prList", + parameters: { + state: "open" + } +} + | show open pull requests in $(repo:wildcard) -> { + actionName: "prList", + parameters: { + repo, + state: "open" + } +} + | list open PRs in $(repo:wildcard) -> { + actionName: "prList", + parameters: { + repo, + state: "open" + } +} + | how many open PRs are in $(repo:wildcard) -> { + actionName: "prList", + parameters: { + repo, + state: "open" + } +} + | show PRs -> { + actionName: "prList", + parameters: {} +} + | list PRs in $(repo:wildcard) -> { + actionName: "prList", + parameters: { + repo + } +}; + + = show pull request $(number:number) -> { + actionName: "prView", + parameters: { + number + } +} + | view PR $(number:number) -> { + actionName: "prView", + parameters: { + number + } +} + | view pull request $(number:number) in $(repo:wildcard) -> { + actionName: "prView", + parameters: { + number, + repo + } +}; + = show my GitHub status -> { actionName: "statusPrint", parameters: {} @@ -106,6 +275,142 @@ | print my GitHub notifications -> { actionName: "statusPrint", parameters: {} +} + | status of issues and pull requests -> { + actionName: "statusPrint", + parameters: {} +} + | current status of issues and pull requests -> { + actionName: "statusPrint", + parameters: {} +} + | status of my notifications -> { + actionName: "statusPrint", + parameters: {} +} + | status of my notifications and PRs -> { + actionName: "statusPrint", + parameters: {} +} + | summary of issues and pull requests -> { + actionName: "statusPrint", + parameters: {} +} + | summary of relevant issues and pull requests -> { + actionName: "statusPrint", + parameters: {} +} + | updates on my repositories -> { + actionName: "statusPrint", + parameters: {} +} + | latest updates on my repositories -> { + actionName: "statusPrint", + parameters: {} +} + | information on recent issues and notifications -> { + actionName: "statusPrint", + parameters: {} +}; + + = view workflow run $(id:word) -> { + actionName: "runView", + parameters: { + id + } +} + | details for workflow run $(id:word) -> { + actionName: "runView", + parameters: { + id + } +} + | details for the workflow run with ID $(id:word) -> { + actionName: "runView", + parameters: { + id + } +} + | details of the workflow run with ID $(id:word) -> { + actionName: "runView", + parameters: { + id + } +} + | workflow run with ID $(id:word) -> { + actionName: "runView", + parameters: { + id + } +} + | workflow run details for ID $(id:word) -> { + actionName: "runView", + parameters: { + id + } +} + | workflow run details for $(id:word) -> { + actionName: "runView", + parameters: { + id + } +} + | workflow run identified by $(id:word) -> { + actionName: "runView", + parameters: { + id + } +} + | details for the workflow run with the ID $(id:word) -> { + actionName: "runView", + parameters: { + id + } +}; + + = show me workflow $(id:word) -> { + actionName: "workflowView", + parameters: { + id + } +} + | view the workflow definition for $(id:word) -> { + actionName: "workflowView", + parameters: { + id + } +} + | workflow details for $(id:word) -> { + actionName: "workflowView", + parameters: { + id + } +}; + + = set the GitHub CLI configuration for $(name:word) to $(value:word) -> { + actionName: "configSet", + parameters: { + name, + value + } +} + | update the gh config with $(name:word) and $(value:word) -> { + actionName: "configSet", + parameters: { + name, + value + } +}; + + = add this SSH key $(key:wildcard) -> { + actionName: "sshKeyAdd", + parameters: { + key + } +} + | add an SSH key for me -> { + actionName: "sshKeyAdd", + parameters: {} }; import { GithubCliActions } from "./github-cliSchema.ts"; @@ -116,10 +421,20 @@ import { GithubCliActions } from "./github-cliSchema.ts"; | | | + | + | | | | + | + | | | + | | - | ; \ No newline at end of file + | + | + | + | + | + | ; \ No newline at end of file diff --git a/ts/packages/agents/github-cli/src/github-cliSchema.ts b/ts/packages/agents/github-cli/src/github-cliSchema.ts index 66fbffff1..c8e7181d1 100644 --- a/ts/packages/agents/github-cli/src/github-cliSchema.ts +++ b/ts/packages/agents/github-cli/src/github-cliSchema.ts @@ -17,11 +17,15 @@ export type GithubCliActions = | IssueCreateAction | IssueCloseAction | IssueReopenAction + | IssueListAction + | IssueViewAction | OrgListAction | OrgViewAction | PrCreateAction | PrCloseAction | PrMergeAction + | PrListAction + | PrViewAction | ProjectCreateAction | ProjectDeleteAction | ProjectListAction @@ -31,6 +35,7 @@ export type GithubCliActions = | RepoCreateAction | RepoCloneAction | RepoDeleteAction + | RepoViewAction | CacheListAction | CacheDeleteAction | RunViewAction @@ -193,6 +198,32 @@ export type IssueReopenAction = { }; }; +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: {}; @@ -238,6 +269,32 @@ export type PrMergeAction = { }; }; +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 ProjectCreateAction = { actionName: "projectCreate"; parameters: { @@ -458,6 +515,14 @@ export type RulesetViewAction = { }; }; +export type RepoViewAction = { + actionName: "repoView"; + parameters: { + + repo?: string; + }; +}; + export type SearchReposAction = { actionName: "searchRepos"; parameters: { 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 000000000..688753466 --- /dev/null +++ b/ts/packages/agents/onboarding/src/testing/runTests.ts @@ -0,0 +1,124 @@ +// 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"; + +const integrationName = process.argv[2] || "github-cli"; + +const __filename = fileURLToPath(import.meta.url); +const AGENTS_DIR = path.resolve(__filename, "../../../../../../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, +}; + +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 f500d51ef..7c5585e03 100644 --- a/ts/packages/agents/onboarding/src/testing/testingHandler.ts +++ b/ts/packages/agents/onboarding/src/testing/testingHandler.ts @@ -558,14 +558,19 @@ async function createTestDispatcher(integrationName: string) { 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"); + const dispatcher = await createDispatcher("onboarding-test-runner", { appAgentProviders, - agents: { commands: ["dispatcher", integrationName] }, + agents: { schemas: [integrationName], actions: [integrationName], commands: ["dispatcher", integrationName] }, explainer: { 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, @@ -597,6 +602,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, From 481256b34ef5ace0b09aea3a323f1cbd8dfad91d Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Fri, 10 Apr 2026 15:18:20 -0700 Subject: [PATCH 06/34] Add github-cli demo scripts for shell and CLI Demo walks through status, stars, contributors, PRs, issues, search, and auth - showcasing the onboarding agent's auto-generated github-cli agent with real gh CLI execution. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ts/packages/cli/demo/github_cli.txt | 30 +++++++++++++ ts/packages/shell/demo/github_cli.txt | 65 +++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 ts/packages/cli/demo/github_cli.txt create mode 100644 ts/packages/shell/demo/github_cli.txt diff --git a/ts/packages/cli/demo/github_cli.txt b/ts/packages/cli/demo/github_cli.txt new file mode 100644 index 000000000..8f4deb6c4 --- /dev/null +++ b/ts/packages/cli/demo/github_cli.txt @@ -0,0 +1,30 @@ +# ============================================= +# 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? +list contributors to microsoft/TypeAgent + +# What PRs are open? +list open PRs in microsoft/TypeAgent + +# What issues need attention? +show open issues in microsoft/TypeAgent + +# Drill into a specific issue +show issue 2170 in microsoft/TypeAgent + +# Find repos +search repositories for TypeScript agent framework + +# Am I authenticated? +check my GitHub authentication diff --git a/ts/packages/shell/demo/github_cli.txt b/ts/packages/shell/demo/github_cli.txt new file mode 100644 index 000000000..d1bb31a28 --- /dev/null +++ b/ts/packages/shell/demo/github_cli.txt @@ -0,0 +1,65 @@ +# ====== Init ======= +@config action -* github-cli +@config schema -* github-cli + +# ============================================= +# GitHub CLI Agent Demo +# Natural language → real gh CLI execution +# ============================================= + +# ------------------------------------- +# 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? +list contributors to microsoft/TypeAgent + +# ------------------------------------- +# Pull request workflows +# ------------------------------------- + +# See what's in flight +list open PRs in microsoft/TypeAgent + +# Check PRs in another repo +list open pull requests in microsoft/garnet + +# ------------------------------------- +# Issue management +# ------------------------------------- + +# Browse issues across repos +show open issues in microsoft/garnet + +# Drill into a specific issue +show issue 2170 in microsoft/TypeAgent + +# ------------------------------------- +# Repository discovery +# ------------------------------------- + +# Find interesting projects +search repositories for TypeScript agent framework + +# Check out an org +show repository microsoft/TypeAgent + +# ------------------------------------- +# Authentication & config +# ------------------------------------- + +# Verify we're logged in +check my GitHub authentication From 9a897d57b9d4f6c4255c182582ea1bec5e0505a4 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Fri, 10 Apr 2026 15:25:32 -0700 Subject: [PATCH 07/34] github-cli: Use octopus emoji for agent icon Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ts/packages/agents/github-cli/src/github-cliManifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ts/packages/agents/github-cli/src/github-cliManifest.json b/ts/packages/agents/github-cli/src/github-cliManifest.json index 7cc11c885..604e85285 100644 --- a/ts/packages/agents/github-cli/src/github-cliManifest.json +++ b/ts/packages/agents/github-cli/src/github-cliManifest.json @@ -1,5 +1,5 @@ { - "emojiChar": "🔌", + "emojiChar": "🐙", "description": "Agent for github-cli", "defaultEnabled": true, "schema": { From 556a9cfab787675a92ce7eee2d0d6c101ef0974c Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Fri, 10 Apr 2026 15:42:52 -0700 Subject: [PATCH 08/34] github-cli: Distill repo info to answer specific questions When asking 'how many stars/forks does X have' or 'what language is X written in', the agent now returns a focused one-line answer instead of dumping all repo stats. General 'show repository X' still returns the full overview. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../github-cli/src/github-cliActionHandler.ts | 62 +++++++++++++++---- .../github-cli/src/github-cliSchema.agr | 17 ++++- .../agents/github-cli/src/github-cliSchema.ts | 2 + 3 files changed, 68 insertions(+), 13 deletions(-) diff --git a/ts/packages/agents/github-cli/src/github-cliActionHandler.ts b/ts/packages/agents/github-cli/src/github-cliActionHandler.ts index c405dfa49..b60c233f2 100644 --- a/ts/packages/agents/github-cli/src/github-cliActionHandler.ts +++ b/ts/packages/agents/github-cli/src/github-cliActionHandler.ts @@ -393,6 +393,42 @@ function buildArgs( } } +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; + } +} + async function executeAction( action: TypeAgentAction, context: ActionContext, @@ -404,6 +440,8 @@ async function executeAction( ); } + const p = action.parameters as Record; + try { const output = await runGh(args); if (!output) { @@ -416,19 +454,19 @@ async function executeAction( if (args.includes("--json")) { try { const data = JSON.parse(output); - const 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; - // Common gh patterns: {name: "..."}, {login: "..."} - 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); + + // 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); } - return String(v); - }; + } + const lines = Object.entries(data) .map(([k, v]) => `- **${k}**: ${formatValue(v)}`) .join("\n"); diff --git a/ts/packages/agents/github-cli/src/github-cliSchema.agr b/ts/packages/agents/github-cli/src/github-cliSchema.agr index aa0bd7604..f1e40d535 100644 --- a/ts/packages/agents/github-cli/src/github-cliSchema.agr +++ b/ts/packages/agents/github-cli/src/github-cliSchema.agr @@ -107,7 +107,22 @@ | how many stars does $(repo:wildcard) have -> { actionName: "repoView", parameters: { - repo + repo, + field: "stars" + } +} + | how many forks does $(repo:wildcard) have -> { + actionName: "repoView", + parameters: { + repo, + field: "forks" + } +} + | what language is $(repo:wildcard) written in -> { + actionName: "repoView", + parameters: { + repo, + field: "language" } } | tell me about repository $(repo:wildcard) -> { diff --git a/ts/packages/agents/github-cli/src/github-cliSchema.ts b/ts/packages/agents/github-cli/src/github-cliSchema.ts index c8e7181d1..742b320fe 100644 --- a/ts/packages/agents/github-cli/src/github-cliSchema.ts +++ b/ts/packages/agents/github-cli/src/github-cliSchema.ts @@ -520,6 +520,8 @@ export type RepoViewAction = { parameters: { repo?: string; + + field?: string; }; }; From d7fa67b3c654342a3d4ab124fdf64763960b1ad6 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Fri, 10 Apr 2026 15:53:43 -0700 Subject: [PATCH 09/34] github-cli: Add hyperlinks to PR, issue, and repo search listings PR list items link to their pull request page, issue list items link to their issue page, and search results link to the repository. Each entry shows a result count header and relevant metadata (state, branch, labels, stars). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../github-cli/src/github-cliActionHandler.ts | 61 ++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/ts/packages/agents/github-cli/src/github-cliActionHandler.ts b/ts/packages/agents/github-cli/src/github-cliActionHandler.ts index b60c233f2..e7dbe536f 100644 --- a/ts/packages/agents/github-cli/src/github-cliActionHandler.ts +++ b/ts/packages/agents/github-cli/src/github-cliActionHandler.ts @@ -151,6 +151,7 @@ function buildArgs( 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": { @@ -197,6 +198,7 @@ function buildArgs( 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": { @@ -367,6 +369,7 @@ function buildArgs( 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": { @@ -429,6 +432,50 @@ function distillRepoField( } } +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; +} + async function executeAction( action: TypeAgentAction, context: ActionContext, @@ -454,6 +501,7 @@ async function executeAction( 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) { @@ -467,11 +515,22 @@ async function executeAction( } } + // 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 object (e.g., repo view) const lines = Object.entries(data) .map(([k, v]) => `- **${k}**: ${formatValue(v)}`) .join("\n"); return createActionResultFromMarkdownDisplay( - `**\`gh ${args.slice(0, args.indexOf("--json")).join(" ")}\`**\n\n${lines}`, + `**${cmdLabel}**\n\n${lines}`, ); } catch { // Fall through to raw output From ad76e6779ebb9bfb7a0f92e2b6f53fd76bf4e9b7 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Fri, 10 Apr 2026 16:09:11 -0700 Subject: [PATCH 10/34] github-cli: Polish output formatting - 'top N contributors' returns exactly N results with a bold header - Issue view shows rich markdown: linked title, author, labels, body - gh status output has bold section headers (Assigned Issues, etc.) - ApiRequest supports limit param via query string for pagination Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../github-cli/src/github-cliActionHandler.ts | 91 ++++++++++++++++++- .../github-cli/src/github-cliSchema.agr | 7 ++ .../agents/github-cli/src/github-cliSchema.ts | 2 + 3 files changed, 98 insertions(+), 2 deletions(-) diff --git a/ts/packages/agents/github-cli/src/github-cliActionHandler.ts b/ts/packages/agents/github-cli/src/github-cliActionHandler.ts index e7dbe536f..25d165826 100644 --- a/ts/packages/agents/github-cli/src/github-cliActionHandler.ts +++ b/ts/packages/agents/github-cli/src/github-cliActionHandler.ts @@ -158,6 +158,7 @@ function buildArgs( 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; } @@ -311,6 +312,10 @@ function buildArgs( 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)); @@ -432,6 +437,71 @@ function distillRepoField( } } +// Format gh status output with bold section headers as markdown +function formatStatusOutput(raw: string): string { + // gh status uses a table format with │ separators and section headers + // Convert to readable markdown with bold headers + const lines = raw.split("\n"); + const result: string[] = []; + const sectionHeaders = new Set([ + "Assigned Issues", + "Assigned Pull Requests", + "Review Requests", + "Mentions", + "Repository Activity", + ]); + + for (const line of lines) { + // Check if line contains a section header + let replaced = false; + for (const header of sectionHeaders) { + if (line.includes(header)) { + // Split on │ to handle multi-column header rows + const parts = line.split("│").map((p) => p.trim()).filter(Boolean); + const boldParts = parts.map((p) => + sectionHeaders.has(p) ? `**${p}**` : p, + ); + result.push(boldParts.join(" │ ")); + replaced = true; + break; + } + } + if (!replaced) { + result.push(line); + } + } + 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; +} + function formatListResults( items: Record[], actionName: string, @@ -525,6 +595,13 @@ async function executeAction( } } + // Single issue view — rich formatted output + if (action.actionName === "issueView" && "number" in data) { + return createActionResultFromMarkdownDisplay( + formatIssueView(data), + ); + } + // Single object (e.g., repo view) const lines = Object.entries(data) .map(([k, v]) => `- **${k}**: ${formatValue(v)}`) @@ -543,11 +620,13 @@ async function executeAction( const arr = JSON.parse(output) as Record[]; if (arr.length > 0 && "login" in arr[0]) { const rows = arr - .slice(0, 20) .map((u, i) => `${i + 1}. **${u.login}** — ${u.contributions} contributions`) .join("\n"); + const header = arr.length === 1 + ? "Top contributor" + : `Top ${arr.length} contributors`; return createActionResultFromMarkdownDisplay( - `**\`gh ${args.join(" ")}\`**\n\n${rows}`, + `**${header}**\n\n${rows}`, ); } } catch { @@ -555,6 +634,14 @@ async function executeAction( } } + // 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\`\`\``, ); diff --git a/ts/packages/agents/github-cli/src/github-cliSchema.agr b/ts/packages/agents/github-cli/src/github-cliSchema.agr index f1e40d535..9fcd8e318 100644 --- a/ts/packages/agents/github-cli/src/github-cliSchema.agr +++ b/ts/packages/agents/github-cli/src/github-cliSchema.agr @@ -161,6 +161,13 @@ parameters: { endpoint } +} + | top $(limit:number) contributors to $(endpoint:wildcard) -> { + actionName: "apiRequest", + parameters: { + endpoint, + limit + } }; = search repositories for $(query:wildcard) -> { diff --git a/ts/packages/agents/github-cli/src/github-cliSchema.ts b/ts/packages/agents/github-cli/src/github-cliSchema.ts index 742b320fe..6a04c1157 100644 --- a/ts/packages/agents/github-cli/src/github-cliSchema.ts +++ b/ts/packages/agents/github-cli/src/github-cliSchema.ts @@ -429,6 +429,8 @@ export type ApiRequestAction = { method?: string; endpoint?: string; + + limit?: number; }; }; From ada082ed554753ddc6dd52b61226a8ea1532701c Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Fri, 10 Apr 2026 16:34:29 -0700 Subject: [PATCH 11/34] Add write actions: issue CRUD, PR draft/close/merge, fork, star, checkout - Add PrCheckoutAction, RepoForkAction, StarRepoAction types - Add draft parameter to PrCreateAction - Add repo parameter to IssueCreateAction, IssueCloseAction, IssueReopenAction - Add repo parameter to ReleaseListAction - Implement repoFork, starRepo/unstarRepo, prCheckout handlers - Add rich prView formatting with JSON output - Add getMutationSuccessMessage for friendly write action feedback - Default empty body on issue/PR create for non-interactive use - Expand grammar with natural write action phrasings - Update demo scripts with PR view, top contributors, star/unstar Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../github-cli/src/github-cliActionHandler.ts | 103 +++++++++++- .../github-cli/src/github-cliSchema.agr | 153 ++++++++++++++++++ .../agents/github-cli/src/github-cliSchema.ts | 42 ++++- ts/packages/cli/demo/github_cli.txt | 8 +- ts/packages/shell/demo/github_cli.txt | 17 +- 5 files changed, 315 insertions(+), 8 deletions(-) diff --git a/ts/packages/agents/github-cli/src/github-cliActionHandler.ts b/ts/packages/agents/github-cli/src/github-cliActionHandler.ts index 25d165826..2cc2d84e5 100644 --- a/ts/packages/agents/github-cli/src/github-cliActionHandler.ts +++ b/ts/packages/agents/github-cli/src/github-cliActionHandler.ts @@ -128,8 +128,9 @@ function buildArgs( // ── 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)); - if (p.body) args.push("--body", String(p.body)); + 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; @@ -137,11 +138,13 @@ function buildArgs( 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": { @@ -175,9 +178,10 @@ function buildArgs( case "prCreate": { const args = ["pr", "create"]; if (p.title) args.push("--title", String(p.title)); - if (p.body) args.push("--body", String(p.body)); + 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": { @@ -206,6 +210,13 @@ function buildArgs( 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; } @@ -237,8 +248,11 @@ function buildArgs( if (p.id) args.push(String(p.id)); return args; } - case "releaseList": - return ["release", "list"]; + case "releaseList": { + const args = ["release", "list"]; + if (p.repo) args.push("--repo", String(p.repo)); + return args; + } // ── Repo ── case "repoCreate": { @@ -269,6 +283,23 @@ function buildArgs( 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": @@ -502,6 +533,31 @@ function formatIssueView(data: Record): string { 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, @@ -546,6 +602,33 @@ function formatListResults( 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, @@ -562,6 +645,11 @@ async function executeAction( 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.`, ); @@ -602,6 +690,13 @@ async function executeAction( ); } + // 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)}`) diff --git a/ts/packages/agents/github-cli/src/github-cliSchema.agr b/ts/packages/agents/github-cli/src/github-cliSchema.agr index 9fcd8e318..75f95b0f6 100644 --- a/ts/packages/agents/github-cli/src/github-cliSchema.agr +++ b/ts/packages/agents/github-cli/src/github-cliSchema.agr @@ -41,6 +41,30 @@ parameters: { title } +} + | open new issue $(title:wildcard) -> { + actionName: "issueCreate", + parameters: { + title + } +} + | file an issue about $(title:wildcard) -> { + actionName: "issueCreate", + parameters: { + title + } +} + | report a bug about $(title:wildcard) -> { + actionName: "issueCreate", + parameters: { + title + } +} + | create issue $(title:wildcard) -> { + actionName: "issueCreate", + parameters: { + title + } }; = close issue number $(number:number) -> { @@ -48,6 +72,12 @@ parameters: { number } +} + | close issue $(number:number) -> { + actionName: "issueClose", + parameters: { + number + } }; = reopen issue number $(number:number) -> { @@ -55,6 +85,12 @@ parameters: { number } +} + | reopen issue $(number:number) -> { + actionName: "issueReopen", + parameters: { + number + } }; = create a pull request titled $(title:wildcard) -> { @@ -62,6 +98,40 @@ parameters: { title } +} + | open a PR titled $(title:wildcard) -> { + actionName: "prCreate", + parameters: { + title + } +} + | open a draft PR titled $(title:wildcard) -> { + actionName: "prCreate", + parameters: { + title, + draft: true + } +} + | create a draft pull request titled $(title:wildcard) -> { + actionName: "prCreate", + parameters: { + title, + draft: true + } +} + | 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 pull request number $(number:number) -> { @@ -69,6 +139,12 @@ parameters: { number } +} + | close PR $(number:number) -> { + actionName: "prClose", + parameters: { + number + } }; = merge pull request number $(number:number) -> { @@ -76,6 +152,12 @@ parameters: { number } +} + | merge PR $(number:number) -> { + actionName: "prMerge", + parameters: { + number + } }; = create a new repository named $(name:wildcard) -> { @@ -435,6 +517,72 @@ parameters: {} }; + = checkout PR $(number:number) -> { + actionName: "prCheckout", + parameters: { + number + } +} + | checkout pull request $(number:number) -> { + actionName: "prCheckout", + parameters: { + number + } +}; + + = fork $(repo:wildcard) -> { + actionName: "repoFork", + parameters: { + repo + } +} + | fork repository $(repo:wildcard) -> { + actionName: "repoFork", + parameters: { + repo + } +}; + + = star $(repo:wildcard) -> { + actionName: "starRepo", + parameters: { + repo + } +} + | star repository $(repo:wildcard) -> { + actionName: "starRepo", + parameters: { + repo + } +} + | unstar $(repo:wildcard) -> { + actionName: "starRepo", + parameters: { + repo, + unstar: true + } +}; + + = list my gists -> { + actionName: "gistList", + parameters: {} +} + | show my gists -> { + actionName: "gistList", + parameters: {} +}; + + = list releases in $(repo:wildcard) -> { + actionName: "releaseList", + parameters: { + repo + } +} + | show releases -> { + actionName: "releaseList", + parameters: {} +}; + import { GithubCliActions } from "./github-cliSchema.ts"; : GithubCliActions = @@ -450,13 +598,18 @@ import { GithubCliActions } from "./github-cliSchema.ts"; | | | + | | | | + | + | | | | | | | + | + | | ; \ No newline at end of file diff --git a/ts/packages/agents/github-cli/src/github-cliSchema.ts b/ts/packages/agents/github-cli/src/github-cliSchema.ts index 6a04c1157..ff8b98fc5 100644 --- a/ts/packages/agents/github-cli/src/github-cliSchema.ts +++ b/ts/packages/agents/github-cli/src/github-cliSchema.ts @@ -26,6 +26,7 @@ export type GithubCliActions = | PrMergeAction | PrListAction | PrViewAction + | PrCheckoutAction | ProjectCreateAction | ProjectDeleteAction | ProjectListAction @@ -36,6 +37,8 @@ export type GithubCliActions = | RepoCloneAction | RepoDeleteAction | RepoViewAction + | RepoForkAction + | StarRepoAction | CacheListAction | CacheDeleteAction | RunViewAction @@ -171,6 +174,8 @@ export type GistListAction = { export type IssueCreateAction = { actionName: "issueCreate"; parameters: { + // owner/repo + repo?: string; title?: string; @@ -248,6 +253,8 @@ export type PrCreateAction = { base?: string; head?: string; + + draft?: boolean; }; }; @@ -295,6 +302,16 @@ export type PrViewAction = { }; }; +export type PrCheckoutAction = { + actionName: "prCheckout"; + parameters: { + + number?: number; + + branch?: string; + }; +}; + export type ProjectCreateAction = { actionName: "projectCreate"; parameters: { @@ -340,7 +357,10 @@ export type ReleaseDeleteAction = { export type ReleaseListAction = { actionName: "releaseList"; - parameters: {}; + parameters: { + + repo?: string; + }; }; export type RepoCreateAction = { @@ -527,6 +547,26 @@ export type RepoViewAction = { }; }; +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: { diff --git a/ts/packages/cli/demo/github_cli.txt b/ts/packages/cli/demo/github_cli.txt index 8f4deb6c4..5510d1ed5 100644 --- a/ts/packages/cli/demo/github_cli.txt +++ b/ts/packages/cli/demo/github_cli.txt @@ -12,17 +12,23 @@ show my GitHub status how many stars does microsoft/TypeAgent have # Who are the top contributors? -list contributors to microsoft/TypeAgent +show top 10 contributors to microsoft/TypeAgent # What PRs are open? list open PRs in microsoft/TypeAgent +# Drill into a PR +show PR 2183 in microsoft/TypeAgent + # What issues need attention? show open issues in microsoft/TypeAgent # Drill into a specific issue show issue 2170 in microsoft/TypeAgent +# Star a repo +star microsoft/TypeAgent + # Find repos search repositories for TypeScript agent framework diff --git a/ts/packages/shell/demo/github_cli.txt b/ts/packages/shell/demo/github_cli.txt index d1bb31a28..a55f49486 100644 --- a/ts/packages/shell/demo/github_cli.txt +++ b/ts/packages/shell/demo/github_cli.txt @@ -25,7 +25,7 @@ how many stars does microsoft/TypeAgent have show open issues in microsoft/TypeAgent # Who built this thing? -list contributors to microsoft/TypeAgent +show top 10 contributors to microsoft/TypeAgent # ------------------------------------- # Pull request workflows @@ -34,6 +34,9 @@ list contributors to microsoft/TypeAgent # See what's in flight list open PRs in microsoft/TypeAgent +# Drill into a specific PR +show PR 2183 in microsoft/TypeAgent + # Check PRs in another repo list open pull requests in microsoft/garnet @@ -47,6 +50,16 @@ show open issues in microsoft/garnet # Drill into a specific issue show issue 2170 in microsoft/TypeAgent +# ------------------------------------- +# Write actions +# ------------------------------------- + +# Star a repo you like +star microsoft/TypeAgent + +# Unstar it +unstar microsoft/TypeAgent + # ------------------------------------- # Repository discovery # ------------------------------------- @@ -54,7 +67,7 @@ show issue 2170 in microsoft/TypeAgent # Find interesting projects search repositories for TypeScript agent framework -# Check out an org +# Full repo overview show repository microsoft/TypeAgent # ------------------------------------- From 11fd1e188d26926c4403439c9bf712669ebae8b8 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Fri, 10 Apr 2026 16:57:54 -0700 Subject: [PATCH 12/34] Polish output formatting and add new features MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix gh status: parse │-table into clean markdown with bold headers, links, emoji - Fix contributors: add hyperlinks to GitHub profile pages - Add 'latest N PRs/issues' grammar rules with limit parameter - Add DependabotAlertsAction with severity/state filters and color-coded output - Handle empty dependabot results with friendly message - Update demo scripts with new features (microsoft/TypeAgent only) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../github-cli/src/github-cliActionHandler.ts | 133 +++++++++++++++--- .../github-cli/src/github-cliSchema.agr | 90 ++++++++++++ .../agents/github-cli/src/github-cliSchema.ts | 15 +- ts/packages/cli/demo/github_cli.txt | 14 +- ts/packages/shell/demo/github_cli.txt | 22 ++- 5 files changed, 242 insertions(+), 32 deletions(-) diff --git a/ts/packages/agents/github-cli/src/github-cliActionHandler.ts b/ts/packages/agents/github-cli/src/github-cliActionHandler.ts index 2cc2d84e5..433d30752 100644 --- a/ts/packages/agents/github-cli/src/github-cliActionHandler.ts +++ b/ts/packages/agents/github-cli/src/github-cliActionHandler.ts @@ -427,6 +427,18 @@ function buildArgs( 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; } @@ -468,13 +480,11 @@ function distillRepoField( } } -// Format gh status output with bold section headers as markdown +// Format gh status output — parse the │-table into clean markdown sections function formatStatusOutput(raw: string): string { - // gh status uses a table format with │ separators and section headers - // Convert to readable markdown with bold headers const lines = raw.split("\n"); - const result: string[] = []; - const sectionHeaders = new Set([ + + const knownHeaders = new Set([ "Assigned Issues", "Assigned Pull Requests", "Review Requests", @@ -482,24 +492,74 @@ function formatStatusOutput(raw: string): string { "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) { - // Check if line contains a section header - let replaced = false; - for (const header of sectionHeaders) { - if (line.includes(header)) { - // Split on │ to handle multi-column header rows - const parts = line.split("│").map((p) => p.trim()).filter(Boolean); - const boldParts = parts.map((p) => - sectionHeaders.has(p) ? `**${p}**` : p, - ); - result.push(boldParts.join(" │ ")); - replaced = true; - break; + 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); } } - if (!replaced) { - result.push(line); + } + + // 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"); } @@ -709,13 +769,44 @@ async function executeAction( } } - // Format JSON arrays (e.g., API contributor responses) + // 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; + const sev = String(adv.severity ?? "unknown").toUpperCase(); + const pkg = a.dependency + ? (a.dependency as Record).package + ? ((a.dependency as Record).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}** — ${u.contributions} contributions`) + .map((u, i) => `${i + 1}. [**${u.login}**](https://github.com/${u.login}) — ${u.contributions} contributions`) .join("\n"); const header = arr.length === 1 ? "Top contributor" diff --git a/ts/packages/agents/github-cli/src/github-cliSchema.agr b/ts/packages/agents/github-cli/src/github-cliSchema.agr index 75f95b0f6..5397a34ba 100644 --- a/ts/packages/agents/github-cli/src/github-cliSchema.agr +++ b/ts/packages/agents/github-cli/src/github-cliSchema.agr @@ -288,6 +288,27 @@ repo, state: "closed" } +} + | get latest $(limit:number) issues in $(repo:wildcard) -> { + actionName: "issueList", + parameters: { + repo, + limit + } +} + | show latest $(limit:number) issues in $(repo:wildcard) -> { + actionName: "issueList", + parameters: { + repo, + limit + } +} + | last $(limit:number) issues in $(repo:wildcard) -> { + actionName: "issueList", + parameters: { + repo, + limit + } }; = show issue $(number:number) -> { @@ -350,6 +371,34 @@ parameters: { repo } +} + | get latest $(limit:number) PRs in $(repo:wildcard) -> { + actionName: "prList", + parameters: { + repo, + limit + } +} + | show latest $(limit:number) PRs in $(repo:wildcard) -> { + actionName: "prList", + parameters: { + repo, + limit + } +} + | last $(limit:number) PRs in $(repo:wildcard) -> { + actionName: "prList", + parameters: { + repo, + limit + } +} + | get latest $(limit:number) pull requests in $(repo:wildcard) -> { + actionName: "prList", + parameters: { + repo, + limit + } }; = show pull request $(number:number) -> { @@ -583,6 +632,46 @@ parameters: {} }; + = 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" + } +} + | get dependabot alerts for $(repo:wildcard) -> { + actionName: "dependabotAlerts", + parameters: { + repo + } +} + | list security vulnerabilities in $(repo:wildcard) -> { + actionName: "dependabotAlerts", + parameters: { + repo + } +} + | show all high severity dependabot issues in $(repo:wildcard) -> { + actionName: "dependabotAlerts", + parameters: { + repo, + severity: "high" + } +}; + import { GithubCliActions } from "./github-cliSchema.ts"; : GithubCliActions = @@ -612,4 +701,5 @@ import { GithubCliActions } from "./github-cliSchema.ts"; | | | + | | ; \ No newline at end of file diff --git a/ts/packages/agents/github-cli/src/github-cliSchema.ts b/ts/packages/agents/github-cli/src/github-cliSchema.ts index ff8b98fc5..1258632e1 100644 --- a/ts/packages/agents/github-cli/src/github-cliSchema.ts +++ b/ts/packages/agents/github-cli/src/github-cliSchema.ts @@ -60,7 +60,8 @@ export type GithubCliActions = | SecretCreateAction | SshKeyAddAction | StatusPrintAction - | VariableCreateAction; + | VariableCreateAction + | DependabotAlertsAction; export type AuthLoginAction = { actionName: "authLogin"; @@ -606,4 +607,16 @@ export type VariableCreateAction = { 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; + }; }; \ No newline at end of file diff --git a/ts/packages/cli/demo/github_cli.txt b/ts/packages/cli/demo/github_cli.txt index 5510d1ed5..d19c1a9f8 100644 --- a/ts/packages/cli/demo/github_cli.txt +++ b/ts/packages/cli/demo/github_cli.txt @@ -17,20 +17,26 @@ 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 2183 in microsoft/TypeAgent +show PR 2180 in microsoft/TypeAgent # What issues need attention? -show open issues in microsoft/TypeAgent +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 -# Find repos -search repositories for TypeScript agent framework +# Full repo overview +show repository microsoft/TypeAgent # Am I authenticated? check my GitHub authentication diff --git a/ts/packages/shell/demo/github_cli.txt b/ts/packages/shell/demo/github_cli.txt index a55f49486..73e2407ef 100644 --- a/ts/packages/shell/demo/github_cli.txt +++ b/ts/packages/shell/demo/github_cli.txt @@ -34,22 +34,32 @@ show top 10 contributors to microsoft/TypeAgent # See what's in flight list open PRs in microsoft/TypeAgent -# Drill into a specific PR -show PR 2183 in microsoft/TypeAgent +# Just the most recent ones +get latest 5 PRs in microsoft/TypeAgent -# Check PRs in another repo -list open pull requests in microsoft/garnet +# Drill into a specific PR +show PR 2180 in microsoft/TypeAgent # ------------------------------------- # Issue management # ------------------------------------- -# Browse issues across repos -show open issues in microsoft/garnet +# 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 # ------------------------------------- From 5ec07e0a1c8cd9ce569962a310c241f25d099172 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Fri, 10 Apr 2026 17:05:08 -0700 Subject: [PATCH 13/34] Add create/close issue pair to demo scripts Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ts/packages/cli/demo/github_cli.txt | 6 ++++++ ts/packages/shell/demo/github_cli.txt | 22 ++++++++++++++-------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/ts/packages/cli/demo/github_cli.txt b/ts/packages/cli/demo/github_cli.txt index d19c1a9f8..b14b17c3d 100644 --- a/ts/packages/cli/demo/github_cli.txt +++ b/ts/packages/cli/demo/github_cli.txt @@ -35,6 +35,12 @@ 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 diff --git a/ts/packages/shell/demo/github_cli.txt b/ts/packages/shell/demo/github_cli.txt index 73e2407ef..0316cac9c 100644 --- a/ts/packages/shell/demo/github_cli.txt +++ b/ts/packages/shell/demo/github_cli.txt @@ -7,6 +7,13 @@ # Natural language → real gh CLI execution # ============================================= +# ------------------------------------- +# Authentication & config +# ------------------------------------- + +# Verify we're logged in +check my GitHub authentication + # ------------------------------------- # Start with your personal GitHub status # ------------------------------------- @@ -70,6 +77,12 @@ 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 # ------------------------------------- @@ -78,11 +91,4 @@ unstar microsoft/TypeAgent search repositories for TypeScript agent framework # Full repo overview -show repository microsoft/TypeAgent - -# ------------------------------------- -# Authentication & config -# ------------------------------------- - -# Verify we're logged in -check my GitHub authentication +show repository microsoft/TypeAgent \ No newline at end of file From 4f5b747b48189711734481c6458d429c007e492f Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Mon, 13 Apr 2026 12:16:07 -0700 Subject: [PATCH 14/34] Simplify grammar: 674 -> 292 lines, rely on LLM fallback for variants Reduce to 1-3 phrasings per action, matching the style of other agents (player, calendar, email). The dispatcher's LLM translation fallback handles natural language variations that aren't covered by grammar rules. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../github-cli/src/github-cliSchema.agr | 552 +++--------------- 1 file changed, 85 insertions(+), 467 deletions(-) diff --git a/ts/packages/agents/github-cli/src/github-cliSchema.agr b/ts/packages/agents/github-cli/src/github-cliSchema.agr index 5397a34ba..0b2cba352 100644 --- a/ts/packages/agents/github-cli/src/github-cliSchema.agr +++ b/ts/packages/agents/github-cli/src/github-cliSchema.agr @@ -4,45 +4,19 @@ = log me into GitHub -> { actionName: "authLogin", parameters: {} -} - | authenticate my GitHub account with hostname $(hostname:word) -> { - actionName: "authLogin", - parameters: { - hostname - } }; = log me out of GitHub -> { actionName: "authLogout", parameters: {} -} - | sign me out of GitHub -> { - actionName: "authLogout", - parameters: {} }; - = show my GitHub auth status -> { - actionName: "authStatus", - parameters: {} -} - | check my GitHub authentication -> { + = check my GitHub authentication -> { actionName: "authStatus", parameters: {} }; - = create an issue titled $(title:wildcard) -> { - actionName: "issueCreate", - parameters: { - title - } -} - | open a new issue called $(title:wildcard) -> { - actionName: "issueCreate", - parameters: { - title - } -} - | open new issue $(title:wildcard) -> { + = create issue $(title:wildcard) -> { actionName: "issueCreate", parameters: { title @@ -53,70 +27,61 @@ parameters: { title } -} - | report a bug about $(title:wildcard) -> { - actionName: "issueCreate", - parameters: { - title - } -} - | create issue $(title:wildcard) -> { - actionName: "issueCreate", - parameters: { - title - } }; - = close issue number $(number:number) -> { - actionName: "issueClose", - parameters: { - number - } -} - | close issue $(number:number) -> { + = close issue $(number:number) -> { actionName: "issueClose", parameters: { number } }; - = reopen issue number $(number:number) -> { - actionName: "issueReopen", - parameters: { - number - } -} - | reopen issue $(number:number) -> { + = reopen issue $(number:number) -> { actionName: "issueReopen", parameters: { number } }; - = create a pull request titled $(title:wildcard) -> { - actionName: "prCreate", + = show open issues in $(repo:wildcard) -> { + actionName: "issueList", parameters: { - title + repo, + state: "open" } } - | open a PR titled $(title:wildcard) -> { - actionName: "prCreate", + | list issues in $(repo:wildcard) -> { + actionName: "issueList", parameters: { - title + repo } } - | open a draft PR titled $(title:wildcard) -> { - actionName: "prCreate", + | get latest $(limit:number) issues in $(repo:wildcard) -> { + actionName: "issueList", parameters: { - title, - draft: true + repo, + limit + } +}; + + = show issue $(number:number) -> { + actionName: "issueView", + parameters: { + number } } - | create a draft pull request titled $(title:wildcard) -> { + | show issue $(number:number) in $(repo:wildcard) -> { + actionName: "issueView", + parameters: { + number, + repo + } +}; + + = create a pull request titled $(title:wildcard) -> { actionName: "prCreate", parameters: { - title, - draft: true + title } } | open a draft PR for branch $(head:word) -> { @@ -134,27 +99,57 @@ } }; - = close pull request number $(number:number) -> { + = close PR $(number:number) -> { actionName: "prClose", parameters: { number } -} - | close PR $(number:number) -> { - actionName: "prClose", +}; + + = merge PR $(number:number) -> { + actionName: "prMerge", parameters: { number } }; - = merge pull request number $(number:number) -> { - actionName: "prMerge", + = 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 } } - | merge PR $(number:number) -> { - actionName: "prMerge", + | show PR $(number:number) in $(repo:wildcard) -> { + actionName: "prView", + parameters: { + number, + repo + } +}; + + = checkout PR $(number:number) -> { + actionName: "prCheckout", parameters: { number } @@ -179,12 +174,6 @@ parameters: { repo } -} - | view repo $(repo:wildcard) -> { - actionName: "repoView", - parameters: { - repo - } } | how many stars does $(repo:wildcard) have -> { actionName: "repoView", @@ -192,53 +181,30 @@ repo, field: "stars" } -} - | how many forks does $(repo:wildcard) have -> { - actionName: "repoView", - parameters: { - repo, - field: "forks" - } -} - | what language is $(repo:wildcard) written in -> { - actionName: "repoView", - parameters: { - repo, - field: "language" - } -} - | tell me about repository $(repo:wildcard) -> { - actionName: "repoView", +}; + + = fork $(repo:wildcard) -> { + actionName: "repoFork", parameters: { repo } -} - | info about $(repo:wildcard) -> { - actionName: "repoView", +}; + + = star $(repo:wildcard) -> { + actionName: "starRepo", parameters: { repo } } - | details for repository $(repo:wildcard) -> { - actionName: "repoView", + | unstar $(repo:wildcard) -> { + actionName: "starRepo", parameters: { - repo + repo, + unstar: true } }; - = call the GitHub API endpoint $(endpoint:wildcard) -> { - actionName: "apiRequest", - parameters: { - endpoint - } -} - | list contributors to $(endpoint:wildcard) -> { - actionName: "apiRequest", - parameters: { - endpoint - } -} - | top contributors to $(endpoint:wildcard) -> { + = list contributors to $(endpoint:wildcard) -> { actionName: "apiRequest", parameters: { endpoint @@ -259,211 +225,9 @@ } }; - = list issues -> { - actionName: "issueList", - parameters: {} -} - | list issues in $(repo:wildcard) -> { - actionName: "issueList", - parameters: { - repo - } -} - | show open issues -> { - actionName: "issueList", - parameters: { - state: "open" - } -} - | show open issues in $(repo:wildcard) -> { - actionName: "issueList", - parameters: { - repo, - state: "open" - } -} - | show closed issues in $(repo:wildcard) -> { - actionName: "issueList", - parameters: { - repo, - state: "closed" - } -} - | get latest $(limit:number) issues in $(repo:wildcard) -> { - actionName: "issueList", - parameters: { - repo, - limit - } -} - | show latest $(limit:number) issues in $(repo:wildcard) -> { - actionName: "issueList", - parameters: { - repo, - limit - } -} - | last $(limit:number) issues in $(repo:wildcard) -> { - actionName: "issueList", - parameters: { - repo, - limit - } -}; - - = show issue $(number:number) -> { - actionName: "issueView", - parameters: { - number - } -} - | view issue $(number:number) in $(repo:wildcard) -> { - actionName: "issueView", - parameters: { - number, - repo - } -}; - - = list pull requests -> { - actionName: "prList", - parameters: {} -} - | list pull requests in $(repo:wildcard) -> { - actionName: "prList", - parameters: { - repo - } -} - | show open pull requests -> { - actionName: "prList", - parameters: { - state: "open" - } -} - | show open pull requests in $(repo:wildcard) -> { - actionName: "prList", - parameters: { - repo, - state: "open" - } -} - | list open PRs in $(repo:wildcard) -> { - actionName: "prList", - parameters: { - repo, - state: "open" - } -} - | how many open PRs are in $(repo:wildcard) -> { - actionName: "prList", - parameters: { - repo, - state: "open" - } -} - | show PRs -> { - actionName: "prList", - parameters: {} -} - | list PRs in $(repo:wildcard) -> { - actionName: "prList", - parameters: { - repo - } -} - | get latest $(limit:number) PRs in $(repo:wildcard) -> { - actionName: "prList", - parameters: { - repo, - limit - } -} - | show latest $(limit:number) PRs in $(repo:wildcard) -> { - actionName: "prList", - parameters: { - repo, - limit - } -} - | last $(limit:number) PRs in $(repo:wildcard) -> { - actionName: "prList", - parameters: { - repo, - limit - } -} - | get latest $(limit:number) pull requests in $(repo:wildcard) -> { - actionName: "prList", - parameters: { - repo, - limit - } -}; - - = show pull request $(number:number) -> { - actionName: "prView", - parameters: { - number - } -} - | view PR $(number:number) -> { - actionName: "prView", - parameters: { - number - } -} - | view pull request $(number:number) in $(repo:wildcard) -> { - actionName: "prView", - parameters: { - number, - repo - } -}; - = show my GitHub status -> { actionName: "statusPrint", parameters: {} -} - | print my GitHub notifications -> { - actionName: "statusPrint", - parameters: {} -} - | status of issues and pull requests -> { - actionName: "statusPrint", - parameters: {} -} - | current status of issues and pull requests -> { - actionName: "statusPrint", - parameters: {} -} - | status of my notifications -> { - actionName: "statusPrint", - parameters: {} -} - | status of my notifications and PRs -> { - actionName: "statusPrint", - parameters: {} -} - | summary of issues and pull requests -> { - actionName: "statusPrint", - parameters: {} -} - | summary of relevant issues and pull requests -> { - actionName: "statusPrint", - parameters: {} -} - | updates on my repositories -> { - actionName: "statusPrint", - parameters: {} -} - | latest updates on my repositories -> { - actionName: "statusPrint", - parameters: {} -} - | information on recent issues and notifications -> { - actionName: "statusPrint", - parameters: {} }; = view workflow run $(id:word) -> { @@ -471,54 +235,6 @@ parameters: { id } -} - | details for workflow run $(id:word) -> { - actionName: "runView", - parameters: { - id - } -} - | details for the workflow run with ID $(id:word) -> { - actionName: "runView", - parameters: { - id - } -} - | details of the workflow run with ID $(id:word) -> { - actionName: "runView", - parameters: { - id - } -} - | workflow run with ID $(id:word) -> { - actionName: "runView", - parameters: { - id - } -} - | workflow run details for ID $(id:word) -> { - actionName: "runView", - parameters: { - id - } -} - | workflow run details for $(id:word) -> { - actionName: "runView", - parameters: { - id - } -} - | workflow run identified by $(id:word) -> { - actionName: "runView", - parameters: { - id - } -} - | details for the workflow run with the ID $(id:word) -> { - actionName: "runView", - parameters: { - id - } }; = show me workflow $(id:word) -> { @@ -526,18 +242,6 @@ parameters: { id } -} - | view the workflow definition for $(id:word) -> { - actionName: "workflowView", - parameters: { - id - } -} - | workflow details for $(id:word) -> { - actionName: "workflowView", - parameters: { - id - } }; = set the GitHub CLI configuration for $(name:word) to $(value:word) -> { @@ -546,79 +250,16 @@ name, value } -} - | update the gh config with $(name:word) and $(value:word) -> { - actionName: "configSet", - parameters: { - name, - value - } }; - = add this SSH key $(key:wildcard) -> { - actionName: "sshKeyAdd", - parameters: { - key - } -} - | add an SSH key for me -> { + = add an SSH key for me -> { actionName: "sshKeyAdd", parameters: {} }; - = checkout PR $(number:number) -> { - actionName: "prCheckout", - parameters: { - number - } -} - | checkout pull request $(number:number) -> { - actionName: "prCheckout", - parameters: { - number - } -}; - - = fork $(repo:wildcard) -> { - actionName: "repoFork", - parameters: { - repo - } -} - | fork repository $(repo:wildcard) -> { - actionName: "repoFork", - parameters: { - repo - } -}; - - = star $(repo:wildcard) -> { - actionName: "starRepo", - parameters: { - repo - } -} - | star repository $(repo:wildcard) -> { - actionName: "starRepo", - parameters: { - repo - } -} - | unstar $(repo:wildcard) -> { - actionName: "starRepo", - parameters: { - repo, - unstar: true - } -}; - = list my gists -> { actionName: "gistList", parameters: {} -} - | show my gists -> { - actionName: "gistList", - parameters: {} }; = list releases in $(repo:wildcard) -> { @@ -626,10 +267,6 @@ parameters: { repo } -} - | show releases -> { - actionName: "releaseList", - parameters: {} }; = show dependabot alerts in $(repo:wildcard) -> { @@ -651,25 +288,6 @@ repo, severity: "critical" } -} - | get dependabot alerts for $(repo:wildcard) -> { - actionName: "dependabotAlerts", - parameters: { - repo - } -} - | list security vulnerabilities in $(repo:wildcard) -> { - actionName: "dependabotAlerts", - parameters: { - repo - } -} - | show all high severity dependabot issues in $(repo:wildcard) -> { - actionName: "dependabotAlerts", - parameters: { - repo, - severity: "high" - } }; import { GithubCliActions } from "./github-cliSchema.ts"; @@ -702,4 +320,4 @@ import { GithubCliActions } from "./github-cliSchema.ts"; | | | - | ; \ No newline at end of file + | ; From 7a9202d1d7f359b104e7368e5b499f221d6bf683 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Mon, 13 Apr 2026 12:38:43 -0700 Subject: [PATCH 15/34] Onboarding: auto-gen CLI handlers, better defaults, fix packaging model - Scaffolder generates working buildArgs()/runCli() handler for CLI agents using path and parameters from api-surface.json discovery data - Changed manifest defaults: defaultEnabled=true, configurable emojiChar - Fixed getPackagingModel() to use createChatModel() (avoids json_object constraint on non-JSON prompts) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ts/packages/agents/onboarding/src/lib/llm.ts | 4 +- .../src/scaffolder/scaffolderHandler.ts | 168 +++++++++++++++--- .../src/scaffolder/scaffolderSchema.ts | 2 + 3 files changed, 146 insertions(+), 28 deletions(-) diff --git a/ts/packages/agents/onboarding/src/lib/llm.ts b/ts/packages/agents/onboarding/src/lib/llm.ts index 53bbffa75..2b6bfaa62 100644 --- a/ts/packages/agents/onboarding/src/lib/llm.ts +++ b/ts/packages/agents/onboarding/src/lib/llm.ts @@ -36,5 +36,7 @@ export function getTestingModel(): ChatModel { } export function getPackagingModel(): ChatModel { - return openai.createChatModelDefault("onboarding:packaging"); + return openai.createChatModel(undefined, undefined, undefined, [ + "onboarding:packaging", + ]); } diff --git a/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts b/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts index 96bb718f7..2f03b7ff9 100644 --- a/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts +++ b/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -// Phase 5 — Scaffolder handler. +// Phase 5 ΓÇö Scaffolder handler. // Stamps out a complete TypeAgent agent package from approved artifacts. // Templates cover manifest, handler, schema, grammar, package.json, tsconfigs. @@ -19,6 +19,10 @@ import { readArtifact, readArtifactJson, } from "../lib/workspace.js"; +import type { + ApiSurface, + DiscoveredAction, +} from "../discovery/discoveryHandler.js"; import fs from "fs/promises"; import path from "path"; import { fileURLToPath } from "url"; @@ -51,6 +55,7 @@ export async function executeScaffolderAction( action.parameters.integrationName, action.parameters.pattern, action.parameters.outputDir, + action.parameters.emojiChar, ); case "scaffoldPlugin": return handleScaffoldPlugin( @@ -69,6 +74,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 +100,11 @@ 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), + buildHandler(integrationName, pascalName, pattern, apiSurface), ); files.push(`src/${integrationName}ActionHandler.ts`); @@ -250,7 +262,7 @@ async function handleScaffoldAgent( `**Files created:**\n` + files.map((f) => `- \`${f}\``).join("\n") + subSchemaNote + - `\n\n**Next step:** Phase 6 — use \`generateTests\` and \`runTests\` to validate.`, + `\n\n**Next step:** Phase 6 ΓÇö use \`generateTests\` and \`runTests\` to validate.`, ); } @@ -292,7 +304,7 @@ function buildSubSchemaTs( const unionType = `export type ${groupPascal}Actions =\n | ${actionTypeNames.join("\n | ")};`; - return `// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n// Sub-schema: ${group.name} — ${group.description}\n// Auto-generated by the onboarding scaffolder.\n\n${actionBlocks.join("\n\n")}\n\n${unionType}\n`; + return `// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n// Sub-schema: ${group.name} ΓÇö ${group.description}\n// Auto-generated by the onboarding scaffolder.\n\n${actionBlocks.join("\n\n")}\n\n${unionType}\n`; } // Build a sub-schema grammar file that includes only the rules relevant to @@ -342,7 +354,7 @@ function buildSubSchemaAgr( `from "./actions/${group.name}ActionsSchema.ts"`, ); - return `// Sub-schema grammar: ${group.name} — ${group.description}\n// Auto-generated by the onboarding scaffolder.\n\n${content}\n`; + return `// Sub-schema grammar: ${group.name} ΓÇö ${group.description}\n// Auto-generated by the onboarding scaffolder.\n\n${content}\n`; } async function handleScaffoldPlugin( @@ -387,17 +399,17 @@ async function handleListTemplates(): Promise { `## Available scaffolding templates`, ``, `### Agent templates`, - `- **default** — TypeAgent agent package (manifest, handler, schema, grammar)`, + `- **default** ΓÇö TypeAgent agent package (manifest, handler, schema, grammar)`, ``, `### Plugin templates (use with \`scaffoldPlugin\`)`, ...Object.entries(PLUGIN_TEMPLATES).map( - ([key, t]) => `- **${key}** — ${t.description}`, + ([key, t]) => `- **${key}** ΓÇö ${t.description}`, ), ]; return createActionResultFromMarkdownDisplay(lines.join("\n")); } -// ─── Template helpers ──────────────────────────────────────────────────────── +// ΓöÇΓöÇΓöÇ Template helpers ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ function toPascalCase(str: string): string { return str @@ -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`, @@ -459,7 +472,17 @@ function buildHandler( name: string, pascalName: string, pattern: AgentPattern = "schema-grammar", + apiSurface?: ApiSurface, ): string { + // If discovery data contains CLI actions, generate a CLI handler + const cliActions = apiSurface?.actions?.filter( + (a) => a.source?.startsWith("cli:"), + ); + if (cliActions && cliActions.length > 0) { + const cliCommand = cliActions[0].source!.split(":")[1]; + return buildCliHandler(name, pascalName, cliCommand, cliActions); + } + switch (pattern) { case "external-api": return buildExternalApiHandler(name, pascalName); @@ -512,7 +535,7 @@ async function executeAction( ): Promise { // TODO: implement action handlers return createActionResultFromTextDisplay( - \`Executing \${action.actionName} — not yet implemented.\`, + \`Executing \${action.actionName} ΓÇö not yet implemented.\`, ); } `; @@ -799,7 +822,7 @@ async function writeFile(filePath: string, content: string): Promise { await fs.writeFile(filePath, content, "utf-8"); } -// ─── Pattern listing ───────────────────────────────────────────────────────── +// ΓöÇΓöÇΓöÇ Pattern listing ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ async function handleListPatterns(): Promise { const lines = [ @@ -810,7 +833,7 @@ async function handleListPatterns(): Promise { `| Pattern | When to use | Examples |`, `|---------|-------------|----------|`, `| \`schema-grammar\` | Standard: bounded set of typed actions (default) | weather, photo, list |`, - `| \`external-api\` | REST/OAuth cloud API (MS Graph, Spotify, GitHub…) | calendar, email, player |`, + `| \`external-api\` | REST/OAuth cloud API (MS Graph, Spotify, GitHubΓǪ) | calendar, email, player |`, `| \`llm-streaming\` | Agent calls an LLM and streams partial results | chat, greeting |`, `| \`sub-agent-orchestrator\` | API surface too large for one schema; split into groups | desktop, code, browser |`, `| \`websocket-bridge\` | Automate an app via a host-side plugin over WebSocket | browser, code |`, @@ -822,13 +845,13 @@ async function handleListPatterns(): Promise { return createActionResultFromMarkdownDisplay(lines.join("\n")); } -// ─── Pattern-specific handler builders ─────────────────────────────────────── +// ΓöÇΓöÇΓöÇ Pattern-specific handler builders ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ function buildExternalApiHandler(name: string, pascalName: string): string { return `// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -// Pattern: external-api — REST/OAuth cloud API bridge. +// Pattern: external-api ΓÇö REST/OAuth cloud API bridge. // Implement ${pascalName}Client with your API's authentication and endpoints. import { @@ -889,7 +912,7 @@ async function executeAction( const { client } = context.agentContext; // TODO: map each action to a client.callApi() call. return createActionResultFromTextDisplay( - \`Executing \${action.actionName} — not yet implemented.\`, + \`Executing \${action.actionName} ΓÇö not yet implemented.\`, ); } `; @@ -899,7 +922,7 @@ function buildLlmStreamingHandler(name: string, pascalName: string): string { return `// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -// Pattern: llm-streaming — LLM-injected agent with streaming responses. +// Pattern: llm-streaming ΓÇö LLM-injected agent with streaming responses. // Runs inside the dispatcher process (injected: true in manifest). // Uses aiclient + typechat; streams partial results via streamingActionContext. @@ -951,7 +974,7 @@ function buildSubAgentOrchestratorHandler( return `// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -// Pattern: sub-agent-orchestrator — root agent routing to N typed sub-schemas. +// Pattern: sub-agent-orchestrator ΓÇö root agent routing to N typed sub-schemas. // Add one executeXxxAction() per sub-schema group defined in subActionManifests. // The root executeAction routes by action name (each group owns disjoint names). @@ -983,7 +1006,7 @@ async function executeAction( // if (isGroupOneAction(action)) return executeGroupOneAction(action, context); // if (isGroupTwoAction(action)) return executeGroupTwoAction(action, context); return createActionResultFromTextDisplay( - \`Executing \${action.actionName} — not yet implemented.\`, + \`Executing \${action.actionName} ΓÇö not yet implemented.\`, ); } @@ -1000,9 +1023,9 @@ function buildWebSocketBridgeHandler(name: string, pascalName: string): string { return `// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -// Pattern: websocket-bridge — bidirectional RPC to a host-side plugin. +// Pattern: websocket-bridge ΓÇö bidirectional RPC to a host-side plugin. // The agent owns a WebSocketServer; the host plugin connects as the client. -// Commands flow TypeAgent → WebSocket → plugin → response. +// Commands flow TypeAgent ΓåÆ WebSocket ΓåÆ plugin ΓåÆ response. import { ActionContext, @@ -1113,7 +1136,7 @@ function buildStateMachineHandler(name: string, pascalName: string): string { return `// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -// Pattern: state-machine — multi-phase disk-persisted workflow. +// Pattern: state-machine ΓÇö multi-phase disk-persisted workflow. // State is stored in ~/.typeagent/${name}//state.json. // Each phase must be approved before the next begins. @@ -1190,7 +1213,7 @@ async function executeAction( // case "approvePhase": return handleApprove(action.parameters.workflowId, action.parameters.phase); // case "getStatus": return handleStatus(action.parameters.workflowId); return createActionResultFromMarkdownDisplay( - \`Executing \${action.actionName} — not yet implemented.\`, + \`Executing \${action.actionName} ΓÇö not yet implemented.\`, ); } `; @@ -1200,7 +1223,7 @@ function buildNativePlatformHandler(name: string, pascalName: string): string { return `// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -// Pattern: native-platform — OS/device APIs via child_process or SDK. +// Pattern: native-platform ΓÇö OS/device APIs via child_process or SDK. // No cloud dependency. Handle platform differences in executeCommand(). import { @@ -1270,7 +1293,7 @@ function buildViewUiHandler(name: string, pascalName: string): string { return `// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -// Pattern: view-ui — web view renderer with IPC handler. +// Pattern: view-ui ΓÇö web view renderer with IPC handler. // Opens a local HTTP server serving site/ and communicates via display APIs. // The actual UX lives in the site/ directory. @@ -1326,7 +1349,7 @@ async function executeAction( ): Promise { // Push state changes to the view via HTML display updates. return createActionResultFromHtmlDisplay( - \`

Executing \${action.actionName} — not yet implemented.

\`, + \`

Executing \${action.actionName} ΓÇö not yet implemented.

\`, ); } `; @@ -1336,7 +1359,7 @@ function buildCommandHandlerTemplate(name: string, pascalName: string): string { return `// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -// Pattern: command-handler — direct dispatch via a handlers map. +// Pattern: command-handler ΓÇö direct dispatch via a handlers map. // Suited for settings-style agents with a small number of well-known commands. import { AppAgent, ActionResult } from "@typeagent/agent-sdk"; @@ -1370,3 +1393,94 @@ function getCommandInterface( } `; } + +function flagToCamel(flag: string): string { + return flag + .replace(/^--?/, "") + .replace(/-([a-z])/g, (_, c) => c.toUpperCase()); +} + +function buildCliHandler( + name: string, + pascalName: string, + cliCommand: string, + actions: DiscoveredAction[], +): string { + const cases: string[] = []; + for (const action of actions) { + const subCmd = action.endpoint ?? 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}`; + flagLines.push( + ` if (params.${camel}) 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 `// 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 { ${pascalName}Actions } from "./${name}Schema.js"; + +const execFileAsync = promisify(execFile); + +async function runCli(...cliArgs: string[]): Promise { + const { stdout, stderr } = await execFileAsync("${cliCommand}", cliArgs, { + timeout: 30_000, + }); + return (stdout || stderr).trim(); +} + +function buildArgs(action: TypeAgentAction<${pascalName}Actions>): string[] { + const args: string[] = []; + const params = action.parameters as Record; + switch (action.actionName) { +${cases.join("\n")} + default: + throw new Error(\`Unknown action: \${action.actionName}\`); + } + return args; +} + +export function instantiate(): AppAgent { + return { + executeAction: async ( + action: TypeAgentAction<${pascalName}Actions>, + context: ActionContext<${pascalName}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}\`); + } + }, + }; +} +`; +} \ No newline at end of file diff --git a/ts/packages/agents/onboarding/src/scaffolder/scaffolderSchema.ts b/ts/packages/agents/onboarding/src/scaffolder/scaffolderSchema.ts index 6de7584c3..f435fca0c 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; }; }; From 1ff189b5a750378b34176b2eb930006fed270681 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Mon, 13 Apr 2026 15:07:32 -0700 Subject: [PATCH 16/34] Fix all LLM model factories, fix test runner .env loading - Switch getDiscoveryModel() and getPhraseGenModel() from createChatModelDefault() to createChatModel() to avoid json_object response format constraint - Load ts/.env in runTests.ts so LLM translation fallback works - Remove duplicate __filename declaration and debug logging - Post-simplification retest: 254/258 (98%), up from 249/258 (97%) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ts/packages/agents/onboarding/src/lib/llm.ts | 8 ++++++-- .../agents/onboarding/src/testing/runTests.ts | 17 ++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/ts/packages/agents/onboarding/src/lib/llm.ts b/ts/packages/agents/onboarding/src/lib/llm.ts index 2b6bfaa62..912553152 100644 --- a/ts/packages/agents/onboarding/src/lib/llm.ts +++ b/ts/packages/agents/onboarding/src/lib/llm.ts @@ -10,11 +10,15 @@ import { ChatModel, openai } from "aiclient"; export function getDiscoveryModel(): ChatModel { - return openai.createChatModelDefault("onboarding:discovery"); + return openai.createChatModel(undefined, undefined, undefined, [ + "onboarding:discovery", + ]); } export function getPhraseGenModel(): ChatModel { - return openai.createChatModelDefault("onboarding:phrasegen"); + return openai.createChatModel(undefined, undefined, undefined, [ + "onboarding:phrasegen", + ]); } export function getSchemaGenModel(): ChatModel { diff --git a/ts/packages/agents/onboarding/src/testing/runTests.ts b/ts/packages/agents/onboarding/src/testing/runTests.ts index 688753466..7b0af5b25 100644 --- a/ts/packages/agents/onboarding/src/testing/runTests.ts +++ b/ts/packages/agents/onboarding/src/testing/runTests.ts @@ -9,9 +9,24 @@ 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 envPath = path.resolve(__filename, "../../../../../../.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 __filename = fileURLToPath(import.meta.url); const AGENTS_DIR = path.resolve(__filename, "../../../../../../packages/agents"); const WORKSPACE_DIR = path.join(os.homedir(), ".typeagent", "onboarding", integrationName); From aed619fe2bf3ce41c904fb5c8ff85c0660e34a44 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Mon, 13 Apr 2026 15:30:41 -0700 Subject: [PATCH 17/34] Improve statusPrint grammar rules: 98% -> 99% test pass rate Add phrasings for 'status of issues and PRs', 'latest updates on repositories', and 'summary of issues' to reduce LLM misrouting statusPrint -> issueList. 3 remaining failures are inherently ambiguous phrases that the LLM reasonably maps to issueList. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../agents/github-cli/src/github-cliSchema.agr | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ts/packages/agents/github-cli/src/github-cliSchema.agr b/ts/packages/agents/github-cli/src/github-cliSchema.agr index 0b2cba352..e3a2a4208 100644 --- a/ts/packages/agents/github-cli/src/github-cliSchema.agr +++ b/ts/packages/agents/github-cli/src/github-cliSchema.agr @@ -228,6 +228,18 @@ = 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) -> { From b739a8df9dc0b4a1dd6dfefc13a78f2c92951e0b Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Mon, 13 Apr 2026 15:39:18 -0700 Subject: [PATCH 18/34] Add github-cli README, update onboarding README with CLI discovery - github-cli: prerequisites, supported actions table, example phrases, output formatting notes, demo instructions - onboarding: document CLI help crawl discovery, auto-generated handler, add example phrases for CLI crawling Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ts/packages/agents/github-cli/README.md | 73 +++++++++++++++ ts/packages/agents/onboarding/README.md | 112 ++++++------------------ 2 files changed, 99 insertions(+), 86 deletions(-) create mode 100644 ts/packages/agents/github-cli/README.md diff --git a/ts/packages/agents/github-cli/README.md b/ts/packages/agents/github-cli/README.md new file mode 100644 index 000000000..829462810 --- /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/onboarding/README.md b/ts/packages/agents/onboarding/README.md index 1cd09843a..82e47dec6 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,28 @@ 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 ``` @@ -72,59 +89,6 @@ run tests for slack Each phase must be **approved** before the next phase begins. Approval locks the phase's artifacts and advances the current phase pointer in `state.json`. -## For Best Results - -The onboarding agent is designed to be driven by an AI orchestrator (Claude Code, GitHub Copilot) that can call TypeAgent actions iteratively, inspect artifacts, and guide each phase to completion. For the best experience, set up TypeAgent as an MCP server so your AI client can communicate with it directly. - -### Set up TypeAgent as an MCP server - -TypeAgent exposes a **Command Executor MCP server** that bridges any MCP-compatible client (Claude Code, GitHub Copilot) to the TypeAgent dispatcher. Full setup instructions are in [packages/commandExecutor/README.md](../../commandExecutor/README.md). The short version: - -1. **Build** the workspace (from `ts/`): - - ```bash - pnpm run build - ``` - -2. **Add the MCP server** to `.mcp.json` at the repo root (create it if it doesn't exist): - - ```json - { - "mcpServers": { - "command-executor": { - "command": "node", - "args": ["packages/commandExecutor/dist/server.js"] - } - } - } - ``` - -3. **Start the TypeAgent dispatcher** (in a separate terminal): - - ```bash - pnpm run start:agent-server - ``` - -4. **Restart your AI client** (Claude Code or Copilot) to pick up the new MCP configuration. - -Once connected, your AI client can drive onboarding phases end-to-end using natural language — e.g. _"start onboarding for Slack"_ — without any manual copy-paste between tools. - -## Agent Patterns - -The scaffolder supports nine architectural patterns. Use `list agent patterns` at runtime for the full table, or see [docs/architecture/agent-patterns.md](../../../../docs/architecture/agent-patterns.md) for the complete reference including when-to-use guidance, file layouts, and manifest flags. - -| Pattern | When to use | Examples | -| ------------------------ | ---------------------------------------- | ------------------------------- | -| `schema-grammar` | Bounded set of typed actions (default) | `weather`, `photo`, `list` | -| `external-api` | Authenticated REST / cloud API | `calendar`, `email`, `player` | -| `llm-streaming` | Agent calls an LLM, streams results | `chat`, `greeting` | -| `sub-agent-orchestrator` | API surface too large for one schema | `desktop`, `code`, `browser` | -| `websocket-bridge` | Automate a host app via a plugin | `browser`, `code` | -| `state-machine` | Multi-phase workflow with approval gates | `onboarding`, `scriptflow` | -| `native-platform` | OS / device APIs, no cloud | `androidMobile`, `playerLocal` | -| `view-ui` | Rich interactive web-view UI | `turtle`, `montage`, `markdown` | -| `command-handler` | Simple settings-style direct dispatch | `settings`, `test` | - ## Building ```bash @@ -132,30 +96,6 @@ pnpm install pnpm run build ``` -## TODO - -### Additional discovery crawlers - -The discovery phase currently supports web docs and OpenAPI specs. 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 -- **Python `inspect` / `pydoc`** — introspect Python modules and their docstrings -- **GraphQL introspection** — query a GraphQL endpoint's introspection schema to enumerate types and operations -- **gRPC / Protobuf** — parse `.proto` files or use server reflection to enumerate services and RPC methods - -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 -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. From ec3d4ceb35952dc8a6d19a13a3353adc9c990826 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Mon, 13 Apr 2026 22:10:13 -0700 Subject: [PATCH 19/34] Fix post-rebase build errors: DiscoveredAction field names, ClientIO methods, extra brace Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../src/scaffolder/scaffolderHandler.ts | 6 +- .../agents/onboarding/src/testing/runTests.ts | 1 + .../onboarding/src/testing/testingHandler.ts | 1 - ts/pnpm-lock.yaml | 946 +++++++++--------- 4 files changed, 498 insertions(+), 456 deletions(-) diff --git a/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts b/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts index 2f03b7ff9..ea2fc2231 100644 --- a/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts +++ b/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts @@ -476,10 +476,10 @@ function buildHandler( ): string { // If discovery data contains CLI actions, generate a CLI handler const cliActions = apiSurface?.actions?.filter( - (a) => a.source?.startsWith("cli:"), + (a) => a.sourceUrl?.startsWith("cli:"), ); if (cliActions && cliActions.length > 0) { - const cliCommand = cliActions[0].source!.split(":")[1]; + const cliCommand = cliActions[0].sourceUrl!.split(":")[1]; return buildCliHandler(name, pascalName, cliCommand, cliActions); } @@ -1408,7 +1408,7 @@ function buildCliHandler( ): string { const cases: string[] = []; for (const action of actions) { - const subCmd = action.endpoint ?? action.name; + const subCmd = action.path ?? action.name; const flagLines: string[] = []; if (action.parameters) { for (const p of action.parameters) { diff --git a/ts/packages/agents/onboarding/src/testing/runTests.ts b/ts/packages/agents/onboarding/src/testing/runTests.ts index 7b0af5b25..eb36515a2 100644 --- a/ts/packages/agents/onboarding/src/testing/runTests.ts +++ b/ts/packages/agents/onboarding/src/testing/runTests.ts @@ -54,6 +54,7 @@ const clientIO = { 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(); diff --git a/ts/packages/agents/onboarding/src/testing/testingHandler.ts b/ts/packages/agents/onboarding/src/testing/testingHandler.ts index 7c5585e03..3b18ca3a1 100644 --- a/ts/packages/agents/onboarding/src/testing/testingHandler.ts +++ b/ts/packages/agents/onboarding/src/testing/testingHandler.ts @@ -550,7 +550,6 @@ function getTestAgentProvider(integrationName: string) { // path the provider resolves the agent directory directly. return createNpmAppAgentProvider(configs, import.meta.url); } -} async function createTestDispatcher(integrationName: string) { const instanceDir = getInstanceDir(); diff --git a/ts/pnpm-lock.yaml b/ts/pnpm-lock.yaml index 070a62983..b944eeb4b 100644 --- a/ts/pnpm-lock.yaml +++ b/ts/pnpm-lock.yaml @@ -28,9 +28,6 @@ importers: markdown-link-check: specifier: ^3.14.2 version: 3.14.2 - prebuild-install: - specifier: ^7.1.3 - version: 7.1.3 prettier: specifier: ^3.5.3 version: 3.5.3 @@ -928,8 +925,8 @@ importers: packages/actionGrammar: dependencies: '@anthropic-ai/claude-agent-sdk': - specifier: ^0.2.12 - version: 0.2.12(zod@4.3.6) + specifier: ^0.2.92 + version: 0.2.105(zod@4.3.6) '@typeagent/action-schema': specifier: workspace:* version: link:../actionSchema @@ -1096,11 +1093,11 @@ importers: packages/agentSdkWrapper: dependencies: '@anthropic-ai/claude-agent-sdk': - specifier: ^0.2.12 - version: 0.2.12(zod@4.3.6) + specifier: ^0.2.92 + version: 0.2.105(zod@4.3.6) '@anthropic-ai/sdk': - specifier: ^0.35.0 - version: 0.35.0(encoding@0.1.13) + specifier: ^0.82.0 + version: 0.82.0(zod@4.3.6) '@modelcontextprotocol/sdk': specifier: ^1.26.0 version: 1.26.0(zod@4.3.6) @@ -1131,9 +1128,6 @@ importers: microsoft-cognitiveservices-speech-sdk: specifier: ^1.38.0 version: 1.43.1 - node-fetch: - specifier: ^3.3.2 - version: 3.3.2 openai: specifier: ^4.73.0 version: 4.103.0(encoding@0.1.13)(ws@8.19.0)(zod@4.3.6) @@ -1142,8 +1136,8 @@ importers: version: 4.3.6 devDependencies: '@types/node': - specifier: ^18.19.3 - version: 18.19.130 + specifier: ^20.17.28 + version: 20.19.25 prettier: specifier: ^3.2.5 version: 3.5.3 @@ -1193,6 +1187,9 @@ importers: '@typeagent/dispatcher-rpc': specifier: workspace:* version: link:../../dispatcher/rpc + '@typeagent/dispatcher-types': + specifier: workspace:* + version: link:../../dispatcher/types devDependencies: prettier: specifier: ^3.5.3 @@ -1221,6 +1218,9 @@ importers: '@typeagent/dispatcher-rpc': specifier: workspace:* version: link:../../dispatcher/rpc + '@typeagent/dispatcher-types': + specifier: workspace:* + version: link:../../dispatcher/types agent-dispatcher: specifier: workspace:* version: link:../../dispatcher/dispatcher @@ -1360,8 +1360,8 @@ importers: packages/agents/browser: dependencies: '@anthropic-ai/claude-agent-sdk': - specifier: ^0.2.12 - version: 0.2.12(zod@4.3.6) + specifier: ^0.2.92 + version: 0.2.105(zod@4.3.6) '@mozilla/readability': specifier: ^0.6.0 version: 0.6.0 @@ -1619,8 +1619,8 @@ importers: specifier: ^9.5.1 version: 9.5.2(typescript@5.4.5)(webpack@5.105.0(esbuild@0.25.11)) vite: - specifier: ^6.4.1 - version: 6.4.1(@types/node@20.19.23)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3) + 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) packages/agents/calendar: dependencies: @@ -1845,8 +1845,8 @@ importers: packages/agents/email: dependencies: '@anthropic-ai/claude-agent-sdk': - specifier: ^0.2.12 - version: 0.2.12(zod@4.3.6) + specifier: ^0.2.92 + version: 0.2.105(zod@4.3.6) '@typeagent/agent-sdk': specifier: workspace:* version: link:../../agentSdk @@ -2105,8 +2105,8 @@ importers: specifier: ^1.0.5 version: 1.0.6(yjs@13.6.27) y-websocket: - specifier: ^1.5.0 - version: 1.5.4(yjs@13.6.27) + specifier: ^3.0.0 + version: 3.0.0(yjs@13.6.27) yjs: specifier: ^13.6.8 version: 13.6.27 @@ -2154,8 +2154,8 @@ importers: specifier: ~5.4.5 version: 5.4.5 vite: - specifier: ^6.4.1 - version: 6.4.1(@types/node@25.5.2)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3) + specifier: ^6.4.2 + version: 6.4.2(@types/node@25.5.2)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3) packages/agents/montage: dependencies: @@ -2417,8 +2417,8 @@ importers: packages/agents/scriptflow: dependencies: '@anthropic-ai/claude-agent-sdk': - specifier: ^0.2.12 - version: 0.2.12(zod@4.3.6) + specifier: ^0.2.92 + version: 0.2.105(zod@4.3.6) '@typeagent/agent-sdk': specifier: workspace:* version: link:../../agentSdk @@ -2530,9 +2530,15 @@ importers: '@types/better-sqlite3': specifier: 7.6.13 version: 7.6.13 + '@types/jest': + specifier: ^29.5.7 + version: 29.5.14 copyfiles: specifier: ^2.4.1 version: 2.4.1 + jest: + specifier: ^29.7.0 + 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 @@ -2630,8 +2636,8 @@ importers: packages/agents/utility: dependencies: '@anthropic-ai/claude-agent-sdk': - specifier: ^0.2.12 - version: 0.2.12(zod@4.3.6) + specifier: ^0.2.92 + version: 0.2.105(zod@4.3.6) '@typeagent/agent-sdk': specifier: workspace:* version: link:../../agentSdk @@ -3193,8 +3199,8 @@ importers: specifier: ^8.5.10 version: 8.18.1 '@vscode/test-cli': - specifier: ^0.0.8 - version: 0.0.8 + specifier: ^0.0.12 + version: 0.0.12 '@vscode/test-electron': specifier: ^2.3.9 version: 2.5.2 @@ -3509,8 +3515,8 @@ importers: packages/dispatcher/dispatcher: dependencies: '@anthropic-ai/claude-agent-sdk': - specifier: ^0.2.12 - version: 0.2.12(zod@4.1.13) + specifier: ^0.2.92 + version: 0.2.105(zod@4.1.13) '@azure/ai-agents': specifier: ^1.0.0-beta.3 version: 1.0.0-beta.3 @@ -3706,6 +3712,15 @@ importers: specifier: workspace:* version: link:../types devDependencies: + '@types/jest': + specifier: ^29.5.7 + version: 29.5.14 + '@types/node': + specifier: ^22.0.0 + version: 22.15.18 + jest: + specifier: ^29.7.0 + 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 @@ -3950,8 +3965,8 @@ importers: packages/kp: dependencies: '@anthropic-ai/claude-agent-sdk': - specifier: ^0.2.12 - version: 0.2.12(zod@4.1.13) + specifier: ^0.2.92 + version: 0.2.105 aiclient: specifier: workspace:* version: link:../aiclient @@ -3984,11 +3999,11 @@ importers: packages/mcp/thoughts: dependencies: '@anthropic-ai/claude-agent-sdk': - specifier: ^0.2.12 - version: 0.2.12(zod@4.3.6) + specifier: ^0.2.92 + version: 0.2.105(zod@4.3.6) '@anthropic-ai/sdk': - specifier: ^0.35.0 - version: 0.35.0(encoding@0.1.13) + specifier: ^0.82.0 + version: 0.82.0(zod@4.3.6) aiclient: specifier: workspace:* version: link:../../aiclient @@ -4436,7 +4451,7 @@ importers: version: 26.8.1(dmg-builder@26.8.1) electron-vite: specifier: ^4.0.1 - version: 4.0.1(vite@6.4.1(@types/node@25.5.2)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3)) + 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)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) @@ -4456,8 +4471,8 @@ importers: specifier: ~5.4.5 version: 5.4.5 vite: - specifier: ^6.4.1 - version: 6.4.1(@types/node@25.5.2)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3) + specifier: ^6.4.2 + version: 6.4.2(@types/node@25.5.2)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3) packages/telemetry: dependencies: @@ -4823,14 +4838,29 @@ packages: '@antfu/utils@8.1.1': resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} - '@anthropic-ai/claude-agent-sdk@0.2.12': - resolution: {integrity: sha512-lto5qlffODYa3He4jbSVdXtPCWVWUxEqWFj+8mWp4tSnY6tMsQBXjwalm7Bz8YgBsEbrCZrceYMcKSw0eL7H+A==} + '@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.35.0': - resolution: {integrity: sha512-JxVuNIRLjcXZbDW/rJa3vSIoYB5c0wgIQUPsjueeqli9OJyCJpInj0UlvKSSk6R2oCYyg0y2M0H8n8Wyt0l1IA==} + '@anthropic-ai/sdk@0.81.0': + resolution: {integrity: sha512-D4K5PvEV6wPiRtVlVsJHIUhHAmOZ6IT/I9rKlTf84gR7GyyAurPJK7z9BOf/AZqC5d1DhYQGJNKRmV+q8dGhgw==} + hasBin: true + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + peerDependenciesMeta: + zod: + optional: true + + '@anthropic-ai/sdk@0.82.0': + resolution: {integrity: sha512-xdHTjL1GlUlDugHq/I47qdOKp/ROPvuHl7ROJCgUQigbvPu7asf9KcAcU1EqdrP2LuVhEKaTs7Z+ShpZDRzHdQ==} + hasBin: true + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + peerDependenciesMeta: + zod: + optional: true '@asamuzakjp/css-color@5.0.1': resolution: {integrity: sha512-2SZFvqMyvboVV1d15lMf7XiI3m7SDqXUuKaTymJYLN6dSGadqp+fVojqJlVoMlbZnlTmu3S0TLwLTJpvBMO1Aw==} @@ -6018,34 +6048,68 @@ packages: cpu: [arm64] os: [darwin] + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + '@img/sharp-darwin-x64@0.33.5': resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.0.4': resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + '@img/sharp-libvips-darwin-x64@1.0.4': resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] os: [darwin] + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-linux-arm64@1.0.4': resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] libc: [glibc] + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] libc: [glibc] + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + libc: [glibc] + '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] @@ -6058,18 +6122,36 @@ packages: os: [linux] libc: [glibc] + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + libc: [glibc] + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] libc: [musl] + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + libc: [musl] + '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] libc: [musl] + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + libc: [musl] + '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -6077,6 +6159,13 @@ packages: os: [linux] libc: [glibc] + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -6084,6 +6173,13 @@ packages: os: [linux] libc: [glibc] + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + libc: [glibc] + '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -6098,6 +6194,13 @@ packages: os: [linux] libc: [glibc] + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -6105,6 +6208,13 @@ packages: os: [linux] libc: [musl] + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -6112,11 +6222,24 @@ packages: os: [linux] libc: [musl] + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + '@img/sharp-win32-ia32@0.33.5': resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -6129,6 +6252,12 @@ packages: cpu: [x64] os: [win32] + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@inquirer/checkbox@4.2.1': resolution: {integrity: sha512-bevKGO6kX1eM/N+pdh9leS5L7TBF4ICrzi9a+cbWkrxeAeIcwlo/7OfWGCDERdRCI2/Q6tjltX4bt07ALHDwFw==} engines: {node: '>=18'} @@ -6575,6 +6704,16 @@ packages: '@cfworker/json-schema': optional: true + '@modelcontextprotocol/sdk@1.29.0': + resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + '@modelcontextprotocol/server-filesystem@2025.8.21': resolution: {integrity: sha512-Kk+E+lAuAQPLhrJlrsboEdwTBxWU0DYfsuELIuP3Nvfn8Kvd72BU6KVjhEa5EjbC4YckQDCxH9VJK47x6psxow==} hasBin: true @@ -7852,8 +7991,9 @@ packages: resolution: {integrity: sha512-91fp6CAAJSRtH5ja95T1FHSKa8aPW9/Zw6cta81jlZTUw/+Vq8jM/AfF/14h2b71wwR84JUTW/3Y8QPhDAawFA==} engines: {node: '>=20.0.0'} - '@vscode/test-cli@0.0.8': - resolution: {integrity: sha512-sBSMSDzJChiiDjmys2Q6uI4SIoUYf0t6oDsQO3ypaQ7udha9YD4e2On9e9VE5OBayZMpxbgJX+NudmCwJMdOIg==} + '@vscode/test-cli@0.0.12': + resolution: {integrity: sha512-iYN0fDg29+a2Xelle/Y56Xvv7Nc8Thzq4VwpzAF/SIE6918rDicqfsQxV6w1ttr2+SOm+10laGuY9FG2ptEKsQ==} + engines: {node: '>=18'} hasBin: true '@vscode/test-electron@2.5.2': @@ -8046,16 +8186,6 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} - abstract-leveldown@6.2.3: - resolution: {integrity: sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==} - engines: {node: '>=6'} - deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - - abstract-leveldown@6.3.0: - resolution: {integrity: sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==} - engines: {node: '>=6'} - deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -8149,10 +8279,6 @@ packages: ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -8301,9 +8427,6 @@ packages: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} - async-limiter@1.0.1: - resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} - async@2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} @@ -8558,11 +8681,6 @@ packages: monocart-coverage-reports: optional: true - c8@9.1.0: - resolution: {integrity: sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==} - engines: {node: '>=14.14.0'} - hasBin: true - cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -8670,6 +8788,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} @@ -9238,10 +9360,6 @@ packages: dagre@0.8.5: resolution: {integrity: sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==} - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - data-uri-to-buffer@6.0.2: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} engines: {node: '>= 14'} @@ -9350,11 +9468,6 @@ packages: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} - deferred-leveldown@5.3.0: - resolution: {integrity: sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==} - engines: {node: '>=6'} - deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -9435,6 +9548,10 @@ packages: resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} engines: {node: '>=0.3.1'} + diff@7.0.0: + resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} + engines: {node: '>=0.3.1'} + dir-compare@4.2.0: resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==} @@ -9586,11 +9703,6 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - encoding-down@6.3.0: - resolution: {integrity: sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==} - engines: {node: '>=6'} - deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - encoding-japanese@2.2.0: resolution: {integrity: sha512-EuJWwlHPZ1LbADuKTClvHtwbaFn4rOD+dRAbWysqEOXRc2Uui0hJInNJrsdH0c+OhJA4nrCBdSkW4DD5YxAo6A==} engines: {node: '>=8.10.0'} @@ -9890,10 +10002,6 @@ packages: picomatch: optional: true - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - file-size@1.0.0: resolution: {integrity: sha512-tLIdonWTpABkU6Axg2yGChYdrOsy4V8xcm0IcyAP8fSsu6jiXLm5pgs083e4sq5fzNRZuAYolUbZyYmPvCKfwQ==} @@ -9989,10 +10097,6 @@ packages: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -10159,11 +10263,6 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - glob@9.3.5: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} @@ -10495,9 +10594,6 @@ packages: immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - immediate@3.3.0: - resolution: {integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==} - import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -10716,6 +10812,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} @@ -11107,6 +11207,10 @@ packages: resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + json-schema-to-ts@3.1.1: + resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} + engines: {node: '>=16'} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -11229,52 +11333,6 @@ packages: engines: {node: '>=14'} hasBin: true - level-codec@9.0.2: - resolution: {integrity: sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==} - engines: {node: '>=6'} - deprecated: Superseded by level-transcoder (https://github.com/Level/community#faq) - - level-concat-iterator@2.0.1: - resolution: {integrity: sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==} - engines: {node: '>=6'} - deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - - level-errors@2.0.1: - resolution: {integrity: sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==} - engines: {node: '>=6'} - deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - - level-iterator-stream@4.0.2: - resolution: {integrity: sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==} - engines: {node: '>=6'} - - level-js@5.0.2: - resolution: {integrity: sha512-SnBIDo2pdO5VXh02ZmtAyPP6/+6YTJg2ibLtl9C34pWvmtMEmRTWpra+qO/hifkUtBTOtfx6S9vLDjBsBK4gRg==} - deprecated: Superseded by browser-level (https://github.com/Level/community#faq) - - level-packager@5.1.1: - resolution: {integrity: sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==} - engines: {node: '>=6'} - deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - - level-supports@1.0.1: - resolution: {integrity: sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==} - engines: {node: '>=6'} - - level@6.0.1: - resolution: {integrity: sha512-psRSqJZCsC/irNhfHzrVZbmPYXDcEYhA5TVNwr+V92jF44rbf86hqGp8fiT702FyiArScYIlPSBTDUASCVNSpw==} - engines: {node: '>=8.6.0'} - - leveldown@5.6.0: - resolution: {integrity: sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==} - engines: {node: '>=8.6.0'} - deprecated: Superseded by classic-level (https://github.com/Level/community#faq) - - levelup@4.4.0: - resolution: {integrity: sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==} - engines: {node: '>=6'} - deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -11445,9 +11503,6 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - ltgt@2.2.1: - resolution: {integrity: sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==} - magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} @@ -11837,9 +11892,9 @@ packages: mnemonist@0.39.8: resolution: {integrity: sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==} - mocha@10.8.2: - resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} - engines: {node: '>= 14.0.0'} + mocha@11.7.5: + resolution: {integrity: sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true module-details-from-path@1.0.4: @@ -11912,9 +11967,6 @@ packages: napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - napi-macros@2.0.0: - resolution: {integrity: sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -11994,18 +12046,10 @@ packages: encoding: optional: true - node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-forge@1.4.0: resolution: {integrity: sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==} engines: {node: '>= 6.13.0'} - node-gyp-build@4.1.1: - resolution: {integrity: sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==} - hasBin: true - node-gyp@12.2.0: resolution: {integrity: sha512-q23WdzrQv48KozXlr0U1v9dwO/k59NHeSzn6loGcasyf0UnSrtzs8kRxM+mfwJSf0DkX0s43hcqgnSO4/VNthQ==} engines: {node: ^20.17.0 || >=22.9.0} @@ -12769,6 +12813,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + readline@1.3.0: resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} @@ -13424,6 +13472,10 @@ packages: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} engines: {node: '>= 8.0'} + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -13436,10 +13488,6 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} - supports-color@9.4.0: - resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} - engines: {node: '>=12'} - supports-hyperlinks@2.3.0: resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} engines: {node: '>=8'} @@ -13663,6 +13711,9 @@ packages: truncate-utf8-bytes@1.0.2: resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + ts-algebra@2.0.0: + resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} + ts-dedent@2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} @@ -14000,8 +14051,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@6.4.1: - resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} + vite@6.4.2: + resolution: {integrity: sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -14096,10 +14147,6 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} - web-streams-polyfill@4.0.0-beta.3: resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} engines: {node: '>= 14'} @@ -14279,8 +14326,8 @@ packages: resolution: {integrity: sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==} engines: {node: '>=12.17'} - workerpool@6.5.1: - resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + workerpool@9.3.4: + resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} @@ -14305,17 +14352,6 @@ packages: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - ws@6.2.3: - resolution: {integrity: sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@7.5.10: resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} @@ -14404,11 +14440,6 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - y-leveldb@0.1.2: - resolution: {integrity: sha512-6ulEn5AXfXJYi89rXPEg2mMHAyyw8+ZfeMMdOtBbV8FJpQ1NOrcgi6DTAcXof0dap84NjHPT2+9d0rb6cFsjEg==} - peerDependencies: - yjs: ^13.0.0 - y-prosemirror@1.3.5: resolution: {integrity: sha512-qW8fXCb72L6H2BWiuhZdSJ6hiShHUog08gh6KvBqLjhK6Et9DxfDnMDvx6yyO3iCdnEhDfUJviRvaMAAXb0dNg==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} @@ -14425,10 +14456,9 @@ packages: peerDependencies: yjs: ^13.0.0 - y-websocket@1.5.4: - resolution: {integrity: sha512-Y3021uy0anOIHqAPyAZbNDoR05JuMEGjRNI8c+K9MHzVS8dWoImdJUjccljAznc8H2L7WkIXhRHZ1igWNRSgPw==} + y-websocket@3.0.0: + resolution: {integrity: sha512-mUHy7AzkOZ834T/7piqtlA8Yk6AchqKqcrCXjKW8J1w2lPtRDjz8W5/CvXz9higKAHgKRKqpI3T33YkRFLkPtg==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} - hasBin: true peerDependencies: yjs: ^13.5.6 @@ -14548,43 +14578,79 @@ snapshots: '@antfu/utils@8.1.1': {} - '@anthropic-ai/claude-agent-sdk@0.2.12(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.81.0(zod@4.1.13) + '@modelcontextprotocol/sdk': 1.29.0(zod@4.1.13) zod: 4.1.13 optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.5 - '@img/sharp-darwin-x64': 0.33.5 - '@img/sharp-linux-arm': 0.33.5 - '@img/sharp-linux-arm64': 0.33.5 - '@img/sharp-linux-x64': 0.33.5 - '@img/sharp-linuxmusl-arm64': 0.33.5 - '@img/sharp-linuxmusl-x64': 0.33.5 - '@img/sharp-win32-x64': 0.33.5 + '@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.12(zod@4.3.6)': + '@anthropic-ai/claude-agent-sdk@0.2.105(zod@4.3.6)': dependencies: + '@anthropic-ai/sdk': 0.81.0(zod@4.3.6) + '@modelcontextprotocol/sdk': 1.29.0(zod@4.3.6) zod: 4.3.6 optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.5 - '@img/sharp-darwin-x64': 0.33.5 - '@img/sharp-linux-arm': 0.33.5 - '@img/sharp-linux-arm64': 0.33.5 - '@img/sharp-linux-x64': 0.33.5 - '@img/sharp-linuxmusl-arm64': 0.33.5 - '@img/sharp-linuxmusl-x64': 0.33.5 - '@img/sharp-win32-x64': 0.33.5 + '@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/sdk@0.35.0(encoding@0.1.13)': + '@anthropic-ai/sdk@0.81.0(zod@4.1.13)': dependencies: - '@types/node': 18.19.130 - '@types/node-fetch': 2.6.12 - abort-controller: 3.0.0 - agentkeepalive: 4.6.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0(encoding@0.1.13) - transitivePeerDependencies: - - encoding + json-schema-to-ts: 3.1.1 + optionalDependencies: + zod: 4.1.13 + + '@anthropic-ai/sdk@0.81.0(zod@4.3.6)': + dependencies: + json-schema-to-ts: 3.1.1 + optionalDependencies: + zod: 4.3.6 + + '@anthropic-ai/sdk@0.82.0(zod@4.3.6)': + dependencies: + json-schema-to-ts: 3.1.1 + optionalDependencies: + zod: 4.3.6 '@asamuzakjp/css-color@5.0.1': dependencies: @@ -15678,7 +15744,7 @@ snapshots: '@babel/parser': 7.28.4 '@babel/template': 7.27.2 '@babel/types': 7.28.4 - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -16065,7 +16131,7 @@ snapshots: '@electron/get@2.0.3': dependencies: - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 @@ -16079,7 +16145,7 @@ snapshots: '@electron/get@3.1.0': dependencies: - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 @@ -16093,7 +16159,7 @@ snapshots: '@electron/notarize@2.5.0': dependencies: - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) fs-extra: 9.1.0 promise-retry: 2.0.1 transitivePeerDependencies: @@ -16102,7 +16168,7 @@ snapshots: '@electron/osx-sign@1.3.3': dependencies: compare-version: 0.1.2 - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) fs-extra: 10.1.0 isbinaryfile: 4.0.10 minimist: 1.2.8 @@ -16113,7 +16179,7 @@ snapshots: '@electron/rebuild@4.0.3': dependencies: '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) detect-libc: 2.0.3 got: 11.8.6 graceful-fs: 4.2.11 @@ -16132,7 +16198,7 @@ snapshots: dependencies: '@electron/asar': 3.4.1 '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) dir-compare: 4.2.0 fs-extra: 11.3.4 minimatch: 9.0.9 @@ -16143,7 +16209,7 @@ snapshots: '@electron/windows-sign@1.2.2': dependencies: cross-dirname: 0.1.0 - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) fs-extra: 11.3.4 minimist: 1.2.8 postject: 1.0.0-alpha.6 @@ -16451,45 +16517,86 @@ snapshots: '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true - '@img/sharp-darwin-x64@0.33.5': + '@img/sharp-darwin-arm64@0.34.5': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 optional: true '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + '@img/sharp-libvips-darwin-x64@1.0.4': optional: true + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + '@img/sharp-libvips-linux-arm64@1.0.4': optional: true + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + '@img/sharp-libvips-linux-arm@1.0.5': optional: true + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + '@img/sharp-libvips-linux-s390x@1.0.4': optional: true '@img/sharp-libvips-linux-x64@1.0.4': optional: true + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + '@img/sharp-linux-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + '@img/sharp-linux-arm@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.0.5 optional: true + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + '@img/sharp-linux-s390x@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.0.4 @@ -16500,27 +16607,48 @@ snapshots: '@img/sharp-libvips-linux-x64': 1.0.4 optional: true + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + '@img/sharp-linuxmusl-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 optional: true + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + '@img/sharp-linuxmusl-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.0.4 optional: true + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + '@img/sharp-wasm32@0.33.5': dependencies: '@emnapi/runtime': 1.4.0 optional: true + '@img/sharp-win32-arm64@0.34.5': + optional: true + '@img/sharp-win32-ia32@0.33.5': optional: true '@img/sharp-win32-x64@0.33.5': optional: true + '@img/sharp-win32-x64@0.34.5': + optional: true + '@inquirer/checkbox@4.2.1(@types/node@20.19.23)': dependencies: '@inquirer/core': 10.1.15(@types/node@20.19.23) @@ -17087,7 +17215,7 @@ snapshots: '@malept/flatpak-bundler@0.4.0': dependencies: - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) fs-extra: 9.1.0 lodash: 4.17.23 tmp-promise: 3.0.3 @@ -17485,6 +17613,71 @@ 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.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: 4.1.13 + zod-to-json-schema: 3.25.1(zod@4.1.13) + transitivePeerDependencies: + - supports-color + + '@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)': + 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: 4.3.6 + zod-to-json-schema: 3.25.1(zod@4.3.6) + transitivePeerDependencies: + - supports-color + '@modelcontextprotocol/server-filesystem@2025.8.21(zod@4.1.13)': dependencies: '@modelcontextprotocol/sdk': 1.26.0(zod@4.1.13) @@ -17619,7 +17812,7 @@ snapshots: dependencies: '@oclif/core': 4.8.0 ansis: 3.17.0 - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) ejs: 3.1.10 transitivePeerDependencies: - supports-color @@ -17989,7 +18182,7 @@ snapshots: '@secretlint/resolver': 9.3.2 '@secretlint/types': 9.3.2 ajv: 8.18.0 - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) rc-config-loader: 4.1.3 transitivePeerDependencies: - supports-color @@ -17998,7 +18191,7 @@ snapshots: dependencies: '@secretlint/profiler': 9.3.2 '@secretlint/types': 9.3.2 - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) structured-source: 4.0.0 transitivePeerDependencies: - supports-color @@ -18011,7 +18204,7 @@ snapshots: '@textlint/module-interop': 14.7.1 '@textlint/types': 14.7.1 chalk: 4.1.2 - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) pluralize: 8.0.0 strip-ansi: 6.0.1 table: 6.9.0 @@ -18430,7 +18623,7 @@ snapshots: '@textlint/resolver': 14.7.1 '@textlint/types': 14.7.1 chalk: 4.1.2 - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) js-yaml: 3.14.2 lodash: 4.17.23 pluralize: 2.0.0 @@ -18511,7 +18704,7 @@ snapshots: '@types/better-sqlite3@7.6.11': dependencies: - '@types/node': 20.19.23 + '@types/node': 20.19.25 '@types/better-sqlite3@7.6.13': dependencies: @@ -18530,7 +18723,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.2.0 '@types/keyv': 3.1.4 - '@types/node': 24.12.2 + '@types/node': 20.19.25 '@types/responselike': 1.0.3 '@types/chrome@0.0.114': @@ -18752,14 +18945,14 @@ snapshots: '@types/fs-extra@9.0.13': dependencies: - '@types/node': 25.5.2 + '@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.23 + '@types/node': 20.19.25 '@types/graceful-fs@4.1.8': dependencies: @@ -18781,7 +18974,7 @@ snapshots: '@types/http-proxy@1.17.14': dependencies: - '@types/node': 25.5.2 + '@types/node': 20.19.25 '@types/istanbul-lib-coverage@2.0.6': {} @@ -18880,7 +19073,7 @@ snapshots: '@types/node-forge@1.3.11': dependencies: - '@types/node': 25.5.2 + '@types/node': 20.19.25 '@types/node@18.19.130': dependencies: @@ -18910,7 +19103,7 @@ snapshots: '@types/plist@3.0.5': dependencies: - '@types/node': 25.5.2 + '@types/node': 20.19.25 xmlbuilder: 15.1.1 optional: true @@ -18937,7 +19130,7 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 24.12.2 + '@types/node': 20.19.25 '@types/retry@0.12.2': {} @@ -19012,7 +19205,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 24.12.2 + '@types/node': 20.19.25 optional: true '@typespec/ts-http-runtime@0.2.2': @@ -19031,17 +19224,19 @@ snapshots: transitivePeerDependencies: - supports-color - '@vscode/test-cli@0.0.8': + '@vscode/test-cli@0.0.12': dependencies: '@types/mocha': 10.0.10 - c8: 9.1.0 + c8: 10.1.3 chokidar: 3.6.0 - enhanced-resolve: 5.15.0 + enhanced-resolve: 5.19.0 glob: 10.5.0 minimatch: 9.0.9 - mocha: 10.8.2 - supports-color: 9.4.0 + mocha: 11.7.5 + supports-color: 10.2.2 yargs: 17.7.2 + transitivePeerDependencies: + - monocart-coverage-reports '@vscode/test-electron@2.5.2': dependencies: @@ -19300,24 +19495,6 @@ snapshots: dependencies: event-target-shim: 5.0.1 - abstract-leveldown@6.2.3: - dependencies: - buffer: 5.7.1 - immediate: 3.3.0 - level-concat-iterator: 2.0.1 - level-supports: 1.0.1 - xtend: 4.0.2 - optional: true - - abstract-leveldown@6.3.0: - dependencies: - buffer: 5.7.1 - immediate: 3.3.0 - level-concat-iterator: 2.0.1 - level-supports: 1.0.1 - xtend: 4.0.2 - optional: true - accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -19399,8 +19576,6 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - ansi-colors@4.1.3: {} - ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -19592,9 +19767,6 @@ snapshots: async-function@1.0.0: {} - async-limiter@1.0.1: - optional: true - async@2.6.4: dependencies: lodash: 4.17.23 @@ -19916,20 +20088,6 @@ snapshots: yargs: 17.7.2 yargs-parser: 21.1.1 - c8@9.1.0: - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@istanbuljs/schema': 0.1.3 - find-up: 5.0.0 - foreground-child: 3.3.1 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.1.6 - test-exclude: 6.0.0 - v8-to-istanbul: 9.1.3 - yargs: 17.7.2 - yargs-parser: 21.1.1 - cac@6.7.14: {} cacache@20.0.3: @@ -20078,6 +20236,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + chownr@1.1.4: {} chownr@3.0.0: {} @@ -20748,8 +20910,6 @@ snapshots: graphlib: 2.1.8 lodash: 4.17.23 - data-uri-to-buffer@4.0.1: {} - data-uri-to-buffer@6.0.2: {} data-urls@3.0.2: @@ -20838,12 +20998,6 @@ snapshots: defer-to-connect@2.0.1: {} - deferred-leveldown@5.3.0: - dependencies: - abstract-leveldown: 6.2.3 - inherits: 2.0.4 - optional: true - define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -20902,6 +21056,8 @@ snapshots: diff@5.2.2: {} + diff@7.0.0: {} + dir-compare@4.2.0: dependencies: minimatch: 3.1.5 @@ -21076,7 +21232,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron-vite@4.0.1(vite@6.4.1(@types/node@25.5.2)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3)): + electron-vite@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)): dependencies: '@babel/core': 7.28.4 '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.4) @@ -21084,7 +21240,7 @@ snapshots: esbuild: 0.25.11 magic-string: 0.30.17 picocolors: 1.1.1 - vite: 6.4.1(@types/node@25.5.2)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3) + 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) transitivePeerDependencies: - supports-color @@ -21122,14 +21278,6 @@ snapshots: encodeurl@2.0.0: {} - encoding-down@6.3.0: - dependencies: - abstract-leveldown: 6.3.0 - inherits: 2.0.4 - level-codec: 9.0.2 - level-errors: 2.0.1 - optional: true - encoding-japanese@2.2.0: {} encoding-sniffer@0.2.1: @@ -21502,7 +21650,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -21573,11 +21721,6 @@ snapshots: optionalDependencies: picomatch: 4.0.3 - fetch-blob@3.2.0: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - file-size@1.0.0: {} file-uri-to-path@1.0.0: {} @@ -21689,10 +21832,6 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 4.0.0-beta.3 - formdata-polyfill@4.0.10: - dependencies: - fetch-blob: 3.2.0 - forwarded@0.2.0: {} fresh@0.5.2: {} @@ -21886,14 +22025,6 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.9 - once: 1.4.0 - glob@9.3.5: dependencies: fs.realpath: 1.0.0 @@ -22277,7 +22408,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -22327,9 +22458,6 @@ snapshots: immediate@3.0.6: {} - immediate@3.3.0: - optional: true - import-fresh@3.3.0: dependencies: parent-module: 1.0.1 @@ -22531,6 +22659,8 @@ snapshots: is-number@7.0.0: {} + is-path-inside@3.0.3: {} + is-plain-obj@2.1.0: {} is-plain-obj@3.0.0: {} @@ -22718,7 +22848,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 25.5.2 + '@types/node': 20.19.25 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.0 @@ -23070,7 +23200,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 25.5.2 + '@types/node': 20.19.25 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -23256,7 +23386,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 25.5.2 + '@types/node': 20.19.25 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -23412,6 +23542,11 @@ snapshots: json-parse-even-better-errors@3.0.2: {} + json-schema-to-ts@3.1.1: + dependencies: + '@babel/runtime': 7.27.0 + ts-algebra: 2.0.0 + json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -23563,68 +23698,6 @@ snapshots: needle: 3.3.1 source-map: 0.6.1 - level-codec@9.0.2: - dependencies: - buffer: 5.7.1 - optional: true - - level-concat-iterator@2.0.1: - optional: true - - level-errors@2.0.1: - dependencies: - errno: 0.1.8 - optional: true - - level-iterator-stream@4.0.2: - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - xtend: 4.0.2 - optional: true - - level-js@5.0.2: - dependencies: - abstract-leveldown: 6.2.3 - buffer: 5.7.1 - inherits: 2.0.4 - ltgt: 2.2.1 - optional: true - - level-packager@5.1.1: - dependencies: - encoding-down: 6.3.0 - levelup: 4.4.0 - optional: true - - level-supports@1.0.1: - dependencies: - xtend: 4.0.2 - optional: true - - level@6.0.1: - dependencies: - level-js: 5.0.2 - level-packager: 5.1.1 - leveldown: 5.6.0 - optional: true - - leveldown@5.6.0: - dependencies: - abstract-leveldown: 6.2.3 - napi-macros: 2.0.0 - node-gyp-build: 4.1.1 - optional: true - - levelup@4.4.0: - dependencies: - deferred-leveldown: 5.3.0 - level-errors: 2.0.1 - level-iterator-stream: 4.0.2 - level-supports: 1.0.1 - xtend: 4.0.2 - optional: true - leven@3.1.0: {} lib0@0.2.108: @@ -23770,9 +23843,6 @@ snapshots: lru-cache@7.18.3: {} - ltgt@2.2.1: - optional: true - magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -24240,7 +24310,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -24391,27 +24461,28 @@ snapshots: dependencies: obliterator: 2.0.5 - mocha@10.8.2: + mocha@11.7.5: dependencies: - ansi-colors: 4.1.3 browser-stdout: 1.3.1 - chokidar: 3.6.0 + chokidar: 4.0.3 debug: 4.4.3(supports-color@8.1.1) - diff: 5.2.2 + diff: 7.0.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 - glob: 8.1.0 + glob: 10.5.0 he: 1.2.0 + is-path-inside: 3.0.3 js-yaml: 4.1.1 log-symbols: 4.1.0 - minimatch: 5.1.9 + minimatch: 9.0.9 ms: 2.1.3 + picocolors: 1.1.1 serialize-javascript: 7.0.5 strip-json-comments: 3.1.1 supports-color: 8.1.1 - workerpool: 6.5.1 - yargs: 16.2.0 - yargs-parser: 20.2.9 + workerpool: 9.3.4 + yargs: 17.7.2 + yargs-parser: 21.1.1 yargs-unparser: 2.0.0 module-details-from-path@1.0.4: {} @@ -24462,9 +24533,6 @@ snapshots: napi-build-utils@2.0.0: {} - napi-macros@2.0.0: - optional: true - natural-compare@1.4.0: {} natural-orderby@3.0.2: {} @@ -24530,17 +24598,8 @@ snapshots: optionalDependencies: encoding: 0.1.13 - node-fetch@3.3.2: - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - node-forge@1.4.0: {} - node-gyp-build@4.1.1: - optional: true - node-gyp@12.2.0: dependencies: env-paths: 2.2.1 @@ -25171,7 +25230,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 25.5.2 + '@types/node': 20.19.25 long: 5.3.2 protocol-buffers-schema@3.6.0: {} @@ -25259,7 +25318,7 @@ snapshots: puppeteer-extra-plugin-user-data-dir@2.4.1(puppeteer-extra@3.3.6(puppeteer-core@24.37.5)(puppeteer@24.37.5(typescript@5.4.5))): dependencies: - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) fs-extra: 10.1.0 puppeteer-extra-plugin: 3.2.3(puppeteer-extra@3.3.6(puppeteer-core@24.37.5)(puppeteer@24.37.5(typescript@5.4.5))) rimraf: 3.0.2 @@ -25355,7 +25414,7 @@ snapshots: rc-config-loader@4.1.3: dependencies: - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) js-yaml: 4.1.1 json5: 2.2.3 require-from-string: 2.0.2 @@ -25383,7 +25442,7 @@ snapshots: read-binary-file-arch@1.0.6: dependencies: - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -25437,6 +25496,8 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.1.2: {} + readline@1.3.0: {} rechoir@0.6.2: @@ -25544,7 +25605,7 @@ snapshots: require-in-the-middle@7.5.2: dependencies: - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) module-details-from-path: 1.0.4 resolve: 1.22.8 transitivePeerDependencies: @@ -26305,10 +26366,12 @@ snapshots: sumchecker@3.0.1: dependencies: - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color + supports-color@10.2.2: {} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -26321,8 +26384,6 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-color@9.4.0: {} - supports-hyperlinks@2.3.0: dependencies: has-flag: 4.0.0 @@ -26573,6 +26634,8 @@ snapshots: dependencies: utf8-byte-length: 1.0.4 + ts-algebra@2.0.0: {} + ts-dedent@2.2.0: {} ts-deepmerge@7.0.2: {} @@ -26990,7 +27053,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite@6.4.1(@types/node@20.19.23)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3): + 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.11 fdir: 6.5.0(picomatch@4.0.3) @@ -27006,7 +27069,7 @@ snapshots: terser: 5.39.2 yaml: 2.8.3 - vite@6.4.1(@types/node@25.5.2)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.8.3): + 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.11 fdir: 6.5.0(picomatch@4.0.3) @@ -27078,8 +27141,6 @@ snapshots: dependencies: defaults: 1.0.4 - web-streams-polyfill@3.3.3: {} - web-streams-polyfill@4.0.0-beta.3: {} webdriver-bidi-protocol@0.4.1: {} @@ -27353,7 +27414,7 @@ snapshots: wordwrapjs@5.1.0: {} - workerpool@6.5.1: {} + workerpool@9.3.4: {} wrap-ansi@6.2.0: dependencies: @@ -27386,11 +27447,6 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 - ws@6.2.3: - dependencies: - async-limiter: 1.0.1 - optional: true - ws@7.5.10: {} ws@8.18.0: {} @@ -27433,13 +27489,6 @@ snapshots: xtend@4.0.2: {} - y-leveldb@0.1.2(yjs@13.6.27): - dependencies: - level: 6.0.1 - lib0: 0.2.117 - yjs: 13.6.27 - optional: true - y-prosemirror@1.3.5(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27): dependencies: lib0: 0.2.117 @@ -27454,18 +27503,11 @@ snapshots: lib0: 0.2.108 yjs: 13.6.27 - y-websocket@1.5.4(yjs@13.6.27): + y-websocket@3.0.0(yjs@13.6.27): dependencies: - lib0: 0.2.108 - lodash.debounce: 4.0.8 + lib0: 0.2.117 y-protocols: 1.0.6(yjs@13.6.27) yjs: 13.6.27 - optionalDependencies: - ws: 6.2.3 - y-leveldb: 0.1.2(yjs@13.6.27) - transitivePeerDependencies: - - bufferutil - - utf-8-validate y18n@5.0.8: {} From 2c2200fc77ce703560a5013153e598edcaf7c65a Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Mon, 13 Apr 2026 23:30:49 -0700 Subject: [PATCH 20/34] Update pnpm-lock.yaml after rebase onto main Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ts/pnpm-lock.yaml | 75 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/ts/pnpm-lock.yaml b/ts/pnpm-lock.yaml index b944eeb4b..8e600815d 100644 --- a/ts/pnpm-lock.yaml +++ b/ts/pnpm-lock.yaml @@ -3134,6 +3134,9 @@ importers: specifier: workspace:* version: link:../utils/typechatUtils devDependencies: + '@jest/globals': + specifier: ^29.7.0 + version: 29.7.0 '@types/debug': specifier: ^4.1.12 version: 4.1.12 @@ -3152,6 +3155,9 @@ importers: rimraf: specifier: ^6.0.1 version: 6.0.1 + ts-jest: + specifier: ^29.4.9 + version: 29.4.9(@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-util@29.7.0)(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 @@ -10388,6 +10394,11 @@ packages: handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + handlebars@4.7.9: + resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} + engines: {node: '>=0.4.7'} + hasBin: true + has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -13746,6 +13757,33 @@ packages: esbuild: optional: true + ts-jest@29.4.9: + resolution: {integrity: sha512-LTb9496gYPMCqjeDLdPrKuXtncudeV1yRZnF4Wo5l3SFi0RYEnYRNgMrFIdg+FHvfzjCyQk1cLncWVqiSX+EvQ==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 || ^30.0.0 + '@jest/types': ^29.0.0 || ^30.0.0 + babel-jest: ^29.0.0 || ^30.0.0 + esbuild: '*' + jest: ^29.0.0 || ^30.0.0 + jest-util: ^29.0.0 || ^30.0.0 + typescript: '>=4.3 <7' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/transform': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + jest-util: + optional: true + ts-loader@9.5.2: resolution: {integrity: sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==} engines: {node: '>=12.0.0'} @@ -13870,6 +13908,11 @@ packages: ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -22225,6 +22268,15 @@ snapshots: handle-thing@2.0.1: {} + handlebars@4.7.9: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + has-bigints@1.1.0: {} has-flag@3.0.0: {} @@ -26681,6 +26733,26 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.28.4) + ts-jest@29.4.9(@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-util@29.7.0)(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 + fast-json-stable-stringify: 2.1.0 + handlebars: 4.7.9 + jest: 29.7.0(@types/node@25.5.2)(ts-node@10.9.2(@types/node@25.5.2)(typescript@5.4.5)) + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.7.4 + type-fest: 4.41.0 + typescript: 5.4.5 + yargs-parser: 21.1.1 + optionalDependencies: + '@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-util: 29.7.0 + ts-loader@9.5.2(typescript@5.4.5)(webpack@5.105.0(esbuild@0.25.11)): dependencies: chalk: 4.1.2 @@ -26878,6 +26950,9 @@ snapshots: ufo@1.6.1: {} + uglify-js@3.19.3: + optional: true + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 From 372b9e90428846cd6c87f62c8526b890e93475f6 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Mon, 13 Apr 2026 23:45:41 -0700 Subject: [PATCH 21/34] Fix boolean flag codegen and add cycle detection to CLI crawl - buildCliHandler: generate flag-only push for boolean params - crawlCliRecursive: add visited set and default maxDepth of 4 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../onboarding/src/discovery/discoveryHandler.ts | 10 +++++++--- .../onboarding/src/scaffolder/scaffolderHandler.ts | 12 +++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts b/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts index 94a636193..e320be1d0 100644 --- a/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts +++ b/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts @@ -535,9 +535,12 @@ async function crawlCliRecursive( command: string, args: string[], depth: number, - maxDepth: number | undefined, + maxDepth: number, + visited: Set = new Set(), ): Promise<{ command: string; helpText: string }[]> { - if (maxDepth !== undefined && depth > maxDepth) return []; + const cmdKey = [command, ...args].join(" "); + if (depth > maxDepth || visited.has(cmdKey)) return []; + visited.add(cmdKey); const helpText = await runHelp(command, args); if (!helpText) return []; @@ -553,6 +556,7 @@ async function crawlCliRecursive( [...args, sub], depth + 1, maxDepth, + visited, ); results.push(...childResults); } @@ -575,7 +579,7 @@ async function handleCrawlCliHelp( await updatePhase(integrationName, "discovery", { status: "in-progress" }); // Crawl the CLI help recursively - const helpEntries = await crawlCliRecursive(command, [], 0, maxDepth); + 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.`, diff --git a/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts b/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts index ea2fc2231..100ef3bf8 100644 --- a/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts +++ b/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts @@ -1414,9 +1414,15 @@ function buildCliHandler( for (const p of action.parameters) { const camel = flagToCamel(p.name); const flag = p.name.startsWith("-") ? p.name : `--${p.name}`; - flagLines.push( - ` if (params.${camel}) args.push("${flag}", String(params.${camel}));`, - ); + if (p.type === "boolean") { + flagLines.push( + ` if (params.${camel}) args.push("${flag}");`, + ); + } else { + flagLines.push( + ` if (params.${camel}) args.push("${flag}", String(params.${camel}));`, + ); + } } } const body = From 67f7f1705aec6cc262569fca4c44ef10c438e543 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Tue, 14 Apr 2026 11:36:11 -0700 Subject: [PATCH 22/34] Restore upstream README sections dropped during rebase Restores: For Best Results, Agent Patterns, TODO, Trademarks sections. Updates phase 1 description and TODO to reflect CLI --help as implemented. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ts/packages/agents/onboarding/README.md | 94 ++++++++++++++++++++++--- 1 file changed, 85 insertions(+), 9 deletions(-) diff --git a/ts/packages/agents/onboarding/README.md b/ts/packages/agents/onboarding/README.md index 82e47dec6..cb53aed9e 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, 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 | +| 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. @@ -89,6 +89,59 @@ When the scaffolder detects CLI-sourced actions, it auto-generates a working han Each phase must be **approved** before the next phase begins. Approval locks the phase's artifacts and advances the current phase pointer in `state.json`. +## For Best Results + +The onboarding agent is designed to be driven by an AI orchestrator (Claude Code, GitHub Copilot) that can call TypeAgent actions iteratively, inspect artifacts, and guide each phase to completion. For the best experience, set up TypeAgent as an MCP server so your AI client can communicate with it directly. + +### Set up TypeAgent as an MCP server + +TypeAgent exposes a **Command Executor MCP server** that bridges any MCP-compatible client (Claude Code, GitHub Copilot) to the TypeAgent dispatcher. Full setup instructions are in [packages/commandExecutor/README.md](../../commandExecutor/README.md). The short version: + +1. **Build** the workspace (from `ts/`): + + ```bash + pnpm run build + ``` + +2. **Add the MCP server** to `.mcp.json` at the repo root (create it if it doesn't exist): + + ```json + { + "mcpServers": { + "command-executor": { + "command": "node", + "args": ["packages/commandExecutor/dist/server.js"] + } + } + } + ``` + +3. **Start the TypeAgent dispatcher** (in a separate terminal): + + ```bash + pnpm run start:agent-server + ``` + +4. **Restart your AI client** (Claude Code or Copilot) to pick up the new MCP configuration. + +Once connected, your AI client can drive onboarding phases end-to-end using natural language — e.g. _"start onboarding for Slack"_ — without any manual copy-paste between tools. + +## Agent Patterns + +The scaffolder supports nine architectural patterns. Use `list agent patterns` at runtime for the full table, or see [docs/architecture/agent-patterns.md](../../../../docs/architecture/agent-patterns.md) for the complete reference including when-to-use guidance, file layouts, and manifest flags. + +| Pattern | When to use | Examples | +| ------------------------ | ---------------------------------------- | ------------------------------- | +| `schema-grammar` | Bounded set of typed actions (default) | `weather`, `photo`, `list` | +| `external-api` | Authenticated REST / cloud API | `calendar`, `email`, `player` | +| `llm-streaming` | Agent calls an LLM, streams results | `chat`, `greeting` | +| `sub-agent-orchestrator` | API surface too large for one schema | `desktop`, `code`, `browser` | +| `websocket-bridge` | Automate a host app via a plugin | `browser`, `code` | +| `state-machine` | Multi-phase workflow with approval gates | `onboarding`, `scriptflow` | +| `native-platform` | OS / device APIs, no cloud | `androidMobile`, `playerLocal` | +| `view-ui` | Rich interactive web-view UI | `turtle`, `montage`, `markdown` | +| `command-handler` | Simple settings-style direct dispatch | `settings`, `test` | + ## Building ```bash @@ -99,3 +152,26 @@ 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, OpenAPI specs, and CLI `--help` scraping. Planned crawlers: + +- **`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 +- **Python `inspect` / `pydoc`** — introspect Python modules and their docstrings +- **GraphQL introspection** — query a GraphQL endpoint's introspection schema to enumerate types and operations +- **gRPC / Protobuf** — parse `.proto` files or use server reflection to enumerate services and RPC methods + +Each new crawler should implement the same `DiscoveryResult` contract so downstream phases (phrase gen, schema gen) remain crawler-agnostic. + +## 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. From 2d44571397c42517c7598661f94cd97a62d135a0 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Tue, 14 Apr 2026 11:56:49 -0700 Subject: [PATCH 23/34] Fix mojibake em dashes to match main MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace corrupted ΓÇö bytes (0xCE93 C387 C3B6) with proper UTF-8 em dash U+2014 (0xE2 0x80 0x94) across 19 occurrences. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../src/scaffolder/scaffolderHandler.ts | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts b/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts index 100ef3bf8..2dc155a76 100644 --- a/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts +++ b/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -// Phase 5 ΓÇö Scaffolder handler. +// Phase 5 — Scaffolder handler. // Stamps out a complete TypeAgent agent package from approved artifacts. // Templates cover manifest, handler, schema, grammar, package.json, tsconfigs. @@ -262,7 +262,7 @@ async function handleScaffoldAgent( `**Files created:**\n` + files.map((f) => `- \`${f}\``).join("\n") + subSchemaNote + - `\n\n**Next step:** Phase 6 ΓÇö use \`generateTests\` and \`runTests\` to validate.`, + `\n\n**Next step:** Phase 6 — use \`generateTests\` and \`runTests\` to validate.`, ); } @@ -304,7 +304,7 @@ function buildSubSchemaTs( const unionType = `export type ${groupPascal}Actions =\n | ${actionTypeNames.join("\n | ")};`; - return `// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n// Sub-schema: ${group.name} ΓÇö ${group.description}\n// Auto-generated by the onboarding scaffolder.\n\n${actionBlocks.join("\n\n")}\n\n${unionType}\n`; + return `// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n// Sub-schema: ${group.name} — ${group.description}\n// Auto-generated by the onboarding scaffolder.\n\n${actionBlocks.join("\n\n")}\n\n${unionType}\n`; } // Build a sub-schema grammar file that includes only the rules relevant to @@ -354,7 +354,7 @@ function buildSubSchemaAgr( `from "./actions/${group.name}ActionsSchema.ts"`, ); - return `// Sub-schema grammar: ${group.name} ΓÇö ${group.description}\n// Auto-generated by the onboarding scaffolder.\n\n${content}\n`; + return `// Sub-schema grammar: ${group.name} — ${group.description}\n// Auto-generated by the onboarding scaffolder.\n\n${content}\n`; } async function handleScaffoldPlugin( @@ -399,17 +399,17 @@ async function handleListTemplates(): Promise { `## Available scaffolding templates`, ``, `### Agent templates`, - `- **default** ΓÇö TypeAgent agent package (manifest, handler, schema, grammar)`, + `- **default** — TypeAgent agent package (manifest, handler, schema, grammar)`, ``, `### Plugin templates (use with \`scaffoldPlugin\`)`, ...Object.entries(PLUGIN_TEMPLATES).map( - ([key, t]) => `- **${key}** ΓÇö ${t.description}`, + ([key, t]) => `- **${key}** — ${t.description}`, ), ]; return createActionResultFromMarkdownDisplay(lines.join("\n")); } -// ΓöÇΓöÇΓöÇ Template helpers ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ +// ─── Template helpers ──────────────────────────────────────────────────────── function toPascalCase(str: string): string { return str @@ -535,7 +535,7 @@ async function executeAction( ): Promise { // TODO: implement action handlers return createActionResultFromTextDisplay( - \`Executing \${action.actionName} ΓÇö not yet implemented.\`, + \`Executing \${action.actionName} — not yet implemented.\`, ); } `; @@ -822,7 +822,7 @@ async function writeFile(filePath: string, content: string): Promise { await fs.writeFile(filePath, content, "utf-8"); } -// ΓöÇΓöÇΓöÇ Pattern listing ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ +// ─── Pattern listing ───────────────────────────────────────────────────────── async function handleListPatterns(): Promise { const lines = [ @@ -833,7 +833,7 @@ async function handleListPatterns(): Promise { `| Pattern | When to use | Examples |`, `|---------|-------------|----------|`, `| \`schema-grammar\` | Standard: bounded set of typed actions (default) | weather, photo, list |`, - `| \`external-api\` | REST/OAuth cloud API (MS Graph, Spotify, GitHubΓǪ) | calendar, email, player |`, + `| \`external-api\` | REST/OAuth cloud API (MS Graph, Spotify, GitHub…) | calendar, email, player |`, `| \`llm-streaming\` | Agent calls an LLM and streams partial results | chat, greeting |`, `| \`sub-agent-orchestrator\` | API surface too large for one schema; split into groups | desktop, code, browser |`, `| \`websocket-bridge\` | Automate an app via a host-side plugin over WebSocket | browser, code |`, @@ -845,13 +845,13 @@ async function handleListPatterns(): Promise { return createActionResultFromMarkdownDisplay(lines.join("\n")); } -// ΓöÇΓöÇΓöÇ Pattern-specific handler builders ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ +// ─── Pattern-specific handler builders ─────────────────────────────────────── function buildExternalApiHandler(name: string, pascalName: string): string { return `// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -// Pattern: external-api ΓÇö REST/OAuth cloud API bridge. +// Pattern: external-api — REST/OAuth cloud API bridge. // Implement ${pascalName}Client with your API's authentication and endpoints. import { @@ -912,7 +912,7 @@ async function executeAction( const { client } = context.agentContext; // TODO: map each action to a client.callApi() call. return createActionResultFromTextDisplay( - \`Executing \${action.actionName} ΓÇö not yet implemented.\`, + \`Executing \${action.actionName} — not yet implemented.\`, ); } `; @@ -922,7 +922,7 @@ function buildLlmStreamingHandler(name: string, pascalName: string): string { return `// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -// Pattern: llm-streaming ΓÇö LLM-injected agent with streaming responses. +// Pattern: llm-streaming — LLM-injected agent with streaming responses. // Runs inside the dispatcher process (injected: true in manifest). // Uses aiclient + typechat; streams partial results via streamingActionContext. @@ -974,7 +974,7 @@ function buildSubAgentOrchestratorHandler( return `// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -// Pattern: sub-agent-orchestrator ΓÇö root agent routing to N typed sub-schemas. +// Pattern: sub-agent-orchestrator — root agent routing to N typed sub-schemas. // Add one executeXxxAction() per sub-schema group defined in subActionManifests. // The root executeAction routes by action name (each group owns disjoint names). @@ -1006,7 +1006,7 @@ async function executeAction( // if (isGroupOneAction(action)) return executeGroupOneAction(action, context); // if (isGroupTwoAction(action)) return executeGroupTwoAction(action, context); return createActionResultFromTextDisplay( - \`Executing \${action.actionName} ΓÇö not yet implemented.\`, + \`Executing \${action.actionName} — not yet implemented.\`, ); } @@ -1023,9 +1023,9 @@ function buildWebSocketBridgeHandler(name: string, pascalName: string): string { return `// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -// Pattern: websocket-bridge ΓÇö bidirectional RPC to a host-side plugin. +// Pattern: websocket-bridge — bidirectional RPC to a host-side plugin. // The agent owns a WebSocketServer; the host plugin connects as the client. -// Commands flow TypeAgent ΓåÆ WebSocket ΓåÆ plugin ΓåÆ response. +// Commands flow TypeAgent → WebSocket → plugin → response. import { ActionContext, @@ -1136,7 +1136,7 @@ function buildStateMachineHandler(name: string, pascalName: string): string { return `// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -// Pattern: state-machine ΓÇö multi-phase disk-persisted workflow. +// Pattern: state-machine — multi-phase disk-persisted workflow. // State is stored in ~/.typeagent/${name}//state.json. // Each phase must be approved before the next begins. @@ -1213,7 +1213,7 @@ async function executeAction( // case "approvePhase": return handleApprove(action.parameters.workflowId, action.parameters.phase); // case "getStatus": return handleStatus(action.parameters.workflowId); return createActionResultFromMarkdownDisplay( - \`Executing \${action.actionName} ΓÇö not yet implemented.\`, + \`Executing \${action.actionName} — not yet implemented.\`, ); } `; @@ -1223,7 +1223,7 @@ function buildNativePlatformHandler(name: string, pascalName: string): string { return `// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -// Pattern: native-platform ΓÇö OS/device APIs via child_process or SDK. +// Pattern: native-platform — OS/device APIs via child_process or SDK. // No cloud dependency. Handle platform differences in executeCommand(). import { @@ -1293,7 +1293,7 @@ function buildViewUiHandler(name: string, pascalName: string): string { return `// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -// Pattern: view-ui ΓÇö web view renderer with IPC handler. +// Pattern: view-ui — web view renderer with IPC handler. // Opens a local HTTP server serving site/ and communicates via display APIs. // The actual UX lives in the site/ directory. @@ -1349,7 +1349,7 @@ async function executeAction( ): Promise { // Push state changes to the view via HTML display updates. return createActionResultFromHtmlDisplay( - \`

Executing \${action.actionName} ΓÇö not yet implemented.

\`, + \`

Executing \${action.actionName} — not yet implemented.

\`, ); } `; @@ -1359,7 +1359,7 @@ function buildCommandHandlerTemplate(name: string, pascalName: string): string { return `// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -// Pattern: command-handler ΓÇö direct dispatch via a handlers map. +// Pattern: command-handler — direct dispatch via a handlers map. // Suited for settings-style agents with a small number of well-known commands. import { AppAgent, ActionResult } from "@typeagent/agent-sdk"; @@ -1393,7 +1393,6 @@ function getCommandInterface( } `; } - function flagToCamel(flag: string): string { return flag .replace(/^--?/, "") @@ -1489,4 +1488,5 @@ export function instantiate(): AppAgent { }; } `; -} \ No newline at end of file +} + From 90141a0a7b272cf2bf95243dc93d9a0ccc9d8a74 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Tue, 14 Apr 2026 12:37:04 -0700 Subject: [PATCH 24/34] Address PR review comments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix path.resolve to use path.dirname() for correct directory resolution - Use Date.now() suffix for unique test tmpDir per run - Fix emojiChar comment to match actual default (🔎) - Fix maxDepth comment to reflect default of 4 - Fix codegen: use === true for booleans, !== undefined/null for values Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../agents/onboarding/src/discovery/discoverySchema.ts | 2 +- .../agents/onboarding/src/scaffolder/scaffolderHandler.ts | 4 ++-- .../agents/onboarding/src/scaffolder/scaffolderSchema.ts | 2 +- ts/packages/agents/onboarding/src/testing/runTests.ts | 5 +++-- ts/packages/agents/onboarding/src/testing/testingHandler.ts | 4 ++-- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ts/packages/agents/onboarding/src/discovery/discoverySchema.ts b/ts/packages/agents/onboarding/src/discovery/discoverySchema.ts index 1b6e7096f..5455c264f 100644 --- a/ts/packages/agents/onboarding/src/discovery/discoverySchema.ts +++ b/ts/packages/agents/onboarding/src/discovery/discoverySchema.ts @@ -37,7 +37,7 @@ export type CrawlCliHelpAction = { integrationName: string; // The CLI command to crawl (e.g. "gh", "az", "kubectl") command: string; - // Maximum recursion depth into subcommands (omit for unlimited) + // Maximum recursion depth into subcommands (default: 4) maxDepth?: number; }; }; diff --git a/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts b/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts index 2dc155a76..415dd3af6 100644 --- a/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts +++ b/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts @@ -1415,11 +1415,11 @@ function buildCliHandler( const flag = p.name.startsWith("-") ? p.name : `--${p.name}`; if (p.type === "boolean") { flagLines.push( - ` if (params.${camel}) args.push("${flag}");`, + ` if (params.${camel} === true) args.push("${flag}");`, ); } else { flagLines.push( - ` if (params.${camel}) args.push("${flag}", String(params.${camel}));`, + ` if (params.${camel} !== undefined && params.${camel} !== null) args.push("${flag}", String(params.${camel}));`, ); } } diff --git a/ts/packages/agents/onboarding/src/scaffolder/scaffolderSchema.ts b/ts/packages/agents/onboarding/src/scaffolder/scaffolderSchema.ts index f435fca0c..2a0aa484c 100644 --- a/ts/packages/agents/onboarding/src/scaffolder/scaffolderSchema.ts +++ b/ts/packages/agents/onboarding/src/scaffolder/scaffolderSchema.ts @@ -28,7 +28,7 @@ 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 "🔌") + // 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 index eb36515a2..db6c4dcf1 100644 --- a/ts/packages/agents/onboarding/src/testing/runTests.ts +++ b/ts/packages/agents/onboarding/src/testing/runTests.ts @@ -11,7 +11,8 @@ 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 envPath = path.resolve(__filename, "../../../../../../.env"); +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(); @@ -27,7 +28,7 @@ if (fs.existsSync(envPath)) { const integrationName = process.argv[2] || "github-cli"; -const AGENTS_DIR = path.resolve(__filename, "../../../../../../packages/agents"); +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"); diff --git a/ts/packages/agents/onboarding/src/testing/testingHandler.ts b/ts/packages/agents/onboarding/src/testing/testingHandler.ts index 3b18ca3a1..34f6d51b6 100644 --- a/ts/packages/agents/onboarding/src/testing/testingHandler.ts +++ b/ts/packages/agents/onboarding/src/testing/testingHandler.ts @@ -536,7 +536,7 @@ function createCapturingClientIO(buffer: string[]): ClientIO { // the generated agent (which would create a circular dependency via // default-agent-provider). const AGENTS_DIR = path.resolve( - fileURLToPath(import.meta.url), + path.dirname(fileURLToPath(import.meta.url)), "../../../../../../packages/agents", ); @@ -560,7 +560,7 @@ async function createTestDispatcher(integrationName: string) { // 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"); + const tmpDir = path.join(instanceDir, "onboarding-test-tmp-" + Date.now()); const dispatcher = await createDispatcher("onboarding-test-runner", { appAgentProviders, From e3429aba88dbe82cea48193c60e4dedd2263301e Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Tue, 14 Apr 2026 13:08:16 -0700 Subject: [PATCH 25/34] Fix prettier formatting for CI lint Run prettier --write on onboarding-agent and github-cli files to fix code style issues detected by build-ts lint step. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ts/packages/agents/github-cli/README.md | 24 +- ts/packages/agents/github-cli/package.json | 2 +- .../github-cli/src/github-cliActionHandler.ts | 162 ++-- .../github-cli/src/github-cliManifest.json | 2 +- .../agents/github-cli/src/github-cliSchema.ts | 826 ++++++++---------- .../agents/github-cli/src/tsconfig.json | 6 +- ts/packages/agents/github-cli/tsconfig.json | 2 +- ts/packages/agents/onboarding/README.md | 1 + .../src/discovery/discoveryHandler.ts | 12 +- .../src/scaffolder/scaffolderHandler.ts | 9 +- .../agents/onboarding/src/testing/runTests.ts | 116 ++- .../onboarding/src/testing/testingHandler.ts | 6 +- 12 files changed, 620 insertions(+), 548 deletions(-) diff --git a/ts/packages/agents/github-cli/README.md b/ts/packages/agents/github-cli/README.md index 829462810..092e3dca8 100644 --- a/ts/packages/agents/github-cli/README.md +++ b/ts/packages/agents/github-cli/README.md @@ -9,18 +9,18 @@ ## 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 | +| 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 diff --git a/ts/packages/agents/github-cli/package.json b/ts/packages/agents/github-cli/package.json index deb67cc94..2f33a5304 100644 --- a/ts/packages/agents/github-cli/package.json +++ b/ts/packages/agents/github-cli/package.json @@ -27,4 +27,4 @@ "rimraf": "^6.0.1", "typescript": "~5.4.5" } -} \ No newline at end of file +} diff --git a/ts/packages/agents/github-cli/src/github-cliActionHandler.ts b/ts/packages/agents/github-cli/src/github-cliActionHandler.ts index 433d30752..3cfc89934 100644 --- a/ts/packages/agents/github-cli/src/github-cliActionHandler.ts +++ b/ts/packages/agents/github-cli/src/github-cliActionHandler.ts @@ -29,10 +29,7 @@ async function initializeAgentContext(): Promise { } // Run a gh CLI command and return stdout. Throws on non-zero exit. -async function runGh( - args: string[], - timeoutMs = 30_000, -): Promise { +async function runGh(args: string[], timeoutMs = 30_000): Promise { const { stdout } = await execFileAsync("gh", args, { timeout: timeoutMs, maxBuffer: 1024 * 1024, @@ -110,8 +107,7 @@ function buildArgs( case "gistCreate": { const args = ["gist", "create"]; if (p.public) args.push("--public"); - if (p.description) - args.push("--desc", String(p.description)); + if (p.description) args.push("--desc", String(p.description)); return args; } case "gistDelete": { @@ -161,7 +157,10 @@ function buildArgs( 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"); + args.push( + "--json", + "number,title,state,body,author,labels,assignees,comments,url,createdAt,closedAt", + ); return args; } @@ -192,8 +191,7 @@ function buildArgs( case "prMerge": { const args = ["pr", "merge"]; if (p.number) args.push(String(p.number)); - if (p.mergeMethod) - args.push(`--${String(p.mergeMethod)}`); + if (p.mergeMethod) args.push(`--${String(p.mergeMethod)}`); return args; } case "prList": { @@ -203,14 +201,20 @@ function buildArgs( 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"); + 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"); + args.push( + "--json", + "number,title,state,body,author,labels,url,createdAt,headRefName,baseRefName,isDraft,additions,deletions,changedFiles", + ); return args; } case "prCheckout": { @@ -267,8 +271,7 @@ function buildArgs( case "repoClone": { const args = ["repo", "clone"]; if (p.repo) args.push(String(p.repo)); - if (p.branch) - args.push("--", "--branch", String(p.branch)); + if (p.branch) args.push("--", "--branch", String(p.branch)); return args; } case "repoDelete": { @@ -280,7 +283,10 @@ function buildArgs( 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"); + args.push( + "--json", + "name,owner,description,stargazerCount,forkCount,watchers,defaultBranchRef,createdAt,updatedAt,url,primaryLanguage,visibility", + ); return args; } case "repoFork": { @@ -340,7 +346,10 @@ function buildArgs( 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) { + if ( + !endpoint.startsWith("/") && + endpoint.split("/").length === 2 + ) { endpoint = `/repos/${endpoint}/contributors`; } if (p.limit) { @@ -405,7 +414,10 @@ function buildArgs( case "searchRepos": { const args = ["search", "repos"]; if (p.query) args.push(String(p.query)); - args.push("--json", "fullName,description,stargazersCount,url,updatedAt"); + args.push( + "--json", + "fullName,description,stargazersCount,url,updatedAt", + ); return args; } case "secretCreate": { @@ -537,7 +549,10 @@ function formatStatusOutput(raw: string): 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"))) { + if ( + items.length === 0 || + (items.length === 1 && items[0].includes("Nothing here")) + ) { result.push(" *Nothing here* 🎉\n"); continue; } @@ -546,14 +561,22 @@ function formatStatusOutput(raw: string): string { 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*(.*)/); + 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}`); + 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}`); + 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}`); @@ -566,16 +589,20 @@ function formatStatusOutput(raw: string): string { // Format a single issue view from JSON into rich markdown function formatIssueView(data: Record): string { - const author = data.author - ? formatValue(data.author) - : "unknown"; + const author = data.author ? formatValue(data.author) : "unknown"; const labels = Array.isArray(data.labels) - ? (data.labels as Record[]).map((l) => `\`${l.name}\``).join(" ") + ? (data.labels as Record[]) + .map((l) => `\`${l.name}\``) + .join(" ") : ""; const assignees = Array.isArray(data.assignees) - ? (data.assignees as Record[]).map((a) => formatValue(a)).join(", ") + ? (data.assignees as Record[]) + .map((a) => formatValue(a)) + .join(", ") : ""; - const commentCount = Array.isArray(data.comments) ? data.comments.length : data.comments ?? 0; + 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*" : ""}` @@ -588,7 +615,8 @@ function formatIssueView(data: Record): string { 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)}`; + if (data.closedAt) + header += ` · **Closed:** ${String(data.closedAt).slice(0, 10)}`; return header + bodySection; } @@ -597,7 +625,9 @@ function formatIssueView(data: Record): string { 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(" ") + ? (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) : ""; @@ -608,7 +638,8 @@ function formatPrView(data: Record): string { 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 (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`; @@ -629,7 +660,9 @@ function formatListResults( return items .map((i) => { const labels = Array.isArray(i.labels) - ? (i.labels as Record[]).map((l) => l.name).join(", ") + ? (i.labels as Record[]) + .map((l) => l.name) + .join(", ") : ""; const labelStr = labels ? ` \`${labels}\`` : ""; return `- [#${i.number} ${i.title}](${i.url}) — ${i.state}${labelStr}`; @@ -652,7 +685,10 @@ function formatListResults( if (actionName === "searchRepos" && "fullName" in items[0]) { return items .map((r) => { - const stars = (r.stargazersCount || r.stargazerCount) ? ` ⭐ ${r.stargazersCount ?? r.stargazerCount}` : ""; + const stars = + r.stargazersCount || r.stargazerCount + ? ` ⭐ ${r.stargazersCount ?? r.stargazerCount}` + : ""; const desc = r.description ? ` — ${r.description}` : ""; return `- [${r.fullName}](${r.url})${stars}${desc}`; }) @@ -781,22 +817,46 @@ async function executeAction( "✅ **No matching Dependabot alerts found!**", ); } - return createActionResultFromTextDisplay("No results 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; - const sev = String(adv.severity ?? "unknown").toUpperCase(); - const pkg = a.dependency - ? (a.dependency as Record).package - ? ((a.dependency as Record).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 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}`, @@ -806,11 +866,15 @@ async function executeAction( // 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`) + .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`; + const header = + arr.length === 1 + ? "Top contributor" + : `Top ${arr.length} contributors`; return createActionResultFromMarkdownDisplay( `**${header}**\n\n${rows}`, ); diff --git a/ts/packages/agents/github-cli/src/github-cliManifest.json b/ts/packages/agents/github-cli/src/github-cliManifest.json index 604e85285..4aca11097 100644 --- a/ts/packages/agents/github-cli/src/github-cliManifest.json +++ b/ts/packages/agents/github-cli/src/github-cliManifest.json @@ -9,4 +9,4 @@ "grammarFile": "../dist/github-cliSchema.ag.json", "schemaType": "GithubCliActions" } -} \ No newline at end of file +} diff --git a/ts/packages/agents/github-cli/src/github-cliSchema.ts b/ts/packages/agents/github-cli/src/github-cliSchema.ts index 1258632e1..682871865 100644 --- a/ts/packages/agents/github-cli/src/github-cliSchema.ts +++ b/ts/packages/agents/github-cli/src/github-cliSchema.ts @@ -2,621 +2,569 @@ // 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; + | 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; - }; + actionName: "authLogin"; + parameters: { + hostname?: string; + + web?: boolean; + + token?: string; + }; }; export type AuthLogoutAction = { - actionName: "authLogout"; - parameters: { - - hostname?: string; - }; + actionName: "authLogout"; + parameters: { + hostname?: string; + }; }; export type AuthStatusAction = { - actionName: "authStatus"; - parameters: { - - hostname?: string; - - showToken?: boolean; - }; + actionName: "authStatus"; + parameters: { + hostname?: string; + + showToken?: boolean; + }; }; export type BrowseRepoAction = { - actionName: "browseRepo"; - parameters: { - - branch?: string; - - commit?: string; - - tag?: string; - }; + actionName: "browseRepo"; + parameters: { + branch?: string; + + commit?: string; + + tag?: string; + }; }; export type BrowseIssueAction = { - actionName: "browseIssue"; - parameters: { - - number?: number; - }; + actionName: "browseIssue"; + parameters: { + number?: number; + }; }; export type BrowsePrAction = { - actionName: "browsePr"; - parameters: { - - number?: number; - }; + actionName: "browsePr"; + parameters: { + number?: number; + }; }; export type CodespaceCreateAction = { - actionName: "codespaceCreate"; - parameters: { - - repo?: string; - - branch?: string; - - location?: string; - }; + actionName: "codespaceCreate"; + parameters: { + repo?: string; + + branch?: string; + + location?: string; + }; }; export type CodespaceDeleteAction = { - actionName: "codespaceDelete"; - parameters: { - - name?: string; - }; + actionName: "codespaceDelete"; + parameters: { + name?: string; + }; }; export type CodespaceListAction = { - actionName: "codespaceList"; - parameters: {}; + actionName: "codespaceList"; + parameters: {}; }; export type GistCreateAction = { - actionName: "gistCreate"; - parameters: { - - public?: boolean; - - description?: string; - }; + actionName: "gistCreate"; + parameters: { + public?: boolean; + + description?: string; + }; }; export type GistDeleteAction = { - actionName: "gistDelete"; - parameters: { - - id?: string; - }; + actionName: "gistDelete"; + parameters: { + id?: string; + }; }; export type GistListAction = { - actionName: "gistList"; - parameters: { - - public?: boolean; - }; + actionName: "gistList"; + parameters: { + public?: boolean; + }; }; export type IssueCreateAction = { - actionName: "issueCreate"; - parameters: { - // owner/repo - repo?: string; - - title?: string; - - body?: string; - - assignee?: string; - - label?: string; - }; + actionName: "issueCreate"; + parameters: { + // owner/repo + repo?: string; + + title?: string; + + body?: string; + + assignee?: string; + + label?: string; + }; }; export type IssueCloseAction = { - actionName: "issueClose"; - parameters: { - - number?: number; - }; + actionName: "issueClose"; + parameters: { + number?: number; + }; }; export type IssueReopenAction = { - actionName: "issueReopen"; - parameters: { - - number?: number; - }; + actionName: "issueReopen"; + parameters: { + number?: number; + }; }; export type IssueListAction = { - actionName: "issueList"; - parameters: { - - repo?: string; - - state?: string; - - label?: string; - - assignee?: string; - - limit?: number; - }; + actionName: "issueList"; + parameters: { + repo?: string; + + state?: string; + + label?: string; + + assignee?: string; + + limit?: number; + }; }; export type IssueViewAction = { - actionName: "issueView"; - parameters: { - - number?: number; - - repo?: string; - }; + actionName: "issueView"; + parameters: { + number?: number; + + repo?: string; + }; }; export type OrgListAction = { - actionName: "orgList"; - parameters: {}; + actionName: "orgList"; + parameters: {}; }; export type OrgViewAction = { - actionName: "orgView"; - parameters: { - - name?: string; - }; + actionName: "orgView"; + parameters: { + name?: string; + }; }; export type PrCreateAction = { - actionName: "prCreate"; - parameters: { - - title?: string; - - body?: string; - - base?: string; - - head?: string; - - draft?: boolean; - }; + actionName: "prCreate"; + parameters: { + title?: string; + + body?: string; + + base?: string; + + head?: string; + + draft?: boolean; + }; }; export type PrCloseAction = { - actionName: "prClose"; - parameters: { - - number?: number; - }; + actionName: "prClose"; + parameters: { + number?: number; + }; }; export type PrMergeAction = { - actionName: "prMerge"; - parameters: { - - number?: number; - - mergeMethod?: string; - }; + actionName: "prMerge"; + parameters: { + number?: number; + + mergeMethod?: string; + }; }; export type PrListAction = { - actionName: "prList"; - parameters: { - - repo?: string; - - state?: string; - - label?: string; - - assignee?: string; - - limit?: number; - }; + actionName: "prList"; + parameters: { + repo?: string; + + state?: string; + + label?: string; + + assignee?: string; + + limit?: number; + }; }; export type PrViewAction = { - actionName: "prView"; - parameters: { - - number?: number; - - repo?: string; - }; + actionName: "prView"; + parameters: { + number?: number; + + repo?: string; + }; }; export type PrCheckoutAction = { - actionName: "prCheckout"; - parameters: { - - number?: number; - - branch?: string; - }; + actionName: "prCheckout"; + parameters: { + number?: number; + + branch?: string; + }; }; export type ProjectCreateAction = { - actionName: "projectCreate"; - parameters: { - - name?: string; - - body?: string; - }; + actionName: "projectCreate"; + parameters: { + name?: string; + + body?: string; + }; }; export type ProjectDeleteAction = { - actionName: "projectDelete"; - parameters: { - - id?: string; - }; + actionName: "projectDelete"; + parameters: { + id?: string; + }; }; export type ProjectListAction = { - actionName: "projectList"; - parameters: {}; + actionName: "projectList"; + parameters: {}; }; export type ReleaseCreateAction = { - actionName: "releaseCreate"; - parameters: { - - tag?: string; - - title?: string; - - notes?: string; - }; + actionName: "releaseCreate"; + parameters: { + tag?: string; + + title?: string; + + notes?: string; + }; }; export type ReleaseDeleteAction = { - actionName: "releaseDelete"; - parameters: { - - id?: string; - }; + actionName: "releaseDelete"; + parameters: { + id?: string; + }; }; export type ReleaseListAction = { - actionName: "releaseList"; - parameters: { - - repo?: string; - }; + actionName: "releaseList"; + parameters: { + repo?: string; + }; }; export type RepoCreateAction = { - actionName: "repoCreate"; - parameters: { - - name?: string; - - description?: string; - - public?: boolean; - - private?: boolean; - }; + actionName: "repoCreate"; + parameters: { + name?: string; + + description?: string; + + public?: boolean; + + private?: boolean; + }; }; export type RepoCloneAction = { - actionName: "repoClone"; - parameters: { - - repo?: string; - - branch?: string; - }; + actionName: "repoClone"; + parameters: { + repo?: string; + + branch?: string; + }; }; export type RepoDeleteAction = { - actionName: "repoDelete"; - parameters: { - - repo?: string; - }; + actionName: "repoDelete"; + parameters: { + repo?: string; + }; }; export type CacheListAction = { - actionName: "cacheList"; - parameters: {}; + actionName: "cacheList"; + parameters: {}; }; export type CacheDeleteAction = { - actionName: "cacheDelete"; - parameters: { - - id?: string; - }; + actionName: "cacheDelete"; + parameters: { + id?: string; + }; }; export type RunViewAction = { - actionName: "runView"; - parameters: { - - id?: string; - }; + actionName: "runView"; + parameters: { + id?: string; + }; }; export type WorkflowViewAction = { - actionName: "workflowView"; - parameters: { - - id?: string; - }; + actionName: "workflowView"; + parameters: { + id?: string; + }; }; export type AgentTaskRunAction = { - actionName: "agentTaskRun"; - parameters: { - - task?: string; - }; + actionName: "agentTaskRun"; + parameters: { + task?: string; + }; }; export type AliasSetAction = { - actionName: "aliasSet"; - parameters: { - - name?: string; - - command?: string; - }; + actionName: "aliasSet"; + parameters: { + name?: string; + + command?: string; + }; }; export type ApiRequestAction = { - actionName: "apiRequest"; - parameters: { - - method?: string; - - endpoint?: string; - - limit?: number; - }; + actionName: "apiRequest"; + parameters: { + method?: string; + + endpoint?: string; + + limit?: number; + }; }; export type AttestationCreateAction = { - actionName: "attestationCreate"; - parameters: { - - artifact?: string; - - type?: string; - }; + actionName: "attestationCreate"; + parameters: { + artifact?: string; + + type?: string; + }; }; export type CompletionGenerateAction = { - actionName: "completionGenerate"; - parameters: { - - shell?: string; - }; + actionName: "completionGenerate"; + parameters: { + shell?: string; + }; }; export type ConfigSetAction = { - actionName: "configSet"; - parameters: { - - name?: string; - - value?: string; - }; + actionName: "configSet"; + parameters: { + name?: string; + + value?: string; + }; }; export type CopilotRunAction = { - actionName: "copilotRun"; - parameters: { - - task?: string; - }; + actionName: "copilotRun"; + parameters: { + task?: string; + }; }; export type ExtensionInstallAction = { - actionName: "extensionInstall"; - parameters: { - - name?: string; - }; + actionName: "extensionInstall"; + parameters: { + name?: string; + }; }; export type GpgKeyAddAction = { - actionName: "gpgKeyAdd"; - parameters: { - - key?: string; - }; + actionName: "gpgKeyAdd"; + parameters: { + key?: string; + }; }; export type LabelCreateAction = { - actionName: "labelCreate"; - parameters: { - - name?: string; - - color?: string; - }; + actionName: "labelCreate"; + parameters: { + name?: string; + + color?: string; + }; }; export type LicensesViewAction = { - actionName: "licensesView"; - parameters: {}; + actionName: "licensesView"; + parameters: {}; }; export type PreviewExecuteAction = { - actionName: "previewExecute"; - parameters: { - - feature?: string; - }; + actionName: "previewExecute"; + parameters: { + feature?: string; + }; }; export type RulesetViewAction = { - actionName: "rulesetView"; - parameters: { - - repo?: string; - }; + actionName: "rulesetView"; + parameters: { + repo?: string; + }; }; export type RepoViewAction = { - actionName: "repoView"; - parameters: { - - repo?: string; - - field?: string; - }; + actionName: "repoView"; + parameters: { + repo?: string; + + field?: string; + }; }; export type RepoForkAction = { - actionName: "repoFork"; - parameters: { - - repo?: string; - - name?: string; - }; + actionName: "repoFork"; + parameters: { + repo?: string; + + name?: string; + }; }; export type StarRepoAction = { - actionName: "starRepo"; - parameters: { - - repo?: string; - - unstar?: boolean; - }; + actionName: "starRepo"; + parameters: { + repo?: string; + + unstar?: boolean; + }; }; export type SearchReposAction = { - actionName: "searchRepos"; - parameters: { - - query?: string; - }; + actionName: "searchRepos"; + parameters: { + query?: string; + }; }; export type SecretCreateAction = { - actionName: "secretCreate"; - parameters: { - - name?: string; - - value?: string; - }; + actionName: "secretCreate"; + parameters: { + name?: string; + + value?: string; + }; }; export type SshKeyAddAction = { - actionName: "sshKeyAdd"; - parameters: { - - key?: string; - }; + actionName: "sshKeyAdd"; + parameters: { + key?: string; + }; }; export type StatusPrintAction = { - actionName: "statusPrint"; - parameters: {}; + actionName: "statusPrint"; + parameters: {}; }; export type VariableCreateAction = { - actionName: "variableCreate"; - parameters: { - - name?: string; - - value?: string; - }; + 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; - }; -}; \ No newline at end of file + 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 index 4102207cb..85efcd566 100644 --- a/ts/packages/agents/github-cli/src/tsconfig.json +++ b/ts/packages/agents/github-cli/src/tsconfig.json @@ -5,10 +5,8 @@ "rootDir": ".", "outDir": "../dist" }, - "include": [ - "./**/*" - ], + "include": ["./**/*"], "ts-node": { "esm": true } -} \ No newline at end of file +} diff --git a/ts/packages/agents/github-cli/tsconfig.json b/ts/packages/agents/github-cli/tsconfig.json index cfc403dee..1e14d73b9 100644 --- a/ts/packages/agents/github-cli/tsconfig.json +++ b/ts/packages/agents/github-cli/tsconfig.json @@ -12,4 +12,4 @@ "ts-node": { "esm": true } -} \ No newline at end of file +} diff --git a/ts/packages/agents/onboarding/README.md b/ts/packages/agents/onboarding/README.md index cb53aed9e..01ecd9ad9 100644 --- a/ts/packages/agents/onboarding/README.md +++ b/ts/packages/agents/onboarding/README.md @@ -58,6 +58,7 @@ 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 diff --git a/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts b/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts index e320be1d0..da75f05e8 100644 --- a/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts +++ b/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts @@ -493,10 +493,14 @@ async function runHelp( // Try --help first, fall back to -h for (const flag of ["--help", "-h"]) { try { - const { stdout, stderr } = await execFileAsync(command, [...args, flag], { - timeout: 15_000, - windowsHide: true, - }); + 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) { diff --git a/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts b/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts index 415dd3af6..6c7ffa233 100644 --- a/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts +++ b/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts @@ -102,7 +102,9 @@ async function handleScaffoldAgent( // Load discovery data to determine handler strategy (CLI vs stub) const apiSurface = await readArtifactJson( - integrationName, "discovery", "api-surface.json", + integrationName, + "discovery", + "api-surface.json", ); await updatePhase(integrationName, "scaffolder", { status: "in-progress" }); @@ -475,8 +477,8 @@ function buildHandler( apiSurface?: ApiSurface, ): string { // If discovery data contains CLI actions, generate a CLI handler - const cliActions = apiSurface?.actions?.filter( - (a) => a.sourceUrl?.startsWith("cli:"), + const cliActions = apiSurface?.actions?.filter((a) => + a.sourceUrl?.startsWith("cli:"), ); if (cliActions && cliActions.length > 0) { const cliCommand = cliActions[0].sourceUrl!.split(":")[1]; @@ -1489,4 +1491,3 @@ export function instantiate(): AppAgent { } `; } - diff --git a/ts/packages/agents/onboarding/src/testing/runTests.ts b/ts/packages/agents/onboarding/src/testing/runTests.ts index db6c4dcf1..71009f461 100644 --- a/ts/packages/agents/onboarding/src/testing/runTests.ts +++ b/ts/packages/agents/onboarding/src/testing/runTests.ts @@ -2,7 +2,10 @@ // 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 { + createNpmAppAgentProvider, + getFsStorageProvider, +} from "dispatcher-node-providers"; import { getInstanceDir } from "agent-dispatcher/helpers/data"; import path from "node:path"; import { fileURLToPath } from "node:url"; @@ -20,7 +23,10 @@ if (fs.existsSync(envPath)) { const eqIdx = trimmed.indexOf("="); if (eqIdx < 0) continue; const key = trimmed.slice(0, eqIdx).trim(); - const val = trimmed.slice(eqIdx + 1).trim().replace(/^["']|["']$/g, ""); + const val = trimmed + .slice(eqIdx + 1) + .trim() + .replace(/^["']|["']$/g, ""); if (!process.env[key]) process.env[key] = val; } console.log(`Loaded env from ${envPath}`); @@ -29,7 +35,12 @@ if (fs.existsSync(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 WORKSPACE_DIR = path.join( + os.homedir(), + ".typeagent", + "onboarding", + integrationName, +); const testCasesFile = path.join(WORKSPACE_DIR, "testing", "test-cases.json"); if (!fs.existsSync(testCasesFile)) { @@ -46,16 +57,27 @@ 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, + 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, + 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(); @@ -65,14 +87,23 @@ const tmpDir = path.join(instanceDir, "onboarding-test-tmp-" + Date.now()); 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)); + 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); } @@ -80,7 +111,11 @@ try { console.log("Creating test dispatcher..."); const dispatcher = await createDispatcher("onboarding-test-runner", { appAgentProviders: [provider], - agents: { schemas: [integrationName], actions: [integrationName], commands: ["dispatcher", integrationName] }, + agents: { + schemas: [integrationName], + actions: [integrationName], + commands: ["dispatcher", integrationName], + }, explainer: { enabled: false }, cache: { enabled: true }, collectCommandResult: true, @@ -105,10 +140,16 @@ for (let i = 0; i < testCases.length; i++) { expectedActionName: tc.expectedActionName, actualActionName: actual, passed: ok, - ...(ok ? {} : { error: `Expected "${tc.expectedActionName}", got "${actual ?? "none"}"` }), + ...(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})`); + console.log( + ` FAIL [${i + 1}/${testCases.length}]: "${tc.phrase.substring(0, 60)}" → ${actual ?? "none"} (exp: ${tc.expectedActionName})`, + ); } } catch (err: any) { results.push({ @@ -117,23 +158,34 @@ for (let i = 0; i < testCases.length; i++) { passed: false, error: err?.message ?? String(err), }); - console.log(` ERROR [${i+1}/${testCases.length}]: "${tc.phrase.substring(0,60)}" → ${err?.message?.substring(0,80)}`); + 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`); +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)); +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(); diff --git a/ts/packages/agents/onboarding/src/testing/testingHandler.ts b/ts/packages/agents/onboarding/src/testing/testingHandler.ts index 34f6d51b6..1df38e9c1 100644 --- a/ts/packages/agents/onboarding/src/testing/testingHandler.ts +++ b/ts/packages/agents/onboarding/src/testing/testingHandler.ts @@ -564,7 +564,11 @@ async function createTestDispatcher(integrationName: string) { const dispatcher = await createDispatcher("onboarding-test-runner", { appAgentProviders, - agents: { schemas: [integrationName], actions: [integrationName], commands: ["dispatcher", integrationName] }, + agents: { + schemas: [integrationName], + actions: [integrationName], + commands: ["dispatcher", integrationName], + }, explainer: { enabled: false }, // Cache must be enabled for grammar matching to work. cache: { enabled: true }, From 60b0bba225ca6c5fd3e24113dde45104eb1a0033 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Tue, 14 Apr 2026 14:54:54 -0700 Subject: [PATCH 26/34] Fix repo policy: copyright header, package.json metadata and sort - Add copyright header to runTests.ts - Add homepage and repository fields to github-cli package.json - Sort github-cli and defaultAgentProvider package.json keys - Fix alphabetical ordering of github-cli-agent dependency Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ts/packages/agents/github-cli/package.json | 8 +++++++- ts/packages/agents/onboarding/src/testing/runTests.ts | 3 +++ ts/packages/defaultAgentProvider/package.json | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/ts/packages/agents/github-cli/package.json b/ts/packages/agents/github-cli/package.json index 2f33a5304..6581f6bf1 100644 --- a/ts/packages/agents/github-cli/package.json +++ b/ts/packages/agents/github-cli/package.json @@ -3,6 +3,12 @@ "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", @@ -11,8 +17,8 @@ "./agent/handlers": "./dist/github-cliActionHandler.js" }, "scripts": { - "asc": "asc -i ./src/github-cliSchema.ts -o ./dist/github-cliSchema.pas.json -t GithubCliActions", "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" diff --git a/ts/packages/agents/onboarding/src/testing/runTests.ts b/ts/packages/agents/onboarding/src/testing/runTests.ts index 71009f461..2a0a83a67 100644 --- a/ts/packages/agents/onboarding/src/testing/runTests.ts +++ b/ts/packages/agents/onboarding/src/testing/runTests.ts @@ -1,3 +1,6 @@ +// 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 diff --git a/ts/packages/defaultAgentProvider/package.json b/ts/packages/defaultAgentProvider/package.json index be5c655f7..812522b88 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:*", @@ -66,7 +67,6 @@ "montage-agent": "workspace:*", "music": "workspace:*", "music-local": "workspace:*", - "github-cli-agent": "workspace:*", "onboarding-agent": "workspace:*", "photo-agent": "workspace:*", "proper-lockfile": "^4.1.2", From ff3b669b95066341cdb48e23e316918704c6bd30 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Tue, 14 Apr 2026 15:09:22 -0700 Subject: [PATCH 27/34] Extract buildCliHandler into separate cliHandlerTemplate.ts Move CLI handler template generator (buildCliHandler + flagToCamel) from scaffolderHandler.ts into its own file for easier maintenance per PR review. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../src/scaffolder/cliHandlerTemplate.ts | 105 ++++++++++++++++++ .../src/scaffolder/scaffolderHandler.ts | 102 +---------------- 2 files changed, 107 insertions(+), 100 deletions(-) create mode 100644 ts/packages/agents/onboarding/src/scaffolder/cliHandlerTemplate.ts 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 000000000..278c7d6e8 --- /dev/null +++ b/ts/packages/agents/onboarding/src/scaffolder/cliHandlerTemplate.ts @@ -0,0 +1,105 @@ +// 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. + +import type { DiscoveredAction } from "../discovery/discoveryHandler.js"; + +function flagToCamel(flag: string): string { + return flag + .replace(/^--?/, "") + .replace(/-([a-z])/g, (_, c) => c.toUpperCase()); +} + +export function buildCliHandler( + name: string, + pascalName: string, + cliCommand: string, + 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 `// 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 { ${pascalName}Actions } from "./${name}Schema.js"; + +const execFileAsync = promisify(execFile); + +async function runCli(...cliArgs: string[]): Promise { + const { stdout, stderr } = await execFileAsync("${cliCommand}", cliArgs, { + timeout: 30_000, + }); + return (stdout || stderr).trim(); +} + +function buildArgs(action: TypeAgentAction<${pascalName}Actions>): string[] { + const args: string[] = []; + const params = action.parameters as Record; + switch (action.actionName) { +${cases.join("\n")} + default: + throw new Error(\`Unknown action: \${action.actionName}\`); + } + return args; +} + +export function instantiate(): AppAgent { + return { + executeAction: async ( + action: TypeAgentAction<${pascalName}Actions>, + context: ActionContext<${pascalName}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/scaffolderHandler.ts b/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts index 6c7ffa233..c571c2937 100644 --- a/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts +++ b/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts @@ -19,10 +19,8 @@ import { readArtifact, readArtifactJson, } from "../lib/workspace.js"; -import type { - ApiSurface, - DiscoveredAction, -} from "../discovery/discoveryHandler.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"; @@ -1395,99 +1393,3 @@ function getCommandInterface( } `; } -function flagToCamel(flag: string): string { - return flag - .replace(/^--?/, "") - .replace(/-([a-z])/g, (_, c) => c.toUpperCase()); -} - -function buildCliHandler( - name: string, - pascalName: string, - cliCommand: string, - 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 `// 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 { ${pascalName}Actions } from "./${name}Schema.js"; - -const execFileAsync = promisify(execFile); - -async function runCli(...cliArgs: string[]): Promise { - const { stdout, stderr } = await execFileAsync("${cliCommand}", cliArgs, { - timeout: 30_000, - }); - return (stdout || stderr).trim(); -} - -function buildArgs(action: TypeAgentAction<${pascalName}Actions>): string[] { - const args: string[] = []; - const params = action.parameters as Record; - switch (action.actionName) { -${cases.join("\n")} - default: - throw new Error(\`Unknown action: \${action.actionName}\`); - } - return args; -} - -export function instantiate(): AppAgent { - return { - executeAction: async ( - action: TypeAgentAction<${pascalName}Actions>, - context: ActionContext<${pascalName}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}\`); - } - }, - }; -} -`; -} From d210b36476997ccd27e22ab15b3c825721e4531a Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Tue, 14 Apr 2026 15:23:34 -0700 Subject: [PATCH 28/34] Move CLI handler template to separate .template file on disk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extract the auto-generated handler code from an inline string literal into cliHandler.template — a standalone file that's easier to read and maintain. buildCliHandler now reads the template from disk and interpolates {{NAME}}, {{PASCAL_NAME}}, {{CLI_COMMAND}}, {{SWITCH_CASES}}. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../src/scaffolder/cliHandler.template | 54 +++++++++++ .../src/scaffolder/cliHandlerTemplate.ts | 89 ++++++------------- .../src/scaffolder/scaffolderHandler.ts | 8 +- 3 files changed, 87 insertions(+), 64 deletions(-) create mode 100644 ts/packages/agents/onboarding/src/scaffolder/cliHandler.template 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 000000000..a7491d687 --- /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 index 278c7d6e8..ef0b4e7e9 100644 --- a/ts/packages/agents/onboarding/src/scaffolder/cliHandlerTemplate.ts +++ b/ts/packages/agents/onboarding/src/scaffolder/cliHandlerTemplate.ts @@ -4,8 +4,22 @@ // 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 @@ -13,12 +27,7 @@ function flagToCamel(flag: string): string { .replace(/-([a-z])/g, (_, c) => c.toUpperCase()); } -export function buildCliHandler( - name: string, - pascalName: string, - cliCommand: string, - actions: DiscoveredAction[], -): string { +function buildSwitchCases(actions: DiscoveredAction[]): string { const cases: string[] = []; for (const action of actions) { const subCmd = action.path ?? action.name; @@ -46,60 +55,20 @@ export function buildCliHandler( ` case "${action.name}":\n args.push(...${JSON.stringify(subCmd.split(" "))});${body}break;`, ); } - - return `// 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 { ${pascalName}Actions } from "./${name}Schema.js"; - -const execFileAsync = promisify(execFile); - -async function runCli(...cliArgs: string[]): Promise { - const { stdout, stderr } = await execFileAsync("${cliCommand}", cliArgs, { - timeout: 30_000, - }); - return (stdout || stderr).trim(); + return cases.join("\n"); } -function buildArgs(action: TypeAgentAction<${pascalName}Actions>): string[] { - const args: string[] = []; - const params = action.parameters as Record; - switch (action.actionName) { -${cases.join("\n")} - default: - throw new Error(\`Unknown action: \${action.actionName}\`); - } - return args; -} - -export function instantiate(): AppAgent { - return { - executeAction: async ( - action: TypeAgentAction<${pascalName}Actions>, - context: ActionContext<${pascalName}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}\`); - } - }, - }; -} -`; +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 c571c2937..18a5e2661 100644 --- a/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts +++ b/ts/packages/agents/onboarding/src/scaffolder/scaffolderHandler.ts @@ -201,7 +201,7 @@ async function handleScaffoldAgent( // Stamp out handler await writeFile( path.join(srcDir, `${integrationName}ActionHandler.ts`), - buildHandler(integrationName, pascalName, pattern, apiSurface), + await buildHandler(integrationName, pascalName, pattern, apiSurface), ); files.push(`src/${integrationName}ActionHandler.ts`); @@ -468,19 +468,19 @@ function buildManifest( return manifest; } -function buildHandler( +async function buildHandler( name: string, pascalName: string, pattern: AgentPattern = "schema-grammar", apiSurface?: ApiSurface, -): string { +): 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 buildCliHandler(name, pascalName, cliCommand, cliActions); + return await buildCliHandler(name, pascalName, cliCommand, cliActions); } switch (pattern) { From 45ecb2c95cdd8a26f51fa217d91935fb9431494f Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Tue, 14 Apr 2026 15:48:21 -0700 Subject: [PATCH 29/34] Address PR review: configurable model, debug truncation warning - llm.ts: All model factories now accept optional endpoint param to override the default model (e.g. 'openai:gpt-5' for best results) - discoveryHandler.ts: Add debug('typeagent:onboarding:discovery') warning when CLI help output is truncated before LLM extraction - Add debug + @types/debug dependencies Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ts/packages/agents/onboarding/package.json | 2 ++ .../src/discovery/discoveryHandler.ts | 15 ++++++++++- ts/packages/agents/onboarding/src/lib/llm.ts | 27 ++++++++++--------- ts/pnpm-lock.yaml | 6 +++++ 4 files changed, 37 insertions(+), 13 deletions(-) diff --git a/ts/packages/agents/onboarding/package.json b/ts/packages/agents/onboarding/package.json index d7a09a6d9..3e9577402 100644 --- a/ts/packages/agents/onboarding/package.json +++ b/ts/packages/agents/onboarding/package.json @@ -44,11 +44,13 @@ "@typeagent/dispatcher-types": "workspace:*", "agent-dispatcher": "workspace:*", "aiclient": "workspace:*", + "debug": "^4.3.4", "dispatcher-node-providers": "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 da75f05e8..d06f6bffc 100644 --- a/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts +++ b/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts @@ -21,8 +21,10 @@ import { import { getDiscoveryModel } from "../lib/llm.js"; import { execFile } from "child_process"; import { promisify } from "util"; +import registerDebug from "debug"; const execFileAsync = promisify(execFile); +const debug = registerDebug("typeagent:onboarding:discovery"); // Represents a single discovered API action export type DiscoveredAction = { @@ -595,6 +597,17 @@ async function handleCrawlCliHelp( .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, + ); + } + const model = getDiscoveryModel(); const prompt = [ @@ -613,7 +626,7 @@ async function handleCrawlCliHelp( `Extract all CLI actions from this help output for the "${integrationName}" integration.\n\n` + `Base command: ${command}\n` + `Total subcommands crawled: ${helpEntries.length}\n\n` + - `Help output (truncated to 12000 chars):\n${combinedHelp.slice(0, 12000)}`, + `Help output (truncated to ${maxHelpChars} chars):\n${helpText}`, }, ]; diff --git a/ts/packages/agents/onboarding/src/lib/llm.ts b/ts/packages/agents/onboarding/src/lib/llm.ts index 912553152..0cc6e5c9b 100644 --- a/ts/packages/agents/onboarding/src/lib/llm.ts +++ b/ts/packages/agents/onboarding/src/lib/llm.ts @@ -6,41 +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.createChatModel(undefined, undefined, undefined, [ +export function getDiscoveryModel(endpoint?: string): ChatModel { + return openai.createChatModel(endpoint, undefined, undefined, [ "onboarding:discovery", ]); } -export function getPhraseGenModel(): ChatModel { - return openai.createChatModel(undefined, undefined, undefined, [ +export function getPhraseGenModel(endpoint?: string): ChatModel { + return openai.createChatModel(endpoint, undefined, undefined, [ "onboarding:phrasegen", ]); } -export function getSchemaGenModel(): ChatModel { - return openai.createChatModel(undefined, undefined, undefined, [ +export function getSchemaGenModel(endpoint?: string): ChatModel { + return openai.createChatModel(endpoint, undefined, undefined, [ "onboarding:schemagen", ]); } -export function getGrammarGenModel(): ChatModel { - return openai.createChatModel(undefined, undefined, undefined, [ +export function getGrammarGenModel(endpoint?: string): ChatModel { + return openai.createChatModel(endpoint, undefined, undefined, [ "onboarding:grammargen", ]); } -export function getTestingModel(): ChatModel { - return openai.createChatModel(undefined, undefined, undefined, [ +export function getTestingModel(endpoint?: string): ChatModel { + return openai.createChatModel(endpoint, undefined, undefined, [ "onboarding:testing", ]); } -export function getPackagingModel(): ChatModel { - return openai.createChatModel(undefined, undefined, undefined, [ +export function getPackagingModel(endpoint?: string): ChatModel { + return openai.createChatModel(endpoint, undefined, undefined, [ "onboarding:packaging", ]); } diff --git a/ts/pnpm-lock.yaml b/ts/pnpm-lock.yaml index 8e600815d..745f90f02 100644 --- a/ts/pnpm-lock.yaml +++ b/ts/pnpm-lock.yaml @@ -2268,6 +2268,9 @@ 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 @@ -2278,6 +2281,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 From 9d70d7346b12b88c1be2ab407ffcddede0adbd84 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Tue, 14 Apr 2026 16:10:13 -0700 Subject: [PATCH 30/34] Migrate CLI discovery extraction to TypeChat translator Replace raw model.complete() + regex JSON parsing with TypeChat's createJsonTranslator. This gives: - Strong typing via TypeScript schema validation - Automatic JSON validation against the CliDiscoveryResult type - Built-in error correction with retry on validation failure - No more fragile regex extraction of JSON from LLM output New file discoveryLlmSchema.ts defines the schema that TypeChat reads as text and sends to the LLM alongside the prompt. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ts/packages/agents/onboarding/package.json | 1 + .../src/discovery/discoveryHandler.ts | 88 ++++++++++++------- .../src/discovery/discoveryLlmSchema.ts | 34 +++++++ ts/pnpm-lock.yaml | 3 + 4 files changed, 92 insertions(+), 34 deletions(-) create mode 100644 ts/packages/agents/onboarding/src/discovery/discoveryLlmSchema.ts diff --git a/ts/packages/agents/onboarding/package.json b/ts/packages/agents/onboarding/package.json index 3e9577402..cbca8859e 100644 --- a/ts/packages/agents/onboarding/package.json +++ b/ts/packages/agents/onboarding/package.json @@ -46,6 +46,7 @@ "aiclient": "workspace:*", "debug": "^4.3.4", "dispatcher-node-providers": "workspace:*", + "typeagent": "workspace:*", "typechat": "^0.1.1" }, "devDependencies": { diff --git a/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts b/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts index d06f6bffc..50c90f1d4 100644 --- a/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts +++ b/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts @@ -21,7 +21,13 @@ import { 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"); @@ -57,6 +63,22 @@ export type ApiSurface = { 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, @@ -608,45 +630,43 @@ async function handleCrawlCliHelp( ); } - const model = getDiscoveryModel(); - - const prompt = [ - { - role: "system" as const, - content: - "You are a CLI documentation analyzer. Extract a list of CLI actions/commands from the provided help output. " + - "For each action, identify: name (camelCase derived from the command path, e.g. 'gh repo create' becomes 'repoCreate'), " + - "description, the full command path as the 'path' field, and parameters (flags/arguments with their types). " + - "Only include leaf commands (commands that perform an action, not command groups). " + - "Return a JSON array of actions.", - }, - { - role: "user" as const, - content: - `Extract all CLI actions from this help output for the "${integrationName}" integration.\n\n` + - `Base command: ${command}\n` + - `Total subcommands crawled: ${helpEntries.length}\n\n` + - `Help output (truncated to ${maxHelpChars} chars):\n${helpText}`, - }, - ]; - - const result = await model.complete(prompt); + // 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\n` + + `Help output:\n${helpText}`; + + const result = await translator.translate(request); if (!result.success) { return { error: `LLM extraction failed: ${result.message}` }; } - let actions: DiscoveredAction[] = []; - try { - const jsonMatch = result.data.match(/\[[\s\S]*\]/); - if (jsonMatch) { - actions = JSON.parse(jsonMatch[0]); - } - } catch { - return { error: "Failed to parse LLM response as JSON action list." }; - } - const source = `cli:${command}`; - actions = actions.map((a) => ({ ...a, method: "CLI", sourceUrl: source })); + 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; + }); // Merge with any existing discovered actions const existing = await readArtifactJson( 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 000000000..9431b9192 --- /dev/null +++ b/ts/packages/agents/onboarding/src/discovery/discoveryLlmSchema.ts @@ -0,0 +1,34 @@ +// 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[]; +}; + +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; +}; diff --git a/ts/pnpm-lock.yaml b/ts/pnpm-lock.yaml index 745f90f02..7029b8766 100644 --- a/ts/pnpm-lock.yaml +++ b/ts/pnpm-lock.yaml @@ -2274,6 +2274,9 @@ importers: 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) From 6ff0abc70f9062e9cb97948f31d59024c95d9d87 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Tue, 14 Apr 2026 16:11:38 -0700 Subject: [PATCH 31/34] Add safety guardrail for CLI help flag probing Only attempt -h fallback for CLIs in a known-safe allowlist (gh, git, az, kubectl, docker, etc.). For unknown CLIs, only --help is tried since -h can mean something else in some tools. Logs a debug warning when the short flag is skipped. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../src/discovery/discoveryHandler.ts | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts b/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts index 50c90f1d4..592e93ecb 100644 --- a/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts +++ b/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts @@ -510,12 +510,45 @@ 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 { - // Try --help first, fall back to -h - for (const flag of ["--help", "-h"]) { + 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, From a954b5e36abf9f847c3f6a9fc8cf93d6f415416e Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Tue, 14 Apr 2026 16:14:09 -0700 Subject: [PATCH 32/34] Add entity extraction to CLI discovery Extend CliDiscoveryResult schema with optional entities field so the TypeChat translator also identifies domain entities (repos, issues, users, etc.) from CLI help output. Entities are stored in ApiSurface alongside actions, deduplicated by name when merging. Downstream phases can optionally consume entities for richer grammar generation (noun recognition) and test phrase generation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../src/discovery/discoveryHandler.ts | 37 ++++++++++++++++++- .../src/discovery/discoveryLlmSchema.ts | 11 ++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts b/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts index 592e93ecb..ce33bc936 100644 --- a/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts +++ b/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts @@ -53,11 +53,18 @@ 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[]; @@ -670,7 +677,9 @@ async function handleCrawlCliHelp( `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\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); @@ -701,6 +710,17 @@ async function handleCrawlCliHelp( 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, @@ -718,6 +738,15 @@ async function handleCrawlCliHelp( ...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, @@ -730,7 +759,8 @@ async function handleCrawlCliHelp( `## CLI discovery complete: ${integrationName}\n\n` + `**Command:** \`${command}\`\n` + `**Subcommands crawled:** ${helpEntries.length}\n` + - `**Actions found:** ${actions.length}\n\n` + + `**Actions found:** ${actions.length}\n` + + `**Entities found:** ${entities.length}\n\n` + actions .slice(0, 20) .map((a) => `- **${a.name}** (\`${a.path}\`): ${a.description}`) @@ -738,6 +768,9 @@ async function handleCrawlCliHelp( (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.`, ); } diff --git a/ts/packages/agents/onboarding/src/discovery/discoveryLlmSchema.ts b/ts/packages/agents/onboarding/src/discovery/discoveryLlmSchema.ts index 9431b9192..bae4956a0 100644 --- a/ts/packages/agents/onboarding/src/discovery/discoveryLlmSchema.ts +++ b/ts/packages/agents/onboarding/src/discovery/discoveryLlmSchema.ts @@ -9,6 +9,8 @@ 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 = { @@ -32,3 +34,12 @@ export type CliParameter = { /** 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[]; +}; From ea2f3133736710bb1636576382e59a3f4d42c3e5 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Wed, 15 Apr 2026 12:49:16 -0700 Subject: [PATCH 33/34] Simplify loadSchema path using basePath + postbuild copy Use loadSchema(['discoveryLlmSchema.ts'], import.meta.url) instead of manual path.resolve to src/. Add postbuild step to copy the TypeChat schema .ts file to dist/ (same pattern as spelunker). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ts/packages/agents/onboarding/package.json | 2 ++ .../agents/onboarding/src/discovery/discoveryHandler.ts | 9 +-------- ts/pnpm-lock.yaml | 3 +++ 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/ts/packages/agents/onboarding/package.json b/ts/packages/agents/onboarding/package.json index cbca8859e..5673c9259 100644 --- a/ts/packages/agents/onboarding/package.json +++ b/ts/packages/agents/onboarding/package.json @@ -34,6 +34,7 @@ "asc:schemagen": "asc -i ./src/schemaGen/schemaGenSchema.ts -o ./dist/schemaGenSchema.pas.json -t SchemaGenActions", "asc:testing": "asc -i ./src/testing/testingSchema.ts -o ./dist/testingSchema.pas.json -t TestingActions", "build": "concurrently npm:tsc npm:asc:* npm:agc:*", + "postbuild": "copyfiles -u 1 \"src/**/discoveryLlmSchema.ts\" dist", "clean": "rimraf --glob dist *.tsbuildinfo *.done.build.log", "prettier": "prettier --check . --ignore-path ../../../.prettierignore", "prettier:fix": "prettier --write . --ignore-path ../../../.prettierignore", @@ -54,6 +55,7 @@ "@types/debug": "^4.1.12", "action-grammar-compiler": "workspace:*", "concurrently": "^9.1.2", + "copyfiles": "^2.4.1", "prettier": "^3.5.3", "rimraf": "^6.0.1", "typescript": "~5.4.5" diff --git a/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts b/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts index ce33bc936..185722619 100644 --- a/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts +++ b/ts/packages/agents/onboarding/src/discovery/discoveryHandler.ts @@ -21,8 +21,6 @@ import { 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"; @@ -73,12 +71,7 @@ export type ApiSurface = { // 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 schema = loadSchema(["discoveryLlmSchema.ts"], import.meta.url); const validator = createTypeScriptJsonValidator( schema, "CliDiscoveryResult", diff --git a/ts/pnpm-lock.yaml b/ts/pnpm-lock.yaml index 7029b8766..e9836127a 100644 --- a/ts/pnpm-lock.yaml +++ b/ts/pnpm-lock.yaml @@ -2293,6 +2293,9 @@ importers: concurrently: specifier: ^9.1.2 version: 9.1.2 + copyfiles: + specifier: ^2.4.1 + version: 2.4.1 prettier: specifier: ^3.5.3 version: 3.5.3 From 61a36ffeeb634460fd4dde33f12a8b714787b204 Mon Sep 17 00:00:00 2001 From: Tal Zaccai Date: Wed, 15 Apr 2026 13:11:37 -0700 Subject: [PATCH 34/34] Fix ClientIO stub for consolidated question() method Update test runner clientIO stub to use the new unified question() method after upstream PR #2194 consolidated askYesNo and popupQuestion. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ts/packages/agents/onboarding/src/testing/runTests.ts | 10 ++++++---- ts/pnpm-lock.yaml | 6 ------ 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/ts/packages/agents/onboarding/src/testing/runTests.ts b/ts/packages/agents/onboarding/src/testing/runTests.ts index 2a0a83a67..a43be276b 100644 --- a/ts/packages/agents/onboarding/src/testing/runTests.ts +++ b/ts/packages/agents/onboarding/src/testing/runTests.ts @@ -68,11 +68,13 @@ const clientIO = { appendDisplay: noop, appendDiagnosticData: noop, setDynamicDisplay: noop, - askYesNo: async (_id: any, _msg: any, def = false) => def, + question: async ( + _requestId: any, + _message: string, + _choices: string[], + defaultId?: number, + ) => defaultId ?? 0, proposeAction: async () => undefined, - popupQuestion: async () => { - throw new Error("not supported"); - }, notify: noop, openLocalView: async () => {}, closeLocalView: async () => {}, diff --git a/ts/pnpm-lock.yaml b/ts/pnpm-lock.yaml index e9836127a..0b72ce737 100644 --- a/ts/pnpm-lock.yaml +++ b/ts/pnpm-lock.yaml @@ -3112,9 +3112,6 @@ importers: default-agent-provider: specifier: workspace:* version: link:../defaultAgentProvider - dispatcher-node-providers: - specifier: workspace:* - version: link:../dispatcher/nodeProviders dotenv: specifier: ^16.3.1 version: 16.5.0 @@ -3139,9 +3136,6 @@ importers: ts-node: specifier: ^10.9.1 version: 10.9.2(@types/node@25.5.2)(typescript@5.4.5) - typechat: - specifier: ^0.1.1 - version: 0.1.1(typescript@5.4.5)(zod@3.25.76) typechat-utils: specifier: workspace:* version: link:../utils/typechatUtils