@kolisachint/hoocode-agent 0.4.155 → 0.4.157

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 (65) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/dist/core/context-files.d.ts +14 -4
  3. package/dist/core/context-files.d.ts.map +1 -1
  4. package/dist/core/context-files.js +7 -4
  5. package/dist/core/context-files.js.map +1 -1
  6. package/dist/core/format-tokens.d.ts +9 -0
  7. package/dist/core/format-tokens.d.ts.map +1 -0
  8. package/dist/core/format-tokens.js +19 -0
  9. package/dist/core/format-tokens.js.map +1 -0
  10. package/dist/core/mcp-status.d.ts +32 -0
  11. package/dist/core/mcp-status.d.ts.map +1 -0
  12. package/dist/core/mcp-status.js +27 -0
  13. package/dist/core/mcp-status.js.map +1 -0
  14. package/dist/core/mode-prompts.d.ts.map +1 -1
  15. package/dist/core/mode-prompts.js +3 -1
  16. package/dist/core/mode-prompts.js.map +1 -1
  17. package/dist/core/resource-loader.d.ts +6 -16
  18. package/dist/core/resource-loader.d.ts.map +1 -1
  19. package/dist/core/resource-loader.js.map +1 -1
  20. package/dist/core/wordmark.d.ts +2 -2
  21. package/dist/core/wordmark.d.ts.map +1 -1
  22. package/dist/core/wordmark.js +4 -4
  23. package/dist/core/wordmark.js.map +1 -1
  24. package/dist/extensions/core/hoo-core.d.ts +3 -0
  25. package/dist/extensions/core/hoo-core.d.ts.map +1 -1
  26. package/dist/extensions/core/hoo-core.js +3 -0
  27. package/dist/extensions/core/hoo-core.js.map +1 -1
  28. package/dist/extensions/core/loop.d.ts +22 -0
  29. package/dist/extensions/core/loop.d.ts.map +1 -1
  30. package/dist/extensions/core/loop.js +36 -6
  31. package/dist/extensions/core/loop.js.map +1 -1
  32. package/dist/extensions/core/mcp-loader.d.ts.map +1 -1
  33. package/dist/extensions/core/mcp-loader.js +27 -3
  34. package/dist/extensions/core/mcp-loader.js.map +1 -1
  35. package/dist/extensions/core/modes.d.ts +52 -1
  36. package/dist/extensions/core/modes.d.ts.map +1 -1
  37. package/dist/extensions/core/modes.js +221 -18
  38. package/dist/extensions/core/modes.js.map +1 -1
  39. package/dist/init-templates.generated.d.ts.map +1 -1
  40. package/dist/init-templates.generated.js +1 -1
  41. package/dist/init-templates.generated.js.map +1 -1
  42. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  43. package/dist/modes/interactive/components/footer.js +1 -11
  44. package/dist/modes/interactive/components/footer.js.map +1 -1
  45. package/dist/modes/interactive/components/task-panel.d.ts.map +1 -1
  46. package/dist/modes/interactive/components/task-panel.js +1 -9
  47. package/dist/modes/interactive/components/task-panel.js.map +1 -1
  48. package/dist/modes/interactive/interactive-mode.d.ts +14 -0
  49. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  50. package/dist/modes/interactive/interactive-mode.js +50 -1
  51. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  52. package/dist/modes/interactive/model-controller.d.ts +6 -0
  53. package/dist/modes/interactive/model-controller.d.ts.map +1 -1
  54. package/dist/modes/interactive/model-controller.js +33 -14
  55. package/dist/modes/interactive/model-controller.js.map +1 -1
  56. package/dist/modes/interactive/resource-display.d.ts +22 -0
  57. package/dist/modes/interactive/resource-display.d.ts.map +1 -1
  58. package/dist/modes/interactive/resource-display.js +73 -16
  59. package/dist/modes/interactive/resource-display.js.map +1 -1
  60. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  61. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  62. package/examples/extensions/sandbox/package.json +1 -1
  63. package/examples/extensions/with-deps/package.json +1 -1
  64. package/package.json +4 -4
  65. package/templates/modes/plan/system.md +4 -1
@@ -10,6 +10,7 @@ import { createCompactionSummaryMessage } from "@kolisachint/hoocode-agent-core"
10
10
  import { CombinedAutocompleteProvider, Container, fuzzyFilter, getCapabilities, hyperlink, Loader, Markdown, matchesKey, ProcessTerminal, Spacer, setKeybindings, Text, TUI, } from "@kolisachint/hoocode-tui";
11
11
  import { spawnSync } from "child_process";
12
12
  import { APP_NAME, APP_TITLE, VERSION } from "../../config.js";
13
+ import { loadAgentRegistry } from "../../core/agent-registry.js";
13
14
  import { parseSkillBlock } from "../../core/agent-session.js";
14
15
  import { FooterDataProvider } from "../../core/footer-data-provider.js";
15
16
  import { KeybindingsManager } from "../../core/keybindings.js";
@@ -25,6 +26,7 @@ import { killTrackedDetachedChildren } from "../../utils/shell.js";
25
26
  import { ensureTool } from "../../utils/tools-manager.js";
26
27
  import { checkForNewHooCodeVersion } from "../../utils/version-check.js";
