@agentprojectcontext/apx 1.63.0 → 1.65.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentprojectcontext/apx",
3
- "version": "1.63.0",
3
+ "version": "1.65.0",
4
4
  "description": "APX — unified CLI + daemon for the Agent Project Context (APC) standard.",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -1,9 +1,6 @@
1
1
  ---
2
2
  name: apx
3
- description: >-
4
- APX CLI — local daemon that orchestrates agents, sessions, MCPs, and channels across CLIs.
5
- Use `apx exec "prompt"` for the local super-agent, or `apx run <agent> --runtime <claude-code|codex|opencode|aider|cursor-agent|gemini-cli|qwen-code> "prompt"` to hand the task to another CLI.
6
- Activate on: 'apx', 'apx exec', 'apx run', 'apx daemon', 'ask codex/claude/opencode/gemini to …', 'have <runtime> do …', 'delegate to another runtime', 'run this in <runtime>', 'route this task to <runtime>'.
3
+ description: Orchestrates agents, sessions, routines, and channels through the APX CLI and local daemon — run the super-agent locally or delegate a task to another coding CLI (Claude Code, Codex, OpenCode, Aider, Cursor, Gemini, Qwen). Triggers: 'apx', 'apx exec', 'apx run', 'apx daemon', 'apx routine', 'delegate to a runtime'.
7
4
  homepage: https://github.com/agentprojectcontext/apx
8
5
  ---
9
6
 
@@ -21,7 +18,7 @@ This is the **engine-side** skill: a slim reference for runtimes invoked by APX.
21
18
  - The user asks you to call APX from inside your session ("send a telegram via apx", "list apx sessions").
22
19
  - You're inside an `.apc/` project and want to consult APX-managed state.
23
20
 
