@gajae-code/coding-agent 0.7.8 → 0.7.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 (92) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +8 -0
  3. package/dist/types/config/keybindings.d.ts +1 -1
  4. package/dist/types/config/model-profile-activation.d.ts +19 -2
  5. package/dist/types/config/model-profiles.d.ts +1 -0
  6. package/dist/types/config/model-registry.d.ts +4 -0
  7. package/dist/types/config/settings-schema.d.ts +12 -3
  8. package/dist/types/extensibility/extensions/types.d.ts +11 -0
  9. package/dist/types/gjc-runtime/launch-tmux.d.ts +19 -3
  10. package/dist/types/gjc-runtime/ultragoal-guard.d.ts +7 -1
  11. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +0 -4
  12. package/dist/types/modes/components/hook-input.d.ts +1 -0
  13. package/dist/types/modes/components/hook-selector.d.ts +5 -0
  14. package/dist/types/modes/components/model-selector.d.ts +9 -0
  15. package/dist/types/modes/components/status-line.d.ts +3 -0
  16. package/dist/types/modes/controllers/extension-ui-controller.d.ts +3 -1
  17. package/dist/types/modes/interactive-mode.d.ts +3 -1
  18. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +41 -7
  19. package/dist/types/modes/types.d.ts +3 -1
  20. package/dist/types/notifications/daemon-paths.d.ts +9 -0
  21. package/dist/types/notifications/html-format.d.ts +2 -0
  22. package/dist/types/notifications/recent-activity.d.ts +5 -1
  23. package/dist/types/notifications/telegram-daemon-cli.d.ts +8 -2
  24. package/dist/types/notifications/telegram-daemon-control.d.ts +8 -0
  25. package/dist/types/notifications/telegram-daemon.d.ts +1 -10
  26. package/dist/types/notifications/telegram-reference.d.ts +4 -0
  27. package/dist/types/notifications/threaded-render.d.ts +1 -0
  28. package/dist/types/tools/ask.d.ts +26 -0
  29. package/dist/types/tools/ultragoal-ask-guard.d.ts +9 -2
  30. package/dist/types/utils/cmux-workspace.d.ts +23 -0
  31. package/dist/types/web/search/index.d.ts +1 -1
  32. package/dist/types/web/search/provider.d.ts +5 -0
  33. package/dist/types/web/search/render.d.ts +1 -0
  34. package/package.json +7 -7
  35. package/src/cli/notify-cli.ts +1 -1
  36. package/src/cli/web-search-cli.ts +3 -2
  37. package/src/cli.ts +1 -0
  38. package/src/config/keybindings.ts +1 -1
  39. package/src/config/model-profile-activation.ts +92 -11
  40. package/src/config/model-profiles.ts +15 -2
  41. package/src/config/model-registry.ts +81 -5
  42. package/src/config/settings-schema.ts +14 -3
  43. package/src/coordinator-mcp/server.ts +4 -2
  44. package/src/deep-interview/render-middleware.ts +1 -0
  45. package/src/defaults/gjc/skills/deep-interview/SKILL.md +40 -8
  46. package/src/defaults/gjc/skills/ralplan/SKILL.md +14 -7
  47. package/src/defaults/gjc/skills/ultragoal/SKILL.md +37 -112
  48. package/src/extensibility/extensions/types.ts +11 -0
  49. package/src/gjc-runtime/deep-interview-runtime.ts +1 -1
  50. package/src/gjc-runtime/launch-tmux.ts +366 -48
  51. package/src/gjc-runtime/team-runtime.ts +69 -4
  52. package/src/gjc-runtime/ultragoal-guard.ts +150 -24
  53. package/src/gjc-runtime/ultragoal-runtime.ts +16 -124
  54. package/src/gjc-runtime/workflow-manifest.generated.json +0 -8
  55. package/src/gjc-runtime/workflow-manifest.ts +0 -1
  56. package/src/hooks/skill-state.ts +33 -73
  57. package/src/internal-urls/docs-index.generated.ts +8 -7
  58. package/src/modes/components/custom-model-preset-wizard.ts +2 -4
  59. package/src/modes/components/hook-editor.ts +7 -4
  60. package/src/modes/components/hook-input.ts +4 -0
  61. package/src/modes/components/hook-selector.ts +21 -3
  62. package/src/modes/components/model-selector.ts +84 -13
  63. package/src/modes/components/settings-selector.ts +83 -24
  64. package/src/modes/components/status-line/presets.ts +11 -0
  65. package/src/modes/components/status-line/segments.ts +10 -2
  66. package/src/modes/components/status-line.ts +1 -0
  67. package/src/modes/controllers/extension-ui-controller.ts +20 -2
  68. package/src/modes/controllers/selector-controller.ts +130 -7
  69. package/src/modes/interactive-mode.ts +7 -2
  70. package/src/modes/shared/agent-wire/deep-interview-gate.ts +64 -13
  71. package/src/modes/types.ts +6 -1
  72. package/src/notifications/daemon-paths.ts +22 -0
  73. package/src/notifications/html-format.ts +75 -1
  74. package/src/notifications/index.ts +12 -1
  75. package/src/notifications/recent-activity.ts +32 -8
  76. package/src/notifications/telegram-daemon-cli.ts +13 -4
  77. package/src/notifications/telegram-daemon-control.ts +9 -0
  78. package/src/notifications/telegram-daemon.ts +69 -45
  79. package/src/notifications/telegram-reference.ts +36 -14
  80. package/src/notifications/threaded-render.ts +14 -6
  81. package/src/prompts/system/system-prompt.md +10 -1
  82. package/src/sdk.ts +13 -6
  83. package/src/session/agent-session.ts +10 -1
  84. package/src/tools/ask.ts +147 -17
  85. package/src/tools/eval.ts +2 -2
  86. package/src/tools/render-utils.ts +2 -0
  87. package/src/tools/ultragoal-ask-guard.ts +39 -5
  88. package/src/utils/cmux-workspace.ts +106 -0
  89. package/src/utils/title-generator.ts +2 -0
  90. package/src/web/search/index.ts +22 -10
  91. package/src/web/search/provider.ts +15 -0
  92. package/src/web/search/render.ts +3 -0
