@pencil-agent/nano-pencil 1.11.14 → 1.11.16

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.
@@ -195,7 +195,10 @@ export class ExtensionRunner {
195
195
  return this.uiContext;
196
196
  }
197
197
  hasUI() {
198
- return this.uiContext !== noOpUIContext;
198
+ if (this.uiContext === noOpUIContext) {
199
+ return false;
200
+ }
201
+ return this.uiContext.__nonInteractive !== true;
199
202
  }
200
203
  getExtensionPaths() {
201
204
  return this.extensions.map((e) => e.path);
@@ -16,7 +16,7 @@ const isProductionBuild = typeof import.meta.url === "string" && import.meta.url
16
16
  const isDebugMode = process.env.NODE_ENV === "development" || (process.env.NODE_ENV !== "production" && !isProductionBuild);
17
17
  function mcpLog(...args) {
18
18
  if (isDebugMode) {
19
- console.log(...args);
19
+ console.error(...args);
20
20
  }
21
21
  }
22
22
  function mcpWarn(...args) {
@@ -26,6 +26,7 @@ import { type PromptTemplate } from "../prompt/prompt-templates.js";
26
26
  import type { ResourceLoader } from "../config/resource-loader.js";
27
27
  import type { BranchSummaryEntry, SessionManager } from "../session/session-manager.js";
28
28
  import type { SettingsManager } from "../config/settings-manager.js";
29
+ import { type SlashCommandInfo } from "../slash-commands.js";
29
30
  import type { BashOperations } from "../tools/bash.js";
30
31
  /** Parsed skill block from a user message */
31
32
  export interface ParsedSkillBlock {
@@ -138,6 +139,11 @@ export interface SessionStats {
138
139
  };
139
140
  cost: number;
140
141
  }
142
+ export interface SessionSlashCommandDescriptor {
143
+ name: string;
144
+ description?: string;
145
+ source: "builtin" | SlashCommandInfo["source"];
146
+ }
141
147
  export declare class AgentSession {
142
148
  readonly agent: Agent;
143
149
  readonly sessionManager: SessionManager;
@@ -211,6 +217,16 @@ export declare class AgentSession {
211
217
  /** Model registry for API key resolution and model discovery */
212
218
  get modelRegistry(): ModelRegistry;
213
219
  get cwd(): string;
220
+ /**
221
+ * Return all currently available slash-like commands for the session.
222
+ * Includes built-in commands, extension commands, prompt templates, and skills.
223
+ */
224
+ getSlashCommands(): SessionSlashCommandDescriptor[];
225
+ /**
226
+ * Try to execute an extension slash command directly.
227
+ * Returns true when a matching extension command was found, even if it failed internally.
228
+ */
229
+ tryExecuteExtensionCommand(text: string): Promise<boolean>;
214
230
  /** Emit an event to all listeners */
215
231
  private _emit;
216
232
  private _lastAssistantMessage;
@@ -219,6 +219,51 @@ export class AgentSession {
219
219
  get cwd() {
220
220
  return this._cwd;
221
221
  }
222
+ /**
223
+ * Return all currently available slash-like commands for the session.
224
+ * Includes built-in commands, extension commands, prompt templates, and skills.
225
+ */
226
+ getSlashCommands() {
227
+ const builtins = BUILTIN_SLASH_COMMANDS.map((command) => ({
228
+ name: command.name,
229
+ description: command.description,
230
+ source: "builtin",
231
+ }));
232
+ const reservedBuiltins = new Set(BUILTIN_SLASH_COMMANDS.map((command) => command.name));
233
+ const extensionCommands = this._extensionRunner
234
+ ?.getRegisteredCommandsWithPaths()
235
+ .filter(({ command }) => !reservedBuiltins.has(command.name))
236
+ .map(({ command }) => ({
237
+ name: command.name,
238
+ description: command.description,
239
+ source: "extension",
240
+ })) ?? [];
241
+ const promptCommands = this.promptTemplates.map((template) => ({
242
+ name: template.name,
243
+ description: template.description,
244
+ source: "prompt",
245
+ }));
246
+ const skillCommands = this._resourceLoader
247
+ .getSkills()
248
+ .skills.map((skill) => ({
249
+ name: `skill:${skill.name}`,
250
+ description: skill.description,
251
+ source: "skill",
252
+ }));
253
+ return [
254
+ ...builtins,
255
+ ...extensionCommands,
256
+ ...promptCommands,
257
+ ...skillCommands,
258
+ ];
259
+ }
260
+ /**
261
+ * Try to execute an extension slash command directly.
262
+ * Returns true when a matching extension command was found, even if it failed internally.
263
+ */
264
+ async tryExecuteExtensionCommand(text) {
265
+ return this._tryExecuteExtensionCommand(text);
266
+ }
222
267
  // =========================================================================
223
268
  // Event Subscription
224
269
  // =========================================================================
@@ -39,6 +39,20 @@ function recordLoopEvent(pi, message) {
39
39
  timestamp: Date.now(),
40
40
  });
41
41
  }
42
+ function publishLoopUpdate(pi, bus, message, type = "info") {
43
+ recordLoopEvent(pi, message);
44
+ notify(bus, message, type);
45
+ pi.sendMessage({
46
+ customType: LOOP_CUSTOM_TYPE,
47
+ content: message,
48
+ display: true,
49
+ details: {
50
+ message,
51
+ level: type,
52
+ timestamp: Date.now(),
53
+ },
54
+ });
55
+ }
42
56
  function notify(bus, message, type = "info") {
43
57
  notifyByBus.get(bus)?.(message, type);
44
58
  }
@@ -243,7 +257,7 @@ function dispatchNextIteration(pi, bus, controller) {
243
257
  }
244
258
  const prompt = controller.buildPrompt();
245
259
  controller.markDispatched();
246
- notify(bus, `[Loop] Starting iteration ${task.currentIteration} for ${task.id}`, "info");
260
+ publishLoopUpdate(pi, bus, `[Loop] Starting iteration ${task.currentIteration} for ${task.id}.`, "info");
247
261
  pi.sendUserMessage(prompt, { deliverAs: "followUp" });
248
262
  }
249
263
  export default async function loopExtension(pi) {
@@ -294,11 +308,10 @@ export default async function loopExtension(pi) {
294
308
  const failure = controller.recordFailure("Loop run ended without an assistant message.");
295
309
  if (failure.action === "stop") {
296
310
  const message = describeTerminalSnapshot(failure.snapshot);
297
- recordLoopEvent(pi, message);
298
- notify(bus, message, "warning");
311
+ publishLoopUpdate(pi, bus, message, "warning");
299
312
  return;
300
313
  }
301
- recordLoopEvent(pi, `[Loop] Iteration failed. Retrying iteration ${failure.task?.currentIteration}.`);
314
+ publishLoopUpdate(pi, bus, `[Loop] Iteration failed. Retrying iteration ${failure.task?.currentIteration}.`, "warning");
302
315
  dispatchNextIteration(pi, bus, controller);
303
316
  return;
304
317
  }
@@ -307,20 +320,18 @@ export default async function loopExtension(pi) {
307
320
  const failure = controller.recordFailure("Assistant response did not include a valid <loop-state> block.");
308
321
  if (failure.action === "stop") {
309
322
  const message = describeTerminalSnapshot(failure.snapshot);
310
- recordLoopEvent(pi, message);
311
- notify(bus, message, "warning");
323
+ publishLoopUpdate(pi, bus, message, "warning");
312
324
  return;
313
325
  }
314
- recordLoopEvent(pi, `[Loop] Missing or invalid loop-state block. Retrying iteration ${failure.task?.currentIteration}.`);
326
+ publishLoopUpdate(pi, bus, `[Loop] Missing or invalid loop-state block. Retrying iteration ${failure.task?.currentIteration}.`, "warning");
315
327
  dispatchNextIteration(pi, bus, controller);
316
328
  return;
317
329
  }
318
- recordLoopEvent(pi, describeDecision(decision));
330
+ publishLoopUpdate(pi, bus, describeDecision(decision), "info");
319
331
  const next = controller.finishTurn(decision);
320
332
  if (next.action === "stop") {
321
333
  const message = describeTerminalSnapshot(next.snapshot);
322
- recordLoopEvent(pi, message);
323
- notify(bus, message, decision.status === "complete" ? "info" : "warning");
334
+ publishLoopUpdate(pi, bus, message, decision.status === "complete" ? "info" : "warning");
324
335
  return;
325
336
  }
326
337
  dispatchNextIteration(pi, bus, controller);
@@ -335,8 +346,7 @@ export default async function loopExtension(pi) {
335
346
  if (parsed.type === "help") {
336
347
  const reason = parsed.reason === "empty" ? "Missing loop goal." : undefined;
337
348
  const help = buildHelp(reason);
338
- recordLoopEvent(pi, help);
339
- notify(bus, help, "warning");
349
+ publishLoopUpdate(pi, bus, help, "warning");
340
350
  return;
341
351
  }
342
352
  if (parsed.type === "status") {
@@ -346,16 +356,14 @@ export default async function loopExtension(pi) {
346
356
  : state.lastTerminal
347
357
  ? formatSnapshot(state.lastTerminal)
348
358
  : "[Loop] No loop task has been started in this session.";
349
- recordLoopEvent(pi, message);
350
- notify(bus, message, "info");
359
+ publishLoopUpdate(pi, bus, message, "info");
351
360
  return;
352
361
  }
353
362
  if (parsed.type === "stop") {
354
363
  const activeTask = controller.getActiveTask();
355
364
  if (!activeTask) {
356
365
  const message = "[Loop] No active loop is running.";
357
- recordLoopEvent(pi, message);
358
- notify(bus, message, "warning");
366
+ publishLoopUpdate(pi, bus, message, "warning");
359
367
  return;
360
368
  }
361
369
  controller.stop("Stopped by user request.", "stopped");
@@ -363,8 +371,7 @@ export default async function loopExtension(pi) {
363
371
  ctx.abort();
364
372
  }
365
373
  const message = `[Loop] Stopped loop ${activeTask.id}.`;
366
- recordLoopEvent(pi, message);
367
- notify(bus, message, "info");
374
+ publishLoopUpdate(pi, bus, message, "info");
368
375
  return;
369
376
  }
370
377
  try {
@@ -374,15 +381,13 @@ export default async function loopExtension(pi) {
374
381
  `Goal: ${task.goal}`,
375
382
  `Safety limits: ${task.maxIterations} iterations, ${task.maxConsecutiveFailures} consecutive failures.`,
376
383
  ].join("\n");
377
- recordLoopEvent(pi, message);
378
- notify(bus, `[Loop] Started ${task.id}: ${summarizeGoal(task.goal)}`, "info");
384
+ publishLoopUpdate(pi, bus, message, "info");
379
385
  dispatchNextIteration(pi, bus, controller);
380
386
  }
381
387
  catch (error) {
382
388
  const message = error instanceof Error ? error.message : String(error);
383
389
  const output = `[Loop] ${message}`;
384
- recordLoopEvent(pi, output);
385
- notify(bus, output, "error");
390
+ publishLoopUpdate(pi, bus, output, "error");
386
391
  }
387
392
  },
388
393
  });
@@ -266,7 +266,7 @@ export default async function soulExtension(pi) {
266
266
  console.warn("[soul] Failed to initialize Soul manager.");
267
267
  return;
268
268
  }
269
- console.log("[soul] Soul extension loaded successfully.");
269
+ console.error("[soul] Soul extension loaded successfully.");
270
270
  // Register event handlers
271
271
  // agent_start: Initialize personality
272
272
  pi.on("agent_start", async (_event, _ctx) => {
@@ -349,6 +349,49 @@ function formatState(state) {
349
349
  }
350
350
  return lines.join("\n");
351
351
  }
352
+ function createProgressReport(state) {
353
+ return {
354
+ id: state.id,
355
+ goal: state.goal,
356
+ mode: state.mode,
357
+ status: state.status,
358
+ startedAt: state.startedAt,
359
+ finishedAt: state.updatedAt,
360
+ plan: state.plan ?? createFallbackPlan(state.goal, state.mode),
361
+ results: [...state.results],
362
+ finalSummary: state.lastWorkerSummary ?? "",
363
+ };
364
+ }
365
+ function buildProgressUpdate(state, message) {
366
+ const lines = [
367
+ `Team run ${state.id} is in stage "${state.stage}".`,
368
+ `Goal: ${summarizeGoal(state.goal, 120)}`,
369
+ ];
370
+ if (message) {
371
+ lines.push(`Progress: ${message}`);
372
+ }
373
+ if (state.plan?.summary) {
374
+ lines.push(`Plan: ${state.plan.summary}`);
375
+ }
376
+ if (state.results.length > 0) {
377
+ lines.push(`Completed workers: ${state.results.length}`);
378
+ }
379
+ if (state.lastWorkerSummary) {
380
+ lines.push(`Latest result: ${state.lastWorkerSummary}`);
381
+ }
382
+ if (state.lastError) {
383
+ lines.push(`Last error: ${state.lastError}`);
384
+ }
385
+ return lines.join("\n");
386
+ }
387
+ function emitProgressUpdate(onUpdate, state, message) {
388
+ if (!onUpdate || !state)
389
+ return;
390
+ onUpdate({
391
+ content: [{ type: "text", text: buildProgressUpdate(state, message) }],
392
+ details: createProgressReport(state),
393
+ });
394
+ }
352
395
  function formatReport(report) {
353
396
  const lines = [
354
397
  `[Team] Run ${report.id}`,
@@ -733,7 +776,7 @@ async function runWorker(pi, ctx, goal, plan, worker, previousResults) {
733
776
  }
734
777
  return parsed;
735
778
  }
736
- async function orchestrateTeamRun(pi, ctx, goal, mode) {
779
+ async function orchestrateTeamRun(pi, ctx, goal, mode, onUpdate) {
737
780
  const controller = getController(pi);
738
781
  const active = controller.getActive();
739
782
  if (!active) {
@@ -742,16 +785,21 @@ async function orchestrateTeamRun(pi, ctx, goal, mode) {
742
785
  controller.update({ stage: "planning" });
743
786
  persistState(pi, controller.getActive());
744
787
  syncRunUi(ctx, controller.getActive());
788
+ emitProgressUpdate(onUpdate, controller.getActive(), "Creating the team plan.");
745
789
  const plan = await createPlan(pi, ctx, goal, mode);
746
790
  controller.update({ plan, stage: "parallel research" });
747
791
  persistState(pi, controller.getActive());
748
792
  syncRunUi(ctx, controller.getActive());
749
- const researchResults = await Promise.all(plan.researchWorkers.map((worker) => runWorker(pi, ctx, goal, plan, worker, [])));
750
- for (const result of researchResults) {
793
+ emitProgressUpdate(onUpdate, controller.getActive(), `Plan ready. Launching ${plan.researchWorkers.length} research worker${plan.researchWorkers.length === 1 ? "" : "s"}.`);
794
+ const researchResults = await Promise.all(plan.researchWorkers.map(async (worker) => {
795
+ emitProgressUpdate(onUpdate, controller.getActive(), `Started ${worker.role} (${worker.id}).`);
796
+ const result = await runWorker(pi, ctx, goal, plan, worker, []);
751
797
  controller.appendResult(result);
752
798
  persistState(pi, controller.getActive());
753
799
  syncRunUi(ctx, controller.getActive());
754
- }
800
+ emitProgressUpdate(onUpdate, controller.getActive(), `${worker.role} finished with status ${result.status}.`);
801
+ return result;
802
+ }));
755
803
  const allResults = [...researchResults];
756
804
  const executionMode = mode === "research" ? "research_only" : plan.executionMode;
757
805
  if (executionMode === "implement_and_review") {
@@ -765,10 +813,12 @@ async function orchestrateTeamRun(pi, ctx, goal, mode) {
765
813
  controller.update({ stage: "implementation" });
766
814
  persistState(pi, controller.getActive());
767
815
  syncRunUi(ctx, controller.getActive());
816
+ emitProgressUpdate(onUpdate, controller.getActive(), "Starting the implementation worker.");
768
817
  const implementationResult = await runWorker(pi, ctx, goal, plan, implementationWorker, allResults);
769
818
  controller.appendResult(implementationResult);
770
819
  persistState(pi, controller.getActive());
771
820
  syncRunUi(ctx, controller.getActive());
821
+ emitProgressUpdate(onUpdate, controller.getActive(), `Implementation worker finished with status ${implementationResult.status}.`);
772
822
  allResults.push(implementationResult);
773
823
  const reviewWorker = {
774
824
  id: "reviewer",
@@ -780,10 +830,12 @@ async function orchestrateTeamRun(pi, ctx, goal, mode) {
780
830
  controller.update({ stage: "review" });
781
831
  persistState(pi, controller.getActive());
782
832
  syncRunUi(ctx, controller.getActive());
833
+ emitProgressUpdate(onUpdate, controller.getActive(), "Starting the review worker.");
783
834
  const reviewResult = await runWorker(pi, ctx, goal, plan, reviewWorker, allResults);
784
835
  controller.appendResult(reviewResult);
785
836
  persistState(pi, controller.getActive());
786
837
  syncRunUi(ctx, controller.getActive());
838
+ emitProgressUpdate(onUpdate, controller.getActive(), `Review worker finished with status ${reviewResult.status}.`);
787
839
  allResults.push(reviewResult);
788
840
  }
789
841
  const status = allResults.some((result) => result.status === "failed")
@@ -803,6 +855,14 @@ async function orchestrateTeamRun(pi, ctx, goal, mode) {
803
855
  finalSummary: "",
804
856
  };
805
857
  const finalSummary = buildFinalSummary(provisionalReport);
858
+ controller.update({
859
+ stage: "finished",
860
+ status,
861
+ lastWorkerSummary: finalSummary,
862
+ });
863
+ persistState(pi, controller.getActive());
864
+ syncRunUi(ctx, controller.getActive());
865
+ emitProgressUpdate(onUpdate, controller.getActive(), `Team run finished with status ${status}.`);
806
866
  const report = controller.finish(status, finalSummary);
807
867
  if (!report) {
808
868
  return { ...provisionalReport, finalSummary };
@@ -887,13 +947,14 @@ export default async function teamExtension(pi) {
887
947
  description: "Delegate a task to a coordinated team of workers, but only when the user explicitly asked for Agent team or multi-agent execution.",
888
948
  guidance: "Only use team_run when the user explicitly requested Agent team, multi-agent, or subagent execution. Do not call it proactively.",
889
949
  parameters: TEAM_TOOL_PARAMS,
890
- execute: async (_toolCallId, params, _signal, _onUpdate, ctx) => {
950
+ execute: async (_toolCallId, params, _signal, onUpdate, ctx) => {
891
951
  ensureExplicitTeamTrigger(ctx, params.goal);
892
952
  const controller = getController(pi);
893
953
  const active = controller.start(params.goal, params.mode ?? "auto");
894
954
  persistState(pi, active);
955
+ emitProgressUpdate(onUpdate, active, "Team run started.");
895
956
  try {
896
- const report = await orchestrateTeamRun(pi, ctx, params.goal, params.mode ?? "auto");
957
+ const report = await orchestrateTeamRun(pi, ctx, params.goal, params.mode ?? "auto", onUpdate);
897
958
  report.artifactPath = writeReportArtifact(report, ctx.cwd);
898
959
  persistReport(pi, report);
899
960
  return {
@@ -904,6 +965,7 @@ export default async function teamExtension(pi) {
904
965
  catch (error) {
905
966
  const message = error instanceof Error ? error.message : String(error);
906
967
  controller.update({ lastError: message, stage: "failed" });
968
+ emitProgressUpdate(onUpdate, controller.getActive(), message);
907
969
  const report = controller.finish("failed", message) ?? {
908
970
  id: active.id,
909
971
  goal: params.goal,
@@ -243,9 +243,9 @@ export default async function exportHtmlExtension(pi) {
243
243
  // Export the session (use default output path)
244
244
  // Pass undefined for state since we don't have access to it here
245
245
  const filePath = await extExportSessionToHtml(sessionManager, undefined);
246
- console.log(`Session exported to: ${filePath}`);
246
+ console.error(`Session exported to: ${filePath}`);
247
247
  },
248
248
  });
249
- console.log("[export-html] Extension loaded");
249
+ console.error("[export-html] Extension loaded");
250
250
  }
251
251
  //# sourceMappingURL=index.js.map
package/dist/main.js CHANGED
@@ -695,7 +695,53 @@ export async function main(args) {
695
695
  }
696
696
  if (parsed.acp) {
697
697
  const { runAcpMode } = await import("./modes/acp/acp-mode.js");
698
- await runAcpMode(session);
698
+ const createAcpSessionForCwd = async (workspaceCwd) => {
699
+ const resolvedWorkspaceCwd = resolveWorkingDirectory(workspaceCwd);
700
+ const workspaceSettingsManager = SettingsManager.create(resolvedWorkspaceCwd, agentDir);
701
+ reportSettingsErrors(workspaceSettingsManager, "acp startup");
702
+ const workspaceResourceLoader = new DefaultResourceLoader({
703
+ cwd: resolvedWorkspaceCwd,
704
+ agentDir,
705
+ settingsManager: workspaceSettingsManager,
706
+ additionalExtensionPaths: [...defaultExtPaths, ...(parsed.extensions ?? [])],
707
+ additionalSkillPaths: parsed.skills,
708
+ additionalPromptTemplatePaths: parsed.promptTemplates,
709
+ additionalThemePaths: parsed.themes,
710
+ noExtensions: parsed.noExtensions,
711
+ noSkills: parsed.noSkills,
712
+ noPromptTemplates: parsed.noPromptTemplates,
713
+ noThemes: parsed.noThemes,
714
+ systemPrompt: parsed.systemPrompt,
715
+ appendSystemPrompt: parsed.appendSystemPrompt,
716
+ });
717
+ await workspaceResourceLoader.reload();
718
+ const workspaceExtensionsResult = workspaceResourceLoader.getExtensions();
719
+ for (const { path, error } of workspaceExtensionsResult.errors) {
720
+ console.error(chalk.red(`Failed to load extension "${path}": ${error}`));
721
+ }
722
+ for (const { name, config } of workspaceExtensionsResult.runtime.pendingProviderRegistrations) {
723
+ modelRegistry.registerProvider(name, config);
724
+ }
725
+ workspaceExtensionsResult.runtime.pendingProviderRegistrations = [];
726
+ let workspaceScopedModels = [];
727
+ if (modelPatterns && modelPatterns.length > 0) {
728
+ workspaceScopedModels = await resolveModelScope(modelPatterns, modelRegistry);
729
+ }
730
+ const workspaceSessionManager = parsed.noSession
731
+ ? SessionManager.inMemory(resolvedWorkspaceCwd)
732
+ : SessionManager.create(resolvedWorkspaceCwd, parsed.sessionDir);
733
+ const { options: workspaceSessionOptions } = buildSessionOptions(parsed, workspaceScopedModels, workspaceSessionManager, modelRegistry, workspaceSettingsManager);
734
+ workspaceSessionOptions.cwd = resolvedWorkspaceCwd;
735
+ workspaceSessionOptions.authStorage = authStorage;
736
+ workspaceSessionOptions.modelRegistry = modelRegistry;
737
+ workspaceSessionOptions.resourceLoader = workspaceResourceLoader;
738
+ workspaceSessionOptions.settingsManager = workspaceSettingsManager;
739
+ workspaceSessionOptions.enableMCP = sessionOptions.enableMCP;
740
+ workspaceSessionOptions.enableSoul = sessionOptions.enableSoul;
741
+ const { session: workspaceSession } = await createAgentSession(workspaceSessionOptions);
742
+ return workspaceSession;
743
+ };
744
+ await runAcpMode(session, { createSessionForCwd: createAcpSessionForCwd });
699
745
  }
700
746
  else if (mode === "rpc") {
701
747
  await runRpcMode(session);
@@ -3,15 +3,15 @@
3
3
  *
4
4
  * Used for integrating with ACP-compatible editors like Zed and JetBrains.
5
5
  * Communication via stdin/stdout using JSON-RPC 2.0 messages.
6
- *
7
- * Protocol:
8
- * - Client → Agent: initialize, session/new, session/prompt, session/cancel
9
- * - Agent → Client: session/update (streaming events), session/request_permission
10
6
  */
11
7
  import type { AgentSession } from "../../core/runtime/agent-session.js";
8
+ interface AcpModeOptions {
9
+ createSessionForCwd?: (cwd: string) => Promise<AgentSession>;
10
+ }
12
11
  /**
13
12
  * Run in ACP mode.
14
13
  * Listens for JSON-RPC 2.0 messages on stdin, outputs JSON-RPC responses/events on stdout.
15
14
  */
16
- export declare function runAcpMode(session: AgentSession): Promise<never>;
15
+ export declare function runAcpMode(session: AgentSession, options?: AcpModeOptions): Promise<never>;
16
+ export {};
17
17
  //# sourceMappingURL=acp-mode.d.ts.map