24
- If you can do the task natively (you're an IDE/CLI with your own tools), prefer that. Only shell out to `apx` when the task is APX-specific.
21
+ If you can do the task natively (you're an IDE/CLI with your own tools), prefer that. Only shell out to `apx` when the task is APX-specific. For anything MCP-related, use the [[apx-mcp]] skill — it's the MCP entry point for agents.
25
22
 
26
23
  ---
27
24
 
@@ -53,10 +50,6 @@ apx project current # which project resolves from CWD
53
50
  apx sessions list --engine <claude|codex|opencode> --project <name>
54
51
  apx sessions list --dir <path>
55
52
 
56
- # MCPs — see the apx-mcp skill for the full guide
57
- apx mcp list
58
- apx mcp run <name> <tool> '{"...":"..."}'
59
-
60
53
  # Memory (curated, durable facts only)
61
54
  apx memory <agent-slug>
62
55
  apx memory <agent-slug> --append "<fact>"
@@ -1,11 +1,13 @@
1
1
  ---
2
2
  name: apx-mcp
3
- description: How to register, list, debug, and scope MCP servers in APX. Use BEFORE adding any MCP three scopes (shared/runtime/global) with different commit and secrecy semantics.
3
+ description: Registers, lists, runs, debugs, and scopes MCP servers in APX the MCP entry point for agents (shared/runtime/global scopes). In an .apc project, prefer APX-managed MCPs over a built-in client. Triggers: 'add MCP', 'apx mcp', 'list MCPs', 'run an MCP tool', 'MCP failing'.
4
4
  ---
5
5
 
6
6
  # apx-mcp
7
7
 
8
- APX exposes Model Context Protocol (MCP) servers to agents. Three scopes, each in a different file with different rules:
8
+ APX exposes Model Context Protocol (MCP) servers to agents. This is the MCP entry point: when you're in an `.apc/` project, prefer APX-managed MCPs over any built-in MCP client, because APX owns the project's scopes, secrets, and merge order. Run `apx mcp list` first to see what's already registered. (Outside an `.apc/` project, or when APX isn't installed, use your internal MCP.)
9
+
10
+ Three scopes, each in a different file with different rules:
9
11
 
10
12
  | Scope | File | Committed? | Secrets OK? | When |
11
13
  |---|---|---|---|---|
@@ -100,13 +102,14 @@ apx mcp remove github # if github lives in runtime, this errors with a
100
102
 
101
103
  ```bash
102
104
  apx mcp check --project iacrmar # what scopes APX sees + which files exist
105
+ apx mcp tools <name> # list a server's tools (proves it spawned + initialized)
106
+ apx mcp tools <name> <tool> # one tool's input schema + a ready-to-run example
107
+ apx mcp logs <name> # spawn/init log + stderr tail for this server
103
108
  apx mcp run <name> <tool> '{...}' # spawn the server and call a tool for real
104
109
  apx log -f # tail unified log for spawn errors
105
110
  ```
106
111
 
107
- A server that "doesn't show tools" usually means: the command failed to start (env vars missing, package not found), or the server crashed during initialize. The unified log has the stderr buffer.
108
-
109
- > `apx mcp tools <name>` is a placeholder stub (prints a "coming in v0.2" notice, lists nothing). To verify a server actually spawns, call a tool with `apx mcp run`.
112
+ A server that "doesn't show tools" usually means: the command failed to start (env vars missing, package not found), or the server crashed during initialize. `apx mcp logs <name>` has the spawn/init log and stderr tail — that's the fastest way to see why.
110
113
 
111
114
  ## Don't
112
115
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: apx-agency-agents
3
- description: "APX agent vault — reusable templates (Roby, Cody, Rocky, Tessa, Max, Arch, Sid, Vera, Finn + generic dev/marketing/ops/qa/support). Spawn a specialist, list, import into a project, create, or hide/restore a bundled default. Triggers: 'spawn agent', 'use Cody/Rocky/Tessa', 'list agents', 'agent vault', 'import agent', 'new agent'."
3
+ description: "APX agent vault — reusable templates (generic dev/marketing/ops/qa/support). Spawn a specialist, list, import into a project, create, or hide/restore a bundled default. Triggers: 'spawn agent', 'use Cody/Rocky/Tessa', 'list agents', 'agent vault', 'import agent', 'new agent'."
4
4
  ---
5
5
 
6
6
  # apx-agency-agents — the APX agent vault
@@ -1,24 +1,46 @@
1
1
  ---
2
2
  name: apx-voice
3
3
  scope: optional
4
- description: APX TTS — Piper (local), ElevenLabs/OpenAI/Gemini (cloud), unified /voice/turn channel, `apx voice` CLI. Load when the user wants to speak with APX, configure a voice engine, or troubleshoot silent output.
4
+ description: Makes APX speak and configures text-to-speech — Piper (local), ElevenLabs/OpenAI/Gemini (cloud), or a custom OpenAI-compatible server (QVox/Qwen3-TTS), with per-engine emotion tags. Load when configuring a voice engine, adding a custom TTS server, enabling emotion tags, or fixing silent output.
5
5
  ---
6
6
 
7
7
  # apx-voice
8
8
 
9
- TTS facade in `core/voice/` with five engines. STT lives separately in `host/daemon/transcription.js` (Whisper). The "voice channel" combines both for mic→agent→speaker.
9
+ TTS facade in `core/voice/` with the built-in engines below plus any number of custom OpenAI-compatible endpoints. STT lives separately in `core/voice/transcription.js` (Whisper). The "voice channel" combines both for mic→agent→speaker.
10
10
 
11
11
  ## Engines
12
12
 
13
13
  | id | Local? | Needs key? | Notes |
14
14
  |---|---|---|---|
15
- | `piper` | yes | no | Local, offline. Requires `piper` CLI + `.onnx` model. es_AR-daniela-high recommended. |
16
- | `elevenlabs` | no | yes | Excellent. Free tier 10k chars/mo. `eleven_multilingual_v2`. |
17
- | `openai` | no | yes | Reuses `engines.openai.api_key`. `tts-1`. |
18
- | `gemini` | no | yes | Returns raw L16 PCM — APX wraps in WAV automatically. |
19
- | `mock` | yes | no | Silent WAV; placeholder for tests. |
15
+ | `piper` | yes | no | Local, offline. Requires `piper` CLI + `.onnx` model. es_AR-daniela-high recommended. |
16
+ | `elevenlabs` | no | yes | Excellent. Free tier 10k chars/mo. `eleven_multilingual_v2`. |
17
+ | `openai` | no | yes | Reuses `engines.openai.api_key`. `tts-1`. Set `base_url` to point it at a custom endpoint instead. |
18
+ | `gemini` | no | yes | Returns raw L16 PCM — APX wraps in WAV automatically. Supports emotion tags. |
19
+ | `custom:<slug>` | no | maybe | Any OpenAI-compatible TTS server (e.g. QVox / Qwen3-TTS). Config-only `base_url`, own key (often keyless). Supports emotion tags. |
20
+ | `mock` | yes | no | Silent WAV; placeholder for tests. |
20
21
 
21
- `auto` probes: piper → elevenlabs → openai → gemini → mock.
22
+ `auto` probes: piper → elevenlabs → openai → gemini → mock (custom providers are never auto-selected — pick one explicitly).
23
+
24
+ ## Custom OpenAI-compatible endpoints (QVox / Qwen3-TTS)
25
+
26
+ Point APX at a local or remote OpenAI-compatible `/v1/audio/speech` server without any hardcoding — it's pure config. Two shapes:
27
+
28
+ - `voice.tts.openai.base_url` — reuse the `openai` engine against a custom endpoint.
29
+ - `voice.tts.custom.<slug>` — a named custom provider, surfaces as engine id `custom:<slug>`, backed by the openai adapter.
30
+
31
+ When `base_url` is set, APX additionally forwards the non-OpenAI fields the server understands — `instruct` (base voice, from the style arg), `language`, `temperature` — and defaults the response format to `wav` (stock OpenAI stays `mp3`). A custom endpoint uses **only its own `api_key`** (often none) and never leaks `engines.openai.api_key` / `OPENAI_API_KEY`.
32
+
33
+ ## Emotion tags (per-engine capability)
34
+
35
+ Some backends (QVox/Qwen3-TTS, Gemini) accept inline `[tag]` markers and switch speaking emotion per segment while keeping the base voice. This is a **generic per-engine toggle**, not hardcoded to any adapter:
36
+
37
+ ```bash
38
+ apx config set voice.tts.custom.qvox.emotions.enabled true
39
+ # optional: restrict the tag set (defaults to the canonical QVox set)
40
+ apx config set voice.tts.custom.qvox.emotions.tags '["happy","sad","excited","calm","whisper","laugh","neutral"]'
41
+ ```
42
+
43
+ Default tags: `happy, sad, excited, angry, calm, whisper, shout, laugh, cry, narrator, neutral`. The voice-mode prompt learns the tag syntax **only when the engine that will actually speak has emotions enabled**. On any engine without tag support, stray `[tags]` are stripped from the displayed text and never read aloud (kept only for the speaking engine's audio).
22
44
 
23
45
  ## Concrete CLI calls
24
46
 
@@ -47,7 +69,17 @@ Playback uses system binaries (`afplay`, `paplay`, `aplay`, `play`, `ffplay`). I
47
69
  "piper": { "bin": "piper", "model": "/Users/.../es_AR-daniela-high.onnx" },
48
70
  "elevenlabs": { "api_key": "...", "model": "eleven_multilingual_v2", "voice_id": "..." },
49
71
  "openai": { "api_key": "...", "model": "tts-1", "voice": "alloy", "format": "mp3" },
50
- "gemini": { "api_key": "...", "model": "gemini-2.5-flash-preview-tts", "voice": "Aoede" }
72
+ "gemini": { "api_key": "...", "model": "gemini-2.5-flash-preview-tts", "voice": "Aoede", "emotions": { "enabled": true } },
73
+ "custom": {
74
+ "qvox": {
75
+ "label": "QVox local",
76
+ "base_url": "http://127.0.0.1:5111/v1",
77
+ "api_key": "",
78
+ "format": "wav",
79
+ "language": "es",
80
+ "emotions": { "enabled": true }
81
+ }
82
+ }
51
83
  }
52
84
  }
