@dexto/tui 1.6.16 → 1.6.17

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 (109) hide show
  1. package/dist/InkCLIRefactored.d.ts +3 -3
  2. package/dist/InkCLIRefactored.d.ts.map +1 -1
  3. package/dist/agent-backend.cjs +118 -0
  4. package/dist/agent-backend.d.ts +82 -0
  5. package/dist/agent-backend.d.ts.map +1 -0
  6. package/dist/agent-backend.js +86 -0
  7. package/dist/agent-backend.test.cjs +28 -0
  8. package/dist/agent-backend.test.d.ts +2 -0
  9. package/dist/agent-backend.test.d.ts.map +1 -0
  10. package/dist/agent-backend.test.js +29 -0
  11. package/dist/components/Footer.cjs +5 -0
  12. package/dist/components/Footer.d.ts +3 -2
  13. package/dist/components/Footer.d.ts.map +1 -1
  14. package/dist/components/Footer.js +5 -0
  15. package/dist/components/ResourceAutocomplete.cjs +8 -0
  16. package/dist/components/ResourceAutocomplete.d.ts +2 -2
  17. package/dist/components/ResourceAutocomplete.d.ts.map +1 -1
  18. package/dist/components/ResourceAutocomplete.js +8 -0
  19. package/dist/components/SlashCommandAutocomplete.cjs +4 -4
  20. package/dist/components/SlashCommandAutocomplete.d.ts +2 -2
  21. package/dist/components/SlashCommandAutocomplete.d.ts.map +1 -1
  22. package/dist/components/SlashCommandAutocomplete.js +5 -5
  23. package/dist/components/StatusBar.d.ts +2 -2
  24. package/dist/components/StatusBar.d.ts.map +1 -1
  25. package/dist/components/modes/AlternateBufferCLI.d.ts +2 -2
  26. package/dist/components/modes/AlternateBufferCLI.d.ts.map +1 -1
  27. package/dist/components/modes/StaticCLI.d.ts +2 -2
  28. package/dist/components/modes/StaticCLI.d.ts.map +1 -1
  29. package/dist/components/overlays/ContextStatsOverlay.d.ts +2 -2
  30. package/dist/components/overlays/ContextStatsOverlay.d.ts.map +1 -1
  31. package/dist/components/overlays/ExportWizard.d.ts +2 -2
  32. package/dist/components/overlays/ExportWizard.d.ts.map +1 -1
  33. package/dist/components/overlays/LogLevelSelector.d.ts +2 -2
  34. package/dist/components/overlays/LogLevelSelector.d.ts.map +1 -1
  35. package/dist/components/overlays/McpRemoveSelector.d.ts +2 -2
  36. package/dist/components/overlays/McpRemoveSelector.d.ts.map +1 -1
  37. package/dist/components/overlays/McpServerList.d.ts +3 -2
  38. package/dist/components/overlays/McpServerList.d.ts.map +1 -1
  39. package/dist/components/overlays/ModelSelectorRefactored.d.ts +3 -2
  40. package/dist/components/overlays/ModelSelectorRefactored.d.ts.map +1 -1
  41. package/dist/components/overlays/PromptDeleteSelector.d.ts +3 -2
  42. package/dist/components/overlays/PromptDeleteSelector.d.ts.map +1 -1
  43. package/dist/components/overlays/PromptList.d.ts +3 -2
  44. package/dist/components/overlays/PromptList.d.ts.map +1 -1
  45. package/dist/components/overlays/ReasoningOverlay.d.ts +2 -2
  46. package/dist/components/overlays/ReasoningOverlay.d.ts.map +1 -1
  47. package/dist/components/overlays/SearchOverlay.d.ts +2 -2
  48. package/dist/components/overlays/SearchOverlay.d.ts.map +1 -1
  49. package/dist/components/overlays/SessionSelectorRefactored.d.ts +2 -2
  50. package/dist/components/overlays/SessionSelectorRefactored.d.ts.map +1 -1
  51. package/dist/components/overlays/ToolBrowser.d.ts +2 -2
  52. package/dist/components/overlays/ToolBrowser.d.ts.map +1 -1
  53. package/dist/containers/InputContainer.cjs +8 -4
  54. package/dist/containers/InputContainer.d.ts +3 -2
  55. package/dist/containers/InputContainer.d.ts.map +1 -1
  56. package/dist/containers/InputContainer.js +12 -4
  57. package/dist/containers/OverlayContainer.cjs +1 -1
  58. package/dist/containers/OverlayContainer.d.ts +2 -2
  59. package/dist/containers/OverlayContainer.d.ts.map +1 -1
  60. package/dist/containers/OverlayContainer.js +1 -1
  61. package/dist/hooks/useAgentEvents.d.ts +3 -2
  62. package/dist/hooks/useAgentEvents.d.ts.map +1 -1
  63. package/dist/hooks/useCLIState.d.ts +4 -3
  64. package/dist/hooks/useCLIState.d.ts.map +1 -1
  65. package/dist/hooks/useCLIState.js +1 -4
  66. package/dist/hooks/useInputOrchestrator.d.ts +3 -2
  67. package/dist/hooks/useInputOrchestrator.d.ts.map +1 -1
  68. package/dist/hooks/useKeyboardShortcuts.d.ts +2 -2
  69. package/dist/hooks/useKeyboardShortcuts.d.ts.map +1 -1
  70. package/dist/hooks/useTokenCounter.d.ts +2 -2
  71. package/dist/hooks/useTokenCounter.d.ts.map +1 -1
  72. package/dist/host/index.d.ts +7 -3
  73. package/dist/host/index.d.ts.map +1 -1
  74. package/dist/index.cjs +7 -0
  75. package/dist/index.d.cts +243 -5
  76. package/dist/index.d.ts +1 -0
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +8 -0
  79. package/dist/interactive-commands/command-parser.d.ts +2 -2
  80. package/dist/interactive-commands/command-parser.d.ts.map +1 -1
  81. package/dist/interactive-commands/commands.cjs +27 -16
  82. package/dist/interactive-commands/commands.d.ts +3 -2
  83. package/dist/interactive-commands/commands.d.ts.map +1 -1
  84. package/dist/interactive-commands/commands.js +29 -15
  85. package/dist/interactive-commands/commands.test.cjs +28 -0
  86. package/dist/interactive-commands/commands.test.d.ts +2 -0
  87. package/dist/interactive-commands/commands.test.d.ts.map +1 -0
  88. package/dist/interactive-commands/commands.test.js +27 -0
  89. package/dist/interactive-commands/documentation-commands.d.ts.map +1 -1
  90. package/dist/interactive-commands/general-commands.cjs +3 -3
  91. package/dist/interactive-commands/general-commands.d.ts +2 -1
  92. package/dist/interactive-commands/general-commands.d.ts.map +1 -1
  93. package/dist/interactive-commands/general-commands.js +3 -3
  94. package/dist/interactive-commands/prompt-commands.d.ts +2 -2
  95. package/dist/interactive-commands/prompt-commands.d.ts.map +1 -1
  96. package/dist/interactive-commands/session/session-commands.d.ts.map +1 -1
  97. package/dist/interactive-commands/system/system-commands.d.ts.map +1 -1
  98. package/dist/interactive-commands/tool-commands.d.ts.map +1 -1
  99. package/dist/services/CommandService.d.ts +2 -2
  100. package/dist/services/CommandService.d.ts.map +1 -1
  101. package/dist/utils/commandOverlays.cjs +5 -1
  102. package/dist/utils/commandOverlays.d.ts +2 -1
  103. package/dist/utils/commandOverlays.d.ts.map +1 -1
  104. package/dist/utils/commandOverlays.js +5 -1
  105. package/dist/utils/messageFormatting.cjs +12 -0
  106. package/dist/utils/messageFormatting.d.ts +3 -2
  107. package/dist/utils/messageFormatting.d.ts.map +1 -1
  108. package/dist/utils/messageFormatting.js +12 -0
  109. package/package.json +4 -4