@@ -68,6 +68,18 @@ function formatProviderError(error: unknown, provider: SearchProvider): string {
68
68
  return `Unknown error from ${provider.label}`;
69
69
  }
70
70
 
71
+ function formatProviderFailure(error: unknown, provider: SearchProvider): string {
72
+ if (error instanceof SearchProviderError) return error.message;
73
+ return `${provider.id}: ${formatProviderError(error, provider)}`;
74
+ }
75
+
76
+ function formatFallbackWarning(
77
+ failures: Array<{ provider: SearchProvider; error: unknown }>,
78
+ provider: SearchProvider,
79
+ ): string {
80
+ return `Web search provider fallback: ${failures.map(f => formatProviderFailure(f.error, f.provider)).join("; ")}; using ${provider.label}.`;
81
+ }
82
+
71
83
  /** Truncate text for tool output */
72
84
  function truncateText(text: string, maxLen: number): string {
73
85
  if (text.length <= maxLen) return text;
@@ -185,10 +197,11 @@ async function executeSearch(
185
197
  });
186
198
 
187
199
  const text = formatForLLM(response);
200
+ const warning = failures.length > 0 ? formatFallbackWarning(failures, provider) : undefined;
188
201
 
189
202
  return {
190
- content: [{ type: "text" as const, text }],
191
- details: { response },
203
+ content: [{ type: "text" as const, text: warning ? `Warning: ${warning}\n\n${text}` : text }],
204
+ details: { response, ...(warning ? { warning } : {}) },
192
205
  };
193
206
  } catch (error) {
194
207
  // Surface user-initiated cancellation immediately so the session sees
@@ -207,13 +220,7 @@ async function executeSearch(
207
220
  : `Unknown error from ${lastProvider.label}`;
208
221
  const message =
209
222
  providers.length > 1
210
- ? `All web search providers failed: ${failures
211
- .map(f =>
212
- f.error instanceof SearchProviderError
213
- ? f.error.message
214
- : `${f.provider.id}: ${formatProviderError(f.error, f.provider)}`,
215
- )
216
- .join("; ")}`
223
+ ? `All web search providers failed: ${failures.map(f => formatProviderFailure(f.error, f.provider)).join("; ")}`
217
224
  : baseMessage;
218
225
 
219
226
  return {
@@ -321,7 +328,12 @@ export function getSearchTools(): CustomTool<any, any>[] {
321
328
  return [webSearchCustomTool];
322
329
  }
323
330
 
324
- export { getSearchProvider, setPreferredSearchProvider, setSearchFallbackProviders } from "./provider";
331
+ export {
332
+ getConfiguredSearchProviderPreference,
333
+ getSearchProvider,
334
+ setPreferredSearchProvider,
335
+ setSearchFallbackProviders,
336
+ } from "./provider";
325
337
  export { setSearchHardTimeoutMs } from "./providers/utils";
326
338
  export type { SearchProviderId as SearchProvider, SearchResponse } from "./types";
327
339
  export { isConfigurableSearchProviderId, isSearchProviderPreference } from "./types";
@@ -149,6 +149,21 @@ export function setSearchFallbackProviders(ids: readonly string[]): void {
149
149
  fallbackProvIds = ids.filter(isConfigurableSearchProviderId);
150
150
  }
151
151
 
152
+ export interface SearchProviderPreferenceSource {
153
+ get(path: "providers.webSearch" | "web_search.provider"): SearchProviderId | "auto";
154
+ has(path: "providers.webSearch" | "web_search.provider"): boolean;
155
+ }
156
+
157
+ export function getConfiguredSearchProviderPreference(
158
+ settings: SearchProviderPreferenceSource,
159
+ ): SearchProviderId | "auto" {
160
+ const providerPreference = settings.get("providers.webSearch");
161
+ if (settings.has("providers.webSearch") || providerPreference !== "auto") return providerPreference;
162
+
163
+ const legacyProviderPreference = settings.get("web_search.provider");
164
+ return legacyProviderPreference;
165
+ }
166
+
152
167
  export interface ResolveProviderChainOptions {
153
168
  authStorage: AuthStorage;
154
169
  sessionId?: string;
@@ -66,6 +66,7 @@ function renderFallbackText(contentText: string, expanded: boolean, theme: Theme
66
66
  export interface SearchRenderDetails {
67
67
  response: SearchResponse;
68
68
  error?: string;
69
+ warning?: string;
69
70
  }
70
71
 
71
72
  /** Render web search result with tree-based layout */
@@ -130,6 +131,8 @@ export function renderSearchResult(
130
131
 
131
132
  const metaLines: string[] = [];
132
133
  metaLines.push(`${theme.fg("muted", "Provider:")} ${theme.fg("text", providerLabel)}`);
134
+ if (details.warning)
135
+ metaLines.push(`${theme.fg("muted", "Fallback:")} ${theme.fg("warning", truncateToWidth(details.warning, 110))}`);
133
136
  if (response.authMode)
134
137
  metaLines.push(
135
138
  `${theme.fg("muted", "Auth:")} ${theme.fg("text", response.authMode === "oauth" ? "OAuth" : response.authMode === "api_key" ? "API key" : response.authMode)}`,