@gajae-code/coding-agent 0.12.6 → 0.12.8

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 (150) hide show
  1. package/CHANGELOG.md +22 -1
  2. package/dist/types/async/job-manager.d.ts +36 -1
  3. package/dist/types/commands/notify.d.ts +4 -0
  4. package/dist/types/config/file-lock.d.ts +3 -0
  5. package/dist/types/config/model-discovery-manager.d.ts +6 -1
  6. package/dist/types/config/model-registry.d.ts +2 -0
  7. package/dist/types/config/resolve-config-value.d.ts +2 -1
  8. package/dist/types/config/settings-schema.d.ts +17 -1
  9. package/dist/types/eval/backend.d.ts +2 -2
  10. package/dist/types/exec/bash-executor.d.ts +8 -10
  11. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +0 -36
  12. package/dist/types/internal-urls/registry-helpers.d.ts +0 -18
  13. package/dist/types/main.d.ts +1 -0
  14. package/dist/types/modes/components/hook-selector.d.ts +20 -0
  15. package/dist/types/modes/components/notifications-settings-editor.d.ts +53 -4
  16. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
  17. package/dist/types/modes/controllers/selector-controller.d.ts +4 -2
  18. package/dist/types/sdk/broker/broker.d.ts +5 -1
  19. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +1 -0
  20. package/dist/types/sdk/bus/chat-daemon-control.d.ts +11 -3
  21. package/dist/types/sdk/bus/config.d.ts +75 -113
  22. package/dist/types/sdk/bus/discord-live-provider.d.ts +8 -2
  23. package/dist/types/sdk/bus/discord-provider.d.ts +19 -0
  24. package/dist/types/sdk/bus/index.d.ts +1 -1
  25. package/dist/types/sdk/bus/notification-orchestration.d.ts +127 -18
  26. package/dist/types/sdk/bus/notification-service.d.ts +31 -4
  27. package/dist/types/sdk/bus/session-control.d.ts +8 -3
  28. package/dist/types/sdk/bus/slack-live-provider.d.ts +9 -2
  29. package/dist/types/sdk/bus/slack-provider.d.ts +22 -0
  30. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +9 -4
  31. package/dist/types/sdk/client/discovery.d.ts +2 -1
  32. package/dist/types/sdk/host/host.d.ts +2 -23
  33. package/dist/types/sdk/host/query/handlers.d.ts +2 -0
  34. package/dist/types/sdk/host/reverse-leases.d.ts +4 -7
  35. package/dist/types/sdk/index.d.ts +1 -0
  36. package/dist/types/sdk/providers.d.ts +22 -0
  37. package/dist/types/sdk/session-directory.d.ts +1 -1
  38. package/dist/types/session/artifacts.d.ts +5 -8
  39. package/dist/types/session/client-bridge.d.ts +0 -14
  40. package/dist/types/session/internal/managed-session-scope.d.ts +17 -1
  41. package/dist/types/session/internal/managed-session-storage.d.ts +11 -4
  42. package/dist/types/session/internal/native-publish-outcome.d.ts +1 -0
  43. package/dist/types/session/internal/session-open-errors.d.ts +5 -0
  44. package/dist/types/session/messages.d.ts +1 -4
  45. package/dist/types/session/session-manager.d.ts +7 -6
  46. package/dist/types/session/session-storage.d.ts +2 -0
  47. package/dist/types/session/streaming-output.d.ts +0 -32
  48. package/dist/types/task/receipt.d.ts +1 -2
  49. package/dist/types/task/types.d.ts +43 -178
  50. package/dist/types/tools/bash.d.ts +1 -1
  51. package/dist/types/tools/fetch.d.ts +0 -3
  52. package/dist/types/tools/output-meta.d.ts +5 -37
  53. package/dist/types/tools/subagent.d.ts +15 -0
  54. package/dist/types/tools/todo-write.d.ts +3 -0
  55. package/dist/types/tools/tool-result.d.ts +0 -1
  56. package/package.json +10 -8
  57. package/scripts/build-sdk-package-smoke.ts +51 -0
  58. package/scripts/capture-notifications-settings-showcase.ts +1 -1
  59. package/src/async/job-manager.ts +430 -46
  60. package/src/cli/notify-cli.ts +204 -94
  61. package/src/commands/notify.ts +19 -8
  62. package/src/config/file-lock.ts +6 -0
  63. package/src/config/model-discovery-manager.ts +50 -8
  64. package/src/config/model-registry.ts +862 -75
  65. package/src/config/resolve-config-value.ts +10 -8
  66. package/src/config/settings-schema.ts +25 -15
  67. package/src/config/settings.ts +15 -15
  68. package/src/cursor.ts +13 -20
  69. package/src/defaults/gjc/skills/ultragoal/SKILL.md +2 -3
  70. package/src/eval/backend.ts +2 -2
  71. package/src/exec/bash-executor.ts +151 -425
  72. package/src/gjc-runtime/session-state-sidecar.ts +12 -2
  73. package/src/gjc-runtime/ultragoal-runtime.ts +3 -280
  74. package/src/gjc-runtime/workflow-manifest.generated.json +1 -40
  75. package/src/gjc-runtime/workflow-manifest.ts +0 -12
  76. package/src/internal-urls/agent-protocol.ts +38 -98
  77. package/src/internal-urls/artifact-protocol.ts +17 -28
  78. package/src/internal-urls/docs-index.generated.ts +7 -7
  79. package/src/internal-urls/registry-helpers.ts +0 -62
  80. package/src/main.ts +43 -7
  81. package/src/modes/DESIGN.md +11 -11
  82. package/src/modes/acp/acp-agent.ts +0 -24
  83. package/src/modes/acp/acp-client-bridge.ts +11 -154
  84. package/src/modes/components/hook-selector.ts +155 -44
  85. package/src/modes/components/model-selector.ts +242 -49
  86. package/src/modes/components/notifications-settings-editor.ts +631 -85
  87. package/src/modes/controllers/extension-ui-controller.ts +114 -15
  88. package/src/modes/controllers/selector-controller.ts +464 -50
  89. package/src/prompts/tools/bash.md +2 -2
  90. package/src/sdk/acp/adapter.ts +9 -200
  91. package/src/sdk/broker/broker.ts +54 -10
  92. package/src/sdk/broker/lifecycle-ledger.ts +34 -1
  93. package/src/sdk/broker/lifecycle.ts +47 -50
  94. package/src/sdk/bus/chat-daemon-cli.ts +12 -5
  95. package/src/sdk/bus/chat-daemon-control.ts +35 -8
  96. package/src/sdk/bus/chat-daemon-runtime.ts +16 -2
  97. package/src/sdk/bus/config.ts +534 -286
  98. package/src/sdk/bus/discord-live-provider.ts +57 -2
  99. package/src/sdk/bus/discord-provider.ts +21 -0
  100. package/src/sdk/bus/index.ts +105 -359
  101. package/src/sdk/bus/notification-orchestration.ts +371 -68
  102. package/src/sdk/bus/notification-service.ts +431 -130
  103. package/src/sdk/bus/session-control.ts +119 -44
  104. package/src/sdk/bus/slack-live-provider.ts +78 -2
  105. package/src/sdk/bus/slack-provider.ts +24 -0
  106. package/src/sdk/bus/telegram-daemon-cli.ts +9 -2
  107. package/src/sdk/bus/telegram-daemon-contract.ts +9 -4
  108. package/src/sdk/bus/telegram-daemon-control.ts +3 -3
  109. package/src/sdk/bus/telegram-daemon.ts +23 -15
  110. package/src/sdk/client/discovery.ts +10 -4
  111. package/src/sdk/host/host.ts +9 -187
  112. package/src/sdk/host/query/handlers.ts +20 -1
  113. package/src/sdk/host/reverse-leases.ts +42 -249
  114. package/src/sdk/index.ts +1 -0
  115. package/src/sdk/protocol/operation-inventory.generated.json +18 -0
  116. package/src/sdk/protocol/operation-registry.ts +5 -2
  117. package/src/sdk/providers.ts +51 -0
  118. package/src/sdk/session-directory.ts +1 -0
  119. package/src/sdk/session.ts +10 -7
  120. package/src/session/agent-session.ts +59 -202
  121. package/src/session/artifacts.ts +74 -211
  122. package/src/session/client-bridge.ts +0 -15
  123. package/src/session/internal/managed-session-scope.ts +981 -450
  124. package/src/session/internal/managed-session-storage.ts +362 -124
  125. package/src/session/internal/native-publish-outcome.ts +3 -1
  126. package/src/session/internal/session-open-errors.ts +11 -0
  127. package/src/session/messages.ts +7 -32
  128. package/src/session/session-manager.ts +48 -15
  129. package/src/session/session-storage.ts +72 -5
  130. package/src/session/streaming-output.ts +40 -198
  131. package/src/slash-commands/builtin-registry.ts +82 -4
  132. package/src/task/index.ts +237 -65
  133. package/src/task/receipt.ts +2 -4
  134. package/src/task/render.ts +0 -30
  135. package/src/task/types.ts +10 -34
  136. package/src/tools/ask.ts +1 -1
  137. package/src/tools/bash.ts +239 -818
  138. package/src/tools/eval.ts +4 -99
  139. package/src/tools/fetch.ts +15 -77
  140. package/src/tools/find.ts +3 -7
  141. package/src/tools/output-meta.ts +114 -696
  142. package/src/tools/search.ts +4 -9
  143. package/src/tools/subagent.ts +97 -75
  144. package/src/tools/telegram-send.ts +4 -2
  145. package/src/tools/todo-write.ts +47 -0
  146. package/src/tools/tool-result.ts +0 -1
  147. package/dist/types/gjc-runtime/ultragoal-review-source.d.ts +0 -83
  148. package/dist/types/utils/artifact-id.d.ts +0 -2
  149. package/src/gjc-runtime/ultragoal-review-source.ts +0 -378
  150. package/src/utils/artifact-id.ts +0 -6
