@gajae-code/coding-agent 0.2.4 → 0.3.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.
Files changed (266) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +1 -1
  3. package/dist/types/async/job-manager.d.ts +145 -2
  4. package/dist/types/commands/harness.d.ts +37 -0
  5. package/dist/types/config/settings-schema.d.ts +13 -3
  6. package/dist/types/config/settings.d.ts +3 -1
  7. package/dist/types/deep-interview/render-middleware.d.ts +5 -0
  8. package/dist/types/discovery/helpers.d.ts +1 -0
  9. package/dist/types/exec/bash-executor.d.ts +8 -1
  10. package/dist/types/extensibility/custom-tools/types.d.ts +1 -0
  11. package/dist/types/extensibility/extensions/types.d.ts +6 -0
  12. package/dist/types/extensibility/shared-events.d.ts +1 -0
  13. package/dist/types/gjc-runtime/restricted-role-agent-bash.d.ts +2 -0
  14. package/dist/types/gjc-runtime/state-graph.d.ts +4 -0
  15. package/dist/types/gjc-runtime/state-migrations.d.ts +24 -0
  16. package/dist/types/gjc-runtime/state-renderer.d.ts +65 -0
  17. package/dist/types/gjc-runtime/state-runtime.d.ts +2 -0
  18. package/dist/types/gjc-runtime/state-validation.d.ts +6 -0
  19. package/dist/types/gjc-runtime/state-writer.d.ts +137 -0
  20. package/dist/types/gjc-runtime/team-runtime.d.ts +81 -7
  21. package/dist/types/gjc-runtime/workflow-manifest.d.ts +54 -0
  22. package/dist/types/harness-control-plane/classifier.d.ts +13 -0
  23. package/dist/types/harness-control-plane/control-endpoint.d.ts +30 -0
  24. package/dist/types/harness-control-plane/finalize.d.ts +47 -0
  25. package/dist/types/harness-control-plane/frame-mapper.d.ts +29 -0
  26. package/dist/types/harness-control-plane/operate.d.ts +35 -0
  27. package/dist/types/harness-control-plane/owner.d.ts +46 -0
  28. package/dist/types/harness-control-plane/preserve.d.ts +19 -0
  29. package/dist/types/harness-control-plane/receipts.d.ts +88 -0
  30. package/dist/types/harness-control-plane/rpc-adapter.d.ts +66 -0
  31. package/dist/types/harness-control-plane/seams.d.ts +21 -0
  32. package/dist/types/harness-control-plane/session-lease.d.ts +65 -0
  33. package/dist/types/harness-control-plane/state-machine.d.ts +19 -0
  34. package/dist/types/harness-control-plane/storage.d.ts +53 -0
  35. package/dist/types/harness-control-plane/types.d.ts +162 -0
  36. package/dist/types/hooks/skill-keywords.d.ts +2 -1
  37. package/dist/types/hooks/skill-state.d.ts +2 -29
  38. package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -1
  39. package/dist/types/modes/components/hook-selector.d.ts +1 -0
  40. package/dist/types/modes/components/skill-hud/render.d.ts +1 -1
  41. package/dist/types/modes/interactive-mode.d.ts +2 -0
  42. package/dist/types/modes/theme/defaults/index.d.ts +45 -9477
  43. package/dist/types/modes/theme/theme.d.ts +1 -5
  44. package/dist/types/modes/types.d.ts +2 -0
  45. package/dist/types/sdk.d.ts +4 -0
  46. package/dist/types/session/agent-session.d.ts +8 -0
  47. package/dist/types/session/streaming-output.d.ts +11 -0
  48. package/dist/types/skill-state/active-state.d.ts +3 -0
  49. package/dist/types/skill-state/deep-interview-mutation-guard.d.ts +1 -1
  50. package/dist/types/skill-state/workflow-state-contract.d.ts +24 -0
  51. package/dist/types/task/executor.d.ts +3 -0
  52. package/dist/types/task/types.d.ts +56 -3
  53. package/dist/types/tools/bash-allowed-prefixes.d.ts +5 -0
  54. package/dist/types/tools/bash.d.ts +24 -0
  55. package/dist/types/tools/cron.d.ts +110 -0
  56. package/dist/types/tools/index.d.ts +4 -0
  57. package/dist/types/tools/monitor.d.ts +54 -0
  58. package/dist/types/tools/subagent.d.ts +11 -1
  59. package/dist/types/web/search/index.d.ts +1 -0
  60. package/dist/types/web/search/provider.d.ts +11 -4
  61. package/dist/types/web/search/providers/duckduckgo.d.ts +57 -0
  62. package/dist/types/web/search/types.d.ts +1 -1
  63. package/package.json +7 -7
  64. package/src/async/job-manager.ts +522 -6
  65. package/src/cli/agents-cli.ts +3 -0
  66. package/src/cli/auth-broker-cli.ts +1 -0
  67. package/src/cli/config-cli.ts +10 -2
  68. package/src/cli.ts +2 -0
  69. package/src/commands/harness.ts +592 -0
  70. package/src/commands/team.ts +36 -39
  71. package/src/config/settings-schema.ts +15 -2
  72. package/src/config/settings.ts +49 -7
  73. package/src/deep-interview/render-middleware.ts +366 -0
  74. package/src/defaults/gjc/skills/deep-interview/SKILL.md +9 -2
  75. package/src/defaults/gjc/skills/ralplan/SKILL.md +8 -4
  76. package/src/defaults/gjc/skills/team/SKILL.md +47 -21
  77. package/src/defaults/gjc/skills/ultragoal/SKILL.md +78 -11
  78. package/src/discovery/helpers.ts +5 -0
  79. package/src/eval/js/shared/rewrite-imports.ts +1 -2
  80. package/src/exec/bash-executor.ts +20 -9
  81. package/src/extensibility/custom-tools/types.ts +1 -0
  82. package/src/extensibility/extensions/types.ts +6 -0
  83. package/src/extensibility/shared-events.ts +1 -0
  84. package/src/gjc-runtime/deep-interview-runtime.ts +40 -21
  85. package/src/gjc-runtime/goal-mode-request.ts +11 -3
  86. package/src/gjc-runtime/ralplan-runtime.ts +27 -10
  87. package/src/gjc-runtime/restricted-role-agent-bash.ts +5 -0
  88. package/src/gjc-runtime/state-graph.ts +86 -0
  89. package/src/gjc-runtime/state-migrations.ts +132 -0
  90. package/src/gjc-runtime/state-renderer.ts +345 -0
  91. package/src/gjc-runtime/state-runtime.ts +733 -21
  92. package/src/gjc-runtime/state-validation.ts +49 -0
  93. package/src/gjc-runtime/state-writer.ts +718 -0
  94. package/src/gjc-runtime/team-runtime.ts +1083 -89
  95. package/src/gjc-runtime/ultragoal-runtime.ts +348 -19
  96. package/src/gjc-runtime/workflow-manifest.generated.json +1497 -0
  97. package/src/gjc-runtime/workflow-manifest.ts +425 -0
  98. package/src/harness-control-plane/classifier.ts +128 -0
  99. package/src/harness-control-plane/control-endpoint.ts +137 -0
  100. package/src/harness-control-plane/finalize.ts +222 -0
  101. package/src/harness-control-plane/frame-mapper.ts +286 -0
  102. package/src/harness-control-plane/operate.ts +225 -0
  103. package/src/harness-control-plane/owner.ts +553 -0
  104. package/src/harness-control-plane/preserve.ts +102 -0
  105. package/src/harness-control-plane/receipts.ts +216 -0
  106. package/src/harness-control-plane/rpc-adapter.ts +276 -0
  107. package/src/harness-control-plane/seams.ts +39 -0
  108. package/src/harness-control-plane/session-lease.ts +388 -0
  109. package/src/harness-control-plane/state-machine.ts +97 -0
  110. package/src/harness-control-plane/storage.ts +257 -0
  111. package/src/harness-control-plane/types.ts +214 -0
  112. package/src/hooks/skill-keywords.ts +4 -2
  113. package/src/hooks/skill-state.ts +25 -42
  114. package/src/internal-urls/docs-index.generated.ts +6 -4
  115. package/src/lsp/render.ts +1 -1
  116. package/src/modes/acp/acp-agent.ts +1 -1
  117. package/src/modes/acp/acp-client-bridge.ts +1 -1
  118. package/src/modes/components/agent-dashboard.ts +1 -1
  119. package/src/modes/components/assistant-message.ts +5 -1
  120. package/src/modes/components/diff.ts +2 -2
  121. package/src/modes/components/hook-selector.ts +72 -2
  122. package/src/modes/components/skill-hud/render.ts +7 -2
  123. package/src/modes/controllers/event-controller.ts +71 -6
  124. package/src/modes/controllers/extension-ui-controller.ts +6 -0
  125. package/src/modes/controllers/input-controller.ts +19 -3
  126. package/src/modes/controllers/selector-controller.ts +3 -2
  127. package/src/modes/interactive-mode.ts +21 -2
  128. package/src/modes/theme/defaults/index.ts +0 -196
  129. package/src/modes/theme/theme.ts +35 -35
  130. package/src/modes/types.ts +2 -0
  131. package/src/prompts/agents/architect.md +5 -1
  132. package/src/prompts/agents/critic.md +5 -1
  133. package/src/prompts/agents/executor.md +13 -0
  134. package/src/prompts/agents/frontmatter.md +1 -0
  135. package/src/prompts/agents/planner.md +5 -1
  136. package/src/prompts/tools/bash.md +9 -0
  137. package/src/prompts/tools/cron.md +25 -0
  138. package/src/prompts/tools/monitor.md +30 -0
  139. package/src/prompts/tools/subagent.md +33 -3
  140. package/src/runtime-mcp/oauth-flow.ts +4 -2
  141. package/src/sdk.ts +7 -0
  142. package/src/session/agent-session.ts +247 -38
  143. package/src/session/session-manager.ts +13 -1
  144. package/src/session/streaming-output.ts +21 -0
  145. package/src/skill-state/active-state.ts +222 -78
  146. package/src/skill-state/deep-interview-mutation-guard.ts +91 -13
  147. package/src/skill-state/initial-phase.ts +2 -0
  148. package/src/skill-state/workflow-state-contract.ts +26 -0
  149. package/src/task/agents.ts +1 -0
  150. package/src/task/executor.ts +51 -8
  151. package/src/task/index.ts +120 -8
  152. package/src/task/render.ts +6 -3
  153. package/src/task/types.ts +57 -3
  154. package/src/tools/ask.ts +28 -7
  155. package/src/tools/bash-allowed-prefixes.ts +169 -0
  156. package/src/tools/bash.ts +190 -29
  157. package/src/tools/browser/tab-worker.ts +1 -1
  158. package/src/tools/cron.ts +665 -0
  159. package/src/tools/index.ts +20 -2
  160. package/src/tools/monitor.ts +136 -0
  161. package/src/tools/subagent.ts +255 -64
  162. package/src/vim/engine.ts +3 -3
  163. package/src/web/search/index.ts +31 -18
  164. package/src/web/search/provider.ts +57 -12
  165. package/src/web/search/providers/duckduckgo.ts +279 -0
  166. package/src/web/search/types.ts +2 -0
  167. package/src/modes/theme/dark.json +0 -95
  168. package/src/modes/theme/defaults/alabaster.json +0 -93
  169. package/src/modes/theme/defaults/amethyst.json +0 -96
  170. package/src/modes/theme/defaults/anthracite.json +0 -93
  171. package/src/modes/theme/defaults/basalt.json +0 -91
  172. package/src/modes/theme/defaults/birch.json +0 -95
  173. package/src/modes/theme/defaults/dark-abyss.json +0 -91
  174. package/src/modes/theme/defaults/dark-arctic.json +0 -104
  175. package/src/modes/theme/defaults/dark-aurora.json +0 -95
  176. package/src/modes/theme/defaults/dark-catppuccin.json +0 -107
  177. package/src/modes/theme/defaults/dark-cavern.json +0 -91
  178. package/src/modes/theme/defaults/dark-copper.json +0 -95
  179. package/src/modes/theme/defaults/dark-cosmos.json +0 -90
  180. package/src/modes/theme/defaults/dark-cyberpunk.json +0 -102
  181. package/src/modes/theme/defaults/dark-dracula.json +0 -98
  182. package/src/modes/theme/defaults/dark-eclipse.json +0 -91
  183. package/src/modes/theme/defaults/dark-ember.json +0 -95
  184. package/src/modes/theme/defaults/dark-equinox.json +0 -90
  185. package/src/modes/theme/defaults/dark-forest.json +0 -96
  186. package/src/modes/theme/defaults/dark-github.json +0 -105
  187. package/src/modes/theme/defaults/dark-gruvbox.json +0 -112
  188. package/src/modes/theme/defaults/dark-lavender.json +0 -95
  189. package/src/modes/theme/defaults/dark-lunar.json +0 -89
  190. package/src/modes/theme/defaults/dark-midnight.json +0 -95
  191. package/src/modes/theme/defaults/dark-monochrome.json +0 -94
  192. package/src/modes/theme/defaults/dark-monokai.json +0 -98
  193. package/src/modes/theme/defaults/dark-nebula.json +0 -90
  194. package/src/modes/theme/defaults/dark-nord.json +0 -97
  195. package/src/modes/theme/defaults/dark-ocean.json +0 -101
  196. package/src/modes/theme/defaults/dark-one.json +0 -100
  197. package/src/modes/theme/defaults/dark-poimandres.json +0 -141
  198. package/src/modes/theme/defaults/dark-rainforest.json +0 -91
  199. package/src/modes/theme/defaults/dark-reef.json +0 -91
  200. package/src/modes/theme/defaults/dark-retro.json +0 -92
  201. package/src/modes/theme/defaults/dark-rose-pine.json +0 -96
  202. package/src/modes/theme/defaults/dark-sakura.json +0 -95
  203. package/src/modes/theme/defaults/dark-slate.json +0 -95
  204. package/src/modes/theme/defaults/dark-solarized.json +0 -97
  205. package/src/modes/theme/defaults/dark-solstice.json +0 -90
  206. package/src/modes/theme/defaults/dark-starfall.json +0 -91
  207. package/src/modes/theme/defaults/dark-sunset.json +0 -99
  208. package/src/modes/theme/defaults/dark-swamp.json +0 -90
  209. package/src/modes/theme/defaults/dark-synthwave.json +0 -103
  210. package/src/modes/theme/defaults/dark-taiga.json +0 -91
  211. package/src/modes/theme/defaults/dark-terminal.json +0 -95
  212. package/src/modes/theme/defaults/dark-tokyo-night.json +0 -101
  213. package/src/modes/theme/defaults/dark-tundra.json +0 -91
  214. package/src/modes/theme/defaults/dark-twilight.json +0 -91
  215. package/src/modes/theme/defaults/dark-volcanic.json +0 -91
  216. package/src/modes/theme/defaults/graphite.json +0 -92
  217. package/src/modes/theme/defaults/light-arctic.json +0 -107
  218. package/src/modes/theme/defaults/light-aurora-day.json +0 -91
  219. package/src/modes/theme/defaults/light-canyon.json +0 -91
  220. package/src/modes/theme/defaults/light-catppuccin.json +0 -106
  221. package/src/modes/theme/defaults/light-cirrus.json +0 -90
  222. package/src/modes/theme/defaults/light-coral.json +0 -95
  223. package/src/modes/theme/defaults/light-cyberpunk.json +0 -96
  224. package/src/modes/theme/defaults/light-dawn.json +0 -90
  225. package/src/modes/theme/defaults/light-dunes.json +0 -91
  226. package/src/modes/theme/defaults/light-eucalyptus.json +0 -95
  227. package/src/modes/theme/defaults/light-forest.json +0 -100
  228. package/src/modes/theme/defaults/light-frost.json +0 -95
  229. package/src/modes/theme/defaults/light-github.json +0 -115
  230. package/src/modes/theme/defaults/light-glacier.json +0 -91
  231. package/src/modes/theme/defaults/light-gruvbox.json +0 -108
  232. package/src/modes/theme/defaults/light-haze.json +0 -90
  233. package/src/modes/theme/defaults/light-honeycomb.json +0 -95
  234. package/src/modes/theme/defaults/light-lagoon.json +0 -91
  235. package/src/modes/theme/defaults/light-lavender.json +0 -95
  236. package/src/modes/theme/defaults/light-meadow.json +0 -91
  237. package/src/modes/theme/defaults/light-mint.json +0 -95
  238. package/src/modes/theme/defaults/light-monochrome.json +0 -101
  239. package/src/modes/theme/defaults/light-ocean.json +0 -99
  240. package/src/modes/theme/defaults/light-one.json +0 -99
  241. package/src/modes/theme/defaults/light-opal.json +0 -91
  242. package/src/modes/theme/defaults/light-orchard.json +0 -91
  243. package/src/modes/theme/defaults/light-paper.json +0 -95
  244. package/src/modes/theme/defaults/light-poimandres.json +0 -141
  245. package/src/modes/theme/defaults/light-prism.json +0 -90
  246. package/src/modes/theme/defaults/light-retro.json +0 -98
  247. package/src/modes/theme/defaults/light-sand.json +0 -95
  248. package/src/modes/theme/defaults/light-savanna.json +0 -91
  249. package/src/modes/theme/defaults/light-solarized.json +0 -102
  250. package/src/modes/theme/defaults/light-soleil.json +0 -90
  251. package/src/modes/theme/defaults/light-sunset.json +0 -99
  252. package/src/modes/theme/defaults/light-synthwave.json +0 -98
  253. package/src/modes/theme/defaults/light-tokyo-night.json +0 -111
  254. package/src/modes/theme/defaults/light-wetland.json +0 -91
  255. package/src/modes/theme/defaults/light-zenith.json +0 -89
  256. package/src/modes/theme/defaults/limestone.json +0 -94
  257. package/src/modes/theme/defaults/mahogany.json +0 -97
  258. package/src/modes/theme/defaults/marble.json +0 -93
  259. package/src/modes/theme/defaults/obsidian.json +0 -91
  260. package/src/modes/theme/defaults/onyx.json +0 -91
  261. package/src/modes/theme/defaults/pearl.json +0 -93
  262. package/src/modes/theme/defaults/porcelain.json +0 -91
  263. package/src/modes/theme/defaults/quartz.json +0 -96
  264. package/src/modes/theme/defaults/sandstone.json +0 -95
  265. package/src/modes/theme/defaults/titanium.json +0 -90
  266. package/src/modes/theme/light.json +0 -93
