@gajae-code/coding-agent 0.5.0 → 0.5.2

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 (194) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +1 -1
  3. package/dist/types/async/job-manager.d.ts +26 -0
  4. package/dist/types/cli/args.d.ts +1 -0
  5. package/dist/types/cli/list-models.d.ts +6 -0
  6. package/dist/types/cli/setup-cli.d.ts +8 -1
  7. package/dist/types/commands/gc.d.ts +26 -0
  8. package/dist/types/commands/setup.d.ts +7 -0
  9. package/dist/types/config/file-lock-gc.d.ts +5 -0
  10. package/dist/types/config/file-lock.d.ts +29 -0
  11. package/dist/types/config/model-registry.d.ts +4 -0
  12. package/dist/types/config/models-config-schema.d.ts +5 -0
  13. package/dist/types/config/settings-schema.d.ts +62 -0
  14. package/dist/types/coordinator/contract.d.ts +1 -1
  15. package/dist/types/defaults/gjc/extensions/grok-build/index.d.ts +1 -0
  16. package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/index.d.ts +1 -0
  17. package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/models/catalog.d.ts +25 -0
  18. package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/payload/sanitize.d.ts +27 -0
  19. package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/provider/billing.d.ts +8 -0
  20. package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/provider/register.d.ts +5 -0
  21. package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/provider/stream.d.ts +10 -0
  22. package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/provider/usage.d.ts +2 -0
  23. package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/shared/base-url.d.ts +2 -0
  24. package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/shared/errors.d.ts +38 -0
  25. package/dist/types/defaults/gjc-grok-cli.d.ts +5 -0
  26. package/dist/types/extensibility/extensions/index.d.ts +1 -0
  27. package/dist/types/extensibility/extensions/prefix-command-bridge.d.ts +35 -0
  28. package/dist/types/gjc-runtime/deep-interview-recorder.d.ts +103 -0
  29. package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +2 -0
  30. package/dist/types/gjc-runtime/deep-interview-state.d.ts +112 -0
  31. package/dist/types/gjc-runtime/gc-render.d.ts +6 -0
  32. package/dist/types/gjc-runtime/gc-runtime.d.ts +134 -0
  33. package/dist/types/gjc-runtime/ledger-event-renderer.d.ts +68 -0
  34. package/dist/types/gjc-runtime/state-writer.d.ts +64 -2
  35. package/dist/types/gjc-runtime/team-gc.d.ts +7 -0
  36. package/dist/types/gjc-runtime/team-runtime.d.ts +5 -0
  37. package/dist/types/gjc-runtime/tmux-common.d.ts +11 -0
  38. package/dist/types/gjc-runtime/tmux-gc.d.ts +7 -0
  39. package/dist/types/gjc-runtime/tmux-sessions.d.ts +13 -0
  40. package/dist/types/gjc-runtime/ultragoal-guard.d.ts +10 -0
  41. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +29 -0
  42. package/dist/types/harness-control-plane/gc-adapter.d.ts +3 -0
  43. package/dist/types/harness-control-plane/owner.d.ts +7 -0
  44. package/dist/types/harness-control-plane/storage.d.ts +20 -0
  45. package/dist/types/modes/components/hook-selector.d.ts +7 -1
  46. package/dist/types/modes/components/provider-onboarding-selector.d.ts +1 -1
  47. package/dist/types/modes/controllers/command-controller.d.ts +1 -0
  48. package/dist/types/modes/interactive-mode.d.ts +1 -1
  49. package/dist/types/modes/rpc/rpc-mode.d.ts +72 -2
  50. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +13 -0
  51. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +25 -0
  52. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +2 -0
  53. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +10 -0
  54. package/dist/types/modes/theme/defaults/index.d.ts +302 -0
  55. package/dist/types/modes/theme/theme.d.ts +1 -0
  56. package/dist/types/modes/types.d.ts +1 -1
  57. package/dist/types/session/agent-session.d.ts +1 -1
  58. package/dist/types/session/blob-store.d.ts +39 -3
  59. package/dist/types/session/history-storage.d.ts +2 -2
  60. package/dist/types/session/session-manager.d.ts +10 -1
  61. package/dist/types/setup/credential-import.d.ts +79 -0
  62. package/dist/types/skill-state/workflow-hud.d.ts +14 -0
  63. package/dist/types/task/executor.d.ts +1 -0
  64. package/dist/types/task/render.d.ts +1 -1
  65. package/dist/types/tools/ask.d.ts +15 -1
  66. package/dist/types/tools/subagent-render.d.ts +7 -1
  67. package/dist/types/tools/subagent.d.ts +27 -0
  68. package/dist/types/tools/ultragoal-ask-guard.d.ts +5 -0
  69. package/dist/types/web/search/index.d.ts +4 -4
  70. package/dist/types/web/search/provider.d.ts +16 -20
  71. package/dist/types/web/search/providers/base.d.ts +2 -1
  72. package/dist/types/web/search/providers/openai-compatible.d.ts +9 -0
  73. package/dist/types/web/search/types.d.ts +14 -2
  74. package/package.json +7 -7
  75. package/scripts/build-binary.ts +7 -0
  76. package/src/async/job-manager.ts +52 -0
  77. package/src/cli/args.ts +5 -0
  78. package/src/cli/auth-broker-cli.ts +1 -0
  79. package/src/cli/fast-help.ts +2 -0
  80. package/src/cli/list-models.ts +13 -1
  81. package/src/cli/setup-cli.ts +138 -3
  82. package/src/cli.ts +1 -0
  83. package/src/commands/gc.ts +22 -0
  84. package/src/commands/harness.ts +7 -3
  85. package/src/commands/setup.ts +5 -1
  86. package/src/commands/ultragoal.ts +3 -1
  87. package/src/config/file-lock-gc.ts +193 -0
  88. package/src/config/file-lock.ts +66 -10
  89. package/src/config/model-profile-activation.ts +15 -3
  90. package/src/config/model-profiles.ts +39 -30
  91. package/src/config/model-registry.ts +21 -1
  92. package/src/config/models-config-schema.ts +1 -0
  93. package/src/config/settings-schema.ts +62 -0
  94. package/src/coordinator/contract.ts +1 -0
  95. package/src/coordinator-mcp/server.ts +459 -3
  96. package/src/defaults/gjc/agent.models.grok-cli.yml +36 -0
  97. package/src/defaults/gjc/extensions/grok-build/index.ts +1 -0
  98. package/src/defaults/gjc/extensions/grok-build/package.json +7 -0
  99. package/src/defaults/gjc/extensions/grok-cli-vendor/biome.json +39 -0
  100. package/src/defaults/gjc/extensions/grok-cli-vendor/package.json +8 -0
  101. package/src/defaults/gjc/extensions/grok-cli-vendor/src/index.ts +1 -0
  102. package/src/defaults/gjc/extensions/grok-cli-vendor/src/models/catalog.ts +155 -0
  103. package/src/defaults/gjc/extensions/grok-cli-vendor/src/payload/sanitize.ts +361 -0
  104. package/src/defaults/gjc/extensions/grok-cli-vendor/src/provider/billing.ts +57 -0
  105. package/src/defaults/gjc/extensions/grok-cli-vendor/src/provider/register.ts +99 -0
  106. package/src/defaults/gjc/extensions/grok-cli-vendor/src/provider/stream.ts +50 -0
  107. package/src/defaults/gjc/extensions/grok-cli-vendor/src/provider/usage.ts +56 -0
  108. package/src/defaults/gjc/extensions/grok-cli-vendor/src/shared/base-url.ts +36 -0
  109. package/src/defaults/gjc/extensions/grok-cli-vendor/src/shared/errors.ts +44 -0
  110. package/src/defaults/gjc/skills/deep-interview/SKILL.md +131 -113
  111. package/src/defaults/gjc/skills/deep-interview/lateral-review-panel.md +49 -0
  112. package/src/defaults/gjc/skills/ultragoal/SKILL.md +30 -8
  113. package/src/defaults/gjc-defaults.ts +7 -0
  114. package/src/defaults/gjc-grok-cli.ts +22 -0
  115. package/src/extensibility/extensions/index.ts +1 -0
  116. package/src/extensibility/extensions/prefix-command-bridge.ts +128 -0
  117. package/src/gjc-runtime/deep-interview-recorder.ts +457 -0
  118. package/src/gjc-runtime/deep-interview-runtime.ts +18 -26
  119. package/src/gjc-runtime/deep-interview-state.ts +324 -0
  120. package/src/gjc-runtime/gc-render.ts +70 -0
  121. package/src/gjc-runtime/gc-runtime.ts +403 -0
  122. package/src/gjc-runtime/launch-tmux.ts +3 -4
  123. package/src/gjc-runtime/ledger-event-renderer.ts +164 -0
  124. package/src/gjc-runtime/ralplan-runtime.ts +232 -19
  125. package/src/gjc-runtime/state-renderer.ts +12 -3
  126. package/src/gjc-runtime/state-runtime.ts +48 -30
  127. package/src/gjc-runtime/state-writer.ts +254 -7
  128. package/src/gjc-runtime/team-gc.ts +49 -0
  129. package/src/gjc-runtime/team-runtime.ts +179 -2
  130. package/src/gjc-runtime/tmux-common.ts +14 -0
  131. package/src/gjc-runtime/tmux-gc.ts +177 -0
  132. package/src/gjc-runtime/tmux-sessions.ts +49 -1
  133. package/src/gjc-runtime/ultragoal-guard.ts +155 -0
  134. package/src/gjc-runtime/ultragoal-runtime.ts +1239 -31
  135. package/src/gjc-runtime/workflow-manifest.generated.json +44 -0
  136. package/src/gjc-runtime/workflow-manifest.ts +12 -0
  137. package/src/harness-control-plane/gc-adapter.ts +184 -0
  138. package/src/harness-control-plane/owner.ts +14 -2
  139. package/src/harness-control-plane/rpc-adapter.ts +1 -1
  140. package/src/harness-control-plane/storage.ts +70 -0
  141. package/src/hooks/skill-state.ts +121 -2
  142. package/src/internal-urls/docs-index.generated.ts +22 -12
  143. package/src/lsp/defaults.json +1 -0
  144. package/src/main.ts +18 -3
  145. package/src/modes/acp/acp-agent.ts +4 -2
  146. package/src/modes/bridge/bridge-mode.ts +2 -1
  147. package/src/modes/components/history-search.ts +5 -2
  148. package/src/modes/components/hook-selector.ts +19 -0
  149. package/src/modes/components/model-selector.ts +51 -8
  150. package/src/modes/components/provider-onboarding-selector.ts +6 -1
  151. package/src/modes/components/status-line/segments.ts +1 -1
  152. package/src/modes/controllers/command-controller.ts +25 -6
  153. package/src/modes/controllers/extension-ui-controller.ts +3 -0
  154. package/src/modes/controllers/selector-controller.ts +81 -1
  155. package/src/modes/interactive-mode.ts +11 -1
  156. package/src/modes/rpc/rpc-mode.ts +266 -34
  157. package/src/modes/shared/agent-wire/command-dispatch.ts +281 -261
  158. package/src/modes/shared/agent-wire/deep-interview-gate.ts +30 -1
  159. package/src/modes/shared/agent-wire/host-tool-bridge.ts +3 -0
  160. package/src/modes/shared/agent-wire/session-registry.ts +109 -0
  161. package/src/modes/shared/agent-wire/unattended-action-policy.ts +24 -0
  162. package/src/modes/shared/agent-wire/unattended-run-controller.ts +23 -3
  163. package/src/modes/shared/agent-wire/unattended-session.ts +32 -2
  164. package/src/modes/theme/defaults/claude-code.json +100 -0
  165. package/src/modes/theme/defaults/codex.json +100 -0
  166. package/src/modes/theme/defaults/index.ts +6 -0
  167. package/src/modes/theme/defaults/opencode.json +102 -0
  168. package/src/modes/theme/theme.ts +2 -2
  169. package/src/modes/types.ts +1 -1
  170. package/src/prompts/agents/executor.md +5 -2
  171. package/src/sdk.ts +29 -4
  172. package/src/session/agent-session.ts +99 -19
  173. package/src/session/blob-store.ts +59 -3
  174. package/src/session/history-storage.ts +32 -11
  175. package/src/session/session-manager.ts +72 -20
  176. package/src/setup/credential-import.ts +429 -0
  177. package/src/setup/hermes/templates/operator-instructions.v1.md +7 -1
  178. package/src/skill-state/deep-interview-mutation-guard.ts +2 -1
  179. package/src/skill-state/workflow-hud.ts +106 -10
  180. package/src/slash-commands/builtin-registry.ts +3 -2
  181. package/src/task/executor.ts +16 -1
  182. package/src/task/render.ts +18 -7
  183. package/src/tools/ask.ts +59 -2
  184. package/src/tools/cron.ts +1 -1
  185. package/src/tools/job.ts +3 -2
  186. package/src/tools/monitor.ts +36 -1
  187. package/src/tools/subagent-render.ts +128 -29
  188. package/src/tools/subagent.ts +173 -9
  189. package/src/tools/ultragoal-ask-guard.ts +39 -0
  190. package/src/web/search/index.ts +25 -25
  191. package/src/web/search/provider.ts +178 -87
  192. package/src/web/search/providers/base.ts +2 -1
  193. package/src/web/search/providers/openai-compatible.ts +151 -0
  194. package/src/web/search/types.ts +47 -22