27
28
  import { BashExecutionController } from "./bash-execution-controller.js";
29
+ import { SEGMENT_SEP } from "./brand.js";
28
30
  import { CommandExecutor } from "./command-executor.js";
29
31
  import { BELL, CompletionChime } from "./completion-chime.js";
30
32
  import { AssistantMessageComponent } from "./components/assistant-message.js";
@@ -50,7 +52,7 @@ import { ExtensionDialogs } from "./extension-dialogs.js";
50
52
  import { LoginController } from "./login-controller.js";
51
53
  import { MessageQueueController } from "./message-queue-controller.js";
52
54
  import { ModelController } from "./model-controller.js";
53
- import { ExpandableText, formatDisplayPath, isExpandable, showLoadedResources as renderLoadedResources, } from "./resource-display.js";
55
+ import { ExpandableText, formatDisplayPath, isExpandable, showLoadedResources as renderLoadedResources, willShowResourceListing, } from "./resource-display.js";
54
56
  import { checkForPackageUpdates, checkTmuxKeyboardSetup, getChangelogForDisplay } from "./startup-checks.js";
55
57
  import { TeamFocusController } from "./team-focus.js";
56
58
  import { getAvailableThemes, getAvailableThemesWithPaths, getEditorTheme, getMarkdownTheme, getThemeByName, initTheme, onThemeChange, setRegisteredThemes, setTheme, setThemeInstance, stopThemeWatcher, Theme, theme, } from "./theme/theme.js";
@@ -151,6 +153,8 @@ export class InteractiveMode {
151
153
  lastEscapeTime = 0;
152
154
  changelogMarkdown = undefined;
153
155
  startupNoticesShown = false;
156
+ /** Billing caveat folded into the startup state line, once resolved. */
157
+ startupAuthNote = undefined;
154
158
  // Status line tracking (for mutating immediately-sequential status updates)
155
159
  lastStatusSpacer = undefined;
156
160
  lastStatusText = undefined;
@@ -819,12 +823,48 @@ export class InteractiveMode {
819
823
  getExtensionRunner: () => this.session.extensionRunner,
820
824
  getActiveMode: () => this.footerDataProvider.getActiveMode(),
821
825
  getSubagentEnabled: () => this.footerDataProvider.getSubagentEnabled(),
826
+ getAgentCount: () => this.getDispatchableAgentCount(),
827
+ getStateLine: () => this.buildSessionStateLine(),
822
828
  quietStartup: () => this.settingsManager.getQuietStartup(),
823
829
  verbose: this.options.verbose ?? false,
824
830
  isExpanded: () => this.getStartupExpansionState(),
825
831
  getBuiltInCommandConflictDiagnostics: (runner) => this.getBuiltInCommandConflictDiagnostics(runner),
826
832
  }, options);
827
833
  }
834
+ /**
835
+ * Agents the model can actually dispatch. Zero when the Task tool is off, so
836
+ * the summary never advertises a capability the session cannot use.
837
+ */
838
+ getDispatchableAgentCount() {
839
+ if (!this.footerDataProvider.getSubagentEnabled())
840
+ return 0;
841
+ try {
842
+ return loadAgentRegistry({ cwd: this.sessionManager.getCwd() }).list().length;
843
+ }
844
+ catch {
845
+ return 0;
846
+ }
847
+ }
848
+ /**
849
+ * One line of session state for the startup summary: the model, its thinking
850
+ * level, and any billing caveat. The footer carries the same facts for the
851
+ * rest of the session, so this replaces the separate status lines that used
852
+ * to be emitted for each of them.
853
+ */
854
+ buildSessionStateLine() {
855
+ const model = this.session.model;
856
+ if (!model)
857
+ return undefined;
858
+ const segments = [theme.fg("muted", model.id)];
859
+ const thinkingLevel = this.session.thinkingLevel;
860
+ if (model.reasoning && thinkingLevel && thinkingLevel !== "off") {
861
+ segments.push(theme.fg("dim", `thinking ${thinkingLevel}`));
862
+ }
863
+ if (this.startupAuthNote) {
864
+ segments.push(theme.fg("warning", this.startupAuthNote));
865
+ }
866
+ return segments.join(theme.fg("muted", ` ${SEGMENT_SEP} `));
867
+ }
828
868
  /**
829
869
  * Initialize the extension system with TUI-based UI context.
830
870
  */
@@ -906,6 +946,15 @@ export class InteractiveMode {
906
946
  this.setupAutocompleteProvider();
907
947
  const extensionRunner = this.session.extensionRunner;
908
948
  this.setupExtensionShortcuts(extensionRunner);
949
+ // Resolved before the summary renders so the billing caveat lands on the
950
+ // state line instead of arriving as a late, separate warning. Skipped on a
951
+ // quiet startup, where the full warning still fires from run().
952
+ if (willShowResourceListing({
953
+ verbose: this.options.verbose ?? false,
954
+ quietStartup: () => this.settingsManager.getQuietStartup(),
955
+ })) {
956
+ this.startupAuthNote = await this.modelController.getAnthropicSubscriptionNote();
957
+ }
909
958
  this.showLoadedResources({ force: false, showDiagnosticsWhenQuiet: true });
910
959
  this.showStartupNoticesIfNeeded();
911
960
  }