@@ -251,11 +251,7 @@ export declare function stopThemeWatcher(): void;
251
251
  * Used by HTML export to generate CSS custom properties.
252
252
  */
253
253
  export declare function getResolvedThemeColors(themeName?: string): Promise<Record<string, string>>;
254
- /**
255
- * Check if a theme is a "light" theme by analyzing its background color luminance.
256
- * Loads theme JSON synchronously (built-in or custom file) and resolves userMessageBg.
257
- */
258
- export declare function isLightTheme(themeName?: string): boolean;
254
+ export declare function isLightTheme(themeName?: string, agentDir?: string): boolean;
259
255
  /**
260
256
  * Get explicit export colors from theme JSON, if specified.
261
257
  * Returns undefined for each color that isn't explicitly set.
@@ -70,6 +70,7 @@ export interface InteractiveModeContext {
70
70
  isInitialized: boolean;
71
71
  isBackgrounded: boolean;
72
72
  isBashMode: boolean;
73
+ isBashNoContext: boolean;
73
74
  toolOutputExpanded: boolean;
74
75
  todoExpanded: boolean;
75
76
  planModeEnabled: boolean;
@@ -92,6 +93,7 @@ export interface InteractiveModeContext {
92
93
  retryLoader: Loader | undefined;
93
94
  autoCompactionEscapeHandler?: () => void;
94
95
  retryEscapeHandler?: () => void;
96
+ retryCountdownTimer?: ReturnType<typeof setInterval>;
95
97
  unsubscribe?: () => void;
96
98
  onInputCallback?: (input: SubmittedUserInput) => void;
97
99
  optimisticUserMessageSignature: string | undefined;
@@ -99,6 +99,8 @@ export interface CreateAgentSessionOptions {
99
99
  agentId?: string;
100
100
  /** Display name for the agent in IRC. Default: "main" or "sub". */
