@f5-sales-demo/xcsh 21.45.3 → 21.46.1

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 (49) hide show
  1. package/package.json +8 -8
  2. package/src/config/settings-schema.ts +10 -0
  3. package/src/debug/log-viewer.ts +6 -6
  4. package/src/extensibility/extensions/bundled/herdr-reporter.ts +29 -0
  5. package/src/extensibility/extensions/types.ts +7 -0
  6. package/src/internal-urls/api-catalog-qmd-index.generated.ts +2 -2
  7. package/src/internal-urls/build-info.generated.ts +8 -8
  8. package/src/internal-urls/docs-index.generated.ts +1 -1
  9. package/src/modes/components/agent-dashboard.ts +13 -3
  10. package/src/modes/components/btw-panel.ts +5 -2
  11. package/src/modes/components/context-add-wizard.ts +5 -3
  12. package/src/modes/components/copy-selector.ts +6 -3
  13. package/src/modes/components/extensions/extension-dashboard.ts +8 -2
  14. package/src/modes/components/history-search.ts +2 -1
  15. package/src/modes/components/hook-editor.ts +8 -2
  16. package/src/modes/components/hook-input.ts +2 -1
  17. package/src/modes/components/hook-selector.ts +3 -2
  18. package/src/modes/components/login-dialog.ts +20 -10
  19. package/src/modes/components/mcp-add-wizard.ts +5 -3
  20. package/src/modes/components/model-selector.ts +3 -1
  21. package/src/modes/components/oauth-selector.ts +3 -2
  22. package/src/modes/components/plan-preview.ts +2 -2
  23. package/src/modes/components/plugin-settings.ts +2 -2
  24. package/src/modes/components/plugins/plugin-dashboard.ts +2 -1
  25. package/src/modes/components/question-transcript.ts +2 -2
  26. package/src/modes/components/recap-message.ts +23 -0
  27. package/src/modes/components/request-user-input.ts +6 -6
  28. package/src/modes/components/reviewed-action-dialog.ts +6 -3
  29. package/src/modes/components/searchable-select-list.ts +3 -2
  30. package/src/modes/components/selector-frame.ts +88 -21
  31. package/src/modes/components/session-observer-overlay.ts +2 -1
  32. package/src/modes/components/session-selector.ts +13 -5
  33. package/src/modes/components/settings-browser.ts +8 -2
  34. package/src/modes/components/settings-editors.ts +11 -4
  35. package/src/modes/components/settings-selector.ts +8 -2
  36. package/src/modes/components/transcript-notice.ts +15 -5
  37. package/src/modes/components/tree-selector.ts +11 -5
  38. package/src/modes/components/user-message-selector.ts +4 -2
  39. package/src/modes/components/welcome.ts +3 -3
  40. package/src/modes/controllers/event-controller.ts +5 -0
  41. package/src/modes/controllers/selector-controller.ts +1 -0
  42. package/src/modes/interactive-mode.ts +1 -0
  43. package/src/modes/utils/ui-helpers.ts +10 -0
  44. package/src/remote-control/protocol-methods.json +3 -0
  45. package/src/remote-control/router.ts +2 -0
  46. package/src/remote-control/session.ts +24 -0
  47. package/src/session/agent-session.ts +73 -2
  48. package/src/session/recap.ts +341 -0
  49. package/src/slash-commands/builtin-registry.ts +19 -1
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@f5-sales-demo/xcsh",
4
- "version": "21.45.3",
4
+ "version": "21.46.1",
5
5
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
6
6
  "homepage": "https://github.com/f5-sales-demo/xcsh",
7
7
  "author": "Can Boluk",
@@ -66,13 +66,13 @@
66
66
  },
