@gajae-code/coding-agent 0.12.7 → 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.
- package/CHANGELOG.md +19 -0
- package/dist/types/commands/notify.d.ts +4 -0
- package/dist/types/config/file-lock.d.ts +3 -0
- package/dist/types/config/model-discovery-manager.d.ts +6 -1
- package/dist/types/config/model-registry.d.ts +2 -0
- package/dist/types/config/resolve-config-value.d.ts +2 -1
- package/dist/types/config/settings-schema.d.ts +17 -1
- package/dist/types/main.d.ts +1 -0
- package/dist/types/modes/components/hook-selector.d.ts +20 -0
- package/dist/types/modes/components/notifications-settings-editor.d.ts +53 -4
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
- package/dist/types/modes/controllers/selector-controller.d.ts +4 -2
- package/dist/types/sdk/broker/broker.d.ts +5 -1
- package/dist/types/sdk/broker/lifecycle-ledger.d.ts +1 -0
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +11 -1
- package/dist/types/sdk/bus/config.d.ts +75 -113
- package/dist/types/sdk/bus/discord-live-provider.d.ts +8 -2
- package/dist/types/sdk/bus/discord-provider.d.ts +19 -0
- package/dist/types/sdk/bus/index.d.ts +1 -1
- package/dist/types/sdk/bus/notification-orchestration.d.ts +127 -18
- package/dist/types/sdk/bus/notification-service.d.ts +31 -4
- package/dist/types/sdk/bus/session-control.d.ts +8 -3
- package/dist/types/sdk/bus/slack-live-provider.d.ts +9 -2
- package/dist/types/sdk/bus/slack-provider.d.ts +22 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +8 -1
- package/dist/types/sdk/client/discovery.d.ts +2 -1
- package/dist/types/sdk/host/query/handlers.d.ts +2 -0
- package/dist/types/sdk/index.d.ts +1 -0
- package/dist/types/sdk/providers.d.ts +22 -0
- package/dist/types/sdk/session-directory.d.ts +1 -1
- package/dist/types/session/internal/managed-session-scope.d.ts +17 -1
- package/dist/types/session/internal/managed-session-storage.d.ts +11 -1
- package/dist/types/session/internal/native-publish-outcome.d.ts +1 -0
- package/dist/types/session/internal/session-open-errors.d.ts +5 -0
- package/dist/types/session/session-manager.d.ts +3 -1
- package/dist/types/session/session-storage.d.ts +2 -0
- package/package.json +10 -8
- package/scripts/build-sdk-package-smoke.ts +51 -0
- package/scripts/capture-notifications-settings-showcase.ts +1 -1
- package/src/cli/notify-cli.ts +204 -94
- package/src/commands/notify.ts +19 -8
- package/src/config/file-lock.ts +6 -0
- package/src/config/model-discovery-manager.ts +50 -8
- package/src/config/model-registry.ts +862 -75
- package/src/config/resolve-config-value.ts +10 -8
- package/src/config/settings-schema.ts +25 -15
- package/src/config/settings.ts +15 -15
- package/src/gjc-runtime/session-state-sidecar.ts +12 -2
- package/src/internal-urls/docs-index.generated.ts +6 -6
- package/src/main.ts +43 -7
- package/src/modes/DESIGN.md +11 -11
- package/src/modes/components/hook-selector.ts +155 -44
- package/src/modes/components/model-selector.ts +242 -49
- package/src/modes/components/notifications-settings-editor.ts +631 -85
- package/src/modes/controllers/extension-ui-controller.ts +114 -15
- package/src/modes/controllers/selector-controller.ts +464 -50
- package/src/sdk/broker/broker.ts +54 -10
- package/src/sdk/broker/lifecycle-ledger.ts +34 -1
- package/src/sdk/broker/lifecycle.ts +47 -50
- package/src/sdk/bus/chat-daemon-cli.ts +12 -5
- package/src/sdk/bus/chat-daemon-control.ts +35 -6
- package/src/sdk/bus/chat-daemon-runtime.ts +16 -2
- package/src/sdk/bus/config.ts +534 -286
- package/src/sdk/bus/discord-live-provider.ts +57 -2
- package/src/sdk/bus/discord-provider.ts +21 -0
- package/src/sdk/bus/index.ts +97 -35
- package/src/sdk/bus/notification-orchestration.ts +371 -68
- package/src/sdk/bus/notification-service.ts +431 -130
- package/src/sdk/bus/session-control.ts +119 -44
- package/src/sdk/bus/slack-live-provider.ts +78 -2
- package/src/sdk/bus/slack-provider.ts +24 -0
- package/src/sdk/bus/telegram-daemon-cli.ts +9 -2
- package/src/sdk/bus/telegram-daemon-contract.ts +8 -1
- package/src/sdk/bus/telegram-daemon-control.ts +3 -3
- package/src/sdk/bus/telegram-daemon.ts +23 -15
- package/src/sdk/client/discovery.ts +10 -4
- package/src/sdk/host/query/handlers.ts +20 -1
- package/src/sdk/index.ts +1 -0
- package/src/sdk/protocol/operation-inventory.generated.json +18 -0
- package/src/sdk/protocol/operation-registry.ts +5 -2
- package/src/sdk/providers.ts +51 -0
- package/src/sdk/session-directory.ts +1 -0
- package/src/sdk/session.ts +10 -7
- package/src/session/agent-session.ts +44 -24
- package/src/session/internal/managed-session-scope.ts +981 -450
- package/src/session/internal/managed-session-storage.ts +382 -45
- package/src/session/internal/native-publish-outcome.ts +3 -1
- package/src/session/internal/session-open-errors.ts +11 -0
- package/src/session/session-manager.ts +27 -3
- package/src/session/session-storage.ts +72 -5
- package/src/slash-commands/builtin-registry.ts +82 -4
- package/src/task/index.ts +9 -3
- package/src/tools/ask.ts +1 -1
- package/src/tools/bash.ts +1 -1
- package/src/tools/telegram-send.ts +4 -2
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import { ThinkingLevel } from "@gajae-code/agent-core";
|
|
2
|
-
import
|
|
3
|
-
|
|
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
|
|
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
|
|
1176
|
-
dialogOptions?.customInput || dialogOptions?.clarificationInput
|
|
1177
|
-
const
|
|
1178
|
-
|
|
1179
|
-
const
|
|
1180
|
-
requestedTitleRows === undefined
|
|
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?.();
|