@@ -68,6 +68,8 @@ export interface UltragoalStatusSummary {
68
68
  goals: UltragoalGoal[];
69
69
  }
70
70
  export interface UltragoalCommandResult {
71
+ reviewBlockerGoalIds?: string[];
72
+ createdReviewPlan?: boolean;
71
73
  status: number;
72
74
  stdout?: string;
73
75
  stderr?: string;
@@ -118,6 +120,17 @@ export declare function startNextUltragoalGoal(input: {
118
120
  goal?: UltragoalGoal;
119
121
  allComplete: boolean;
120
122
  }>;
123
+ type SurfaceFamily = "web" | "cli" | "native" | "api-package" | "algorithm-math" | "unknown";
124
+ export declare function normalizeSurfaceToken(value: string): string;
125
+ export declare function surfaceFamily(value: string): SurfaceFamily;
126
+ export interface ReplayProcessHandle {
127
+ readonly exited: Promise<number>;
128
+ kill(signal?: number | NodeJS.Signals): void;
129
+ }
130
+ export declare function waitForReplayProcessWithTimeout(process: ReplayProcessHandle, timeoutMs: number, graceMs?: number): Promise<number>;
131
+ export declare function validateExecutorQaRedTeamEvidenceForReview(cwd: string, executorQa: Record<string, unknown>, options?: {
132
+ mode?: "review";
133
+ }): Promise<void>;
121
134
  export declare function checkpointUltragoalGoal(input: {
122
135
  cwd: string;
123
136
  goalId: string;
@@ -159,5 +172,21 @@ export declare function recordUltragoalReviewBlockers(input: {
159
172
  evidence: string;
160
173
  gjcGoalJson?: string;
161
174
  }): Promise<UltragoalPlan>;
175
+ type UltragoalReviewContractStrength = "strong" | "thin-derived";
176
+ interface UltragoalReviewFinding extends JsonObject {
177
+ severity: "blocker";
178
+ message: string;
179
+ }
180
+ interface UltragoalReviewResult extends JsonObject {
181
+ verdict: "pass" | "fail" | "inconclusive: weak-contract";
182
+ contractStrength: UltragoalReviewContractStrength;
183
+ cleanPassEligible: boolean;
184
+ source: JsonObject;
185
+ findings: UltragoalReviewFinding[];
186
+ artifactValidationSummary: JsonObject;
187
+ weakContractCapApplied: boolean;
188
+ blockerGoalIds?: string[];
189
+ }
190
+ export declare function runUltragoalReview(cwd: string, args: readonly string[]): Promise<UltragoalReviewResult>;
162
191
  export declare function runNativeUltragoalCommand(args: string[], cwd?: string): Promise<UltragoalCommandResult>;
163
192
  export {};
@@ -0,0 +1,3 @@
1
+ import { type GcStoreAdapter } from "../gjc-runtime/gc-runtime";
2
+ export declare const harnessLeasesGcAdapter: GcStoreAdapter;
3
+ export declare const registryEntriesGcAdapter: GcStoreAdapter;
@@ -44,3 +44,10 @@ export interface ResolvedOwner {
44
44
  }
45
45
  /** Determine whether a live owner currently holds the session (for CLI routing). */
46
46
  export declare function resolveOwner(root: string, sessionId: string): Promise<ResolvedOwner>;
47
+ /**
48
+ * Owner liveness for verbs that do not route to the owner (e.g. `classify`): a routable owner
49
+ * has a live lease and a socket endpoint. This is the same lease/socket probe `observe` uses to
50
+ * decide routing, so non-routing verbs derive `ownerLive` consistently instead of assuming the
51
+ * owner is gone (which would misclassify a live owner as vanished/restart-clean).
52
+ */
53
+ export declare function resolveOwnerLive(root: string, sessionId: string): Promise<boolean>;
@@ -1,8 +1,28 @@
1
1
  import type { EventEnvelope, ReceiptFamily, SessionState } from "./types";
2
+ interface HarnessRootRegistryEntry {
3
+ root: string;
4
+ updatedAt: string;
5
+ }
6
+ export interface HarnessRootRegistryForGc {
7
+ sessionId: string;
8
+ roots: HarnessRootRegistryEntry[];
9
+ }
10
+ export interface HarnessRootRegistryListingForGc {
11
+ sessionId: string;
12
+ file: string;
13
+ roots: HarnessRootRegistryEntry[];
14
+ error?: string;
15
+ }
2
16
  interface ResolveHarnessSessionRootOptions {
3
17
  expectedWorkspace?: string;
4
18
  }
5
19
  export declare function canonicalWorkspacePath(workspace: string): string;
20
+ /** @internal */
21
+ export declare function listHarnessRootRegistriesForGc(env?: NodeJS.ProcessEnv): Promise<HarnessRootRegistryListingForGc[]>;
22
+ /** @internal */
23
+ export declare function rewriteHarnessRootRegistryForGc(file: string, registry: HarnessRootRegistryForGc): Promise<void>;
24
+ /** @internal */
25
+ export declare function removeHarnessRootRegistryFileForGc(file: string): Promise<void>;
6
26
  export declare const MAX_UNIX_SOCKET_PATH_BYTES = 100;
7
27
  export declare function controlSocketPath(root: string, sessionId: string, env?: NodeJS.ProcessEnv): string;
8
28
  export declare class StorageError extends Error {
@@ -2,7 +2,7 @@
2
2
  * Generic selector component for hooks.
3
3
  * Displays a list of string options with keyboard navigation.
4
4
  */
5
- import { Container, type TUI } from "@gajae-code/tui";
5
+ import { type AutocompleteProvider, Container, type TUI } from "@gajae-code/tui";
6
6
  export interface HookSelectorOptions {
7
7
  tui?: TUI;
8
8
  timeout?: number;
@@ -33,6 +33,12 @@ export interface HookSelectorOptions {
33
33
  optionLabel: string;
34
34
  onSubmit: (text: string) => void;
35
35
  };
36
+ /**
37
+ * Autocomplete provider for the inline custom-input editor. When present,
38
+ * the "Other (type your own)" editor gains the same `@` file-link and `/`
39
+ * completion behavior as the main prompt editor.
40
+ */
41
+ autocompleteProvider?: AutocompleteProvider;
36
42
  }
37
43
  export declare class HookSelectorComponent extends Container {
38
44
  #private;
@@ -1,5 +1,5 @@
1
1
  import { Container } from "@gajae-code/tui";
2
- export type ProviderOnboardingAction = "custom-provider-wizard" | "oauth-login" | "api-guide";
2
+ export type ProviderOnboardingAction = "custom-provider-wizard" | "oauth-login" | "import-credentials" | "api-guide";
3
3
  export declare class ProviderOnboardingSelectorComponent extends Container {
4
4
  #private;
5
5
  constructor(onSelect: (action: ProviderOnboardingAction) => void, onCancel: () => void);
@@ -35,3 +35,4 @@ export declare class CommandController {
35
35
  handleContributionPrepCommand(customInstructions?: string): Promise<void>;
36
36
  }
37
37
  export declare function renderProviderSection(details: ProviderDetails, uiTheme: Pick<typeof theme, "fg">): string;
38
+ export declare function renderUsageReports(reports: UsageReport[], uiTheme: typeof theme, nowMs: number, availableWidth: number): string;
@@ -86,7 +86,7 @@ export declare class InteractiveMode implements InteractiveModeContext {
86
86
  retryLoader: Loader | undefined;
87
87
  autoCompactionEscapeHandler?: () => void;
88
88
  retryEscapeHandler?: () => void;
89
- retryCountdownTimer?: ReturnType<typeof setInterval>;
89
+ retryCountdownTimer?: NodeJS.Timeout;
90
90
  unsubscribe?: () => void;
91
91
  onInputCallback?: (input: SubmittedUserInput) => void;
92
92
  optimisticUserMessageSignature: string | undefined;
@@ -1,12 +1,80 @@
1
+ /**
2
+ * RPC mode: Headless operation with JSON stdin/stdout protocol.
3
+ *
4
+ * Used for embedding the agent in other applications.
5
+ * Receives commands as JSON on stdin, outputs events and responses as JSON on stdout.
6
+ *
7
+ * Protocol:
8
+ * - Commands: JSON objects with `type` field, optional `id` for correlation
9
+ * - Responses: JSON objects with `type: "response"`, `command`, `success`, and optional `data`/`error`
10
+ * - Events: AgentSessionEvent objects streamed as they occur
11
+ * - Extension UI: Extension UI requests are emitted, client responds with extension_ui_response
12
+ */
1
13
  import type { ExtensionUIContext, ExtensionUIDialogOptions } from "../../extensibility/extensions";
2
14
  import type { AgentSession } from "../../session/agent-session";
3
- import type { RpcExtensionUIRequest, RpcExtensionUIResponse, RpcHostToolCallRequest, RpcHostToolCancelRequest, RpcHostUriCancelRequest, RpcHostUriRequest, RpcResponse } from "./rpc-types";
15
+ import type { RpcCommand, RpcExtensionUIRequest, RpcExtensionUIResponse, RpcHostToolCallRequest, RpcHostToolCancelRequest, RpcHostUriCancelRequest, RpcHostUriRequest, RpcResponse } from "./rpc-types";
4
16
  export type * from "./rpc-types";
5
17
  export type PendingExtensionRequest = {
6
18
  resolve: (response: RpcExtensionUIResponse) => void;
7
19
  reject: (error: Error) => void;
8
20
  };
9
21
  type RpcOutput = (obj: RpcResponse | RpcExtensionUIRequest | RpcHostToolCallRequest | RpcHostToolCancelRequest | RpcHostUriRequest | RpcHostUriCancelRequest | object) => void;
22
+ export declare function shouldEmitRpcTitlesForTest(): boolean;
23
+ /**
24
+ * Cancellation commands bypass the ordered serial chain because they must
25
+ * interrupt in-flight work — they cannot wait behind the very command they are
26
+ * meant to abort.
27
+ */
28
+ export declare const RPC_CANCELLATION_COMMANDS: ReadonlySet<RpcCommand["type"]>;
29
+ /**
30
+ * Safe read-only commands that bypass the ordered serial chain so they never
31
+ * head-of-line-block behind a long-running ordered command like
32
+ * `bash`/`compact`/`handoff`/`login` (#606, issue 13 — the partial fix only
33
+ * fast-laned cancellation).
34
+ *
35
+ * Every command listed here has a dispatch handler that is **fully synchronous
36
+ * and side-effect-free**: on the single-threaded event loop it runs to
37
+ * completion between the await points of any in-flight ordered command, reading
38
+ * live state without mutating it. Because such a read performs no causal write,
39
+ * jumping ahead of an earlier *queued* ordered command is observably harmless —
40
+ * there is no state change to reorder. Read payloads are additionally
41
+ * snapshotted inside the handler (e.g. `get_messages` returns a shallow copy of
42
+ * `session.messages`) so a fast-lane read can never serialize a half-mutated
43
+ * array that an ordered turn/compaction is rewriting in place.
44
+ *
45
+ * Deliberately excluded (kept ordered): every async/long command and every
46
+ * mutating command. In particular the control-flag setters (`set_thinking_level`,
47
+ * `cycle_thinking_level`, `set_steering_mode`, `set_follow_up_mode`,
48
+ * `set_interrupt_mode`, `set_auto_compaction`, `set_auto_retry`) stay ordered.
49
+ * Their handlers are synchronous, so fast-laning one ahead of an already-queued
50
+ * `prompt`/`bash` would apply the new mode *before* that earlier command runs —
51
+ * the earlier command would then observe the later setter's value, a
52
+ * causal-order (arrival-order) regression. Mutations therefore stay on the
53
+ * chain, and new command types default to ordered (fail-safe).
54
+ */
55
+ export declare const RPC_SAFE_READ_CONTROL_COMMANDS: ReadonlySet<RpcCommand["type"]>;
56
+ /** True when a command may bypass the ordered serial chain and run immediately. */
57
+ export declare function isFastLaneRpcCommand(type: RpcCommand["type"]): boolean;
58
+ /**
59
+ * Schedules inbound RPC commands: fast-lane commands run immediately while
60
+ * everything else runs through a serial chain so causal order is preserved. The
61
+ * read loop never blocks, which is what lets a fast-lane command reach a
62
+ * long-running ordered command instead of being head-of-line-blocked behind it.
63
+ */
64
+ export declare function createRpcCommandScheduler(run: (command: RpcCommand) => Promise<void>, track: (task: Promise<void>) => void): {
65
+ dispatch: (command: RpcCommand) => void;
66
+ };
67
+ export declare class RpcListenRefusedError extends Error {
68
+ constructor(socketPath: string);
69
+ }
70
+ /**
71
+ * Probe whether a unix-domain socket path has a live server accepting
72
+ * connections. Returns `true` when a connection succeeds (a previous owner is
73
+ * still alive), and returns `false` only for known missing/stale endpoints
74
+ * (ENOENT / ECONNREFUSED). Unexpected probe failures fail closed as "alive" so
75
+ * `--listen` startup refuses to unlink a path it could not safely classify.
76
+ */
77
+ export declare function isUnixSocketAlive(socketPath: string): Promise<boolean>;
10
78
  export declare function requestRpcEditor(pendingRequests: Map<string, PendingExtensionRequest>, output: RpcOutput, title: string, prefill?: string, dialogOptions?: ExtensionUIDialogOptions, editorOptions?: {
11
79
  promptStyle?: boolean;
12
80
  }): Promise<string | undefined>;
@@ -14,4 +82,6 @@ export declare function requestRpcEditor(pendingRequests: Map<string, PendingExt
14
82
  * Run in RPC mode.
15
83
  * Listens for JSON commands on stdin, outputs events and responses on stdout.
16
84
  */
17
- export declare function runRpcMode(session: AgentSession, setToolUIContext?: (uiContext: ExtensionUIContext, hasUI: boolean) => void): Promise<never>;
85
+ export declare function runRpcMode(session: AgentSession, setToolUIContext?: (uiContext: ExtensionUIContext, hasUI: boolean) => void, options?: {
86
+ listen?: string;
87
+ }): Promise<never>;
@@ -1,6 +1,14 @@
1
1
  import type { OpenGateInput } from "./workflow-gate-broker";
2
2
  /** "Other (type your own)" sentinel, mirroring the interactive ask tool. */
3
3
  export declare const GATE_OTHER_OPTION = "Other (type your own)";
4
+ /** Optional structured deep-interview round metadata supplied by the agent. */
5
+ export interface AskGateDeepInterviewState {
6
+ round_id?: string;
7
+ round: number;
8
+ component: string;
9
+ dimension: string;
10
+ ambiguity: number;
11
+ }
4
12
  export interface AskGateQuestion {
5
13
  id: string;
6
14
  question: string;
@@ -9,6 +17,11 @@ export interface AskGateQuestion {
9
17
  }>;
10
18
  multi?: boolean;
11
19
  recommended?: number;
20
+ /**
21
+ * Structured round metadata. When present it is the authoritative source for gate
22
+ * `stage_state`; when absent, the question text is regex-parsed as a fallback.
23
+ */
24
+ deepInterview?: AskGateDeepInterviewState;
12
25
  }
13
26
  export interface AskGateResult {
14
27
  id: string;
@@ -0,0 +1,25 @@
1
+ export type RpcSessionTransport = "stdio" | "bridge" | "socket";
2
+ export interface RpcSessionRecord {
3
+ sessionId: string;
4
+ pid: number;
5
+ transport: RpcSessionTransport;
6
+ cwd: string;
7
+ model?: string;
8
+ /** ISO-8601 start timestamp. */
9
+ startedAt: string;
10
+ /** Reachable endpoint for persistent transports (issue 09); absent for stdio. */
11
+ endpoint?: string;
12
+ }
13
+ /**
14
+ * Write (or replace) the registry record for a session. The record is written to
15
+ * a same-directory temp file and atomically renamed into place so a concurrent
16
+ * reader never observes (and reaps) a partially-written record.
17
+ */
18
+ export declare function registerRpcSession(record: RpcSessionRecord, agentDir?: string): Promise<string>;
19
+ /** Remove a session's registry record. Best-effort: a missing file is not an error. */
20
+ export declare function unregisterRpcSession(sessionId: string, agentDir?: string): Promise<void>;
21
+ /**
22
+ * List live RPC sessions, reaping records whose process is gone or whose file is
23
+ * unparseable. Returns records sorted by `startedAt` ascending.
24
+ */
25
+ export declare function listRpcSessions(agentDir?: string): Promise<RpcSessionRecord[]>;
@@ -20,6 +20,8 @@ import type { RpcUnattendedActionClass } from "../../rpc/rpc-types";
20
20
  import type { BridgeCommandScope } from "./scopes";
21
21
  /** Coarse command scope -> `command.<scope>` action class. */
22
22
  export declare function actionClassForScope(scope: BridgeCommandScope): RpcUnattendedActionClass;
23
+ /** Runtime list of every v1 action class — membership-validation source for negotiate (#319). */
24
+ export declare const RPC_UNATTENDED_ACTION_CLASSES: readonly RpcUnattendedActionClass[];
23
25
  /**
24
26
  * Classify a (possibly compound / nested) bash command into the most severe
25
27
  * action class across all statements and nested substitutions. Fail-closed.
@@ -14,10 +14,20 @@
14
14
  * Also implements the dispatch-facing {@link RpcUnattendedControlPlane} so the
15
15
  * RPC server can route `negotiate_unattended` + `workflow_gate_response` here.
16
16
  */
17
+ import type { Model } from "@gajae-code/ai";
17
18
  import type { RpcCommand, RpcUnattendedAccepted, RpcUnattendedDeclaration, RpcWorkflowGate, RpcWorkflowGateResolution, RpcWorkflowGateResponse } from "../../rpc/rpc-types";
18
19
  import type { RpcUnattendedControlPlane } from "./command-dispatch";
19
20
  import { type UnattendedAbortHooks, type UnattendedAuditEvent, UnattendedRunController } from "./unattended-run-controller";
20
21
  import { type GateStore, type OpenGateInput } from "./workflow-gate-broker";
22
+ /**
23
+ * Derive an explicit `providerSupportsTokenCostMetrics` capability from the
24
+ * active model so unattended negotiation fails closed when token/cost usage
25
+ * cannot be accounted for (#606). Callers that omit a model — or whose model is
26
+ * configured to suppress streaming usage (`compat.supportsUsageInStreaming:
27
+ * false`) — get `false`, which the controller refuses with
28
+ * `unsupported_budget_metric`.
29
+ */
30
+ export declare function modelSupportsTokenCostMetrics(model: Model | undefined): boolean;
21
31
  /** Minimal surface a skill runtime / ask tool uses to emit a gate and await its answer. */
22
32
  export interface WorkflowGateEmitter {
23
33
  /** True only when unattended mode has been negotiated. */
@@ -125,6 +125,308 @@ export declare const defaultThemes: {
125
125
  };
126
126
  };
127
127
  };
128
+ "claude-code": {
129
+ $schema: string;
130
+ name: string;
131
+ vars: {
132
+ "bg": string;
133
+ "surface": string;
134
+ "surfaceSubtle": string;
135
+ "separator": string;
136
+ "fg": string;
137
+ "muted": string;
138
+ "dim": string;
139
+ "brandTerracotta": string;
140
+ "shimmerTerracotta": string;
141
+ "toolPink": string;
142
+ "lavender": string;
143
+ "autoAcceptPurple": string;
144
+ "successGreen": string;
145
+ "warningAmber": string;
146
+ "errorSoftRed": string;
147
+ "diffAddedBg": string;
148
+ "diffRemovedBg": string;
149
+ "diffRemovedFg": string;
150
+ };
151
+ colors: {
152
+ "accent": string;
153
+ "border": string;
154
+ "borderAccent": string;
155
+ "borderMuted": string;
156
+ "success": string;
157
+ "error": string;
158
+ "warning": string;
159
+ "muted": string;
160
+ "dim": string;
161
+ "text": string;
162
+ "thinkingText": string;
163
+ "selectedBg": string;
164
+ "userMessageBg": string;
165
+ "userMessageText": string;
166
+ "customMessageBg": string;
167
+ "customMessageText": string;
168
+ "customMessageLabel": string;
169
+ "toolPendingBg": string;
170
+ "toolSuccessBg": string;
171
+ "toolErrorBg": string;
172
+ "toolTitle": string;
173
+ "toolOutput": string;
174
+ "mdHeading": string;
175
+ "mdLink": string;
176
+ "mdLinkUrl": string;
177
+ "mdCode": string;
178
+ "mdCodeBlock": string;
179
+ "mdCodeBlockBorder": string;
180
+ "mdQuote": string;
181
+ "mdQuoteBorder": string;
182
+ "mdHr": string;
183
+ "mdListBullet": string;
184
+ "toolDiffAdded": string;
185
+ "toolDiffRemoved": string;
186
+ "toolDiffContext": string;
187
+ "syntaxComment": string;
188
+ "syntaxKeyword": string;
189
+ "syntaxFunction": string;
190
+ "syntaxVariable": string;
191
+ "syntaxString": string;
192
+ "syntaxNumber": string;
193
+ "syntaxType": string;
194
+ "syntaxOperator": string;
195
+ "syntaxPunctuation": string;
196
+ "thinkingOff": string;
197
+ "thinkingMinimal": string;
198
+ "thinkingLow": string;
199
+ "thinkingMedium": string;
200
+ "thinkingHigh": string;
201
+ "thinkingXhigh": string;
202
+ "bashMode": string;
203
+ "pythonMode": string;
204
+ "statusLineBg": string;
205
+ "statusLineSep": string;
206
+ "statusLineModel": string;
207
+ "statusLinePath": string;
208
+ "statusLineGitClean": string;
209
+ "statusLineGitDirty": string;
210
+ "statusLineContext": string;
211
+ "statusLineSpend": string;
212
+ "statusLineStaged": string;
213
+ "statusLineDirty": string;
214
+ "statusLineUntracked": string;
215
+ "statusLineOutput": string;
216
+ "statusLineCost": string;
217
+ "statusLineSubagents": string;
218
+ };
219
+ export: {
220
+ "pageBg": string;
221
+ "cardBg": string;
222
+ "infoBg": string;
223
+ };
224
+ symbols: {
225
+ "preset": string;
226
+ };
227
+ };
228
+ codex: {
229
+ $schema: string;
230
+ name: string;
231
+ vars: {
232
+ "bg": string;
233
+ "surface": string;
234
+ "surfaceBright": string;
235
+ "selection": string;
236
+ "fg": string;
237
+ "muted": string;
238
+ "dim": string;
239
+ "borderNeutral": string;
240
+ "ansiCyan": string;
241
+ "cyanSoft": string;
242
+ "brandMagenta": string;
243
+ "magentaSoft": string;
244
+ "successGreen": string;
245
+ "errorRed": string;
246
+ "warningOrange": string;
247
+ "diffRemovalRed": string;
248
+ "toolSuccessBg": string;
249
+ "toolErrorBg": string;
250
+ };
251
+ colors: {
252
+ "accent": string;
253
+ "border": string;
254
+ "borderAccent": string;
255
+ "borderMuted": string;
256
+ "success": string;
257
+ "error": string;
258
+ "warning": string;
259
+ "muted": string;
260
+ "dim": string;
261
+ "text": string;
262
+ "thinkingText": string;
263
+ "selectedBg": string;
264
+ "userMessageBg": string;
265
+ "userMessageText": string;
266
+ "customMessageBg": string;
267
+ "customMessageText": string;
268
+ "customMessageLabel": string;
269
+ "toolPendingBg": string;
270
+ "toolSuccessBg": string;
271
+ "toolErrorBg": string;
272
+ "toolTitle": string;
273
+ "toolOutput": string;
274
+ "mdHeading": string;
275
+ "mdLink": string;
276
+ "mdLinkUrl": string;
277
+ "mdCode": string;
278
+ "mdCodeBlock": string;
279
+ "mdCodeBlockBorder": string;
280
+ "mdQuote": string;
281
+ "mdQuoteBorder": string;
282
+ "mdHr": string;
283
+ "mdListBullet": string;
284
+ "toolDiffAdded": string;
285
+ "toolDiffRemoved": string;
286
+ "toolDiffContext": string;
287
+ "syntaxComment": string;
288
+ "syntaxKeyword": string;
289
+ "syntaxFunction": string;
290
+ "syntaxVariable": string;
291
+ "syntaxString": string;
292
+ "syntaxNumber": string;
293
+ "syntaxType": string;
294
+ "syntaxOperator": string;
295
+ "syntaxPunctuation": string;
296
+ "thinkingOff": string;
297
+ "thinkingMinimal": string;
298
+ "thinkingLow": string;
299
+ "thinkingMedium": string;
300
+ "thinkingHigh": string;
301
+ "thinkingXhigh": string;
302
+ "bashMode": string;
303
+ "pythonMode": string;
304
+ "statusLineBg": string;
305
+ "statusLineSep": string;
306
+ "statusLineModel": string;
307
+ "statusLinePath": string;
308
+ "statusLineGitClean": string;
309
+ "statusLineGitDirty": string;
310
+ "statusLineContext": string;
311
+ "statusLineSpend": string;
312
+ "statusLineStaged": string;
313
+ "statusLineDirty": string;
314
+ "statusLineUntracked": string;
315
+ "statusLineOutput": string;
316
+ "statusLineCost": string;
317
+ "statusLineSubagents": string;
318
+ };
319
+ export: {
320
+ "pageBg": string;
321
+ "cardBg": string;
322
+ "infoBg": string;
323
+ };
324
+ symbols: {
325
+ "preset": string;
326
+ };
327
+ };
328
+ opencode: {
329
+ $schema: string;
330
+ name: string;
331
+ vars: {
332
+ "background": string;
333
+ "currentLine": string;
334
+ "selection": string;
335
+ "backgroundDarker": string;
336
+ "foreground": string;
337
+ "comment": string;
338
+ "primary": string;
339
+ "secondary": string;
340
+ "accentPurple": string;
341
+ "errorRed": string;
342
+ "warningOrange": string;
343
+ "successGreen": string;
344
+ "infoCyan": string;
345
+ "emphasizedYellow": string;
346
+ "border": string;
347
+ "diffAdded": string;
348
+ "diffRemoved": string;
349
+ "diffContext": string;
350
+ "addedBg": string;
351
+ "removedBg": string;
352
+ };
353
+ colors: {
354
+ "accent": string;
355
+ "border": string;
356
+ "borderAccent": string;
357
+ "borderMuted": string;
358
+ "success": string;
359
+ "error": string;
360
+ "warning": string;
361
+ "muted": string;
362
+ "dim": string;
363
+ "text": string;
364
+ "thinkingText": string;
365
+ "selectedBg": string;
366
+ "userMessageBg": string;
367
+ "userMessageText": string;
368
+ "customMessageBg": string;
369
+ "customMessageText": string;
370
+ "customMessageLabel": string;
371
+ "toolPendingBg": string;
372
+ "toolSuccessBg": string;
373
+ "toolErrorBg": string;
374
+ "toolTitle": string;
375
+ "toolOutput": string;
376
+ "mdHeading": string;
377
+ "mdLink": string;
378
+ "mdLinkUrl": string;
379
+ "mdCode": string;
380
+ "mdCodeBlock": string;
381
+ "mdCodeBlockBorder": string;
382
+ "mdQuote": string;
383
+ "mdQuoteBorder": string;
384
+ "mdHr": string;
385
+ "mdListBullet": string;
386
+ "toolDiffAdded": string;
387
+ "toolDiffRemoved": string;
388
+ "toolDiffContext": string;
389
+ "syntaxComment": string;
390
+ "syntaxKeyword": string;
391
+ "syntaxFunction": string;
392
+ "syntaxVariable": string;
393
+ "syntaxString": string;
394
+ "syntaxNumber": string;
395
+ "syntaxType": string;
396
+ "syntaxOperator": string;
397
+ "syntaxPunctuation": string;
398
+ "thinkingOff": string;
399
+ "thinkingMinimal": string;
400
+ "thinkingLow": string;
401
+ "thinkingMedium": string;
402
+ "thinkingHigh": string;
403
+ "thinkingXhigh": string;
404
+ "bashMode": string;
405
+ "pythonMode": string;
406
+ "statusLineBg": string;
407
+ "statusLineSep": string;
408
+ "statusLineModel": string;
409
+ "statusLinePath": string;
410
+ "statusLineGitClean": string;
411
+ "statusLineGitDirty": string;
412
+ "statusLineContext": string;
413
+ "statusLineSpend": string;
414
+ "statusLineStaged": string;
415
+ "statusLineDirty": string;
416
+ "statusLineUntracked": string;
417
+ "statusLineOutput": string;
418
+ "statusLineCost": string;
419
+ "statusLineSubagents": string;
420
+ };
421
+ export: {
422
+ "pageBg": string;
423
+ "cardBg": string;
424
+ "infoBg": string;
425
+ };
426
+ symbols: {
427
+ "preset": string;
428
+ };
429
+ };
128
430
  "red-claw": {
129
431
  $schema: string;
130
432
  name: string;
@@ -8,6 +8,7 @@ export type SymbolPreset = "unicode" | "nerd" | "ascii";
8
8
  */
9
9
  export type SymbolKey = "status.success" | "status.error" | "status.warning" | "status.info" | "status.pending" | "status.disabled" | "status.enabled" | "status.running" | "status.shadowed" | "status.aborted" | "nav.cursor" | "nav.selected" | "nav.expand" | "nav.collapse" | "nav.back" | "tree.branch" | "tree.last" | "tree.vertical" | "tree.horizontal" | "tree.hook" | "boxRound.topLeft" | "boxRound.topRight" | "boxRound.bottomLeft" | "boxRound.bottomRight" | "boxRound.horizontal" | "boxRound.vertical" | "boxSharp.topLeft" | "boxSharp.topRight" | "boxSharp.bottomLeft" | "boxSharp.bottomRight" | "boxSharp.horizontal" | "boxSharp.vertical" | "boxSharp.cross" | "boxSharp.teeDown" | "boxSharp.teeUp" | "boxSharp.teeRight" | "boxSharp.teeLeft" | "sep.powerline" | "sep.powerlineThin" | "sep.powerlineLeft" | "sep.powerlineRight" | "sep.powerlineThinLeft" | "sep.powerlineThinRight" | "sep.block" | "sep.space" | "sep.asciiLeft" | "sep.asciiRight" | "sep.dot" | "sep.slash" | "sep.pipe" | "icon.model" | "icon.plan" | "icon.goal" | "icon.pause" | "icon.folder" | "icon.scratchFolder" | "icon.file" | "icon.git" | "icon.branch" | "icon.pr" | "icon.tokens" | "icon.context" | "icon.cost" | "icon.time" | "icon.pi" | "icon.agents" | "icon.cache" | "icon.input" | "icon.output" | "icon.host" | "icon.session" | "icon.package" | "icon.warning" | "icon.rewind" | "icon.auto" | "icon.fast" | "icon.extensionSkill" | "icon.extensionTool" | "icon.extensionSlashCommand" | "icon.extensionMcp" | "icon.extensionRule" | "icon.extensionHook" | "icon.extensionPrompt" | "icon.extensionContextFile" | "icon.extensionInstruction" | "icon.mic" | "thinking.minimal" | "thinking.low" | "thinking.medium" | "thinking.high" | "thinking.xhigh" | "thinking.max" | "checkbox.checked" | "checkbox.unchecked" | "format.bullet" | "format.dash" | "format.bracketLeft" | "format.bracketRight" | "md.quoteBorder" | "md.hrChar" | "md.bullet" | "lang.default" | "lang.typescript" | "lang.javascript" | "lang.python" | "lang.rust" | "lang.go" | "lang.java" | "lang.c" | "lang.cpp" | "lang.csharp" | "lang.ruby" | "lang.php" | "lang.swift" | "lang.kotlin" | "lang.shell" | "lang.html" | "lang.css" | "lang.json" | "lang.yaml" | "lang.markdown" | "lang.sql" | "lang.docker" | "lang.lua" | "lang.text" | "lang.env" | "lang.toml" | "lang.xml" | "lang.ini" | "lang.conf" | "lang.log" | "lang.csv" | "lang.tsv" | "lang.image" | "lang.pdf" | "lang.archive" | "lang.binary" | "tab.appearance" | "tab.model" | "tab.interaction" | "tab.context" | "tab.editing" | "tab.tools" | "tab.memory" | "tab.tasks" | "tab.providers";
10
10
  export type SpinnerType = "status" | "activity";
11
+ export declare const THEME_COLOR_KEYS: readonly ["accent", "border", "borderAccent", "borderMuted", "success", "error", "warning", "muted", "dim", "text", "thinkingText", "selectedBg", "userMessageBg", "userMessageText", "customMessageBg", "customMessageText", "customMessageLabel", "toolPendingBg", "toolSuccessBg", "toolErrorBg", "toolTitle", "toolOutput", "mdHeading", "mdLink", "mdLinkUrl", "mdCode", "mdCodeBlock", "mdCodeBlockBorder", "mdQuote", "mdQuoteBorder", "mdHr", "mdListBullet", "toolDiffAdded", "toolDiffRemoved", "toolDiffContext", "syntaxComment", "syntaxKeyword", "syntaxFunction", "syntaxVariable", "syntaxString", "syntaxNumber", "syntaxType", "syntaxOperator", "syntaxPunctuation", "thinkingOff", "thinkingMinimal", "thinkingLow", "thinkingMedium", "thinkingHigh", "thinkingXhigh", "bashMode", "pythonMode", "statusLineBg", "statusLineSep", "statusLineModel", "statusLinePath", "statusLineGitClean", "statusLineGitDirty", "statusLineContext", "statusLineSpend", "statusLineStaged", "statusLineDirty", "statusLineUntracked", "statusLineOutput", "statusLineCost", "statusLineSubagents"];
11
12
  export type ThemeColor = "accent" | "border" | "borderAccent" | "borderMuted" | "success" | "error" | "warning" | "muted" | "dim" | "text" | "thinkingText" | "userMessageText" | "customMessageText" | "customMessageLabel" | "toolTitle" | "toolOutput" | "mdHeading" | "mdLink" | "mdLinkUrl" | "mdCode" | "mdCodeBlock" | "mdCodeBlockBorder" | "mdQuote" | "mdQuoteBorder" | "mdHr" | "mdListBullet" | "toolDiffAdded" | "toolDiffRemoved" | "toolDiffContext" | "syntaxComment" | "syntaxKeyword" | "syntaxFunction" | "syntaxVariable" | "syntaxString" | "syntaxNumber" | "syntaxType" | "syntaxOperator" | "syntaxPunctuation" | "thinkingOff" | "thinkingMinimal" | "thinkingLow" | "thinkingMedium" | "thinkingHigh" | "thinkingXhigh" | "bashMode" | "pythonMode" | "statusLineSep" | "statusLineModel" | "statusLinePath" | "statusLineGitClean" | "statusLineGitDirty" | "statusLineContext" | "statusLineSpend" | "statusLineStaged" | "statusLineDirty" | "statusLineUntracked" | "statusLineOutput" | "statusLineCost" | "statusLineSubagents";
12
13
  /** Check if a string is a valid ThemeColor value */
13
14
  export declare function isValidThemeColor(color: string): color is ThemeColor;
@@ -93,7 +93,7 @@ export interface InteractiveModeContext {
93
93
  retryLoader: Loader | undefined;
94
94
  autoCompactionEscapeHandler?: () => void;
95
95
  retryEscapeHandler?: () => void;
96
- retryCountdownTimer?: ReturnType<typeof setInterval>;
96
+ retryCountdownTimer?: NodeJS.Timeout;
97
97
  unsubscribe?: () => void;
98
98
  onInputCallback?: (input: SubmittedUserInput) => void;
99
99
  optimisticUserMessageSignature: string | undefined;