67
67
  "dependencies": {
68
68
  "@agentclientprotocol/sdk": "1.4.0",
69
- "@f5-sales-demo/pi-agent-core": "21.45.3",
70
- "@f5-sales-demo/pi-ai": "21.45.3",
71
- "@f5-sales-demo/pi-natives": "21.45.3",
72
- "@f5-sales-demo/pi-resource-management": "21.45.3",
73
- "@f5-sales-demo/pi-tui": "21.45.3",
74
- "@f5-sales-demo/pi-utils": "21.45.3",
75
- "@f5-sales-demo/xcsh-stats": "21.45.3",
69
+ "@f5-sales-demo/pi-agent-core": "21.46.1",
70
+ "@f5-sales-demo/pi-ai": "21.46.1",
71
+ "@f5-sales-demo/pi-natives": "21.46.1",
72
+ "@f5-sales-demo/pi-resource-management": "21.46.1",
73
+ "@f5-sales-demo/pi-tui": "21.46.1",
74
+ "@f5-sales-demo/pi-utils": "21.46.1",
75
+ "@f5-sales-demo/xcsh-stats": "21.46.1",
76
76
  "@mozilla/readability": "^0.6",
77
77
  "@sinclair/typebox": "0.34.52",
78
78
  "@tobilu/qmd": "2.8.3",
@@ -1011,6 +1011,16 @@ export const SETTINGS_SCHEMA = {
1011
1011
  },
1012
1012
 
1013
1013
  // Compaction
1014
+ "recap.auto": {
1015
+ type: "boolean",
1016
+ default: true,
1017
+ ui: {
1018
+ tab: "context",
1019
+ label: "Automatic Recaps",
1020
+ description: "Create a brief recap after 30 minutes away from an idle conversation",
1021
+ },
1022
+ },
1023
+
1014
1024
  "compaction.enabled": {
1015
1025
  type: "boolean",
1016
1026
  default: true,
@@ -15,9 +15,11 @@ import { formatKeyHints } from "../config/keybindings";
15
15
  import {
16
16
  type SelectorFrameLine,
17
17
  selectorCancelHint,
18
+ selectorCompactRow,
18
19
  selectorFrame,
19
20
  selectorFrameContentWidth,
20
21
  selectorKeys,
22
+ selectorProse,
21
23
  } from "../modes/components/selector-frame";
22
24
  import { theme } from "../modes/theme/theme";
23
25
  import {
@@ -660,11 +662,9 @@ export class DebugLogViewerComponent implements Component, MouseRoutable {
660
662
  maxBodyRows: bodyHeight,
661
663
  },
662
664
  );
663
- const firstContent = visibleBodyLines.find(line =>
664
- typeof line === "string" ? line.trim().length > 0 : Bun.stripANSI(line.content).trim().length > 0,
665
- );
665
+ const firstContent = visibleBodyLines.find(line => Bun.stripANSI(line.content).trim().length > 0);
666
666
  if (firstContent) {
667
- const needle = Bun.stripANSI(typeof firstContent === "string" ? firstContent : firstContent.content).trim();
667
+ const needle = Bun.stripANSI(firstContent.content).trim();
668
668
  const index = frame.findIndex(line => Bun.stripANSI(line).includes(needle));
669
669
  this.#bodyRowStart = index >= 0 ? index : 0;
670
670
  }
@@ -850,7 +850,7 @@ export class DebugLogViewerComponent implements Component, MouseRoutable {
850
850
  const lines: SelectorFrameLine[] = [];
851
851
  if (rows.length === 0) {
852
852
  this.#bodyLineToRowIndex.push(undefined);
853
- lines.push(theme.fg("muted", "No matching log entries."));
853
+ lines.push(selectorProse("No matching log entries.", "muted"));
854
854
  }
855
855
  for (let i = this.#scrollRowOffset; i < rows.length; i++) {
856
856
  const row = rows[i];
@@ -863,7 +863,7 @@ export class DebugLogViewerComponent implements Component, MouseRoutable {
863
863
  break;
864
864
  }
865
865
  this.#bodyLineToRowIndex.push(row.rowIndex);
866
- lines.push({ content: line, selected: this.#model.cursorRowIndex === row.rowIndex });
866
+ lines.push(selectorCompactRow(line, this.#model.cursorRowIndex === row.rowIndex));
867
867
  }
868
868
 
869
869
  if (lines.length >= bodyHeight) {
@@ -69,6 +69,7 @@ const SESSION_METHOD = "pane.report_agent_session";
69
69
  const HEARTBEAT_METHOD = "pane.report_agent_heartbeat";
70
70
  const RELEASE_METHOD = "pane.release_agent";
71
71
  const TURN_REPORT_METHOD = "agent.turn.report";
72
+ const RECAP_REPORT_METHOD = "agent.recap.report";
72
73
  const TURN_ACTION_GET_METHOD = "agent.turn.action.get";
73
74
  const TURN_ACTION_ACK_METHOD = "agent.turn.action.ack";
74
75
  const SOCKET_TIMEOUT_MS = 2000;
@@ -919,6 +920,34 @@ export default function herdrReporter(pi: ExtensionAPI): void {
919
920
  }
920
921
  });
921
922
 
923
+ pi.on("recap_created", async (event, ctx) => {
924
+ const socketPath = process.env.HERDR_SOCKET_PATH;
925
+ if (!socketPath) return;
926
+ await reportSession(ctx);
927
+ const sessionFile = ctx.sessionManager?.getSessionFile?.();
928
+ const sessionRef =
929
+ typeof sessionFile === "string" && path.isAbsolute(sessionFile)
930
+ ? sessionFile
931
+ : ctx.sessionManager?.getSessionId?.();
932
+ if (!sessionRef || event.recap.sessionId !== ctx.sessionManager?.getSessionId?.()) return;
933
+ await enqueue(async () => {
934
+ const client = getHerdrClient(socketPath);
935
+ await client.ensureSemanticProtocol();
936
+ if (client.capabilityVersion("agent_recaps") !== 1) return;
937
+ await requestHerdrIdempotent(client, RECAP_REPORT_METHOD, {
938
+ pane_id: paneId,
939
+ source: HERDR_SOURCE,
940
+ session_id: sessionRef,
941
+ id: event.recap.id,
942
+ trigger: event.recap.trigger,
943
+ summary: event.recap.summary,
944
+ ...(event.recap.nextAction ? { next_action: event.recap.nextAction } : {}),
945
+ completed_turn_count: event.recap.completedTurnCount,
946
+ created_at: event.recap.createdAt,
947
+ });
948
+ });
949
+ });
950
+
922
951
  pi.on("before_agent_start", async (_event, ctx) => {
923
952
  latestContext = ctx;
924
953
  if (!activeSemanticTurn) await beginSemanticTurn(ctx);
@@ -571,6 +571,11 @@ export interface TurnPhaseEvent {
571
571
  turnId: number;
572
572
  }
573
573
 
574
+ export interface RecapCreatedEvent {
575
+ type: "recap_created";
576
+ recap: import("../../session/recap").RecapRecord;
577
+ }
578
+
574
579
  /** Fired when a tool starts executing */
575
580
  export interface ToolExecutionStartEvent {
576
581
  type: "tool_execution_start";
@@ -850,6 +855,7 @@ export type ExtensionEvent =
850
855
  | UserPromptStartEvent
851
856
  | UserPromptEndEvent
852
857
  | TurnPhaseEvent
858
+ | RecapCreatedEvent
853
859
  | ToolExecutionStartEvent
854
860
  | ToolExecutionUpdateEvent
855
861
  | ToolExecutionEndEvent
@@ -1099,6 +1105,7 @@ export interface ExtensionAPI {
1099
1105
  on(event: "user_prompt_start", handler: ExtensionHandler<UserPromptStartEvent>): void;
1100
1106
  on(event: "user_prompt_end", handler: ExtensionHandler<UserPromptEndEvent>): void;
1101
1107
  on(event: "turn_phase", handler: ExtensionHandler<TurnPhaseEvent>): void;
1108
+ on(event: "recap_created", handler: ExtensionHandler<RecapCreatedEvent>): void;
1102
1109
  on(event: "tool_execution_start", handler: ExtensionHandler<ToolExecutionStartEvent>): void;
1103
1110
  on(event: "tool_execution_update", handler: ExtensionHandler<ToolExecutionUpdateEvent>): void;
1104
1111
  on(event: "tool_execution_end", handler: ExtensionHandler<ToolExecutionEndEvent>): void;