53
85
  }
@@ -2,6 +2,7 @@
2
2
  // We just probe the binary with `--version` (or equivalent) and don't fail if
3
3
  // it isn't there — caller decides what to do with absence.
4
4
  import { runProcess } from "#host/daemon/runtimes/_spawn.js";
5
+ import { resolveAntigravityCli } from "#host/daemon/runtimes/antigravity.js";
5
6
 
6
7
  const PROBES = [
7
8
  // Coding-agent CLIs (runtimes/)
@@ -12,6 +13,9 @@ const PROBES = [
12
13
  { id: "gemini-cli", binary: "gemini", args: ["--version"], category: "runtime" },
13
14
  { id: "cursor-agent",binary: "cursor-agent", args: ["--version"], category: "runtime" },
14
15
  { id: "qwen-code", binary: "qwen", args: ["--version"], category: "runtime" },
16
+ // Antigravity IDE ships its CLI inside the app bundle (not on PATH), so we
17
+ // resolve the absolute path rather than relying on the bare binary name.
18
+ { id: "antigravity", binary: "antigravity-ide", args: ["--version"], category: "runtime", resolve: resolveAntigravityCli },
15
19
 
16
20
  // Local LLM runners (engines/)
17
21
  { id: "ollama", binary: "ollama", args: ["--version"], category: "engine" },
@@ -36,8 +40,24 @@ export async function detectAll() {
36
40
  async function probe(p) {
37
41
  const start = Date.now();
38
42
  try {
43
+ // Some runtimes (e.g. Antigravity) aren't on PATH — resolve an absolute
44
+ // path first; if the resolver finds nothing, report not-installed early.
45
+ let command = p.binary;
46
+ if (typeof p.resolve === "function") {
47
+ const resolved = p.resolve();
48
+ if (!resolved) {
49
+ return {
50
+ id: p.id,
51
+ binary: p.binary,
52
+ category: p.category,
53
+ installed: false,
54
+ reason: "not found",
55
+ };
56
+ }
57
+ command = resolved;
58
+ }
39
59
  const r = await runProcess({
40
- command: p.binary,
60
+ command,
41
61
  args: p.args,
42
62
  timeoutMs: 3000,
43
63
  });
@@ -0,0 +1,153 @@
1
+ // Google Antigravity runtime adapter.
2
+ //
3
+ // Antigravity ships in two shapes on a machine:
4
+ //
5
+ // 1. `agy` — a HEADLESS agent CLI (the one we want). It has a non-interactive
6
+ // print mode: agy -p "<prompt>" → prints the reply to stdout, so APX can
7
+ // capture the result like any other runtime. This is the preferred path.
8
+ //
9
+ // 2. `antigravity-ide` — the desktop IDE CLI (a VS Code fork). Its `chat`
10
+ // subcommand LAUNCHES THE GUI and shows the reply inside the editor
11
+ // window; it returns nothing on stdout. It cannot feed a result back to
12
+ // APX, so we only use it as a last-resort "launch the GUI" fallback and we
13
+ // say so explicitly.
14
+ //
15
+ // Neither binary is guaranteed to be on PATH: `agy` normally installs to
16
+ // ~/.local/bin; the IDE CLI lives inside the app bundle. We resolve both.
17
+ //
18
+ // Result flow: with `agy` we capture stdout directly. If only the IDE is
19
+ // present, the reply lives in the GUI and can only reach APX via the runtime
20
+ // bridge callback (the in-IDE agent running `apx session close <id> --result`).
21
+
22
+ import fs from "node:fs";
23
+ import os from "node:os";
24
+ import path from "node:path";
25
+ import { runProcess } from "./_spawn.js";
26
+
27
+ const IDE_BUNDLE_REL = "Contents/Resources/app/bin/antigravity-ide";
28
+
29
+ function whichSync(bin) {
30
+ const dirs = (process.env.PATH || "").split(path.delimiter);
31
+ for (const d of dirs) {
32
+ if (!d) continue;
33
+ const p = path.join(d, bin);
34
+ try {
35
+ fs.accessSync(p, fs.constants.X_OK);
36
+ return p;
37
+ } catch {}
38
+ }
39
+ return null;
40
+ }
41
+
42
+ function firstExisting(candidates) {
43
+ for (const c of candidates) {
44
+ try {
45
+ if (c && fs.existsSync(c)) return c;
46
+ } catch {}
47
+ }
48
+ return null;
49
+ }
50
+
51
+ // The headless `agy` CLI — the real runtime. Returns an absolute path or null.
52
+ export function resolveAgyCli() {
53
+ return (
54
+ whichSync("agy") ||
55
+ firstExisting([
56
+ path.join(os.homedir(), ".local", "bin", "agy"),
57
+ "/usr/local/bin/agy",
58
+ "/opt/homebrew/bin/agy",
59
+ ])
60
+ );
61
+ }
62
+
63
+ // The desktop IDE CLI (GUI). Returns an absolute path or null.
64
+ export function resolveAntigravityIde() {
65
+ const home = os.homedir();
66
+ return (
67
+ whichSync("antigravity-ide") ||
68
+ firstExisting([
69
+ path.join("/Applications/Antigravity IDE.app", IDE_BUNDLE_REL),
70
+ path.join(home, "Applications", "Antigravity IDE.app", IDE_BUNDLE_REL),
71
+ "/usr/share/antigravity-ide/bin/antigravity-ide",
72
+ "/opt/Antigravity IDE/bin/antigravity-ide",
73
+ "/opt/antigravity-ide/bin/antigravity-ide",
74
+ path.join(home, ".local", "share", "antigravity-ide", "bin", "antigravity-ide"),
75
+ path.join(process.env.LOCALAPPDATA || "", "Programs", "Antigravity IDE", "bin", "antigravity-ide.cmd"),
76
+ ])
77
+ );
78
+ }
79
+
80
+ // Used by env detection: Antigravity is "installed" if EITHER binary exists.
81
+ // We prefer `agy` (the headless CLI) since that's what makes it a usable
82
+ // runtime; fall back to the IDE path so detection still reports it as present.
83
+ export function resolveAntigravityCli() {
84
+ return resolveAgyCli() || resolveAntigravityIde();
85
+ }
86
+
87
+ export default {
88
+ id: "antigravity",
89
+ binary: "agy",
90
+ versionFlag: "--version",
91
+ resolveBinary: resolveAntigravityCli,
92
+
93
+ async run({ system, prompt, cwd, env, timeoutMs }) {
94
+ const fullPrompt = system ? `${system}\n\n---\n\n${prompt}` : prompt;
95
+
96
+ // --- Preferred path: headless `agy` print mode (captures the reply) ---
97
+ const agy = resolveAgyCli();
98
+ if (agy) {
99
+ const args = ["--dangerously-skip-permissions"];
100
+ // Bound agy's own wait so it can't hang on the default 5-minute print
101
+ // timeout; leave a little headroom under our own process timeout.
102
+ if (timeoutMs) {
103
+ const secs = Math.max(30, Math.floor(timeoutMs / 1000) - 5);
104
+ args.push("--print-timeout", `${secs}s`);
105
+ }
106
+ args.push("-p", fullPrompt);
107
+
108
+ const r = await runProcess({ command: agy, args, cwd, env, timeoutMs });
109
+ const output = r.stdout.trim();
110
+ return {
111
+ exitCode: r.exitCode,
112
+ output:
113
+ output ||
114
+ "[antigravity] agy ran but returned no text. It may need `agy install` " +
115
+ "or an authenticated session — check `agy models`.",
116
+ stderr: r.stderr,
117
+ externalSessionPath: null,
118
+ };
119
+ }
120
+
121
+ // --- Fallback: only the desktop IDE is installed (GUI, no capture) ---
122
+ const ide = resolveAntigravityIde();
123
+ if (ide) {
124
+ const r = await runProcess({
125
+ command: ide,
126
+ args: ["chat", "--mode", "agent", "--reuse-window", fullPrompt],
127
+ cwd,
128
+ env,
129
+ timeoutMs,
130
+ });
131
+ return {
132
+ exitCode: r.exitCode,
133
+ output:
134
+ r.stdout.trim() ||
135
+ "[antigravity] no headless `agy` CLI found — handed the prompt to the " +
136
+ "Antigravity IDE (GUI). The reply is shown in the editor, not returned " +
137
+ "to APX. Install the `agy` CLI for headless runs.",
138
+ stderr: r.stderr,
139
+ externalSessionPath: null,
140
+ };
141
+ }
142
+
143
+ // --- Nothing installed / enabled ---
144
+ return {
145
+ exitCode: -1,
146
+ output:
147
+ "[antigravity] not available: neither the `agy` headless CLI nor the " +
148
+ "Antigravity IDE was found. Install Antigravity and run `agy install`.",
149
+ stderr: "antigravity runtime unavailable (agy / antigravity-ide not found)",
150
+ externalSessionPath: null,
151
+ };
152
+ },
153
+ };
@@ -22,6 +22,7 @@ import aider from "./aider.js";
22
22
  import cursorAgent from "./cursor-agent.js";
23
23
  import geminiCli from "./gemini-cli.js";
24
24
  import qwenCode from "./qwen-code.js";
25
+ import antigravity from "./antigravity.js";
25
26
 
26
27
  const REGISTRY = {
27
28
  "claude-code": claudeCode,
@@ -31,6 +32,7 @@ const REGISTRY = {
31
32
  "cursor-agent": cursorAgent,
32
33
  "gemini-cli": geminiCli,
33
34
  "qwen-code": qwenCode,
35
+ antigravity,
34
36
  };
35
37
 
36
38
  export const RUNTIME_IDS = Object.keys(REGISTRY);
@@ -5,7 +5,7 @@ export async function cmdRun(args) {
5
5
  const slug = args._[0];
6
6
  if (!slug) throw new Error("apx run: usage: apx run <agent> --runtime <id> \"<prompt>\"");
7
7
  const runtime = args.flags.runtime === true ? null : args.flags.runtime;
8
- if (!runtime) throw new Error("apx run: --runtime required (claude-code | codex | opencode | aider | cursor-agent | gemini-cli | qwen-code)");
8
+ if (!runtime) throw new Error("apx run: --runtime required (claude-code | codex | opencode | aider | cursor-agent | gemini-cli | qwen-code | antigravity)");
9
9
 
10
10
  let prompt = args._.slice(1).join(" ").trim();
11
11
  if (!prompt || prompt === "-") {
@@ -1177,9 +1177,9 @@ const HELP_TOPICS = new Map(Object.entries({
1177
1177
  run: topic({
1178
1178
  title: "apx run",
1179
1179
  summary: "Launch a full external runtime session for an agent.",
1180
- usage: ["apx run <agent> --runtime <claude-code|codex|opencode|aider|cursor-agent|gemini-cli|qwen-code> \"<prompt>\" [--timeout <seconds>] [--project <name|id|path>]"],
1180
+ usage: ["apx run <agent> --runtime <claude-code|codex|opencode|aider|cursor-agent|gemini-cli|qwen-code|antigravity> \"<prompt>\" [--timeout <seconds>] [--project <name|id|path>]"],
1181
1181
  options: [
1182
- ["--runtime <id>", "Runtime CLI to launch: claude-code, codex, opencode, aider, cursor-agent, gemini-cli, qwen-code."],
1182
+ ["--runtime <id>", "Runtime CLI to launch: claude-code, codex, opencode, aider, cursor-agent, gemini-cli, qwen-code, antigravity."],
1183
1183
  ["--timeout <seconds>", "Runtime timeout."],
1184
1184
  ["--project <name|id|path>", "Pin command to a specific project."],
1185
1185
  ],
@@ -2102,7 +2102,7 @@ function buildHelp(version) {
2102
2102
 
2103
2103
  hSec("Runtimes"),
2104
2104
  hCmd("apx run <agent>", 36, "--runtime <id> \"prompt\" --timeout <s>"),
2105
- ` ${H.DI}runtimes: claude-code | codex | opencode | aider | cursor-agent | gemini-cli | qwen-code${H.R}`,
2105
+ ` ${H.DI}runtimes: claude-code | codex | opencode | aider | cursor-agent | gemini-cli | qwen-code | antigravity${H.R}`,
2106
2106
  hCmd("apx env detect", 36, "which agent CLIs are installed"),
2107
2107
 
2108
2108
  hSec("Agent-to-Agent"),
@@ -95,7 +95,7 @@ server.tool(
95
95
  {
96
96
  slug: z.string().describe("Agent slug"),
97
97
  prompt: z.string().describe("Prompt / task for the agent"),
98
- runtime: z.string().optional().describe("Runtime: claude-code | codex | opencode | aider | cursor-agent | gemini-cli | qwen-code (default: claude-code)"),
98
+ runtime: z.string().optional().describe("Runtime: claude-code | codex | opencode | aider | cursor-agent | gemini-cli | qwen-code | antigravity (default: claude-code)"),
99
99
  },
100
100
  async ({ slug, prompt, runtime }) => {
101
101
  const proj = await resolveProject();
@@ -2175,9 +2175,9 @@
2175
2175
  }
2176
2176
  },
2177
2177
  "node_modules/browserslist": {
2178
- "version": "4.28.4",
2179
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz",
2180
- "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==",
2178
+ "version": "4.28.5",
2179
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.5.tgz",
2180
+ "integrity": "sha512-Cu2E6QejHWzuDMTkuwgpABFgDfZrXLQq5V13YOACZx4mFAG4IwGTbTfHPMr4WtxlHoXSM8FIuRwYYCz5XiabaQ==",
2181
2181
  "dev": true,
2182
2182
  "funding": [
2183
2183
  {
@@ -2195,10 +2195,10 @@
2195
2195
  ],
2196
2196
  "license": "MIT",
2197
2197
  "dependencies": {
2198
- "baseline-browser-mapping": "^2.10.38",
2199
- "caniuse-lite": "^1.0.30001799",
2200
- "electron-to-chromium": "^1.5.376",
2201
- "node-releases": "^2.0.48",
2198
+ "baseline-browser-mapping": "^2.10.42",
2199
+ "caniuse-lite": "^1.0.30001800",
2200
+ "electron-to-chromium": "^1.5.387",
2201
+ "node-releases": "^2.0.50",
2202
2202
  "update-browserslist-db": "^1.2.3"
2203
2203
  },
2204
2204
  "bin": {