qlogicagent 2.18.9 → 2.18.10

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.
Files changed (62) hide show
  1. package/dist/cli.js +1 -1
  2. package/dist/host-contract.js +1 -1
  3. package/dist/index.js +445 -984
  4. package/dist/pet-host.js +8 -8
  5. package/dist/project-memory-host.js +40 -0
  6. package/dist/protocol.js +1 -1
  7. package/dist/types/cli/acp-session-host.d.ts +1 -1
  8. package/dist/types/cli/community-resource-installer.d.ts +3 -5
  9. package/dist/types/cli/default-project-bootstrap.d.ts +1 -1
  10. package/dist/types/cli/handlers/agents-handler.d.ts +8 -6
  11. package/dist/types/cli/handlers/community-handler.d.ts +0 -4
  12. package/dist/types/cli/handlers/control-handler.d.ts +1 -1
  13. package/dist/types/cli/handlers/project-handler.d.ts +1 -1
  14. package/dist/types/cli/handlers/session-handler.d.ts +0 -7
  15. package/dist/types/cli/handlers/solo-handler.d.ts +0 -2
  16. package/dist/types/cli/memory-coordinator.d.ts +1 -1
  17. package/dist/types/cli/multi-agent-state-coordinator.d.ts +0 -3
  18. package/dist/types/cli/pet-runtime.d.ts +5 -5
  19. package/dist/types/cli/product-coordinator.d.ts +0 -2
  20. package/dist/types/cli/project-memory-store-factory.d.ts +11 -1
  21. package/dist/types/cli/rpc-registry.d.ts +0 -2
  22. package/dist/types/cli/stdio-runtime-bootstrap.d.ts +2 -0
  23. package/dist/types/cli/stdio-runtime-services.d.ts +2 -0
  24. package/dist/types/cli/stdio-server.d.ts +3 -1
  25. package/dist/types/config/cn-mirror.d.ts +2 -2
  26. package/dist/types/host-contract/index.d.ts +167 -9
  27. package/dist/types/orchestration/agent-instance.d.ts +1 -3
  28. package/dist/types/orchestration/goal-mode-adapters.d.ts +0 -3
  29. package/dist/types/orchestration/goal-run-persistence.d.ts +0 -3
  30. package/dist/types/orchestration/product-persistence.d.ts +1 -4
  31. package/dist/types/orchestration/product-planner.d.ts +2 -3
  32. package/dist/types/orchestration/run-state-host-authority.d.ts +7 -0
  33. package/dist/types/orchestration/solo-evaluator.d.ts +2 -3
  34. package/dist/types/orchestration/solo-persistence.d.ts +4 -7
  35. package/dist/types/orchestration/testing/delegate-test-bridge.d.ts +13 -2
  36. package/dist/types/orchestration/workflow/node-schema.d.ts +2 -1
  37. package/dist/types/orchestration/workflow/qla-executor-host.d.ts +1 -1
  38. package/dist/types/orchestration/workflow/workflow-bundle.d.ts +1 -1
  39. package/dist/types/project-memory-host.d.ts +3 -0
  40. package/dist/types/protocol/wire/acp-agent-management.d.ts +1 -1
  41. package/dist/types/protocol/wire/acp-protocol.d.ts +1 -1
  42. package/dist/types/runtime/infra/acp-detector.d.ts +1 -1
  43. package/dist/types/runtime/infra/background-tasks.d.ts +1 -1
  44. package/dist/types/runtime/pet/pet-community-assets.d.ts +7 -17
  45. package/dist/types/runtime/pet/petdex-vision-qa.d.ts +12 -0
  46. package/dist/types/runtime/ports/memory-recall-source.d.ts +10 -0
  47. package/dist/types/runtime/ports/project-memory-store.d.ts +1 -1
  48. package/dist/types/runtime/session/session-persistence.d.ts +3 -4
  49. package/dist/types/skills/memory/host-memory-provider.d.ts +2 -2
  50. package/dist/types/skills/memory/memory-config-resolver.d.ts +4 -0
  51. package/dist/types/skills/memory/task-distillation.d.ts +1 -1
  52. package/dist/types/test-support/run-state-authority-setup.d.ts +1 -0
  53. package/dist/types/transport/host-pet-client.d.ts +20 -0
  54. package/dist/types/transport/host-run-state-client.d.ts +17 -0
  55. package/dist/workflow-host.js +9 -9
  56. package/package.json +12 -2
  57. package/dist/runtime/infra/mcp-bridge-server.js +0 -338
  58. package/dist/types/cli/handlers/message-feedback-handler.d.ts +0 -31
  59. package/dist/types/runtime/infra/agent-process.d.ts +0 -368
  60. package/dist/types/runtime/infra/external-agent-pool.d.ts +0 -89
  61. package/dist/types/skills/memory/local-memory-provider.d.ts +0 -325
  62. package/dist/types/skills/memory/memory-provider-factory.d.ts +0 -33