101
101
  agentDisplayName?: string;
102
+ /** Optional restricted bash command prefixes for read-only role agents. */
103
+ bashAllowedPrefixes?: string[];
102
104
  /** Optional shared agent registry for IRC routing. Default: AgentRegistry.global(). */
103
105
  agentRegistry?: AgentRegistry;
104
106
  /** Parent task ID prefix for nested artifact naming (e.g., "6-Extensions") */
@@ -125,6 +127,8 @@ export interface CreateAgentSessionOptions {
125
127
  forkContextSeed?: ForkContextSeed;
126
128
  /** Optional provider state override. Fork-context children should omit this by default. */
127
129
  providerSessionState?: Map<string, ProviderSessionState>;
130
+ /** Cooperative pause checkpoint passed through to Agent. */
131
+ shouldPause?: () => boolean;
128
132
  }
129
133
  /** Result from createAgentSession */
130
134
  export interface CreateAgentSessionResult {
@@ -90,6 +90,7 @@ export type AgentSessionEvent = AgentEvent | {
90
90
  maxAttempts: number;
91
91
  delayMs: number;
92
92
  errorMessage: string;
93
+ unbounded?: boolean;
93
94
  } | {
94
95
  type: "auto_retry_end";
95
96
  success: boolean;
@@ -604,6 +605,7 @@ export declare class AgentSession {
604
605
  abort(options?: {
605
606
  goalReason?: "interrupted" | "internal";
606
607
  timeoutMs?: number;
608
+ cause?: "user_interrupt" | "new_session" | "session_switch" | "compaction" | "handoff" | "tool_abort" | "internal";
607
609
  }): Promise<void>;
608
610
  /**
609
611
  * Start a new session, optionally with initial messages and parent tracking.
@@ -752,6 +754,12 @@ export declare class AgentSession {
752
754
  * Cancel in-progress retry.
753
755
  */
754
756
  abortRetry(): void;
757
+ /**
758
+ * Skip the current retry backoff and re-attempt immediately. Distinct from
759
+ * abortRetry(), which cancels the retry and returns to idle. No-op when no
760
+ * retry backoff is active.
761
+ */
762
+ retryNow(): void;
755
763
  /** Whether auto-retry is currently in progress */
756
764
  get isRetrying(): boolean;
757
765
  /** Whether auto-retry is enabled */
@@ -41,6 +41,17 @@ export interface OutputSinkOptions {
41
41
  onChunk?: (chunk: string) => void;
42
42
  /** Minimum ms between onChunk calls. 0 = every chunk (default). */
43
43
  chunkThrottleMs?: number;
44
+ /**
45
+ * Unthrottled per-chunk callback fired *after* sanitization but *before*
46
+ * any throttle gating, column capping, or head/tail bookkeeping. Used by
47
+ * background-job substrate to record the complete process stream for the
48
+ * Monitor tool while keeping `onChunk` cheap for UI/progress.
49
+ *
50
+ * Receives the sanitized chunk verbatim; never receives the column-capped
51
+ * or minimized text. Implementations must be fast and side-effect-free
52
+ * relative to the sink (the sink does not catch errors from this callback).
53
+ */
54
+ onRawChunk?: (chunk: string) => void;
44
55
  }
45
56
  export interface TruncationResult {
46
57
  content: string;
@@ -46,6 +46,8 @@ export interface SkillActiveState {
46
46
  session_id?: string;
47
47
  thread_id?: string;
48
48
  turn_id?: string;
49
+ initialized_mode?: CanonicalGjcWorkflowSkill;
50
+ initialized_state_path?: string;
49
51
  active_skills?: SkillActiveEntry[];
50
52
  [key: string]: unknown;
51
53
  }
@@ -74,6 +76,7 @@ export declare function isCanonicalGjcWorkflowSkill(skill: string): skill is Can
74
76
  export declare function listActiveSkills(raw: unknown): SkillActiveEntry[];
75
77
  export declare function normalizeSkillActiveState(raw: unknown): SkillActiveState | null;
76
78
  export declare function getSkillActiveStatePaths(cwd: string, sessionId?: string): SkillActiveStatePaths;
79
+ export declare function collapsePlanningPipeline(entries: readonly SkillActiveEntry[]): SkillActiveEntry[];
77
80
  export declare function readVisibleSkillActiveState(cwd: string, sessionId?: string): Promise<SkillActiveState | null>;
78
81
  export declare function syncSkillActiveState(options: SyncSkillActiveStateOptions): Promise<void>;
79
82
  export interface ApplyHandoffOptions {
@@ -1,6 +1,6 @@
1
1
  import type { AgentTool } from "@gajae-code/agent-core";
2
2
  export declare const DEEP_INTERVIEW_MUTATION_BLOCK_MESSAGE = "Deep-interview phase boundary: continue gathering context/questions/risks and emit a handoff/spec before code edits. Mutation tools and patch execution are blocked while deep-interview is active; finalize specs through `gjc deep-interview --write --stage final` or hand off to an execution phase.";
3
- export declare const WORKFLOW_STATE_MUTATION_BLOCK_MESSAGE = "Workflow state JSON is runtime-owned. Use `gjc state <skill> read|write --input '<json>'` for deep-interview, ralplan, ultragoal, and team. Planning artifacts under `.gjc/specs/` and `.gjc/plans/` remain allowed.";
3
+ export declare const WORKFLOW_STATE_MUTATION_BLOCK_MESSAGE = ".gjc workflow state and artifacts are runtime-owned. Agent mutation tools cannot edit `.gjc/**`; use the sanctioned `gjc` CLI instead.";
4
4
  type ToolWithEditMode = AgentTool & {
5
5
  mode?: unknown;
6
6
  customWireName?: unknown;
@@ -4,6 +4,12 @@ export declare const WORKFLOW_STATE_RECEIPT_VERSION = 1;
4
4
  export declare const WORKFLOW_STATE_RECEIPT_FRESH_MS: number;
5
5
  export type WorkflowStateMutationOwner = "gjc-state-cli" | "gjc-runtime" | "gjc-hook";
6
6
  export type WorkflowStateReceiptStatus = "fresh" | "stale";
7
+ export interface WorkflowStateContentChecksum {
8
+ algorithm: "sha256";
9
+ value: string;
10
+ covered_path: string;
11
+ computed_at: string;
12
+ }
7
13
  export interface WorkflowStateReceipt {
8
14
  version: 1;
9
15
  skill: CanonicalGjcWorkflowSkill;
@@ -15,6 +21,24 @@ export interface WorkflowStateReceipt {
15
21
  fresh_until: string;
16
22
  status: WorkflowStateReceiptStatus;
17
23
  mutation_id: string;
24
+ verb?: string;
25
+ from_phase?: string;
26
+ to_phase?: string;
27
+ forced?: boolean;
28
+ paths?: string[];
29
+ content_sha256?: WorkflowStateContentChecksum;
30
+ }
31
+ export interface AuditEntry {
32
+ ts: string;
33
+ skill?: string;
34
+ category: string;
35
+ verb: string;
36
+ owner: WorkflowStateMutationOwner;
37
+ mutation_id: string;
38
+ from_phase?: string;
39
+ to_phase?: string;
40
+ forced: boolean;
41
+ paths: string[];
18
42
  }
19
43
  export declare function workflowModeStateFileName(skill: CanonicalGjcWorkflowSkill): string;
20
44
  export declare function workflowStateStoragePath(cwd: string, skill: CanonicalGjcWorkflowSkill, sessionId?: string): string;
@@ -29,6 +29,9 @@ export interface ExecutorOptions {
29
29
  index: number;
30
30
  id: string;
31
31
  modelOverride?: string | string[];
32
+ runMode?: "initial" | "resume" | "message";
33
+ resumeMessage?: string;
34
+ subagentId?: string;
32
35
  /**
33
36
  * Active model selector of the parent session, used as an auth-aware fallback
34
37
  * if the resolved subagent model has no working credentials. See #985.
@@ -32,7 +32,7 @@ export interface SubagentLifecyclePayload {
32
32
  agent: string;
33
33
  agentSource: AgentSource;
34
34
  description?: string;
35
- status: "started" | "completed" | "failed" | "aborted";
35
+ status: "started" | "completed" | "failed" | "aborted" | "paused";
36
36
  sessionFile?: string;
37
37
  index: number;
38
38
  }
@@ -161,6 +161,7 @@ export interface AgentDefinition {
161
161
  autoloadSkills?: string[];
162
162
  hide?: boolean;
163
163
  forkContext?: ForkContextPolicy;
164
+ bashAllowedPrefixes?: string[];
164
165
  source: AgentSource;
165
166
  filePath?: string;
166
167
  }
@@ -170,7 +171,7 @@ export interface AgentProgress {
170
171
  id: string;
171
172
  agent: string;
172
173
  agentSource: AgentSource;
173
- status: "pending" | "running" | "completed" | "failed" | "aborted";
174
+ status: "pending" | "running" | "completed" | "failed" | "aborted" | "paused";
174
175
  task: string;
175
176
  assignment?: string;
176
177
  description?: string;
@@ -212,6 +213,7 @@ export interface AgentProgress {
212
213
  retryState?: {
213
214
  attempt: number;
214
215
  maxAttempts: number;
216
+ unbounded?: boolean;
215
217
  delayMs: number;
216
218
  errorMessage: string;
217
219
  startedAtMs: number;
@@ -260,6 +262,7 @@ export interface SingleResult {
260
262
  error?: string;
261
263
  aborted?: boolean;
262
264
  abortReason?: string;
265
+ paused?: boolean;
263
266
  /** Aggregated usage from the subprocess, accumulated incrementally from message_end events. */
264
267
  usage?: Usage;
265
268
  /** Output path for the task result */
@@ -298,9 +301,59 @@ export interface TaskToolDetails {
298
301
  outputPaths?: string[];
299
302
  progress?: AgentProgress[];
300
303
  async?: {
301
- state: "running" | "completed" | "failed";
304
+ state: "running" | "paused" | "queued" | "completed" | "failed";
302
305
  jobId: string;
303
306
  type: "task";
304
307
  };
305
308
  }
309
+ /**
310
+ * Persisted per-turn / per-subagent token record (Phase 0 instrumentation).
311
+ *
312
+ * Additive: this does not alter any existing task result shape. It is the
313
+ * durable, model-independent unit the deterministic orchestration-token
314
+ * benchmark (`@gajae-code/orchestration-token-benchmark`) consumes to measure
315
+ * token efficiency without any live-model calls.
316
+ */
317
+ export interface TaskTokenLog {
318
+ /** Subagent id, or "root" for the orchestrator's own turn. */
319
+ subagentId: string;
320
+ /** Agent name for attribution, when known. */
321
+ agent?: string;
322
+ /** 1-based turn index within the subagent's session. */
323
+ turn: number;
324
+ /** ISO-8601 timestamp the turn completed. */
325
+ at: string;
326
+ /** Cost-bearing input tokens (excludes cache reads), mirrors `Usage.input`. */
327
+ input: number;
328
+ /** Total output tokens for the turn, mirrors `Usage.output`. */
329
+ output: number;
330
+ /** Tokens read from the prompt cache, mirrors `Usage.cacheRead`. */
331
+ cacheRead: number;
332
+ /** Tokens written to the prompt cache, mirrors `Usage.cacheWrite`. */
333
+ cacheWrite: number;
334
+ /** input + output + cacheRead + cacheWrite. */
335
+ totalTokens: number;
336
+ /** Latest per-turn context-window occupancy, when known. */
337
+ contextTokens?: number;
338
+ /** Estimated USD cost for the turn, when known. */
339
+ cost?: number;
340
+ /** Model id used for the turn, when known. */
341
+ model?: string;
342
+ }
343
+ /**
344
+ * Deterministic aggregate token metrics computed from a set of `TaskTokenLog`
345
+ * entries. The cache-hit-rate field is the primary prompt-cache signal called
346
+ * out by the prefix-stability invariant (see the approved plan).
347
+ */
348
+ export interface TaskTokenMetrics {
349
+ /** Number of token-log entries aggregated. */
350
+ turns: number;
351
+ inputTokens: number;
352
+ outputTokens: number;
353
+ cacheReadTokens: number;
354
+ cacheWriteTokens: number;
355
+ totalTokens: number;
356
+ /** cacheRead / (input + cacheRead); 0 when there is no input-class traffic. */
357
+ cacheHitRate: number;
358
+ }
306
359
  export {};
@@ -0,0 +1,5 @@
1
+ export interface BashAllowedPrefixesCheck {
2
+ allowed: boolean;
3
+ reason?: string;
4
+ }
5
+ export declare function checkBashAllowedPrefixes(command: string, allowedPrefixes: readonly string[] | undefined): BashAllowedPrefixesCheck;
@@ -59,6 +59,30 @@ export declare class BashTool implements AgentTool<BashToolSchema, BashToolDetai
59
59
  readonly concurrency = "exclusive";
60
60
  readonly strict = true;
61
61
  constructor(session: ToolSession);
62
+ /**
63
+ * Start a background bash job for the Monitor tool. Reuses the full Bash
64
+ * pipeline (interceptors, internal-URL expansion, env, cwd, timeout); the
65
+ * public `monitor` tool itself is ACP-gated by `AgentSession` before this
66
+ * helper is called. The caller-supplied `onRawLine` callback is invoked once
67
+ * per newline-terminated stdout chunk, between turns, so the upstream Claude
68
+ * Code "Each stdout line is a task-notification event" semantics are preserved
69
+ * through the agent's existing background-task delivery path.
70
+ */
71
+ startMonitorJob(input: {
72
+ command: string;
73
+ cwd?: string;
74
+ timeout?: number;
75
+ env?: Record<string, string>;
76
+ }, opts?: {
77
+ ownerId?: string;
78
+ label?: string;
79
+ ctx?: AgentToolContext;
80
+ onRawLine?: (line: string, jobId: string) => void;
81
+ }): Promise<{
82
+ jobId: string;
83
+ label: string;
84
+ commandCwd: string;
85
+ }>;
62
86
  execute(_toolCallId: string, { command: rawCommand, env: rawEnv, timeout: rawTimeout, cwd, async: asyncRequested, pty }: BashToolInput, signal?: AbortSignal, onUpdate?: AgentToolUpdateCallback<BashToolDetails>, ctx?: AgentToolContext): Promise<AgentToolResult<BashToolDetails>>;
63
87
  }
64
88
  export interface BashRenderArgs {
@@ -0,0 +1,110 @@
1
+ import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@gajae-code/agent-core";
2
+ import * as z from "zod/v4";
3
+ import type { ToolSession } from "./index";
4
+ /** Maximum scheduled tasks per owner. Mirrors upstream Claude Code's 50-task cap. */
5
+ export declare const MAX_CRON_TASKS_PER_OWNER = 50;
6
+ /** Recurring tasks auto-expire 7 days after creation (mirrors upstream). */
7
+ export declare const CRON_RECURRING_MAX_AGE_MS: number;
8
+ declare const cronCreateSchema: z.ZodObject<{
9
+ cron_expression: z.ZodString;
10
+ prompt: z.ZodString;
11
+ recurring: z.ZodDefault<z.ZodBoolean>;
12
+ }, z.core.$strip>;
13
+ export type CronCreateParams = z.infer<typeof cronCreateSchema>;
14
+ declare const cronListSchema: z.ZodObject<{}, z.core.$strip>;
15
+ export type CronListParams = z.infer<typeof cronListSchema>;
16
+ declare const cronDeleteSchema: z.ZodObject<{
17
+ id: z.ZodString;
18
+ }, z.core.$strip>;
19
+ export type CronDeleteParams = z.infer<typeof cronDeleteSchema>;
20
+ export interface CronJobSnapshot {
21
+ id: string;
22
+ cron_expression: string;
23
+ prompt: string;
24
+ recurring: boolean;
25
+ createdAt: number;
26
+ expiresAt?: number;
27
+ nextFireAt?: number;
28
+ humanSchedule: string;
29
+ ownerId?: string;
30
+ }
31
+ export interface CronListJobDetails {
32
+ id: string;
33
+ cron: string;
34
+ recurring: boolean;
35
+ prompt: string;
36
+ humanSchedule: string;
37
+ }
38
+ export interface CronCreateToolDetails {
39
+ id: string;
40
+ cron_expression: string;
41
+ recurring: boolean;
42
+ nextFireAt?: number;
43
+ }
44
+ export interface CronListToolDetails {
45
+ jobs: CronListJobDetails[];
46
+ }
47
+ export interface CronDeleteToolDetails {
48
+ id: string;
49
+ deleted: boolean;
50
+ }
51
+ /** Clear every schedule for an owner. Exported for tests + lifecycle teardown. */
52
+ export declare function clearOwnerSchedules(ownerId: string | undefined): void;
53
+ /** Reset every owner's schedule store. Test-only. */
54
+ export declare function resetCronRegistryForTests(): void;
55
+ export declare function validateCronExpression(expression: string): void;
56
+ export declare function findNextCronMatchMs(expression: string, afterMs: number, deadlineMs?: number): number | undefined;
57
+ export declare function calculateCronFireTimeMs(params: {
58
+ id: string;
59
+ cronExpression: string;
60
+ baseMatchMs: number;
61
+ recurring: boolean;
62
+ nowMs: number;
63
+ expiresAt?: number;
64
+ }): number;
65
+ export declare class CronCreateTool implements AgentTool<typeof cronCreateSchema, CronCreateToolDetails> {
66
+ private readonly session;
67
+ readonly name = "CronCreate";
68
+ readonly label = "CronCreate";
69
+ readonly summary = "Schedule a prompt on a 5-field cron expression";
70
+ readonly description: string;
71
+ readonly parameters: z.ZodObject<{
72
+ cron_expression: z.ZodString;
73
+ prompt: z.ZodString;
74
+ recurring: z.ZodDefault<z.ZodBoolean>;
75
+ }, z.core.$strip>;
76
+ readonly strict = true;
77
+ readonly loadMode = "discoverable";
78
+ constructor(session: ToolSession);
79
+ static createIf(session: ToolSession): CronCreateTool | null;
80
+ execute(_toolCallId: string, params: CronCreateParams, _signal?: AbortSignal, _onUpdate?: AgentToolUpdateCallback<CronCreateToolDetails>, _context?: AgentToolContext): Promise<AgentToolResult<CronCreateToolDetails>>;
81
+ }
82
+ export declare class CronListTool implements AgentTool<typeof cronListSchema, CronListToolDetails> {
83
+ private readonly session;
84
+ readonly name = "CronList";
85
+ readonly label = "CronList";
86
+ readonly summary = "List scheduled cron jobs";
87
+ readonly description: string;
88
+ readonly parameters: z.ZodObject<{}, z.core.$strip>;
89
+ readonly strict = true;
90
+ readonly loadMode = "discoverable";
91
+ constructor(session: ToolSession);
92
+ static createIf(session: ToolSession): CronListTool | null;
93
+ execute(_toolCallId: string, _params: CronListParams, _signal?: AbortSignal, _onUpdate?: AgentToolUpdateCallback<CronListToolDetails>, _context?: AgentToolContext): Promise<AgentToolResult<CronListToolDetails>>;
94
+ }
95
+ export declare class CronDeleteTool implements AgentTool<typeof cronDeleteSchema, CronDeleteToolDetails> {
96
+ private readonly session;
97
+ readonly name = "CronDelete";
98
+ readonly label = "CronDelete";
99
+ readonly summary = "Cancel a scheduled cron job by ID";
100
+ readonly description: string;
101
+ readonly parameters: z.ZodObject<{
102
+ id: z.ZodString;
103
+ }, z.core.$strip>;
104
+ readonly strict = true;
105
+ readonly loadMode = "discoverable";
106
+ constructor(session: ToolSession);
107
+ static createIf(session: ToolSession): CronDeleteTool | null;
108
+ execute(_toolCallId: string, params: CronDeleteParams, _signal?: AbortSignal, _onUpdate?: AgentToolUpdateCallback<CronDeleteToolDetails>, _context?: AgentToolContext): Promise<AgentToolResult<CronDeleteToolDetails>>;
109
+ }
110
+ export {};
@@ -32,6 +32,7 @@ export * from "./bash";
32
32
  export * from "./browser";
33
33
  export * from "./calculator";
34
34
  export * from "./checkpoint";
35
+ export * from "./cron";
35
36
  export * from "./debug";
36
37
  export * from "./eval";
37
38
  export * from "./find";
@@ -43,6 +44,7 @@ export * from "./image-gen";
43
44
  export * from "./inspect-image";
44
45
  export * from "./irc";
45
46
  export * from "./job";
47
+ export * from "./monitor";
46
48
  export * from "./read";
47
49
  export * from "./recipe";
48
50
  export * from "./render-mermaid";
@@ -118,6 +120,8 @@ export interface ToolSession {
118
120
  getToolByName?: (name: string) => AgentTool | undefined;
119
121
  /** Agent registry for IRC routing across live sessions. */
120
122
  agentRegistry?: AgentRegistry;
123
+ /** Optional restricted bash command prefixes for read-only role agents. */
124
+ bashAllowedPrefixes?: string[];
121
125
  /** Get artifacts directory for artifact:// URLs */
122
126
  getArtifactsDir?: () => string | null;
123
127
  /** Get the ArtifactManager backing this session (shared across parent + subagents). */
@@ -0,0 +1,54 @@
1
+ import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@gajae-code/agent-core";
2
+ import * as z from "zod/v4";
3
+ import type { ToolSession } from "./index";
4
+ declare const monitorKindEnum: z.ZodEnum<{
5
+ log: "log";
6
+ other: "other";
7
+ poll: "poll";
8
+ watch: "watch";
9
+ }>;
10
+ declare const monitorSchema: z.ZodObject<{
11
+ command: z.ZodString;
12
+ kind: z.ZodEnum<{
13
+ log: "log";
14
+ other: "other";
15
+ poll: "poll";
16
+ watch: "watch";
17
+ }>;
18
+ description: z.ZodString;
19
+ timeout: z.ZodOptional<z.ZodNumber>;
20
+ persistent: z.ZodOptional<z.ZodBoolean>;
21
+ }, z.core.$strip>;
22
+ export type MonitorParams = z.infer<typeof monitorSchema>;
23
+ export interface MonitorToolDetails {
24
+ taskId: string;
25
+ kind: z.infer<typeof monitorKindEnum>;
26
+ description: string;
27
+ command: string;
28
+ persistent: boolean;
29
+ }
30
+ export declare class MonitorTool implements AgentTool<typeof monitorSchema, MonitorToolDetails> {
31
+ private readonly session;
32
+ readonly name = "monitor";
33
+ readonly label = "Monitor";
34
+ readonly summary = "Start a background monitor that streams stdout lines as task notifications";
35
+ readonly description: string;
36
+ readonly parameters: z.ZodObject<{
37
+ command: z.ZodString;
38
+ kind: z.ZodEnum<{
39
+ log: "log";
40
+ other: "other";
41
+ poll: "poll";
42
+ watch: "watch";
43
+ }>;
44
+ description: z.ZodString;
45
+ timeout: z.ZodOptional<z.ZodNumber>;
46
+ persistent: z.ZodOptional<z.ZodBoolean>;
47
+ }, z.core.$strip>;
48
+ readonly strict = true;
49
+ readonly loadMode = "discoverable";
50
+ constructor(session: ToolSession);
51
+ static createIf(session: ToolSession): MonitorTool | null;
52
+ execute(_toolCallId: string, params: MonitorParams, _signal?: AbortSignal, _onUpdate?: AgentToolUpdateCallback<MonitorToolDetails>, context?: AgentToolContext): Promise<AgentToolResult<MonitorToolDetails>>;
53
+ }
54
+ export {};
@@ -8,13 +8,18 @@ declare const subagentSchema: z.ZodObject<{
8
8
  cancel: "cancel";
9
9
  inspect: "inspect";
10
10
  list: "list";
11
+ pause: "pause";
12
+ resume: "resume";
13
+ steer: "steer";
11
14
  }>;
12
15
  ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
16
+ message: z.ZodOptional<z.ZodString>;
17
+ pause: z.ZodOptional<z.ZodBoolean>;
13
18
  timeout_ms: z.ZodOptional<z.ZodNumber>;
14
19
  limit: z.ZodOptional<z.ZodNumber>;
15
20
  }, z.core.$strip>;
16
21
  type SubagentParams = z.infer<typeof subagentSchema>;
17
- type SubagentStatus = "running" | "completed" | "failed" | "cancelled" | "not_found" | "already_completed";
22
+ type SubagentStatus = "running" | "paused" | "queued" | "completed" | "failed" | "cancelled" | "not_found" | "already_completed";
18
23
  export interface SubagentSnapshot {
19
24
  id: string;
20
25
  jobId: string;
@@ -45,8 +50,13 @@ export declare class SubagentTool implements AgentTool<typeof subagentSchema, Su
45
50
  cancel: "cancel";
46
51
  inspect: "inspect";
47
52
  list: "list";
53
+ pause: "pause";
54
+ resume: "resume";
55
+ steer: "steer";
48
56
  }>;
49
57
  ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
58
+ message: z.ZodOptional<z.ZodString>;
59
+ pause: z.ZodOptional<z.ZodBoolean>;
50
60
  timeout_ms: z.ZodOptional<z.ZodNumber>;
51
61
  limit: z.ZodOptional<z.ZodNumber>;
52
62
  }, z.core.$strip>;
@@ -40,6 +40,7 @@ export declare function runSearchQuery(params: SearchQueryParams, options?: {
40
40
  authStorage?: AuthStorage;
41
41
  sessionId?: string;
42
42
  signal?: AbortSignal;
43
+ activeModelProvider?: string;
43
44
  }): Promise<{
44
45
  content: Array<{
45
46
  type: "text";
@@ -14,8 +14,15 @@ export declare const SEARCH_PROVIDER_ORDER: SearchProviderId[];
14
14
  /** Set the preferred web search provider from settings */
15
15
  export declare function setPreferredSearchProvider(provider: SearchProviderId | "auto"): void;
16
16
  /**
17
- * Determine which providers are configured and currently available.
18
- * Each candidate is loaded (and its `isAvailable()` called) only as the chain
19
- * is walked, so unconfigured providers never pay the load cost.
17
+ * Resolve the ordered provider chain for a search request.
18
+ *
19
+ * Resolution is active-model-gated, never credential-scanning:
20
+ * 1. An explicitly preferred provider (settings) that is available is primary.
21
+ * 2. Otherwise the active model's own native search is primary, but only when
22
+ * that provider's own credentials are present (its `isAvailable()`).
23
+ * 3. DuckDuckGo (keyless) is always appended as the terminal fallback, so a
24
+ * missing primary — or a primary runtime failure — still returns results
25
+ * with zero configuration. Keyed standalone providers are never
26
+ * auto-selected; they are reachable only via explicit selection (step 1).
20
27
  */
21
- export declare function resolveProviderChain(authStorage: AuthStorage, preferredProvider?: SearchProviderId | "auto"): Promise<SearchProvider[]>;
28
+ export declare function resolveProviderChain(authStorage: AuthStorage, preferredProvider?: SearchProviderId | "auto", activeModelProvider?: string): Promise<SearchProvider[]>;
@@ -0,0 +1,57 @@
1
+ /**
2
+ * DuckDuckGo Web Search Provider
3
+ *
4
+ * Keyless, permissionless web search. Scrapes DuckDuckGo's no-JavaScript HTML
5
+ * endpoints and maps anchors/snippets into the unified SearchResponse shape
6
+ * (sources only — DuckDuckGo does not synthesize an answer).
7
+ *
8
+ * This is the zero-config default/fallback backend: it requires no API key and
9
+ * no OAuth, so `isAvailable()` is always true. Because DuckDuckGo applies
10
+ * anti-bot rate limiting (HTTP 202 / 403 / empty responses) from datacenter and
11
+ * VPN IPs, the provider is best-effort: it retries with backoff, rotates the
12
+ * user-agent, and alternates between the `html` and `lite` endpoints. When every
13
+ * attempt fails it throws a {@link SearchProviderError} rather than returning an
14
+ * empty success — it never falls through to keyed providers.
15
+ *
16
+ * Endpoints:
17
+ * https://html.duckduckgo.com/html/ (primary)
18
+ * https://lite.duckduckgo.com/lite/ (fallback markup)
19
+ *
20
+ * The HTML markup is liable to drift; the parser is deliberately small and is
21
+ * pinned by fixture-driven tests (see test/tools/web-search-duckduckgo.test.ts).
22
+ */
23
+ import type { AuthStorage } from "@gajae-code/ai";
24
+ import type { SearchResponse } from "../../../web/search/types";
25
+ import type { SearchParams } from "./base";
26
+ import { SearchProvider } from "./base";
27
+ interface ParsedResult {
28
+ title: string;
29
+ url: string;
30
+ snippet?: string;
31
+ }
32
+ /**
33
+ * Resolve a DuckDuckGo result href to the real destination URL. DuckDuckGo wraps
34
+ * external links in a `/l/?uddg=<encoded>` redirect; `lite` sometimes links
35
+ * directly. Returns null for unusable or internal links (so ads/redirect shells
36
+ * are dropped).
37
+ */
38
+ export declare function decodeResultUrl(href: string): string | null;
39
+ /** Parse results from the `html.duckduckgo.com/html/` markup. */
40
+ export declare function parseHtmlResults(html: string): ParsedResult[];
41
+ /** Parse results from the `lite.duckduckgo.com/lite/` markup. */
42
+ export declare function parseLiteResults(html: string): ParsedResult[];
43
+ /** Execute a keyless DuckDuckGo web search with light resilience. */
44
+ export declare function searchDuckDuckGo(params: {
45
+ query: string;
46
+ num_results?: number;
47
+ recency?: "day" | "week" | "month" | "year";
48
+ signal?: AbortSignal;
49
+ }): Promise<SearchResponse>;
50
+ /** Keyless, permissionless web search provider backed by DuckDuckGo. */
51
+ export declare class DuckDuckGoProvider extends SearchProvider {
52
+ readonly id = "duckduckgo";
53
+ readonly label = "DuckDuckGo";
54
+ isAvailable(_authStorage: AuthStorage): boolean;
55
+ search(params: SearchParams): Promise<SearchResponse>;
56
+ }
57
+ export {};
@@ -4,7 +4,7 @@
4
4
  * Unified types for web search responses across supported providers.
5
5
  */
6
6
  /** Supported web search providers */
7
- export type SearchProviderId = "exa" | "brave" | "jina" | "kimi" | "zai" | "anthropic" | "perplexity" | "gemini" | "codex" | "tavily" | "parallel" | "kagi" | "synthetic" | "searxng";
7
+ export type SearchProviderId = "duckduckgo" | "exa" | "brave" | "jina" | "kimi" | "zai" | "anthropic" | "perplexity" | "gemini" | "codex" | "tavily" | "parallel" | "kagi" | "synthetic" | "searxng";
8
8
  export declare function isSearchProviderId(value: string): value is SearchProviderId;
9
9
  export declare function isSearchProviderPreference(value: string): value is SearchProviderId | "auto";
10
10
  /** Source returned by search (all providers) */