@@ -7,11 +7,11 @@
7
7
  *
8
8
  * The mode is selected via USE_ALTERNATE_BUFFER constant.
9
9
  */
10
- import type { DextoAgent } from '@dexto/core';
10
+ import type { TuiAgentBackend } from './agent-backend.js';
11
11
  import type { StartupInfo } from './state/types.js';
12
12
  import type { SoundNotificationService } from './utils/soundNotification.js';
13
13
  interface InkCLIProps {
14
- agent: DextoAgent;
14
+ agent: TuiAgentBackend;
15
15
  initialSessionId: string | null;
16
16
  initialPrompt?: string | undefined;
17
17
  startupInfo: StartupInfo;
@@ -50,6 +50,6 @@ export interface InkCLIOptions {
50
50
  /**
51
51
  * Start the modern Ink-based CLI
52
52
  */
53
- export declare function startInkCliRefactored(agent: DextoAgent, initialSessionId: string | null, options?: InkCLIOptions): Promise<void>;
53
+ export declare function startInkCliRefactored(agent: TuiAgentBackend, initialSessionId: string | null, options?: InkCLIOptions): Promise<void>;
54
54
  export {};
55
55
  //# sourceMappingURL=InkCLIRefactored.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"InkCLIRefactored.d.ts","sourceRoot":"","sources":["../src/InkCLIRefactored.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAWpD,OAAO,KAAK,EAAe,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAuB1F,UAAU,WAAW;IACjB,KAAK,EAAE,UAAU,CAAC;IAClB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC9C,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACtC;AA2DD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,EAC7B,KAAK,EACL,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,YAAY,EACZ,cAAc,EACd,wBAAgC,GACnC,EAAE,WAAW,2CAmBb;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,kDAAkD;IAClD,UAAU,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IACpF,wEAAwE;IACxE,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,mDAAmD;IACnD,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3C,iEAAiE;IACjE,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC3C;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACvC,KAAK,EAAE,UAAU,EACjB,gBAAgB,EAAE,MAAM,GAAG,IAAI,EAC/B,OAAO,GAAE,aAAkB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAqRf"}
1
+ {"version":3,"file":"InkCLIRefactored.d.ts","sourceRoot":"","sources":["../src/InkCLIRefactored.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAWpD,OAAO,KAAK,EAAe,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAuB1F,UAAU,WAAW;IACjB,KAAK,EAAE,eAAe,CAAC;IACvB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC9C,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACtC;AA2DD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,EAC7B,KAAK,EACL,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,YAAY,EACZ,cAAc,EACd,wBAAgC,GACnC,EAAE,WAAW,2CAmBb;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,kDAAkD;IAClD,UAAU,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IACpF,wEAAwE;IACxE,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,mDAAmD;IACnD,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3C,iEAAiE;IACjE,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC3C;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACvC,KAAK,EAAE,eAAe,EACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,EAC/B,OAAO,GAAE,aAAkB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAqRf"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var agent_backend_exports = {};
20
+ __export(agent_backend_exports, {
21
+ getTuiCapabilities: () => getTuiCapabilities,
22
+ isCommandDefinitionSupported: () => isCommandDefinitionSupported,
23
+ isCommandSupported: () => isCommandSupported,
24
+ supportsAttachments: () => supportsAttachments,
25
+ supportsContextStats: () => supportsContextStats,
26
+ supportsPrompts: () => supportsPrompts,
27
+ supportsReasoningCycle: () => supportsReasoningCycle,
28
+ supportsResources: () => supportsResources,
29
+ supportsStartupInfo: () => supportsStartupInfo
30
+ });
31
+ module.exports = __toCommonJS(agent_backend_exports);
32
+ const DEFAULT_CAPABILITIES = {
33
+ prompts: true,
34
+ resources: true,
35
+ attachments: true,
36
+ reasoningCycle: true,
37
+ contextStats: true,
38
+ startupInfo: true
39
+ };
40
+ const COMMAND_CAPABILITY_GATES = [
41
+ {
42
+ capability: "prompts",
43
+ commands: ["prompts", "sysprompt"]
44
+ },
45
+ {
46
+ capability: "reasoningCycle",
47
+ commands: ["reasoning"]
48
+ },
49
+ {
50
+ capability: "contextStats",
51
+ commands: ["context", "ctx", "tokens"]
52
+ }
53
+ ];
54
+ function normalizeCommandName(command) {
55
+ return command.trim().toLowerCase();
56
+ }
57
+ function getTuiCapabilities(agent) {
58
+ return {
59
+ ...DEFAULT_CAPABILITIES,
60
+ ...agent.capabilities,
61
+ ...agent.capabilities?.supportedCommands ? {
62
+ supportedCommands: agent.capabilities.supportedCommands.map(normalizeCommandName)
63
+ } : {}
64
+ };
65
+ }
66
+ function isCommandSupported(agent, command, definition) {
67
+ const capabilities = getTuiCapabilities(agent);
68
+ const supportedCommands = capabilities.supportedCommands;
69
+ const candidates = /* @__PURE__ */ new Set([normalizeCommandName(command)]);
70
+ if (definition?.name) {
71
+ candidates.add(normalizeCommandName(definition.name));
72
+ }
73
+ for (const alias of definition?.aliases ?? []) {
74
+ candidates.add(normalizeCommandName(alias));
75
+ }
76
+ for (const gate of COMMAND_CAPABILITY_GATES) {
77
+ if (capabilities[gate.capability] === false && gate.commands.some((candidate) => candidates.has(candidate))) {
78
+ return false;
79
+ }
80
+ }
81
+ if (!supportedCommands) {
82
+ return true;
83
+ }
84
+ return Array.from(candidates).some((candidate) => supportedCommands.includes(candidate));
85
+ }
86
+ function isCommandDefinitionSupported(agent, definition) {
87
+ return isCommandSupported(agent, definition.name, definition);
88
+ }
89
+ function supportsPrompts(agent) {
90
+ return getTuiCapabilities(agent).prompts ?? true;
91
+ }
92
+ function supportsResources(agent) {
93
+ return getTuiCapabilities(agent).resources ?? true;
94
+ }
95
+ function supportsAttachments(agent) {
96
+ return getTuiCapabilities(agent).attachments ?? true;
97
+ }
98
+ function supportsReasoningCycle(agent) {
99
+ return getTuiCapabilities(agent).reasoningCycle ?? true;
100
+ }
101
+ function supportsContextStats(agent) {
102
+ return getTuiCapabilities(agent).contextStats ?? true;
103
+ }
104
+ function supportsStartupInfo(agent) {
105
+ return getTuiCapabilities(agent).startupInfo ?? true;
106
+ }
107
+ // Annotate the CommonJS export names for ESM import in node:
108
+ 0 && (module.exports = {
109
+ getTuiCapabilities,
110
+ isCommandDefinitionSupported,
111
+ isCommandSupported,
112
+ supportsAttachments,
113
+ supportsContextStats,
114
+ supportsPrompts,
115
+ supportsReasoningCycle,
116
+ supportsResources,
117
+ supportsStartupInfo
118
+ });
@@ -0,0 +1,82 @@
1
+ import type { AgentEventMap, DextoAgent, SessionMetadata } from '@dexto/core';
2
+ import type { CommandDefinition } from './interactive-commands/command-parser.js';
3
+ export interface TuiAgentCapabilities {
4
+ supportedCommands?: readonly string[];
5
+ prompts?: boolean;
6
+ resources?: boolean;
7
+ attachments?: boolean;
8
+ reasoningCycle?: boolean;
9
+ contextStats?: boolean;
10
+ startupInfo?: boolean;
11
+ }
12
+ type RootLogger = Pick<DextoAgent['logger'], 'debug' | 'info' | 'warn' | 'error' | 'getLevel' | 'getLogFilePath'>;
13
+ interface TuiSessionStats {
14
+ totalSessions: number;
15
+ inMemorySessions: number;
16
+ maxSessions: number;
17
+ }
18
+ export interface TuiEffectiveConfig {
19
+ llm: {
20
+ provider: string;
21
+ model: string;
22
+ maxOutputTokens?: number | null | undefined;
23
+ temperature?: number | null | undefined;
24
+ };
25
+ permissions: {
26
+ mode: string;
27
+ };
28
+ sessions?: {
29
+ maxSessions?: number | undefined;
30
+ sessionTTL?: number | undefined;
31
+ } | undefined;
32
+ mcpServers?: Record<string, unknown> | undefined;
33
+ prompts?: unknown[] | undefined;
34
+ [key: string]: unknown;
35
+ }
36
+ export interface TuiAgentBackend extends Pick<DextoAgent, 'stream' | 'stop' | 'run' | 'listSessions' | 'getSessionMetadata' | 'getSessionHistory' | 'getSessionTitle' | 'setSessionTitle' | 'generateSessionTitle' | 'forkSession' | 'getCurrentLLMConfig' | 'switchLLM' | 'getSupportedProviders' | 'getSupportedModels' | 'getContextStats' | 'clearContext' | 'compactContext' | 'queueMessage' | 'getQueuedMessages' | 'removeQueuedMessage' | 'clearMessageQueue' | 'cancel' | 'searchMessages' | 'listPrompts' | 'refreshPrompts' | 'resolvePrompt' | 'getSystemPrompt' | 'loadToolkits' | 'listResources' | 'setLogLevel' | 'getAllTools' | 'getEnabledTools' | 'getAllMcpTools' | 'setGlobalDisabledTools' | 'setSessionDisabledTools' | 'setSessionAutoApproveTools' | 'getSessionAutoApproveTools' | 'getMcpServersWithStatus' | 'addMcpServer' | 'enableMcpServer' | 'disableMcpServer' | 'removeMcpServer' | 'restartMcpServer' | 'getMcpClients' | 'getMcpFailedConnections'> {
37
+ createSession: (sessionId?: string) => Promise<{
38
+ id: string;
39
+ logger: Pick<RootLogger, 'getLevel' | 'getLogFilePath'>;
40
+ }>;
41
+ getSession: (sessionId: string) => Promise<{
42
+ id: string;
43
+ logger: Pick<RootLogger, 'getLevel' | 'getLogFilePath'>;
44
+ } | undefined>;
45
+ getEffectiveConfig: (sessionId?: string) => TuiEffectiveConfig;
46
+ on: <K extends keyof AgentEventMap>(event: K, listener: AgentEventMap[K] extends void ? () => void : (payload: AgentEventMap[K]) => void, options?: {
47
+ signal?: AbortSignal;
48
+ }) => void;
49
+ emit: <K extends keyof AgentEventMap>(event: K, ...args: AgentEventMap[K] extends void ? [] : [AgentEventMap[K]]) => boolean;
50
+ logger: RootLogger;
51
+ config: {
52
+ agentId: string;
53
+ };
54
+ sessionManager: {
55
+ getSessionMetadata: (sessionId: string) => Promise<SessionMetadata | undefined>;
56
+ getSessionStats: () => Promise<TuiSessionStats>;
57
+ };
58
+ mcpManager: {
59
+ getClients: () => Map<string, unknown>;
60
+ getFailedConnections: () => Record<string, unknown>;
61
+ };
62
+ toolManager: {
63
+ addSessionAutoApproveTools: (sessionId: string, toolNames: string[]) => void | Promise<void>;
64
+ };
65
+ services: {
66
+ hookManager: {
67
+ getHookNames: () => string[];
68
+ };
69
+ };
70
+ capabilities?: TuiAgentCapabilities;
71
+ }
72
+ export declare function getTuiCapabilities(agent: TuiAgentBackend): TuiAgentCapabilities;
73
+ export declare function isCommandSupported(agent: TuiAgentBackend, command: string, definition?: Pick<CommandDefinition, 'name' | 'aliases'>): boolean;
74
+ export declare function isCommandDefinitionSupported(agent: TuiAgentBackend, definition: Pick<CommandDefinition, 'name' | 'aliases'>): boolean;
75
+ export declare function supportsPrompts(agent: TuiAgentBackend): boolean;
76
+ export declare function supportsResources(agent: TuiAgentBackend): boolean;
77
+ export declare function supportsAttachments(agent: TuiAgentBackend): boolean;
78
+ export declare function supportsReasoningCycle(agent: TuiAgentBackend): boolean;
79
+ export declare function supportsContextStats(agent: TuiAgentBackend): boolean;
80
+ export declare function supportsStartupInfo(agent: TuiAgentBackend): boolean;
81
+ export {};
82
+ //# sourceMappingURL=agent-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-backend.d.ts","sourceRoot":"","sources":["../src/agent-backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ const DEFAULT_CAPABILITIES = {
2
+ prompts: true,
3
+ resources: true,
4
+ attachments: true,
5
+ reasoningCycle: true,
6
+ contextStats: true,
7
+ startupInfo: true
8
+ };
9
+ const COMMAND_CAPABILITY_GATES = [
10
+ {
11
+ capability: "prompts",
12
+ commands: ["prompts", "sysprompt"]
13
+ },
14
+ {
15
+ capability: "reasoningCycle",
16
+ commands: ["reasoning"]
17
+ },
18
+ {
19
+ capability: "contextStats",
20
+ commands: ["context", "ctx", "tokens"]
21
+ }
22
+ ];
23
+ function normalizeCommandName(command) {
24
+ return command.trim().toLowerCase();
25
+ }
26
+ function getTuiCapabilities(agent) {
27
+ return {
28
+ ...DEFAULT_CAPABILITIES,
29
+ ...agent.capabilities,
30
+ ...agent.capabilities?.supportedCommands ? {
31
+ supportedCommands: agent.capabilities.supportedCommands.map(normalizeCommandName)
32
+ } : {}
33
+ };
34
+ }
35
+ function isCommandSupported(agent, command, definition) {
36
+ const capabilities = getTuiCapabilities(agent);
37
+ const supportedCommands = capabilities.supportedCommands;
38
+ const candidates = /* @__PURE__ */ new Set([normalizeCommandName(command)]);
39
+ if (definition?.name) {
40
+ candidates.add(normalizeCommandName(definition.name));
41
+ }
42
+ for (const alias of definition?.aliases ?? []) {
43
+ candidates.add(normalizeCommandName(alias));
44
+ }
45
+ for (const gate of COMMAND_CAPABILITY_GATES) {
46
+ if (capabilities[gate.capability] === false && gate.commands.some((candidate) => candidates.has(candidate))) {
47
+ return false;
48
+ }
49
+ }
50
+ if (!supportedCommands) {
51
+ return true;
52
+ }
53
+ return Array.from(candidates).some((candidate) => supportedCommands.includes(candidate));
54
+ }
55
+ function isCommandDefinitionSupported(agent, definition) {
56
+ return isCommandSupported(agent, definition.name, definition);
57
+ }
58
+ function supportsPrompts(agent) {
59
+ return getTuiCapabilities(agent).prompts ?? true;
60
+ }
61
+ function supportsResources(agent) {
62
+ return getTuiCapabilities(agent).resources ?? true;
63
+ }
64
+ function supportsAttachments(agent) {
65
+ return getTuiCapabilities(agent).attachments ?? true;
66
+ }
67
+ function supportsReasoningCycle(agent) {
68
+ return getTuiCapabilities(agent).reasoningCycle ?? true;
69
+ }
70
+ function supportsContextStats(agent) {
71
+ return getTuiCapabilities(agent).contextStats ?? true;
72
+ }
73
+ function supportsStartupInfo(agent) {
74
+ return getTuiCapabilities(agent).startupInfo ?? true;
75
+ }
76
+ export {
77
+ getTuiCapabilities,
78
+ isCommandDefinitionSupported,
79
+ isCommandSupported,
80
+ supportsAttachments,
81
+ supportsContextStats,
82
+ supportsPrompts,
83
+ supportsReasoningCycle,
84
+ supportsResources,
85
+ supportsStartupInfo
86
+ };
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var import_vitest = require("vitest");
3
+ var import_agent_backend = require("./agent-backend.js");
4
+ function createAgent(capabilities) {
5
+ return { capabilities };
6
+ }
7
+ (0, import_vitest.describe)("isCommandSupported", () => {
8
+ (0, import_vitest.it)("blocks capability-gated commands when the capability is disabled", () => {
9
+ const agent = createAgent({ contextStats: false });
10
+ (0, import_vitest.expect)(
11
+ (0, import_agent_backend.isCommandSupported)(agent, "tokens", {
12
+ name: "context",
13
+ aliases: ["ctx", "tokens"]
14
+ })
15
+ ).toBe(false);
16
+ });
17
+ (0, import_vitest.it)("requires both capability support and allowlist support when both are configured", () => {
18
+ const agent = createAgent({
19
+ supportedCommands: ["context"],
20
+ contextStats: false
21
+ });
22
+ (0, import_vitest.expect)((0, import_agent_backend.isCommandSupported)(agent, "context", { name: "context", aliases: [] })).toBe(false);
23
+ });
24
+ (0, import_vitest.it)("still allows unrelated commands when only a different capability is disabled", () => {
25
+ const agent = createAgent({ prompts: false });
26
+ (0, import_vitest.expect)((0, import_agent_backend.isCommandSupported)(agent, "help", { name: "help", aliases: ["h"] })).toBe(true);
27
+ });
28
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-backend.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-backend.test.d.ts","sourceRoot":"","sources":["../src/agent-backend.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ isCommandSupported
4
+ } from "./agent-backend.js";
5
+ function createAgent(capabilities) {
6
+ return { capabilities };
7
+ }
8
+ describe("isCommandSupported", () => {
9
+ it("blocks capability-gated commands when the capability is disabled", () => {
10
+ const agent = createAgent({ contextStats: false });
11
+ expect(
12
+ isCommandSupported(agent, "tokens", {
13
+ name: "context",
14
+ aliases: ["ctx", "tokens"]
15
+ })
16
+ ).toBe(false);
17
+ });
18
+ it("requires both capability support and allowlist support when both are configured", () => {
19
+ const agent = createAgent({
20
+ supportedCommands: ["context"],
21
+ contextStats: false
22
+ });
23
+ expect(isCommandSupported(agent, "context", { name: "context", aliases: [] })).toBe(false);
24
+ });
25
+ it("still allows unrelated commands when only a different capability is disabled", () => {
26
+ const agent = createAgent({ prompts: false });
27
+ expect(isCommandSupported(agent, "help", { name: "help", aliases: ["h"] })).toBe(true);
28
+ });
29
+ });
@@ -38,6 +38,7 @@ var import_ink = require("ink");
38
38
  var import_core = require("@dexto/core");
39
39
  var import_llm_provider_display = require("../utils/llm-provider-display.js");
40
40
  var import_chatgpt_rate_limit = require("../utils/chatgpt-rate-limit.js");
41
+ var import_agent_backend = require("../agent-backend.js");
41
42
  function Footer({
42
43
  agent,
43
44
  sessionId,
@@ -65,6 +66,10 @@ function Footer({
65
66
  const chatGPTRateLimitHint = showChatGPTRateLimitHint && chatgptRateLimitStatus ? (0, import_chatgpt_rate_limit.getChatGPTRateLimitHint)(chatgptRateLimitStatus) : null;
66
67
  const chatGPTRateLimitColor = chatgptRateLimitStatus?.exceeded ? "redBright" : (chatgptRateLimitStatus?.usedPercent ?? 0) >= 90 ? "yellowBright" : "yellow";
67
68
  (0, import_react.useEffect)(() => {
69
+ if (!(0, import_agent_backend.supportsContextStats)(agent)) {
70
+ setContextLeft(null);
71
+ return;
72
+ }
68
73
  if (!sessionId) {
69
74
  setContextLeft(null);
70
75
  return;
@@ -2,9 +2,10 @@
2
2
  * Footer Component
3
3
  * Status line at the bottom showing CWD, branch, and model info.
4
4
  */
5
- import { type CodexRateLimitSnapshot, type DextoAgent } from '@dexto/core';
5
+ import { type CodexRateLimitSnapshot } from '@dexto/core';
6
+ import { type TuiAgentBackend } from '../agent-backend.js';
6
7
  interface FooterProps {
7
- agent: DextoAgent;
8
+ agent: TuiAgentBackend;
8
9
  sessionId: string | null;
9
10
  modelName: string;
10
11
  cwd?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"Footer.d.ts","sourceRoot":"","sources":["../../src/components/Footer.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAIH,KAAK,sBAAsB,EAC3B,KAAK,UAAU,EAClB,MAAM,aAAa,CAAC;AAOrB,UAAU,WAAW;IACjB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kEAAkE;IAClE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sBAAsB,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;CAC1D;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,EACnB,KAAK,EACL,SAAS,EACT,SAAS,EACT,GAAG,EACH,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,sBAAsB,GACzB,EAAE,WAAW,2CAyKb"}
1
+ {"version":3,"file":"Footer.d.ts","sourceRoot":"","sources":["../../src/components/Footer.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAIH,KAAK,sBAAsB,EAC9B,MAAM,aAAa,CAAC;AAMrB,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEjF,UAAU,WAAW;IACjB,KAAK,EAAE,eAAe,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kEAAkE;IAClE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sBAAsB,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;CAC1D;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,EACnB,KAAK,EACL,SAAS,EACT,SAAS,EACT,GAAG,EACH,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,sBAAsB,GACzB,EAAE,WAAW,2CA8Kb"}
@@ -12,6 +12,7 @@ import {
12
12
  getChatGPTRateLimitHint,
13
13
  shouldShowChatGPTRateLimitHint
14
14
  } from "../utils/chatgpt-rate-limit.js";
15
+ import { supportsContextStats } from "../agent-backend.js";
15
16
  function Footer({
16
17
  agent,
17
18
  sessionId,
@@ -39,6 +40,10 @@ function Footer({
39
40
  const chatGPTRateLimitHint = showChatGPTRateLimitHint && chatgptRateLimitStatus ? getChatGPTRateLimitHint(chatgptRateLimitStatus) : null;
40
41
  const chatGPTRateLimitColor = chatgptRateLimitStatus?.exceeded ? "redBright" : (chatgptRateLimitStatus?.usedPercent ?? 0) >= 90 ? "yellowBright" : "yellow";
41
42
  useEffect(() => {
43
+ if (!supportsContextStats(agent)) {
44
+ setContextLeft(null);
45
+ return;
46
+ }
42
47
  if (!sessionId) {
43
48
  setContextLeft(null);
44
49
  return;
@@ -38,6 +38,7 @@ var import_path = __toESM(require("path"), 1);
38
38
  var import_messageFormatting = require("../utils/messageFormatting.js");
39
39
  var import_useTerminalSize = require("../hooks/useTerminalSize.js");
40
40
  var import_overlaySizing = require("../utils/overlaySizing.js");
41
+ var import_agent_backend = require("../agent-backend.js");
41
42
  function getResourceMatchScore(resource, query) {
42
43
  if (!query) return 3;
43
44
  const lowerQuery = query.toLowerCase();
@@ -118,6 +119,13 @@ const ResourceAutocompleteInner = (0, import_react.forwardRef)(
118
119
  setIsLoading(true);
119
120
  const fetchResources = async () => {
120
121
  try {
122
+ if (!(0, import_agent_backend.supportsResources)(agent)) {
123
+ if (!cancelled) {
124
+ setResources([]);
125
+ setIsLoading(false);
126
+ }
127
+ return;
128
+ }
121
129
  const resourceSet = await agent.listResources();
122
130
  const resourceList = Object.values(resourceSet);
123
131
  if (!cancelled) {
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import type { Key } from '../hooks/useInputOrchestrator.js';
3
3
  import type { ResourceMetadata } from '@dexto/core';
4
- import type { DextoAgent } from '@dexto/core';
4
+ import { type TuiAgentBackend } from '../agent-backend.js';
5
5
  export interface ResourceAutocompleteHandle {
6
6
  handleInput: (input: string, key: Key) => boolean;
7
7
  }
@@ -11,7 +11,7 @@ interface ResourceAutocompleteProps {
11
11
  onSelectResource: (resource: ResourceMetadata) => void;
12
12
  onLoadIntoInput?: (text: string) => void;
13
13
  onClose: () => void;
14
- agent: DextoAgent;
14
+ agent: TuiAgentBackend;
15
15
  }
16
16
  /**
17
17
  * Inner component - wrapped with React.memo below
@@ -1 +1 @@
1
- {"version":3,"file":"ResourceAutocomplete.d.ts","sourceRoot":"","sources":["../../src/components/ResourceAutocomplete.tsx"],"names":[],"mappings":"AAAA,OAAO,KAQN,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kCAAkC,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C,MAAM,WAAW,0BAA0B;IACvC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;AAED,UAAU,yBAAyB;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACvD,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;CACrB;AAsFD;;GAEG;AACH,QAAA,MAAM,yBAAyB,8GA4X9B,CAAC;AAEF;;;GAGG;AACH,QAAA,MAAM,oBAAoB,EAErB,OAAO,yBAAyB,CAAC;AAEtC,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"ResourceAutocomplete.d.ts","sourceRoot":"","sources":["../../src/components/ResourceAutocomplete.tsx"],"names":[],"mappings":"AAAA,OAAO,KAQN,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kCAAkC,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE9E,MAAM,WAAW,0BAA0B;IACvC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;AAED,UAAU,yBAAyB;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACvD,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,eAAe,CAAC;CAC1B;AAsFD;;GAEG;AACH,QAAA,MAAM,yBAAyB,8GAmY9B,CAAC;AAEF;;;GAGG;AACH,QAAA,MAAM,oBAAoB,EAErB,OAAO,yBAAyB,CAAC;AAEtC,eAAe,oBAAoB,CAAC"}
@@ -13,6 +13,7 @@ import path from "path";
13
13
  import { centerTruncatePath } from "../utils/messageFormatting.js";
14
14
  import { useTerminalSize } from "../hooks/useTerminalSize.js";
15
15
  import { getMaxVisibleItemsForTerminalRows } from "../utils/overlaySizing.js";
16
+ import { supportsResources } from "../agent-backend.js";
16
17
  function getResourceMatchScore(resource, query) {
17
18
  if (!query) return 3;
18
19
  const lowerQuery = query.toLowerCase();
@@ -93,6 +94,13 @@ const ResourceAutocompleteInner = forwardRef(
93
94
  setIsLoading(true);
94
95
  const fetchResources = async () => {
95
96
  try {
97
+ if (!supportsResources(agent)) {
98
+ if (!cancelled) {
99
+ setResources([]);
100
+ setIsLoading(false);
101
+ }
102
+ return;
103
+ }
96
104
  const resourceSet = await agent.listResources();
97
105
  const resourceList = Object.values(resourceSet);
98
106
  if (!cancelled) {
@@ -37,6 +37,7 @@ var import_ink = require("ink");
37
37
  var import_commands = require("../interactive-commands/commands.js");
38
38
  var import_useTerminalSize = require("../hooks/useTerminalSize.js");
39
39
  var import_overlaySizing = require("../utils/overlaySizing.js");
40
+ var import_agent_backend = require("../agent-backend.js");
40
41
  function getPromptMatchScore(prompt, query) {
41
42
  if (!query) return 3;
42
43
  const lowerQuery = query.toLowerCase();
@@ -132,12 +133,11 @@ const SlashCommandAutocompleteInner = (0, import_react.forwardRef)(function Slas
132
133
  setIsLoading(true);
133
134
  const fetchCommands = async () => {
134
135
  try {
135
- const promptSet = await agent.listPrompts();
136
- const promptList = Object.values(promptSet).map((p) => ({
136
+ const promptList = (0, import_agent_backend.supportsPrompts)(agent) ? Object.values(await agent.listPrompts()).map((p) => ({
137
137
  ...p,
138
138
  kind: "prompt"
139
- }));
140
- const allCommands = (0, import_commands.getAllCommands)();
139
+ })) : [];
140
+ const allCommands = (0, import_commands.getAvailableCommands)(agent);
141
141
  const commandList = allCommands.map((cmd) => ({
142
142
  kind: "system",
143
143
  name: cmd.name,
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import type { Key } from '../hooks/useInputOrchestrator.js';
3
3
  import type { PromptInfo } from '@dexto/core';
4
- import type { DextoAgent } from '@dexto/core';
4
+ import { type TuiAgentBackend } from '../agent-backend.js';
5
5
  export interface SlashCommandAutocompleteHandle {
6
6
  handleInput: (input: string, key: Key) => boolean;
7
7
  }
@@ -13,7 +13,7 @@ interface SlashCommandAutocompleteProps {
13
13
  onLoadIntoInput?: (command: string) => void;
14
14
  onSubmitRaw?: ((text: string) => Promise<void> | void) | undefined;
15
15
  onClose: () => void;
16
- agent: DextoAgent;
16
+ agent: TuiAgentBackend;
17
17
  }
18
18
  /**
19
19
  * Inner component - wrapped with React.memo below
@@ -1 +1 @@
1
- {"version":3,"file":"SlashCommandAutocomplete.d.ts","sourceRoot":"","sources":["../../src/components/SlashCommandAutocomplete.tsx"],"names":[],"mappings":"AAAA,OAAO,KAQN,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kCAAkC,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAM9C,MAAM,WAAW,8BAA8B;IAC3C,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;AAED,UAAU,6BAA6B;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC7C,qBAAqB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,WAAW,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;IACnE,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;CACrB;AAmGD;;GAEG;AACH,QAAA,MAAM,6BAA6B,sHA4bjC,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAEhC,OAAO,6BAA6B,CAAC"}
1
+ {"version":3,"file":"SlashCommandAutocomplete.d.ts","sourceRoot":"","sources":["../../src/components/SlashCommandAutocomplete.tsx"],"names":[],"mappings":"AAAA,OAAO,KAQN,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kCAAkC,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE5E,MAAM,WAAW,8BAA8B;IAC3C,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;AAED,UAAU,6BAA6B;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC7C,qBAAqB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,WAAW,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;IACnE,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,eAAe,CAAC;CAC1B;AAmGD;;GAEG;AACH,QAAA,MAAM,6BAA6B,sHA6bjC,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAEhC,OAAO,6BAA6B,CAAC"}
@@ -9,9 +9,10 @@ import React, {
9
9
  useImperativeHandle
10
10
  } from "react";
11
11
  import { Box, Text } from "ink";
12
- import { getAllCommands } from "../interactive-commands/commands.js";
12
+ import { getAvailableCommands } from "../interactive-commands/commands.js";
13
13
  import { useTerminalSize } from "../hooks/useTerminalSize.js";
14
14
  import { getMaxVisibleItemsForTerminalRows } from "../utils/overlaySizing.js";
15
+ import { supportsPrompts } from "../agent-backend.js";
15
16
  function getPromptMatchScore(prompt, query) {
16
17
  if (!query) return 3;
17
18
  const lowerQuery = query.toLowerCase();
@@ -107,12 +108,11 @@ const SlashCommandAutocompleteInner = forwardRef(function SlashCommandAutocomple
107
108
  setIsLoading(true);
108
109
  const fetchCommands = async () => {
109
110
  try {
110
- const promptSet = await agent.listPrompts();
111
- const promptList = Object.values(promptSet).map((p) => ({
111
+ const promptList = supportsPrompts(agent) ? Object.values(await agent.listPrompts()).map((p) => ({
112
112
  ...p,
113
113
  kind: "prompt"
114
- }));
115
- const allCommands = getAllCommands();
114
+ })) : [];
115
+ const allCommands = getAvailableCommands(agent);
116
116
  const commandList = allCommands.map((cmd) => ({
117
117
  kind: "system",
118
118
  name: cmd.name,
@@ -7,9 +7,9 @@
7
7
  * - Line 2: Meta info (time, tokens, cancel hint)
8
8
  * This 2-line layout prevents truncation on any terminal width.
9
9
  */
10
- import type { DextoAgent } from '@dexto/core';
10
+ import type { TuiAgentBackend } from '../agent-backend.js';
11
11
  interface StatusBarProps {
12
- agent: DextoAgent;
12
+ agent: TuiAgentBackend;
13
13
  isProcessing: boolean;
14
14
  isThinking: boolean;
15
15
  isCompacting: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../src/components/StatusBar.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAa9C,UAAU,cAAc;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oDAAoD;IACpD,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,wCAAwC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kCAAkC;IAClC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,yCAAyC;IACzC,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EACtB,KAAK,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,eAAuB,EACvB,kBAA0B,EAC1B,YAAmB,EACnB,QAAgB,EAChB,cAAsB,EACtB,gBAAwB,EACxB,sBAA0B,GAC7B,EAAE,cAAc,kDAwIhB"}
1
+ {"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../src/components/StatusBar.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAQ3D,UAAU,cAAc;IACpB,KAAK,EAAE,eAAe,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oDAAoD;IACpD,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,wCAAwC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kCAAkC;IAClC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,yCAAyC;IACzC,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EACtB,KAAK,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,eAAuB,EACvB,kBAA0B,EAC1B,YAAmB,EACnB,QAAgB,EAChB,cAAsB,EACtB,gBAAwB,EACxB,sBAA0B,GAC7B,EAAE,cAAc,kDAwIhB"}
@@ -9,10 +9,10 @@
9
9
  * - Copy mode toggle (Ctrl+S)
10
10
  * - Selection hint when user tries to drag without Option key
11
11
  */
12
- import type { DextoAgent } from '@dexto/core';
12
+ import type { TuiAgentBackend } from '../../agent-backend.js';
13
13
  import type { StartupInfo } from '../../state/types.js';
14
14
  interface AlternateBufferCLIProps {
15
- agent: DextoAgent;
15
+ agent: TuiAgentBackend;
16
16
  initialSessionId: string | null;
17
17
  initialPrompt?: string | undefined;
18
18
  startupInfo: StartupInfo;
@@ -1 +1 @@
1
- {"version":3,"file":"AlternateBufferCLI.d.ts","sourceRoot":"","sources":["../../../src/components/modes/AlternateBufferCLI.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,KAAK,EAAW,WAAW,EAAE,MAAM,sBAAsB,CAAC;AA+BjE,UAAU,uBAAuB;IAC7B,KAAK,EAAE,UAAU,CAAC;IAClB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,6DAA6D;IAC7D,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,kBAAkB,CAAC,EAC/B,KAAK,EACL,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,cAAc,EACd,wBAAgC,EAChC,kBAAkB,EAClB,YAAmB,GACtB,EAAE,uBAAuB,2CAkXzB"}
1
+ {"version":3,"file":"AlternateBufferCLI.d.ts","sourceRoot":"","sources":["../../../src/components/modes/AlternateBufferCLI.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,KAAK,EAAW,WAAW,EAAE,MAAM,sBAAsB,CAAC;AA+BjE,UAAU,uBAAuB;IAC7B,KAAK,EAAE,eAAe,CAAC;IACvB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,6DAA6D;IAC7D,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,kBAAkB,CAAC,EAC/B,KAAK,EACL,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,cAAc,EACd,wBAAgC,EAChC,kBAAkB,EAClB,YAAmB,GACtB,EAAE,uBAAuB,2CAkXzB"}