@@ -23,7 +23,6 @@
23
23
  * - CrewAI: checkpoint serialization (mid-task state)
24
24
  * - LangGraph: durable execution (persist after each node)
25
25
  */
26
- import type { AgentProcessManager } from "../runtime/infra/agent-process.js";
27
26
  import type { AcpDetector } from "../runtime/infra/acp-detector.js";
28
27
  import type { AgentConfigStore } from "../runtime/infra/agent-config-store.js";
29
28
  import type { DelegateBridge } from "./delegation-coordinator.js";
@@ -40,6 +39,7 @@ export interface PlanningSession {
40
39
  cwd: string;
41
40
  leaderAgentId: string;
42
41
  leaderMemberId?: string;
42
+ activeDelegationId?: string;
43
43
  phase: PlanningPhase;
44
44
  plan?: ProductPlan;
45
45
  /** Multi-turn conversation history during planning. */
@@ -105,12 +105,11 @@ export interface DagMutation {
105
105
  details?: Record<string, unknown>;
106
106
  }
107
107
  export declare class ProductPlanner {
108
- private processManager;
109
108
  private acpDetector;
110
109
  private configStore;
111
110
  private callbacks;
112
111
  private sessions;
113
- constructor(processManager: AgentProcessManager, acpDetector: AcpDetector, configStore: AgentConfigStore | null, callbacks?: PlannerCallbacks);
112
+ constructor(acpDetector: AcpDetector, configStore: AgentConfigStore | null, callbacks?: PlannerCallbacks);
114
113
  /**
115
114
  * Start an interactive planning session (Phase 1).
116
115
  * Spawns the leader agent and begins multi-turn dialogue.
@@ -0,0 +1,7 @@
1
+ import type { HostRunStateClient } from "../transport/host-run-state-client.js";
2
+ export interface HostRunStateAuthority {
3
+ client: HostRunStateClient;
4
+ sessionId: string;
5
+ }
6
+ export declare function configureHostRunStateAuthority(resolver: (() => HostRunStateAuthority | undefined) | null): void;
7
+ export declare function requireHostRunStateAuthority(): HostRunStateAuthority;
@@ -18,11 +18,11 @@
18
18
  *
19
19
  * Degradation: if K agents fail but ≥1 succeeds, session remains interactive.
20
20
  */
21
- import type { AgentProcessManager } from "../runtime/infra/agent-process.js";
22
21
  import type { AcpDetector } from "../runtime/infra/acp-detector.js";
23
22
  import type { AgentConfigStore } from "../runtime/infra/agent-config-store.js";
24
23
  import type { DelegateBridge } from "./delegation-coordinator.js";
25
24
  import type { SoloState, SoloAgentState, SoloEvaluation, SoloStatus, SoloStartParams, SoloSelectParams, SoloSpec } from "../protocol/wire/acp-agent-management.js";
25
+ export declare function deriveSoloDelegateProjectId(registeredProjectRoot: string): string;
26
26
  export interface SoloCallbacks {
27
27
  log?: {
28
28
  info(msg: string): void;
@@ -75,11 +75,10 @@ export declare function buildEvaluationPrompt(originalTask: string, spec: SoloSp
75
75
  diff?: string;
76
76
  }>): string;
77
77
  export declare class SoloEvaluator {
78
- private processManager;
79
78
  private configStore;
80
79
  private callbacks;
81
80
  private sessions;
82
- constructor(processManager: AgentProcessManager, _acpDetector: AcpDetector, configStore: AgentConfigStore | null, callbacks?: SoloCallbacks);
81
+ constructor(_acpDetector: AcpDetector, configStore: AgentConfigStore | null, callbacks?: SoloCallbacks);
83
82
  /** Persist current session data to disk (fire-and-forget). */
84
83
  private persistSession;
85
84
  /** Restore sessions from disk (call once at startup). */
@@ -1,8 +1,5 @@
1
1
  /**
2
- * Solo Persistence read/write Solo Mode state to disk.
3
- *
4
- * State is stored at `<project>/.qlogicagent/solos/<soloId>/solo-state.json`.
5
- * Mirrors the product-persistence.ts pattern.
2
+ * Solo persistence facade over the Gateway-owned RunStateStore.
6
3
  */
7
4
  import type { PathService } from "../runtime/ports/index.js";
8
5
  import type { SoloState, SoloAgentState, SoloEvaluation, SoloSpec } from "../protocol/wire/acp-agent-management.js";
@@ -40,11 +37,11 @@ export interface PersistedSoloState {
40
37
  export interface SoloPersistenceOptions {
41
38
  pathService?: PathService;
42
39
  }
43
- /** Save solo state to disk. */
40
+ /** Save the latest Solo snapshot through Gateway authority. */
44
41
  export declare function saveSoloState(state: PersistedSoloState, cwd?: string, options?: SoloPersistenceOptions): Promise<void>;
45
- /** Load solo state from disk. Returns undefined if not found. */
42
+ /** Load the latest Solo snapshot from Gateway authority. */
46
43
  export declare function loadSoloState(soloId: string, cwd?: string, options?: SoloPersistenceOptions): Promise<PersistedSoloState | undefined>;
47
44
  /** List all solo session IDs with their persisted state. */
48
45
  export declare function listSoloSessions(cwd?: string, options?: SoloPersistenceOptions): Promise<PersistedSoloState[]>;
49
- /** Delete solo state from disk. */
46
+ /** Delete a Solo run through Gateway authority. */
50
47
  export declare function deleteSoloState(soloId: string, cwd?: string, options?: SoloPersistenceOptions): Promise<boolean>;
@@ -1,4 +1,15 @@
1
- import type { AgentProcessManager } from "../../runtime/infra/agent-process.js";
2
1
  import type { DelegateBridge } from "../delegation-coordinator.js";
2
+ interface LegacyTurnFixture {
3
+ sendTask(memberId: string, prompt: string, options?: {
4
+ timeout?: number;
5
+ }): Promise<unknown>;
6
+ getUsageTracker?(memberId: string): {
7
+ getUsage(): {
8
+ inputTokens: number;
9
+ outputTokens: number;
10
+ };
11
+ } | null;
12
+ }
3
13
  /** Test-only adapter for migrating orchestration fixtures from the retired local spawn lane. */
4
- export declare function makeDelegateTestBridge(processManager: AgentProcessManager): DelegateBridge;
14
+ export declare function makeDelegateTestBridge(processManager: LegacyTurnFixture): DelegateBridge;
15
+ export {};
@@ -147,11 +147,12 @@ export interface ExecutorHost {
147
147
  waitWebhook?(req: WebhookWaitHostRequest): Promise<Record<string, unknown>>;
148
148
  }
149
149
  export interface AgentHostRequest {
150
- agentId?: string;
150
+ agentId: string;
151
151
  prompt: string;
152
152
  input: DataItem[];
153
153
  signal?: AbortSignal;
154
154
  }
155
+ export declare function requireWorkflowAgentId(value: unknown): string;
155
156
  export interface ModelHostRequest {
156
157
  prompt: string;
157
158
  modelHint?: string;
@@ -14,7 +14,7 @@ import type { ExecutorHost, ToolHostRequest, MemoryHostRequest, SubworkflowHostR
14
14
  export interface QlaExecutorHostDeps {
15
15
  /** Run one agent turn (spawn external ACP agent + sendTask). Returns the agent's text output. */
16
16
  runAgent: (req: {
17
- agentId?: string;
17
+ agentId: string;
18
18
  prompt: string;
19
19
  signal?: AbortSignal;
20
20
  }) => Promise<string>;
@@ -10,7 +10,7 @@
10
10
  * graph references, so an importer (or the Hub apply checklist) can verify bindings
11
11
  * BEFORE activating instead of failing mid-run.
12
12
  */
13
- import type { WorkflowDef } from "./node-schema.js";
13
+ import { type WorkflowDef } from "./node-schema.js";
14
14
  import type { TriggerDef } from "./workflow-trigger.js";
15
15
  import type { ConcurrencyPolicy, WorkflowRecord } from "./workflow-store.js";
16
16
  export declare const WORKFLOW_BUNDLE_SCHEMA_VERSION = 2;
@@ -0,0 +1,3 @@
1
+ /** Gateway-owned project-memory implementation. qlogicagent production code must consume the X7 proxy. */
2
+ export { Memdir } from "./skills/memory/memdir.js";
3
+ export type { MemdirFileInfo, MemdirResult } from "./skills/memory/memdir.js";
@@ -75,7 +75,7 @@ export interface AgentInstallSpec {
75
75
  }
76
76
  /**
77
77
  * Extended descriptor for external agents,
78
- * used internally by AgentProcessManager to spawn.
78
+ * used by the Gateway Supervisor when resolving an agent.
79
79
  */
80
80
  export interface ExternalAgentDescriptor {
81
81
  /** Backend ID. */
@@ -97,7 +97,7 @@ export interface AcpHostCapabilities {
97
97
  }
98
98
  /** Agent capabilities declared in the initialize response. */
99
99
  export interface AcpAgentCapabilities {
100
- /** Standard (agent-process reads it; implemented in subproject 2). */
100
+ /** Standard ACP capability consumed by the Gateway Supervisor. */
101
101
  loadSession?: boolean;
102
102
  /** Standard (used when reading third-party agents like copilot). */
103
103
  promptCapabilities?: Record<string, unknown>;
@@ -220,7 +220,7 @@ export declare class AcpDetector {
220
220
  */
221
221
  private buildSelfDescriptor;
222
222
  /**
223
- * Build an ExternalAgentDescriptor suitable for AgentProcessManager.spawn().
223
+ * Build an ExternalAgentDescriptor suitable for Gateway Supervisor resolution.
224
224
  * Returns null if the agent is not available.
225
225
  */
226
226
  buildExternalDescriptor(agentId: string): import("../../protocol/wire/acp-agent-management.js").ExternalAgentDescriptor | null;
@@ -67,7 +67,7 @@ export interface TaskOutputSnapshot {
67
67
  }
68
68
  /**
69
69
  * Control surface for a task whose EXECUTION lives outside this manager — e.g. a
70
- * team-member subprocess owned by AgentProcessManager. The manager holds the task
70
+ * supervised team-member process. The Gateway holds the task
71
71
  * in the unified panel (list/output/cancel) and routes those three actions here;
72
72
  * lifecycle settlement is driven by the owner via settleExternalTask().
73
73
  */
@@ -1,31 +1,21 @@
1
1
  import type { CommunityInstallResolution } from "../community/community-consent-client.js";
2
- import { type PetdexPetAssetSummary } from "./petdex-asset.js";
3
- export interface InstalledCommunityPet {
2
+ export interface CommunityPetAdoptionProposal {
4
3
  kind: "pet";
5
- status: "installed";
4
+ mode: "gateway-adoption";
6
5
  resourceId: string;
7
6
  version: string;
8
7
  checksum: string;
9
- /** Petdex asset id now registered in profile.customPets. */
10
8
  assetId: string;
11
9
  name: string;
12
- /** Materialized petdex summary (atlas imageUrl = spritesheet data URL) for instant UI hydration. */
13
- asset: PetdexPetAssetSummary;
10
+ fileName: string;
11
+ /** Validated, provenance-normalized .petdex bytes. Only Gateway may adopt these bytes. */
12
+ packageBase64: string;
14
13
  }
15
14
  export interface InstallCommunityPetOptions {
16
15
  fetchFn?: typeof fetch;
17
16
  /** Replace an existing install in place (update flow). Petdex upsert is idempotent, so this is accepted for dispatcher parity. */
18
17
  allowReplace?: boolean;
19
- /** Owner whose profile receives the pet; defaults to the active runtime owner. */
20
- ownerUserId?: string;
21
18
  }
22
- /**
23
- * Materialize a community pet end to end: download the gzipped `.petdex` package,
24
- * verify size + whole-package sha256, gunzip + load + validate the petdex atlas, then
25
- * register it into `profile.customPets` with `source.kind="community"` — the exact same
26
- * registration upload/forge use. From that moment `pet.status` includes it and the desktop
27
- * pet can render the sprite. (Previously this wrote a stripped manifest that never reached
28
- * the profile, so installed community pets were invisible in the settings pet list.)
29
- */
30
- export declare function installCommunityPetResource(install: CommunityInstallResolution, options?: InstallCommunityPetOptions): Promise<InstalledCommunityPet>;
19
+ /** Download, verify, validate, and normalize a community PET into an inert Gateway adoption proposal. */
20
+ export declare function installCommunityPetResource(install: CommunityInstallResolution, options?: InstallCommunityPetOptions): Promise<CommunityPetAdoptionProposal>;
31
21
  export declare function assertPetInstall(install: CommunityInstallResolution): void;
@@ -0,0 +1,12 @@
1
+ export interface PetdexVisionVerdict {
2
+ ok: boolean;
3
+ reason: string;
4
+ qaSkipped?: boolean;
5
+ }
6
+ export interface PetdexVisionQaContext {
7
+ label: string;
8
+ target: string;
9
+ }
10
+ /** Lenient parse: only an explicit FAIL blocks ambiguous model output. */
11
+ export declare function parsePetdexVisionVerdict(text: string): PetdexVisionVerdict;
12
+ export declare function runPetdexVisionQa(call: () => Promise<string>, context: PetdexVisionQaContext, log?: (message: string) => void): Promise<PetdexVisionVerdict>;
@@ -1,3 +1,13 @@
1
1
  export interface MemoryRecallSource {
2
2
  getRootPath(): string;
3
+ searchLocal(query: string): Promise<Array<{
4
+ file: string;
5
+ snippet: string;
6
+ score: number;
7
+ }>>;
8
+ readFile(name: string): Promise<{
9
+ ok: boolean;
10
+ content?: string;
11
+ message: string;
12
+ }>;
3
13
  }
@@ -12,7 +12,7 @@ export interface ProjectMemoryResult {
12
12
  }
13
13
  export interface ProjectMemoryStore {
14
14
  getRootPath(): string;
15
- ensureInitialized(): void;
15
+ ensureInitialized(): void | Promise<void>;
16
16
  getIndexForPrompt(): string;
17
17
  getIndexRaw(): string;
18
18
  getIndexUsage(): {
@@ -1,13 +1,12 @@
1
1
  /**
2
2
  * Session persistence authority facade.
3
3
  *
4
- * When gateway advertises Session X7, durable reads/writes go through HostSessionClient. Without
5
- * that capability (gate-off/tests/standalone), the legacy local implementation remains the inert
6
- * compatibility path. A single call never writes both stores.
4
+ * Every durable read/write goes through HostSessionClient. Standalone/local persistence is not a
5
+ * supported runtime mode after the S3 state-inversion cut.
7
6
  */
8
7
  import type { ChatMessage } from "../../protocol/wire/index.js";
9
8
  import type { HostSessionClient } from "../../transport/host-session-client.js";
10
- import { type AppendMessageOutcome } from "./session-transcript-store.js";
9
+ import type { AppendMessageOutcome } from "./session-transcript-store.js";
11
10
  import { getSessionMetadata, readSessionMetadata } from "./session-metadata-store.js";
12
11
  import type { MessageDisplayMetadata, PersistedSession, SessionMetadataPatch, SessionStateSaveMetadata, SessionUsageSnapshot, TokenUsage } from "./session-types.js";
13
12
  export declare function configureHostSessionPersistence(resolver: () => HostSessionClient | undefined): void;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * HostMemoryProvider —— qlogicagent 大脑对 memories.db 的存取反转(Route B B3;X7 brain proxy)。
3
3
  *
4
- * LocalMemoryProvider 同公开面的 **proxy 实现**:大脑逻辑(dream/distill/晋升/consolidation/召回 hook)
4
+ * Gateway Memory 权威公开面的 **proxy 实现**:大脑逻辑(dream/distill/晋升/consolidation/召回 hook)
5
5
  * 零改动,底下的存取经 `x/host.request`(HostRequestClient)打到 gateway 四权威 host 服务(memory 域),
6
6
  * store(memories.db)只有 gateway 进程打开。
7
7
  *
@@ -144,5 +144,5 @@ export declare class HostMemoryProvider implements MemoryRuntimeHookProvider, Me
144
144
  readAttachmentBytes(_id: string): never;
145
145
  setAttachmentText(_id: string, _text: string): never;
146
146
  }
147
- /** 工厂便捷函数(与 createLocalMemoryProvider 对称)。 */
147
+ /** Host Memory proxy 工厂。 */
148
148
  export declare function createHostMemoryProvider(config: HostMemoryProviderConfig): HostMemoryProvider;
@@ -0,0 +1,4 @@
1
+ import { type MemoryProviderFactoryConfig } from "./memory-embedding-config.js";
2
+ export type { MemoryProviderFactoryConfig } from "./memory-embedding-config.js";
3
+ /** Resolve embedding configuration without constructing or opening a local memories.db provider. */
4
+ export declare function resolveMemoryConfigFromEnv(): MemoryProviderFactoryConfig;
@@ -11,7 +11,7 @@
11
11
  * 【B3 登记·刻意不动】本文件的 profile 级 JSON store 直写(task-distill-candidates.json /
12
12
  * promotion-proposals.json / procedure-usage.json,均 A 域)是 qla 写、gateway 读(gateway
13
13
  * MemoryProfileService 已持 promotion-proposals.json)的**文件级共享过渡态**——B3.1 只反转
14
- * memories.db 存取(LocalMemoryProvider→HostMemoryProvider),这批 JSON 随削藩批次归
14
+ * memories.db 存取已收口为 HostMemoryProvider proxy,这批 JSON 随削藩批次归
15
15
  * store-owner(spec §1 X7 裁决第 4 条)。单一事实源 docs/agent-supervision-authority-migration-spec.md。
16
16
  */
17
17
  /** 同模式判定的余弦下限。错聚有害(把不同任务蒸成一份配方),漏聚无害(下次再攒)。 */
@@ -0,0 +1,20 @@
1
+ import type { HostRequestParams } from "../host-contract/index.js";
2
+ import type { PetSoul } from "../runtime/pet/pet-types.js";
3
+ interface PetRequester {
4
+ request(params: HostRequestParams): Promise<unknown>;
5
+ }
6
+ export interface HostPetAwardResult {
7
+ active: boolean;
8
+ soul?: PetSoul;
9
+ growth?: Record<string, unknown>;
10
+ events?: Array<Record<string, unknown>>;
11
+ }
12
+ export declare class HostPetClient {
13
+ private readonly requester;
14
+ constructor(requester: PetRequester);
15
+ isActive(sessionId: string): Promise<boolean>;
16
+ getSoul(sessionId: string): Promise<PetSoul | null>;
17
+ awardXp(event: string, sessionId: string): Promise<HostPetAwardResult>;
18
+ journeyCatchUp(sessionId: string): Promise<string[]>;
19
+ }
20
+ export {};
@@ -0,0 +1,17 @@
1
+ import type { HostRequestParams, RunEvent, RunState } from "../host-contract/index.js";
2
+ export interface HostRunStateRequester {
3
+ request(params: HostRequestParams): Promise<unknown>;
4
+ }
5
+ export declare class HostRunStateClient {
6
+ private readonly requester;
7
+ constructor(requester: HostRunStateRequester);
8
+ open(runId: string, kind: "solo" | "product" | "goal", projectId: string, sessionId: string): Promise<string>;
9
+ recordEvent(runId: string, event: Omit<RunEvent, "member">, sessionId: string): Promise<void>;
10
+ checkpoint(runId: string, snapshot: unknown, sessionId: string, checkpointId?: string): Promise<void>;
11
+ get(runId: string, sessionId: string): Promise<RunState>;
12
+ list(projectId: string, sessionId: string, kind?: "solo" | "product" | "goal"): Promise<RunState[]>;
13
+ delete(runId: string, sessionId: string): Promise<boolean>;
14
+ getCheckpoint(runId: string, checkpointId: string, sessionId: string): Promise<unknown | undefined>;
15
+ listCheckpoints(runId: string, sessionId: string): Promise<string[]>;
16
+ restoreCheckpoint(runId: string, checkpointId: string, sessionId: string): Promise<unknown | undefined>;
17
+ }