@@ -1,6 +1,14 @@
1
1
  import { ThinkingLevel } from "@gajae-code/agent-core";
2
- import type { Component, OverlayHandle, TUI } from "@gajae-code/tui";
3
- import { Container, Spacer, Text } from "@gajae-code/tui";
2
+ import {
3
+ type Component,
4
+ Container,
5
+ type OverlayHandle,
6
+ replaceTabs,
7
+ Spacer,
8
+ Text,
9
+ type TUI,
10
+ wrapTextWithAnsi,
11
+ } from "@gajae-code/tui";
4
12
  import { logger } from "@gajae-code/utils";
5
13
  import { KeybindingsManager } from "../../config/keybindings";
6
14
  import type {
@@ -39,7 +47,15 @@ import { prepareTranscriptRebuild } from "../utils/ui-helpers";
39
47
  const MAX_WIDGET_LINES = 10;
40
48
  const HOOK_SELECTOR_CHROME_ROWS = 7;
41
49
  const HOOK_SELECTOR_OUTLINE_ROWS = 2;
42
- const HOOK_SELECTOR_INLINE_INPUT_ROWS = 2;
50
+ const HOOK_SELECTOR_INLINE_EDITOR_ROWS = 2;
51
+ const HOOK_SELECTOR_INLINE_AUTOCOMPLETE_ROWS = 6;
52
+ const HOOK_SELECTOR_INLINE_INPUT_ROWS = 1 + HOOK_SELECTOR_INLINE_EDITOR_ROWS + HOOK_SELECTOR_INLINE_AUTOCOMPLETE_ROWS;
53
+ const HOOK_SELECTOR_INLINE_COMPACT_EDITOR_ROWS = 1;
54
+ const HOOK_SELECTOR_INLINE_COMPACT_AUTOCOMPLETE_MAX_VISIBLE = 3;
55
+ const HOOK_SELECTOR_INLINE_COMPACT_AUTOCOMPLETE_ROWS = 4;
56
+ const HOOK_SELECTOR_INLINE_COMPACT_INPUT_ROWS =
57
+ 1 + HOOK_SELECTOR_INLINE_COMPACT_EDITOR_ROWS + HOOK_SELECTOR_INLINE_COMPACT_AUTOCOMPLETE_ROWS;
58
+ const HOOK_SELECTOR_INLINE_COMPACT_CHROME_ROWS = 2;
43
59
 
44
60
  const EXTENSION_ACTION_MUTATIONS: ReadonlySet<PropertyKey> = new Set([
45
61
  "sendMessage",
@@ -91,6 +107,7 @@ export class ExtensionUiController {
91
107
  #activeHookCustomOverlay?: OverlayHandle;
92
108
  #activeHookCustomCancel?: () => void;
93
109
 
110
+ #hookSelectorResizeHandler?: () => void;
94
111
  constructor(private ctx: InteractiveModeContext) {}
95
112
 
96
113
  #clearActiveHookCustom(): void {
@@ -364,6 +381,11 @@ export class ExtensionUiController {
364
381
  #restoreComposerEditor(): void {
365
382
  this.ctx.restoreComposer();
366
383
  }
384
+ #removeHookSelectorResizeHandler(): void {
385
+ if (!this.#hookSelectorResizeHandler) return;
386
+ process.stdout.removeListener("resize", this.#hookSelectorResizeHandler);
387
+ this.#hookSelectorResizeHandler = undefined;
388
+ }
367
389
 
368
390
  #isStopped(): boolean {
369
391
  return this.ctx.isStopped?.() === true;
@@ -1165,19 +1187,75 @@ export class ExtensionUiController {
1165
1187
  dialogOptions?.signal,
1166
1188
  );
1167
1189
  const requestedTitleRows = dialogOptions?.scrollTitleRows;
1168
- const baseMaxVisible = Math.max(4, Math.min(15, this.ctx.ui.terminal.rows - 12));
1169
- const scrollOptionRows = Math.max(1, Math.min(baseMaxVisible, options.length));
1170
- const maxVisible =
1171
- requestedTitleRows === undefined ? baseMaxVisible : Math.min(15, Math.max(3, scrollOptionRows + 1));
1172
1190
  const listChromeRows = dialogOptions?.outline === true ? HOOK_SELECTOR_OUTLINE_ROWS : 0;
1173
1191
  // Reserve rows for the inline custom-input editor so opening it doesn't
1174
1192
  // push the scrollable title past the viewport into terminal scrollback.
1175
- const inlineInputRows =
1176
- dialogOptions?.customInput || dialogOptions?.clarificationInput ? HOOK_SELECTOR_INLINE_INPUT_ROWS : 0;
1177
- const availableTitleRows =
1178
- this.ctx.ui.terminal.rows - scrollOptionRows - listChromeRows - inlineInputRows - HOOK_SELECTOR_CHROME_ROWS;
1179
- const scrollTitleRows =
1180
- requestedTitleRows === undefined ? undefined : Math.max(1, Math.min(requestedTitleRows, availableTitleRows));
1193
+ const hasInlineInput =
1194
+ dialogOptions?.customInput !== undefined || dialogOptions?.clarificationInput !== undefined;
1195
+ const inlineInputRows = hasInlineInput ? HOOK_SELECTOR_INLINE_INPUT_ROWS : 0;
1196
+ const helpText = dialogOptions?.helpText ?? "up/down navigate enter select esc cancel";
1197
+ const inlineInputHelpText =
1198
+ requestedTitleRows === undefined
1199
+ ? "enter submit esc back to options ctrl+g external editor"
1200
+ : "enter submit esc back to options ctrl+g external editor PgUp/PgDn: question · Wheel: transcript";
1201
+ const computeBudget = (): {
1202
+ maxVisible: number;
1203
+ scrollTitleRows: number | undefined;
1204
+ inlineEditorMaxHeight: number | undefined;
1205
+ inlineAutocompleteMaxVisible: number | undefined;
1206
+ compactInlineInput: boolean;
1207
+ } => {
1208
+ const baseMaxVisible = Math.max(4, Math.min(15, this.ctx.ui.terminal.rows - 12));
1209
+ const scrollOptionRows = Math.max(1, Math.min(baseMaxVisible, options.length));
1210
+ const helpWidth = Math.max(1, this.ctx.ui.terminal.columns - 2);
1211
+ const helpTextRows = Math.max(
1212
+ wrapTextWithAnsi(replaceTabs(helpText), helpWidth).length,
1213
+ hasInlineInput ? wrapTextWithAnsi(replaceTabs(inlineInputHelpText), helpWidth).length : 0,
1214
+ 1,
1215
+ );
1216
+ const baseChromeRows = HOOK_SELECTOR_CHROME_ROWS - 1 + helpTextRows;
1217
+ const compactInlineInput =
1218
+ requestedTitleRows !== undefined &&
1219
+ hasInlineInput &&
1220
+ this.ctx.ui.terminal.rows < baseChromeRows + listChromeRows + inlineInputRows + 2;
1221
+ const chromeRows = baseChromeRows - (compactInlineInput ? HOOK_SELECTOR_INLINE_COMPACT_CHROME_ROWS : 0);
1222
+ const effectiveInlineInputRows = compactInlineInput
1223
+ ? HOOK_SELECTOR_INLINE_COMPACT_INPUT_ROWS
1224
+ : inlineInputRows;
1225
+ const maxVisible =
1226
+ requestedTitleRows === undefined
1227
+ ? baseMaxVisible
1228
+ : Math.max(
1229
+ 1,
1230
+ Math.min(
1231
+ 15,
1232
+ scrollOptionRows,
1233
+ this.ctx.ui.terminal.rows - listChromeRows - effectiveInlineInputRows - chromeRows - 1,
1234
+ ),
1235
+ );
1236
+ const availableTitleRows =
1237
+ this.ctx.ui.terminal.rows - maxVisible - listChromeRows - effectiveInlineInputRows - chromeRows;
1238
+ const scrollTitleRows =
1239
+ requestedTitleRows === undefined
1240
+ ? undefined
1241
+ : Math.max(1, Math.min(requestedTitleRows, availableTitleRows));
1242
+ return {
1243
+ maxVisible,
1244
+ scrollTitleRows,
1245
+ inlineEditorMaxHeight:
1246
+ requestedTitleRows !== undefined && hasInlineInput
1247
+ ? compactInlineInput
1248
+ ? HOOK_SELECTOR_INLINE_COMPACT_EDITOR_ROWS
1249
+ : HOOK_SELECTOR_INLINE_EDITOR_ROWS
1250
+ : undefined,
1251
+ inlineAutocompleteMaxVisible: compactInlineInput
1252
+ ? HOOK_SELECTOR_INLINE_COMPACT_AUTOCOMPLETE_MAX_VISIBLE
1253
+ : undefined,
1254
+ compactInlineInput,
1255
+ };
1256
+ };
1257
+ const { maxVisible, scrollTitleRows, inlineEditorMaxHeight, inlineAutocompleteMaxVisible, compactInlineInput } =
1258
+ computeBudget();
1181
1259
 
1182
1260
  ringTerminalBell(classifyHookSelectorBellEvent(title));
1183
1261
 
@@ -1213,8 +1291,6 @@ export class ExtensionUiController {
1213
1291
  timeout: dialogOptions?.timeout,
1214
1292
  onTimeout: dialogOptions?.onTimeout,
1215
1293
  tui: this.ctx.ui,
1216
- // Share the main prompt editor's autocomplete provider so the
1217
- // inline "Other (type your own)" editor supports `@` file links.
1218
1294
  autocompleteProvider:
1219
1295
  dialogOptions?.customInput || dialogOptions?.clarificationInput
1220
1296
  ? this.ctx.editor.getAutocompleteProvider()
@@ -1223,6 +1299,9 @@ export class ExtensionUiController {
1223
1299
  wrapFocused: dialogOptions?.wrapFocused,
1224
1300
  scrollTitleRows,
1225
1301
  maxVisible,
1302
+ inlineEditorMaxHeight,
1303
+ inlineAutocompleteMaxVisible,
1304
+ compactInlineInput,
1226
1305
  customInput: dialogOptions?.customInput
1227
1306
  ? {
1228
1307
  optionLabel: dialogOptions.customInput.optionLabel,
@@ -1255,6 +1334,24 @@ export class ExtensionUiController {
1255
1334
  this.ctx.editorContainer.addChild(this.ctx.hookSelector);
1256
1335
  this.ctx.ui.setFocus(this.ctx.hookSelector);
1257
1336
  this.ctx.ui.requestRender();
1337
+ if (requestedTitleRows !== undefined) {
1338
+ this.#removeHookSelectorResizeHandler();
1339
+ const resizeHandler = () => {
1340
+ const selector = this.ctx.hookSelector;
1341
+ const nextBudget = computeBudget();
1342
+ if (!selector || nextBudget.scrollTitleRows === undefined) return;
1343
+ selector.setLayoutBudget(
1344
+ nextBudget.maxVisible,
1345
+ nextBudget.scrollTitleRows,
1346
+ nextBudget.inlineEditorMaxHeight,
1347
+ nextBudget.inlineAutocompleteMaxVisible,
1348
+ nextBudget.compactInlineInput,
1349
+ );
1350
+ this.ctx.ui.requestRender();
1351
+ };
1352
+ this.#hookSelectorResizeHandler = resizeHandler;
1353
+ process.stdout.on("resize", resizeHandler);
1354
+ }
1258
1355
  attachAbort();
1259
1356
  return promise;
1260
1357
  }
@@ -1263,6 +1360,7 @@ export class ExtensionUiController {
1263
1360
  * Hide the hook selector.
1264
1361
  */
1265
1362
  hideHookSelector(): void {
1363
+ this.#removeHookSelectorResizeHandler();
1266
1364
  this.ctx.hookSelector?.dispose();
1267
1365
  this.ctx.hookSelector = undefined;
1268
1366
  if (this.#isStopped()) return;
@@ -1509,6 +1607,7 @@ export class ExtensionUiController {
1509
1607
  }
1510
1608
 
1511
1609
  dispose(): void {
1610
+ this.#removeHookSelectorResizeHandler();
1512
1611
  this.#extensionErrorUnsubscribe?.();
1513
1612
  this.#extensionErrorUnsubscribe = undefined;
1514
1613
  this.#activeHookCustomCancel?.();