@kolisachint/hoocode-agent 0.5.52 → 0.5.53

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 (114) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/cli/args.d.ts +2 -2
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +9 -8
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/core/agent-frontmatter.d.ts +8 -2
  7. package/dist/core/agent-frontmatter.d.ts.map +1 -1
  8. package/dist/core/agent-frontmatter.js +13 -7
  9. package/dist/core/agent-frontmatter.js.map +1 -1
  10. package/dist/core/agent-session-services.d.ts +1 -1
  11. package/dist/core/agent-session-services.d.ts.map +1 -1
  12. package/dist/core/agent-session-services.js +1 -1
  13. package/dist/core/agent-session-services.js.map +1 -1
  14. package/dist/core/agent-session.d.ts.map +1 -1
  15. package/dist/core/agent-session.js +2 -2
  16. package/dist/core/agent-session.js.map +1 -1
  17. package/dist/core/embsearch/embsearch-service.d.ts +1 -1
  18. package/dist/core/embsearch/embsearch-service.d.ts.map +1 -1
  19. package/dist/core/embsearch/embsearch-service.js +1 -1
  20. package/dist/core/embsearch/embsearch-service.js.map +1 -1
  21. package/dist/core/extensions/plugins/authoring.d.ts.map +1 -1
  22. package/dist/core/extensions/plugins/authoring.js +1 -1
  23. package/dist/core/extensions/plugins/authoring.js.map +1 -1
  24. package/dist/core/extensions/plugins/formats/shared.d.ts +1 -1
  25. package/dist/core/extensions/plugins/formats/shared.d.ts.map +1 -1
  26. package/dist/core/extensions/plugins/formats/shared.js +1 -1
  27. package/dist/core/extensions/plugins/formats/shared.js.map +1 -1
  28. package/dist/core/extensions/plugins/formats/types.d.ts +1 -1
  29. package/dist/core/extensions/plugins/formats/types.d.ts.map +1 -1
  30. package/dist/core/extensions/plugins/formats/types.js.map +1 -1
  31. package/dist/core/external-tools.d.ts +1 -1
  32. package/dist/core/external-tools.d.ts.map +1 -1
  33. package/dist/core/external-tools.js +2 -2
  34. package/dist/core/external-tools.js.map +1 -1
  35. package/dist/core/sdk.d.ts +2 -2
  36. package/dist/core/sdk.d.ts.map +1 -1
  37. package/dist/core/sdk.js +3 -3
  38. package/dist/core/sdk.js.map +1 -1
  39. package/dist/core/self-docs.d.ts +1 -1
  40. package/dist/core/self-docs.d.ts.map +1 -1
  41. package/dist/core/self-docs.js +1 -1
  42. package/dist/core/self-docs.js.map +1 -1
  43. package/dist/core/settings-defaults.d.ts +1 -1
  44. package/dist/core/settings-defaults.d.ts.map +1 -1
  45. package/dist/core/settings-defaults.js +1 -1
  46. package/dist/core/settings-defaults.js.map +1 -1
  47. package/dist/core/settings-manager.d.ts +2 -2
  48. package/dist/core/settings-manager.d.ts.map +1 -1
  49. package/dist/core/settings-manager.js +13 -5
  50. package/dist/core/settings-manager.js.map +1 -1
  51. package/dist/core/settings-types.d.ts +1 -1
  52. package/dist/core/settings-types.d.ts.map +1 -1
  53. package/dist/core/settings-types.js.map +1 -1
  54. package/dist/core/system-prompt.d.ts.map +1 -1
  55. package/dist/core/system-prompt.js +5 -5
  56. package/dist/core/system-prompt.js.map +1 -1
  57. package/dist/core/tools/index.d.ts +2 -2
  58. package/dist/core/tools/index.d.ts.map +1 -1
  59. package/dist/core/tools/index.js +3 -3
  60. package/dist/core/tools/index.js.map +1 -1
  61. package/dist/core/tools/plugins.d.ts.map +1 -1
  62. package/dist/core/tools/plugins.js +2 -2
  63. package/dist/core/tools/plugins.js.map +1 -1
  64. package/dist/core/tools/propose-plugin.d.ts.map +1 -1
  65. package/dist/core/tools/propose-plugin.js +1 -1
  66. package/dist/core/tools/propose-plugin.js.map +1 -1
  67. package/dist/core/tools/search.d.ts +1 -1
  68. package/dist/core/tools/search.d.ts.map +1 -1
  69. package/dist/core/tools/search.js +5 -5
  70. package/dist/core/tools/search.js.map +1 -1
  71. package/dist/init-templates.generated.d.ts.map +1 -1
  72. package/dist/init-templates.generated.js +9 -9
  73. package/dist/init-templates.generated.js.map +1 -1
  74. package/dist/main.d.ts.map +1 -1
  75. package/dist/main.js +7 -7
  76. package/dist/main.js.map +1 -1
  77. package/dist/modes/interactive/components/tool-chain-summary.d.ts.map +1 -1
  78. package/dist/modes/interactive/components/tool-chain-summary.js +1 -1
  79. package/dist/modes/interactive/components/tool-chain-summary.js.map +1 -1
  80. package/dist/modes/interactive/components/tool-signal.d.ts.map +1 -1
  81. package/dist/modes/interactive/components/tool-signal.js +7 -7
  82. package/dist/modes/interactive/components/tool-signal.js.map +1 -1
  83. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  84. package/dist/modes/interactive/components/tree-selector.js +2 -2
  85. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  86. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  87. package/dist/modes/interactive/interactive-mode.js +2 -2
  88. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  89. package/docs/extensions.md +1 -1
  90. package/docs/modes.md +1 -1
  91. package/docs/quickstart.md +1 -1
  92. package/docs/sdk.md +2 -2
  93. package/docs/settings.md +3 -3
  94. package/docs/usage.md +4 -4
  95. package/examples/agents/fork-reviewer.md +1 -1
  96. package/examples/agents/orchestrator.md +1 -1
  97. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  98. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  99. package/examples/extensions/plan-mode/index.ts +1 -1
  100. package/examples/extensions/preset.ts +1 -1
  101. package/examples/extensions/sandbox/package.json +1 -1
  102. package/examples/extensions/truncated-tool.ts +1 -1
  103. package/examples/extensions/with-deps/package.json +1 -1
  104. package/examples/sdk/05-tools.ts +3 -3
  105. package/package.json +4 -4
  106. package/templates/agents/code-review.md +1 -1
  107. package/templates/agents/explore.md +2 -2
  108. package/templates/agents/general-purpose.md +2 -2
  109. package/templates/agents/plan.md +2 -2
  110. package/templates/agents/security-review.md +1 -1
  111. package/templates/modes/debug/system.md +1 -1
  112. package/templates/skills/artifact-design/SKILL.md +1 -1
  113. package/templates/skills/canvas-design/SKILL.md +1 -1
  114. package/templates/skills/plugin-authoring/SKILL.md +1 -1
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Main entry point for the coding agent CLI.\n *\n * This file handles CLI argument parsing and translates them into\n * createAgentSession() options. The SDK does the heavy lifting.\n */\n\nimport { resolve } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport { type ImageContent, modelsAreEqual } from \"@kolisachint/hoocode-ai\";\nimport { ProcessTerminal, setKeybindings, TUI } from \"@kolisachint/hoocode-tui\";\nimport chalk from \"chalk\";\nimport { type Args, type Mode, parseArgs, printHelp } from \"./cli/args.js\";\nimport { processFileArguments } from \"./cli/file-processor.js\";\nimport { buildInitialMessage } from \"./cli/initial-message.js\";\nimport { listModels } from \"./cli/list-models.js\";\nimport { selectSession } from \"./cli/session-picker.js\";\nimport { ENV_SESSION_DIR, expandTildePath, getAgentDir, VERSION } from \"./config.js\";\nimport { setAgentCliPaths } from \"./core/agent-manifest-paths.js\";\nimport { type CreateAgentSessionRuntimeFactory, createAgentSessionRuntime } from \"./core/agent-session-runtime.js\";\nimport {\n\ttype AgentSessionRuntimeDiagnostic,\n\tcreateAgentSessionFromServices,\n\tcreateAgentSessionServices,\n} from \"./core/agent-session-services.js\";\nimport { formatNoModelsAvailableMessage } from \"./core/auth-guidance.js\";\nimport { AuthStorage } from \"./core/auth-storage.js\";\nimport { builtinSkillPaths } from \"./core/builtin-skills.js\";\nimport { analyzeDeferral, formatDeferral } from \"./core/capabilities/deferral.js\";\nimport { reportEmbsearchProgress } from \"./core/embsearch/embsearch-progress.js\";\nimport {\n\tEmbsearchService,\n\tregisterEmbsearchService,\n\tunregisterEmbsearchService,\n} from \"./core/embsearch/embsearch-service.js\";\nimport { exportFromFile } from \"./core/export-html/index.js\";\nimport { parsePlatforms, setPlatforms } from \"./core/extensions/plugins/formats/platform-targets.js\";\nimport type { ExtensionAPI, ExtensionFactory } from \"./core/extensions/types.js\";\nimport { KeybindingsManager } from \"./core/keybindings.js\";\nimport {\n\tcreateLightTools,\n\tLIGHT_MODE_ENV,\n\tLIGHT_SYSTEM_PROMPT,\n\tLIGHT_TOOL_NAMES,\n\tmeasurePromptSurface,\n} from \"./core/light.js\";\nimport type { ModelRegistry } from \"./core/model-registry.js\";\nimport { resolveCliModel, resolveModelScope, type ScopedModel } from \"./core/model-resolver.js\";\nimport { restoreStdout, takeOverStdout } from \"./core/output-guard.js\";\nimport type { CreateAgentSessionOptions } from \"./core/sdk.js\";\nimport {\n\tformatMissingSessionCwdPrompt,\n\tgetMissingSessionCwdIssue,\n\tMissingSessionCwdError,\n\ttype SessionCwdIssue,\n} from \"./core/session-cwd.js\";\nimport { SessionManager } from \"./core/session-manager.js\";\nimport { SettingsManager } from \"./core/settings-manager.js\";\nimport {\n\tcanSpawnSubagent,\n\tDEFER_MCP_SCHEMAS_ENV,\n\tDELEGATE_ALLOW_ENV,\n\tNESTED_CONCURRENCY_ENV,\n\tresolveMaxSubagentDepth,\n\tresolveNestedConcurrency,\n\tSUBAGENT_MAX_DEPTH_ENV,\n} from \"./core/subagent-depth.js\";\nimport { printTimings, resetTimings, time } from \"./core/timings.js\";\nimport { createPackagePluginToolDefinition } from \"./core/tools/package-plugin.js\";\nimport { createPluginLifecycleToolDefinitions } from \"./core/tools/plugins.js\";\nimport { createProposePluginToolDefinitions } from \"./core/tools/propose-plugin.js\";\nimport {\n\tbuildTaskMainPrompt,\n\tcreateTaskOutputToolDefinition,\n\tcreateTaskToolDefinition,\n} from \"./core/tools/subagent.js\";\nimport { createTodoWriteToolDefinition } from \"./core/tools/todo.js\";\nimport { WARM_SUBAGENTS_ENV } from \"./core/warm-subagent-pool-instance.js\";\n// Static import (not dynamic) so `bun build --compile` statically reaches\n// hoo-core from the compiled entry chain (src/bun/cli.ts -> src/cli.ts ->\n// main.ts) and bundles it into the standalone binary. The node CLI reaches it\n// via this same path through DEFAULT_EXTENSION_FACTORIES below.\nimport hooCore from \"./extensions/core/hoo-core.js\";\nimport { runMigrations, showDeprecationWarnings } from \"./migrations.js\";\nimport { InteractiveMode, runPrintMode, runRpcMode } from \"./modes/index.js\";\nimport { ExtensionSelectorComponent } from \"./modes/interactive/components/extension-selector.js\";\nimport { initTheme, stopThemeWatcher } from \"./modes/interactive/theme/theme.js\";\nimport { handleConfigCommand, handlePackageCommand } from \"./package-manager-cli.js\";\nimport { handleResourcesCommand } from \"./resources-cli.js\";\nimport { isLocalPath } from \"./utils/paths.js\";\n\n/**\n * Read all content from piped stdin.\n * Returns undefined if stdin is a TTY (interactive terminal).\n */\nasync function readPipedStdin(): Promise<string | undefined> {\n\t// If stdin is a TTY, we're running interactively - don't read stdin\n\tif (process.stdin.isTTY) {\n\t\treturn undefined;\n\t}\n\n\treturn new Promise((resolve) => {\n\t\tlet data = \"\";\n\t\tprocess.stdin.setEncoding(\"utf8\");\n\t\tprocess.stdin.on(\"data\", (chunk) => {\n\t\t\tdata += chunk;\n\t\t});\n\t\tprocess.stdin.on(\"end\", () => {\n\t\t\tresolve(data.trim() || undefined);\n\t\t});\n\t\tprocess.stdin.resume();\n\t});\n}\n\nfunction collectSettingsDiagnostics(\n\tsettingsManager: SettingsManager,\n\tcontext: string,\n): AgentSessionRuntimeDiagnostic[] {\n\treturn settingsManager.drainErrors().map(({ scope, error }) => ({\n\t\ttype: \"warning\",\n\t\tmessage: `(${context}, ${scope} settings) ${error.message}`,\n\t}));\n}\n\nfunction reportDiagnostics(diagnostics: readonly AgentSessionRuntimeDiagnostic[]): void {\n\tfor (const diagnostic of diagnostics) {\n\t\tconst color = diagnostic.type === \"error\" ? chalk.red : diagnostic.type === \"warning\" ? chalk.yellow : chalk.dim;\n\t\tconst prefix = diagnostic.type === \"error\" ? \"Error: \" : diagnostic.type === \"warning\" ? \"Warning: \" : \"\";\n\t\tconsole.error(color(`${prefix}${diagnostic.message}`));\n\t}\n}\n\nfunction isTruthyEnvFlag(value: string | undefined): boolean {\n\tif (!value) return false;\n\treturn value === \"1\" || value.toLowerCase() === \"true\" || value.toLowerCase() === \"yes\";\n}\n\ntype AppMode = \"interactive\" | \"print\" | \"json\" | \"rpc\";\n\nfunction resolveAppMode(parsed: Args, stdinIsTTY: boolean): AppMode {\n\tif (parsed.mode === \"rpc\") {\n\t\treturn \"rpc\";\n\t}\n\tif (parsed.mode === \"json\") {\n\t\treturn \"json\";\n\t}\n\tif (parsed.print || !stdinIsTTY) {\n\t\treturn \"print\";\n\t}\n\treturn \"interactive\";\n}\n\nfunction toPrintOutputMode(appMode: AppMode): Exclude<Mode, \"rpc\"> {\n\treturn appMode === \"json\" ? \"json\" : \"text\";\n}\n\nasync function prepareInitialMessage(\n\tparsed: Args,\n\tautoResizeImages: boolean,\n\tstdinContent?: string,\n): Promise<{\n\tinitialMessage?: string;\n\tinitialImages?: ImageContent[];\n}> {\n\tif (parsed.fileArgs.length === 0) {\n\t\treturn buildInitialMessage({ parsed, stdinContent });\n\t}\n\n\tconst { text, images } = await processFileArguments(parsed.fileArgs, { autoResizeImages });\n\treturn buildInitialMessage({\n\t\tparsed,\n\t\tfileText: text,\n\t\tfileImages: images,\n\t\tstdinContent,\n\t});\n}\n\n/** Result from resolving a session argument */\ntype ResolvedSession =\n\t| { type: \"path\"; path: string } // Direct file path\n\t| { type: \"local\"; path: string } // Found in current project\n\t| { type: \"global\"; path: string; cwd: string } // Found in different project\n\t| { type: \"not_found\"; arg: string }; // Not found anywhere\n\n/**\n * Resolve a session argument to a file path.\n * If it looks like a path, use as-is. Otherwise try to match as session ID prefix.\n */\nasync function resolveSessionPath(sessionArg: string, cwd: string, sessionDir?: string): Promise<ResolvedSession> {\n\t// If it looks like a file path, use as-is\n\tif (sessionArg.includes(\"/\") || sessionArg.includes(\"\\\\\") || sessionArg.endsWith(\".jsonl\")) {\n\t\treturn { type: \"path\", path: sessionArg };\n\t}\n\n\t// Try to match as session ID in current project first\n\tconst localSessions = await SessionManager.list(cwd, sessionDir);\n\tconst localMatches = localSessions.filter((s) => s.id.startsWith(sessionArg));\n\n\tif (localMatches.length >= 1) {\n\t\treturn { type: \"local\", path: localMatches[0].path };\n\t}\n\n\t// Try global search across all projects\n\tconst allSessions = await SessionManager.listAll();\n\tconst globalMatches = allSessions.filter((s) => s.id.startsWith(sessionArg));\n\n\tif (globalMatches.length >= 1) {\n\t\tconst match = globalMatches[0];\n\t\treturn { type: \"global\", path: match.path, cwd: match.cwd };\n\t}\n\n\t// Not found anywhere\n\treturn { type: \"not_found\", arg: sessionArg };\n}\n\n/** Prompt user for yes/no confirmation */\nasync function promptConfirm(message: string): Promise<boolean> {\n\treturn new Promise((resolve) => {\n\t\tconst rl = createInterface({\n\t\t\tinput: process.stdin,\n\t\t\toutput: process.stdout,\n\t\t});\n\t\trl.question(`${message} [y/N] `, (answer) => {\n\t\t\trl.close();\n\t\t\tresolve(answer.toLowerCase() === \"y\" || answer.toLowerCase() === \"yes\");\n\t\t});\n\t});\n}\n\nfunction validateForkFlags(parsed: Args): void {\n\tif (!parsed.fork) return;\n\n\tconst conflictingFlags = [\n\t\tparsed.session ? \"--session\" : undefined,\n\t\tparsed.continue ? \"--continue\" : undefined,\n\t\tparsed.resume ? \"--resume\" : undefined,\n\t\tparsed.noSession ? \"--no-session\" : undefined,\n\t].filter((flag): flag is string => flag !== undefined);\n\n\tif (conflictingFlags.length > 0) {\n\t\tconsole.error(chalk.red(`Error: --fork cannot be combined with ${conflictingFlags.join(\", \")}`));\n\t\tprocess.exit(1);\n\t}\n}\n\nfunction forkSessionOrExit(sourcePath: string, cwd: string, sessionDir?: string): SessionManager {\n\ttry {\n\t\treturn SessionManager.forkFrom(sourcePath, cwd, sessionDir);\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tprocess.exit(1);\n\t}\n}\n\nasync function createSessionManager(\n\tparsed: Args,\n\tcwd: string,\n\tsessionDir: string | undefined,\n\tsettingsManager: SettingsManager,\n): Promise<SessionManager> {\n\tif (parsed.noSession) {\n\t\treturn SessionManager.inMemory();\n\t}\n\n\tif (parsed.fork) {\n\t\tconst resolved = await resolveSessionPath(parsed.fork, cwd, sessionDir);\n\n\t\tswitch (resolved.type) {\n\t\t\tcase \"path\":\n\t\t\tcase \"local\":\n\t\t\tcase \"global\":\n\t\t\t\treturn forkSessionOrExit(resolved.path, cwd, sessionDir);\n\n\t\t\tcase \"not_found\":\n\t\t\t\tconsole.error(chalk.red(`No session found matching '${resolved.arg}'`));\n\t\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\tif (parsed.session) {\n\t\tconst resolved = await resolveSessionPath(parsed.session, cwd, sessionDir);\n\n\t\tswitch (resolved.type) {\n\t\t\tcase \"path\":\n\t\t\tcase \"local\":\n\t\t\t\treturn SessionManager.open(resolved.path, sessionDir);\n\n\t\t\tcase \"global\": {\n\t\t\t\tconsole.log(chalk.yellow(`Session found in different project: ${resolved.cwd}`));\n\t\t\t\tconst shouldFork = await promptConfirm(\"Fork this session into current directory?\");\n\t\t\t\tif (!shouldFork) {\n\t\t\t\t\tconsole.log(chalk.dim(\"Aborted.\"));\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t\treturn forkSessionOrExit(resolved.path, cwd, sessionDir);\n\t\t\t}\n\n\t\t\tcase \"not_found\":\n\t\t\t\tconsole.error(chalk.red(`No session found matching '${resolved.arg}'`));\n\t\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\tif (parsed.resume) {\n\t\tinitTheme(settingsManager.getTheme(), true);\n\t\ttry {\n\t\t\tconst selectedPath = await selectSession(\n\t\t\t\t(onProgress) => SessionManager.list(cwd, sessionDir, onProgress),\n\t\t\t\tSessionManager.listAll,\n\t\t\t);\n\t\t\tif (!selectedPath) {\n\t\t\t\tconsole.log(chalk.dim(\"No session selected\"));\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t\treturn SessionManager.open(selectedPath, sessionDir);\n\t\t} finally {\n\t\t\tstopThemeWatcher();\n\t\t}\n\t}\n\n\tif (parsed.continue) {\n\t\treturn SessionManager.continueRecent(cwd, sessionDir);\n\t}\n\n\treturn SessionManager.create(cwd, sessionDir);\n}\n\nfunction buildSessionOptions(\n\tparsed: Args,\n\tscopedModels: ScopedModel[],\n\thasExistingSession: boolean,\n\tmodelRegistry: ModelRegistry,\n\tsettingsManager: SettingsManager,\n\tlightMode: boolean,\n): {\n\toptions: CreateAgentSessionOptions;\n\tcliThinkingFromModel: boolean;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n} {\n\tconst options: CreateAgentSessionOptions = {};\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\tlet cliThinkingFromModel = false;\n\n\t// Model from CLI\n\t// - supports --provider <name> --model <pattern>\n\t// - supports --model <provider>/<pattern>\n\tif (parsed.model) {\n\t\tconst resolved = resolveCliModel({\n\t\t\tcliProvider: parsed.provider,\n\t\t\tcliModel: parsed.model,\n\t\t\tmodelRegistry,\n\t\t});\n\t\tif (resolved.warning) {\n\t\t\tdiagnostics.push({ type: \"warning\", message: resolved.warning });\n\t\t}\n\t\tif (resolved.error) {\n\t\t\tdiagnostics.push({ type: \"error\", message: resolved.error });\n\t\t}\n\t\tif (resolved.model) {\n\t\t\toptions.model = resolved.model;\n\t\t\t// Allow \"--model <pattern>:<thinking>\" as a shorthand.\n\t\t\t// Explicit --thinking still takes precedence (applied later).\n\t\t\tif (!parsed.thinking && resolved.thinkingLevel) {\n\t\t\t\toptions.thinkingLevel = resolved.thinkingLevel;\n\t\t\t\tcliThinkingFromModel = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!options.model && scopedModels.length > 0 && !hasExistingSession) {\n\t\t// Check if saved default is in scoped models - use it if so, otherwise first scoped model\n\t\tconst savedProvider = settingsManager.getDefaultProvider();\n\t\tconst savedModelId = settingsManager.getDefaultModel();\n\t\tconst savedModel = savedProvider && savedModelId ? modelRegistry.find(savedProvider, savedModelId) : undefined;\n\t\tconst savedInScope = savedModel ? scopedModels.find((sm) => modelsAreEqual(sm.model, savedModel)) : undefined;\n\n\t\tif (savedInScope) {\n\t\t\toptions.model = savedInScope.model;\n\t\t\t// Use thinking level from scoped model config if explicitly set\n\t\t\tif (!parsed.thinking && savedInScope.thinkingLevel) {\n\t\t\t\toptions.thinkingLevel = savedInScope.thinkingLevel;\n\t\t\t}\n\t\t} else {\n\t\t\toptions.model = scopedModels[0].model;\n\t\t\t// Use thinking level from first scoped model if explicitly set\n\t\t\tif (!parsed.thinking && scopedModels[0].thinkingLevel) {\n\t\t\t\toptions.thinkingLevel = scopedModels[0].thinkingLevel;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Thinking level from CLI (takes precedence over scoped model thinking levels set above)\n\tif (parsed.thinking) {\n\t\toptions.thinkingLevel = parsed.thinking;\n\t}\n\n\t// Scoped models for Ctrl+P cycling\n\t// Keep thinking level undefined when not explicitly set in the model pattern.\n\t// Undefined means \"inherit current session thinking level\" during cycling.\n\tif (scopedModels.length > 0) {\n\t\toptions.scopedModels = scopedModels.map((sm) => ({\n\t\t\tmodel: sm.model,\n\t\t\tthinkingLevel: sm.thinkingLevel,\n\t\t}));\n\t}\n\n\t// API key from CLI - set in authStorage\n\t// (handled by caller before createAgentSession)\n\n\t// Tools\n\tif (parsed.noTools) {\n\t\toptions.noTools = \"all\";\n\t} else if (parsed.noBuiltinTools) {\n\t\toptions.noTools = \"builtin\";\n\t}\n\tif (parsed.tools) {\n\t\toptions.tools = [...parsed.tools];\n\t}\n\tif (parsed.disallowedTools) {\n\t\toptions.disallowedTools = [...parsed.disallowedTools];\n\t}\n\t// Persisted per-tool disables from the TUI (/settings → Tools). These compose\n\t// with any CLI denylist and always subtract from the active tool set: a tool\n\t// listed here stays off even if it also appears in the --tools allowlist.\n\tconst disabledTools = settingsManager.getDisabledTools();\n\tif (disabledTools.length > 0) {\n\t\toptions.disallowedTools = [...new Set([...(options.disallowedTools ?? []), ...disabledTools])];\n\t}\n\t// Light preset: restrict to the four core tools unless the user passed an\n\t// explicit allowlist or suppression flag (explicit flags win over the preset).\n\t// The allowlist also blocks Task/TodoWrite/plugin tools from becoming active.\n\tif (lightMode && !parsed.tools && !parsed.noTools && !parsed.noBuiltinTools) {\n\t\toptions.tools = [...LIGHT_TOOL_NAMES];\n\t}\n\t// Artifact platform targeting: the --platform flag (falls back to the\n\t// `platform` setting, which /settings also writes) picks which vendor\n\t// layout(s) hoocode writes when it produces artifacts — authored plugins\n\t// (ProposePlugin) and the /new-skill //new-agent //new-command scaffolds.\n\t// Stored as process-wide state next to the format registry; readers of every\n\t// format stay unaffected.\n\tconst platformTokens = parsed.platform ?? settingsManager.getPlatform();\n\tif (platformTokens && platformTokens.length > 0) {\n\t\tconst { platforms, invalid } = parsePlatforms(platformTokens);\n\t\tfor (const token of invalid) {\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"warning\",\n\t\t\t\tmessage: `Unknown --platform \"${token}\" (valid: claude, copilot|github|gh, agents|native)`,\n\t\t\t});\n\t\t}\n\t\tif (platforms.length > 0) {\n\t\t\tsetPlatforms(platforms);\n\t\t} else {\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"warning\",\n\t\t\t\tmessage: \"--platform resolved no valid platforms; using the default targets\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Web tools (webfetch + websearch): opt-in via --enable-webtools flag or the\n\t// enableWebTools setting. They are registered as base tools but inactive by\n\t// default; this adds them to the default active set.\n\tif (parsed.enableWebTools ?? settingsManager.getEnableWebTools()) {\n\t\toptions.enableWebTools = true;\n\t}\n\t// Ranked code search (search tool, lexical + semantic hybrid). The search tool\n\t// is active by default. The enableEmbsearchTools setting controls whether the\n\t// optional semantic index layer starts; when off, search degrades to lexical-only.\n\tif (parsed.enableEmbsearchTools ?? settingsManager.getEnableEmbsearchTools()) {\n\t\toptions.enableEmbsearchTools = true;\n\t}\n\n\t// Optional Task (subagent) tool: opt-in via --enable-subagents flag or the enableSubagent setting.\n\t// Registered as a custom tool; respects --tools/--no-tools allowlists like any other tool.\n\t//\n\t// Nesting is bounded by the tree-wide cap (maxSubagentDepth, default 1). The root\n\t// seeds the cap into the environment so every descendant agrees on one value; the\n\t// Task tool is registered only while this process's depth is below that cap. At the\n\t// default cap this reproduces the original guard exactly: subagents (depth >= 1) get\n\t// no Task tool and cannot recursively dispatch.\n\tconst isSubagentChild = parsed.taskId !== undefined;\n\tif (process.env[SUBAGENT_MAX_DEPTH_ENV] === undefined) {\n\t\t// The root seeds the tree-wide cap; the --max-subagent-depth flag overrides the\n\t\t// setting. resolveMaxSubagentDepth clamps it to the supported range so the seeded\n\t\t// env (and everything that inherits it) carries a sane value. Descendants inherit\n\t\t// it via the environment (env already set => keep it).\n\t\tprocess.env[SUBAGENT_MAX_DEPTH_ENV] = String(\n\t\t\tresolveMaxSubagentDepth(parsed.maxSubagentDepth ?? settingsManager.getMaxSubagentDepth()),\n\t\t);\n\t}\n\tif (process.env[NESTED_CONCURRENCY_ENV] === undefined) {\n\t\t// Seed the nested-pool concurrency from settings so descendants agree on one value.\n\t\tprocess.env[NESTED_CONCURRENCY_ENV] = String(\n\t\t\tresolveNestedConcurrency(settingsManager.getNestedSubagentConcurrency()),\n\t\t);\n\t}\n\t// Scoped delegation: --delegate-allow is the authoritative restriction for this\n\t// process. Set it from the flag, or clear any inherited value so a restricted\n\t// parent's scope never leaks into a child that wasn't given its own.\n\tif (parsed.delegateAllow && parsed.delegateAllow.length > 0) {\n\t\tprocess.env[DELEGATE_ALLOW_ENV] = parsed.delegateAllow.join(\",\");\n\t} else {\n\t\tdelete process.env[DELEGATE_ALLOW_ENV];\n\t}\n\tif (!lightMode && canSpawnSubagent() && (parsed.subagent ?? settingsManager.getEnableSubagent())) {\n\t\toptions.customTools = [\n\t\t\t...(options.customTools ?? []),\n\t\t\tcreateTaskToolDefinition(),\n\t\t\tcreateTaskOutputToolDefinition(),\n\t\t];\n\t\t// Warm subagents (experimental): dispatch eligible foreground subagents on\n\t\t// reused RPC workers to skip the cold-boot. Root-only — the Task tool exists\n\t\t// only where canSpawnSubagent holds and never inside a spawned child — and\n\t\t// carried via env so the Task tool reads it without threading a setting.\n\t\tif (!isSubagentChild && (parsed.warmSubagents ?? settingsManager.getWarmSubagents())) {\n\t\t\tprocess.env[WARM_SUBAGENTS_ENV] = \"1\";\n\t\t}\n\t}\n\n\t// Optional TodoWrite tool: opt-in via --enable-todowrite flag or the\n\t// enableTodoWrite setting. Never registered inside a spawned subagent child —\n\t// its todos would otherwise leak into the parent's \"main\" task group in the pane.\n\tif (!isSubagentChild && !lightMode && (parsed.todoWrite ?? settingsManager.getEnableTodoWrite())) {\n\t\toptions.customTools = [...(options.customTools ?? []), createTodoWriteToolDefinition()];\n\t}\n\n\t// Deferred MCP tool schemas (default on; disable via deferMcpSchemas=false): set\n\t// for the top-level agent only. Subagent\n\t// children clear this env (see subagent-pool) so a child that needs MCP resolves\n\t// its allowlisted tools eagerly at dispatch.\n\tif (!isSubagentChild && settingsManager.getDeferMcpSchemas()) {\n\t\tprocess.env[DEFER_MCP_SCHEMAS_ENV] = \"1\";\n\t}\n\n\t// Plugin lifecycle tools (SearchPlugins, InstallPlugin, ...). Top-level agent\n\t// only: these are capability-acquisition tools and must never be available to\n\t// a spawned subagent child (privilege-amplification guardrail, spec §3).\n\t// `enablePluginTools` is the master switch for the whole autonomous plugin\n\t// system (default off) — it gates both these tools and the runtime reuse\n\t// nudge (see extensions/core/prompt-reactive), so both flip together.\n\tif (!isSubagentChild && !lightMode && (parsed.enablePluginTools ?? settingsManager.getEnablePluginTools())) {\n\t\toptions.customTools = [\n\t\t\t...(options.customTools ?? []),\n\t\t\t...createPluginLifecycleToolDefinitions(),\n\t\t\t...createProposePluginToolDefinitions(),\n\t\t\tcreatePackagePluginToolDefinition(),\n\t\t];\n\t}\n\n\treturn { options, cliThinkingFromModel, diagnostics };\n}\n\nfunction resolveCliPaths(cwd: string, paths: string[] | undefined): string[] | undefined {\n\treturn paths?.map((value) => (isLocalPath(value) ? resolve(cwd, value) : value));\n}\n\nasync function promptForMissingSessionCwd(\n\tissue: SessionCwdIssue,\n\tsettingsManager: SettingsManager,\n): Promise<string | undefined> {\n\tinitTheme(settingsManager.getTheme());\n\tsetKeybindings(KeybindingsManager.create());\n\n\treturn new Promise((resolve) => {\n\t\tconst ui = new TUI(new ProcessTerminal(), settingsManager.getShowHardwareCursor());\n\t\tui.setClearOnShrink(settingsManager.getClearOnShrink());\n\n\t\tlet settled = false;\n\t\tconst finish = (result: string | undefined) => {\n\t\t\tif (settled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettled = true;\n\t\t\tui.stop();\n\t\t\tresolve(result);\n\t\t};\n\n\t\tconst selector = new ExtensionSelectorComponent(\n\t\t\tformatMissingSessionCwdPrompt(issue),\n\t\t\t[\"Continue\", \"Cancel\"],\n\t\t\t(option) => finish(option === \"Continue\" ? issue.fallbackCwd : undefined),\n\t\t\t() => finish(undefined),\n\t\t\t{ tui: ui },\n\t\t);\n\t\tui.addChild(selector);\n\t\tui.setFocus(selector);\n\t\tui.start();\n\t});\n}\n\nexport interface MainOptions {\n\textensionFactories?: ExtensionFactory[];\n}\n\n/**\n * Built-in extension factories loaded when the caller supplies none. This is\n * the single source of truth for the app's built-ins (hoo-core: /loop, /plugin,\n * /mode, /cost, scaffold commands, the MCP loader + remote-MCP/OAuth flow).\n * Both entry points — the node CLI (bin/hoocode.js) and the compiled binary\n * (src/cli.ts) — call main() without factories and inherit this default.\n * Downstream embedders that pass their own extensionFactories override it.\n */\nconst DEFAULT_EXTENSION_FACTORIES: ExtensionFactory[] = [hooCore];\n\nexport async function main(args: string[], options?: MainOptions) {\n\tresetTimings();\n\tconst offlineMode = args.includes(\"--offline\") || isTruthyEnvFlag(process.env.HOOCODE_OFFLINE);\n\tif (offlineMode) {\n\t\tprocess.env.HOOCODE_OFFLINE = \"1\";\n\t\tprocess.env.HOOCODE_SKIP_VERSION_CHECK = \"1\";\n\t}\n\n\tif (await handlePackageCommand(args)) {\n\t\treturn;\n\t}\n\n\tif (await handleConfigCommand(args)) {\n\t\treturn;\n\t}\n\n\tif (await handleResourcesCommand(args)) {\n\t\treturn;\n\t}\n\n\tconst parsed = parseArgs(args);\n\tif (parsed.diagnostics.length > 0) {\n\t\tfor (const d of parsed.diagnostics) {\n\t\t\tconst color = d.type === \"error\" ? chalk.red : chalk.yellow;\n\t\t\tconsole.error(color(`${d.type === \"error\" ? \"Error\" : \"Warning\"}: ${d.message}`));\n\t\t}\n\t\tif (parsed.diagnostics.some((d) => d.type === \"error\")) {\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\ttime(\"parseArgs\");\n\tlet appMode = resolveAppMode(parsed, process.stdin.isTTY);\n\tconst shouldTakeOverStdout = appMode !== \"interactive\";\n\tif (shouldTakeOverStdout) {\n\t\ttakeOverStdout();\n\t}\n\n\tif (parsed.version) {\n\t\tconsole.log(VERSION);\n\t\tprocess.exit(0);\n\t}\n\n\tif (parsed.export) {\n\t\tlet result: string;\n\t\ttry {\n\t\t\tconst outputPath = parsed.messages.length > 0 ? parsed.messages[0] : undefined;\n\t\t\tresult = await exportFromFile(parsed.export, outputPath);\n\t\t} catch (error: unknown) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Failed to export session\";\n\t\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconsole.log(`Exported to: ${result}`);\n\t\tprocess.exit(0);\n\t}\n\n\tif (parsed.mode === \"rpc\" && parsed.fileArgs.length > 0) {\n\t\tconsole.error(chalk.red(\"Error: @file arguments are not supported in RPC mode\"));\n\t\tprocess.exit(1);\n\t}\n\n\tvalidateForkFlags(parsed);\n\n\t// Run migrations (pass cwd for project-local migrations)\n\tconst { migratedAuthProviders: migratedProviders, deprecationWarnings } = runMigrations(process.cwd());\n\ttime(\"runMigrations\");\n\n\tconst cwd = process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst startupSettingsManager = SettingsManager.create(cwd, agentDir);\n\treportDiagnostics(collectSettingsDiagnostics(startupSettingsManager, \"startup session lookup\"));\n\n\t// Decide the final runtime cwd before creating cwd-bound runtime services.\n\t// --session and --resume may select a session from another project, so project-local\n\t// settings, resources, provider registrations, and models must be resolved only after\n\t// the target session cwd is known. The startup-cwd settings manager is used only for\n\t// sessionDir lookup during session selection.\n\tconst envSessionDir = process.env[ENV_SESSION_DIR];\n\tconst sessionDir =\n\t\tparsed.sessionDir ??\n\t\t(envSessionDir ? expandTildePath(envSessionDir) : undefined) ??\n\t\tstartupSettingsManager.getSessionDir();\n\tlet sessionManager = await createSessionManager(parsed, cwd, sessionDir, startupSettingsManager);\n\tconst missingSessionCwdIssue = getMissingSessionCwdIssue(sessionManager, cwd);\n\tif (missingSessionCwdIssue) {\n\t\tif (appMode === \"interactive\") {\n\t\t\tconst selectedCwd = await promptForMissingSessionCwd(missingSessionCwdIssue, startupSettingsManager);\n\t\t\tif (!selectedCwd) {\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t\tsessionManager = SessionManager.open(missingSessionCwdIssue.sessionFile!, sessionDir, selectedCwd);\n\t\t} else {\n\t\t\tconsole.error(chalk.red(new MissingSessionCwdError(missingSessionCwdIssue).message));\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\ttime(\"createSessionManager\");\n\n\tconst resolvedExtensionPaths = resolveCliPaths(cwd, parsed.extensions);\n\tconst resolvedSkillPaths = resolveCliPaths(cwd, parsed.skills);\n\tconst resolvedAgentPaths = resolveCliPaths(cwd, parsed.agents);\n\tconst resolvedPromptTemplatePaths = resolveCliPaths(cwd, parsed.promptTemplates);\n\tconst resolvedSlashCommandPaths = resolveCliPaths(cwd, parsed.slashCommands);\n\tconst resolvedThemePaths = resolveCliPaths(cwd, parsed.themes);\n\n\t// Populate the module-level CLI agent store before any session is created.\n\tsetAgentCliPaths(resolvedAgentPaths ?? []);\n\n\t// Synthetic factory: feed CLI --mode-path values into the extension runtime\n\t// so hoo-core (and any other extension that reads pi.getModeSearchPaths)\n\t// sees them alongside extension-registered dirs.\n\tconst cliModePaths = parsed.modePaths ?? [];\n\tconst cliResourcePathFactories: ExtensionFactory[] =\n\t\tcliModePaths.length === 0\n\t\t\t? []\n\t\t\t: [\n\t\t\t\t\tObject.assign(\n\t\t\t\t\t\t(pi: ExtensionAPI) => {\n\t\t\t\t\t\t\tfor (const p of cliModePaths) pi.addModeSearchPath(p);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ internal: true },\n\t\t\t\t\t),\n\t\t\t\t];\n\t// `??` (not `[...a, ...b]`) so an explicit list — from bin/hoocode.js or a\n\t// downstream embedder — fully replaces the default and hoo-core is never\n\t// registered twice.\n\tconst allExtensionFactories: ExtensionFactory[] = [\n\t\t...cliResourcePathFactories,\n\t\t...(options?.extensionFactories ?? DEFAULT_EXTENSION_FACTORIES),\n\t];\n\tconst authStorage = AuthStorage.create();\n\t// A spawned subagent (run with a task id) is a single-shot, non-interactive\n\t// process: it renders no TUI and its prompt is a plain task, never a slash\n\t// command. Themes, slash commands, and prompt templates are dead weight in that\n\t// path, so skip loading them to trim the child's cold-boot cost. Skills, context\n\t// files, and extensions (which carry the core tools) are kept — they affect the\n\t// subagent's actual work.\n\tconst isSubagentBoot = parsed.taskId !== undefined;\n\tconst createRuntime: CreateAgentSessionRuntimeFactory = async ({\n\t\tcwd,\n\t\tagentDir,\n\t\tsessionManager,\n\t\tsessionStartEvent,\n\t}) => {\n\t\t// Light preset: resolve before services so it can shape resource loading\n\t\t// (no skills/context files, terse system prompt). The env flag tells code\n\t\t// that cannot see flags or settings — the hoo-core modes extension — to\n\t\t// skip its system-prompt appendix.\n\t\tconst earlySettingsManager = SettingsManager.create(cwd, agentDir);\n\t\tconst lightMode = parsed.light ?? earlySettingsManager.getLight();\n\t\tif (lightMode) {\n\t\t\tprocess.env[LIGHT_MODE_ENV] = \"1\";\n\t\t} else {\n\t\t\tdelete process.env[LIGHT_MODE_ENV];\n\t\t}\n\t\t// Skills hoocode ships itself. Contributed as explicit paths rather than a\n\t\t// default directory so `--no-skills` and light mode suppress them the same\n\t\t// way they suppress everything else, and so a gated-off skill is never\n\t\t// materialized at all.\n\t\tconst builtinSkills =\n\t\t\tparsed.noSkills || lightMode\n\t\t\t\t? []\n\t\t\t\t: builtinSkillPaths({ enablePluginTools: earlySettingsManager.getEnablePluginTools() }, agentDir);\n\n\t\tconst services = await createAgentSessionServices({\n\t\t\tcwd,\n\t\t\tagentDir,\n\t\t\tauthStorage,\n\t\t\tsettingsManager: earlySettingsManager,\n\t\t\textensionFlagValues: parsed.unknownFlags,\n\t\t\tresourceLoaderOptions: {\n\t\t\t\tadditionalExtensionPaths: resolvedExtensionPaths,\n\t\t\t\t// Built-ins last. Skill paths are first-wins by name, so anything the\n\t\t\t\t// user pointed at - `--skills`, a settings path, `~/.agents/skills`,\n\t\t\t\t// `.hoocode/skills` - beats a skill hoocode ships under the same name,\n\t\t\t\t// and the collision is still reported as a diagnostic. Left untouched\n\t\t\t\t// when there are no built-ins, so that path is byte for byte what it was.\n\t\t\t\tadditionalSkillPaths:\n\t\t\t\t\tbuiltinSkills.length > 0 ? [...(resolvedSkillPaths ?? []), ...builtinSkills] : resolvedSkillPaths,\n\t\t\t\tadditionalPromptTemplatePaths: resolvedPromptTemplatePaths,\n\t\t\t\tadditionalSlashCommandPaths: resolvedSlashCommandPaths,\n\t\t\t\tadditionalThemePaths: resolvedThemePaths,\n\t\t\t\tnoExtensions: parsed.noExtensions,\n\t\t\t\tnoSkills: parsed.noSkills || lightMode,\n\t\t\t\tnoPromptTemplates: parsed.noPromptTemplates || isSubagentBoot,\n\t\t\t\tnoSlashCommands: parsed.noSlashCommands || isSubagentBoot,\n\t\t\t\tnoThemes: parsed.noThemes || isSubagentBoot,\n\t\t\t\tnoContextFiles: parsed.noContextFiles || lightMode,\n\t\t\t\tsystemPrompt: parsed.systemPrompt ?? (lightMode ? LIGHT_SYSTEM_PROMPT : undefined),\n\t\t\t\textensionFactories: allExtensionFactories,\n\t\t\t},\n\t\t});\n\t\tconst { settingsManager, modelRegistry, resourceLoader } = services;\n\t\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [\n\t\t\t...services.diagnostics,\n\t\t\t...collectSettingsDiagnostics(settingsManager, \"runtime creation\"),\n\t\t\t// Warnings here describe an extension that loaded with something held back\n\t\t\t// (workspace trust withholding a plugin's hooks and MCP servers). They are\n\t\t\t// reported and stepped over; only real load failures abort startup below.\n\t\t\t...resourceLoader\n\t\t\t\t.getExtensions()\n\t\t\t\t.errors.map(({ path, error, severity }) =>\n\t\t\t\t\tseverity === \"warning\"\n\t\t\t\t\t\t? { type: \"warning\" as const, message: `${error} (${path})` }\n\t\t\t\t\t\t: { type: \"error\" as const, message: `Failed to load extension \"${path}\": ${error}` },\n\t\t\t\t),\n\t\t];\n\n\t\t// When subagent tooling is enabled, append the main session subagent instructions.\n\t\tif (!lightMode && (parsed.subagent ?? settingsManager.getEnableSubagent())) {\n\t\t\tresourceLoader.addAppendSystemPrompt(buildTaskMainPrompt());\n\t\t}\n\n\t\tconst modelPatterns = parsed.models ?? settingsManager.getEnabledModels();\n\t\tconst scopedModels =\n\t\t\tmodelPatterns && modelPatterns.length > 0 ? await resolveModelScope(modelPatterns, modelRegistry) : [];\n\t\tconst {\n\t\t\toptions: sessionOptions,\n\t\t\tcliThinkingFromModel,\n\t\t\tdiagnostics: sessionOptionDiagnostics,\n\t\t} = buildSessionOptions(\n\t\t\tparsed,\n\t\t\tscopedModels,\n\t\t\tsessionManager.buildSessionContext().messages.length > 0,\n\t\t\tmodelRegistry,\n\t\t\tsettingsManager,\n\t\t\tlightMode,\n\t\t);\n\t\tdiagnostics.push(...sessionOptionDiagnostics);\n\t\t// Swap in the short-schema read/write/edit/bash tool variants. Skipped\n\t\t// when the user's own --tools allowlist overrode the light tool set.\n\t\tif (lightMode && !parsed.tools) {\n\t\t\tsessionOptions.baseToolsOverride = createLightTools(cwd);\n\t\t}\n\n\t\tif (parsed.apiKey) {\n\t\t\tif (!sessionOptions.model) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tmessage: \"--api-key requires a model to be specified via --model, --provider/--model, or --models\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tauthStorage.setRuntimeApiKey(sessionOptions.model.provider, parsed.apiKey);\n\t\t\t}\n\t\t}\n\n\t\tconst created = await createAgentSessionFromServices({\n\t\t\tservices,\n\t\t\tsessionManager,\n\t\t\tsessionStartEvent,\n\t\t\tmodel: sessionOptions.model,\n\t\t\tthinkingLevel: sessionOptions.thinkingLevel,\n\t\t\tscopedModels: sessionOptions.scopedModels,\n\t\t\ttools: sessionOptions.tools,\n\t\t\tnoTools: sessionOptions.noTools,\n\t\t\tdisallowedTools: sessionOptions.disallowedTools,\n\t\t\tcustomTools: sessionOptions.customTools,\n\t\t\tenableWebTools: sessionOptions.enableWebTools,\n\t\t\tenableEmbsearchTools: sessionOptions.enableEmbsearchTools,\n\t\t\tbaseToolsOverride: sessionOptions.baseToolsOverride,\n\t\t});\n\t\tconst cliThinkingOverride = parsed.thinking !== undefined || cliThinkingFromModel;\n\t\tif (created.session.model && cliThinkingOverride) {\n\t\t\tcreated.session.setThinkingLevel(created.session.thinkingLevel);\n\t\t}\n\n\t\treturn {\n\t\t\t...created,\n\t\t\tservices,\n\t\t\tdiagnostics,\n\t\t};\n\t};\n\ttime(\"createRuntime\");\n\tconst runtime = await createAgentSessionRuntime(createRuntime, {\n\t\tcwd: sessionManager.getCwd(),\n\t\tagentDir,\n\t\tsessionManager,\n\t});\n\tconst { services, session, modelFallbackMessage } = runtime;\n\tconst { settingsManager, modelRegistry, resourceLoader } = services;\n\n\tif (parsed.help) {\n\t\tconst extensionFlags = resourceLoader\n\t\t\t.getExtensions()\n\t\t\t.extensions.flatMap((extension) => Array.from(extension.flags.values()));\n\t\tprintHelp(extensionFlags);\n\t\tprocess.exit(0);\n\t}\n\n\tif (parsed.listModels !== undefined) {\n\t\tconst searchPattern = typeof parsed.listModels === \"string\" ? parsed.listModels : undefined;\n\t\tawait listModels(modelRegistry, searchPattern);\n\t\tprocess.exit(0);\n\t}\n\n\tif (parsed.printTokenSurface) {\n\t\tconst surface = measurePromptSurface(session);\n\t\tconsole.log(\"Fixed per-turn surface (chars/4 token estimate):\");\n\t\tconsole.log(` system prompt: ${surface.systemPromptTokens} tokens`);\n\t\tfor (const tool of surface.tools) {\n\t\t\tconsole.log(` tool ${tool.name}: ${tool.tokens} tokens`);\n\t\t}\n\t\tconsole.log(` tool schemas total: ${surface.toolSchemaTokens} tokens`);\n\t\tconsole.log(` total: ${surface.totalTokens} tokens`);\n\n\t\t// The surface above says what the schemas cost; this says whether\n\t\t// withholding them is worth what a resolve costs (§6.3, §8.6 item 6).\n\t\tconst deferrable = surface.tools.filter((t) => t.name.startsWith(\"mcp_\"));\n\t\tconst deferredTokens = deferrable.reduce((sum, t) => sum + t.tokens, 0);\n\t\tconsole.log(`\\nDeferrable (MCP) tools: ${deferrable.length}, ${deferredTokens} tokens`);\n\t\tif (session.model) {\n\t\t\tconsole.log(\n\t\t\t\tformatDeferral(\n\t\t\t\t\tanalyzeDeferral({\n\t\t\t\t\t\tdeferredTokens,\n\t\t\t\t\t\tprefixTokens: surface.totalTokens,\n\t\t\t\t\t\tprices: session.model.cost,\n\t\t\t\t\t}),\n\t\t\t\t\t{ prefixIsFloor: true },\n\t\t\t\t),\n\t\t\t);\n\t\t} else {\n\t\t\tconsole.log(\" deferral: no model resolved, so the trade-off cannot be costed\");\n\t\t}\n\t\tprocess.exit(0);\n\t}\n\n\t// Read piped stdin content (if any) - skip for RPC mode which uses stdin for JSON-RPC\n\tlet stdinContent: string | undefined;\n\tif (appMode !== \"rpc\") {\n\t\tstdinContent = await readPipedStdin();\n\t\tif (stdinContent !== undefined && appMode === \"interactive\") {\n\t\t\tappMode = \"print\";\n\t\t}\n\t}\n\ttime(\"readPipedStdin\");\n\n\tconst { initialMessage, initialImages } = await prepareInitialMessage(\n\t\tparsed,\n\t\tsettingsManager.getImageAutoResize(),\n\t\tstdinContent,\n\t);\n\ttime(\"prepareInitialMessage\");\n\tinitTheme(settingsManager.getTheme(), appMode === \"interactive\");\n\ttime(\"initTheme\");\n\n\t// Show deprecation warnings in interactive mode\n\tif (appMode === \"interactive\" && deprecationWarnings.length > 0) {\n\t\tawait showDeprecationWarnings(deprecationWarnings);\n\t}\n\n\tconst scopedModels = [...session.scopedModels];\n\ttime(\"resolveModelScope\");\n\treportDiagnostics(runtime.diagnostics);\n\tif (runtime.diagnostics.some((diagnostic) => diagnostic.type === \"error\")) {\n\t\tprocess.exit(1);\n\t}\n\ttime(\"createAgentSession\");\n\n\tif (appMode !== \"interactive\" && !session.model) {\n\t\tconsole.error(chalk.red(formatNoModelsAvailableMessage()));\n\t\tprocess.exit(1);\n\t}\n\n\tconst startupBenchmark = isTruthyEnvFlag(process.env.HOOCODE_STARTUP_BENCHMARK);\n\tif (startupBenchmark && appMode !== \"interactive\") {\n\t\tconsole.error(chalk.red(\"Error: HOOCODE_STARTUP_BENCHMARK only supports interactive mode\"));\n\t\tprocess.exit(1);\n\t}\n\n\t// Start the optional local embedding index service in the background. The\n\t// `search` tool is always available and runs lexical-only by default; this\n\t// semantic-index layer is completely off unless --enable-search-tool (or the\n\t// setting) is true. When on, the tool fuses semantic hits once the index\n\t// reports available.\n\tlet embsearchService: EmbsearchService | undefined;\n\tif (parsed.enableEmbsearchTools ?? settingsManager.getEnableEmbsearchTools()) {\n\t\tconst isInteractive = appMode === \"interactive\";\n\t\tembsearchService = new EmbsearchService({\n\t\t\tcwd: sessionManager.getCwd(),\n\t\t\tbinaryPath: settingsManager.getEmbsearchBinaryPath(),\n\t\t\tthresholdBytes: settingsManager.getEmbsearchThresholdBytes(),\n\t\t\t// Interactive routes to the footer's startupProgress store; non-interactive\n\t\t\t// logs to stderr. See reportEmbsearchProgress for the per-phase mapping.\n\t\t\tonProgress: (state) => reportEmbsearchProgress(state, { interactive: isInteractive }),\n\t\t});\n\t\tregisterEmbsearchService(sessionManager.getCwd(), embsearchService);\n\t\tembsearchService.start().catch(() => {\n\t\t\t// Errors are logged by the onProgress unavailable state; swallow to avoid\n\t\t\t// crashing the session because of an optional background index.\n\t\t});\n\t}\n\n\tif (appMode === \"rpc\") {\n\t\tprintTimings();\n\t\ttry {\n\t\t\tawait runRpcMode(runtime);\n\t\t} finally {\n\t\t\tawait embsearchService?.dispose();\n\t\t\tunregisterEmbsearchService(sessionManager.getCwd());\n\t\t}\n\t} else if (appMode === \"interactive\") {\n\t\tif (scopedModels.length > 0 && (parsed.verbose || !settingsManager.getQuietStartup())) {\n\t\t\tconst modelList = scopedModels\n\t\t\t\t.map((sm) => {\n\t\t\t\t\tconst thinkingStr = sm.thinkingLevel ? `:${sm.thinkingLevel}` : \"\";\n\t\t\t\t\treturn `${sm.model.id}${thinkingStr}`;\n\t\t\t\t})\n\t\t\t\t.join(\", \");\n\t\t\tconsole.log(chalk.dim(`Model scope: ${modelList} ${chalk.gray(\"(Ctrl+P to cycle)\")}`));\n\t\t}\n\n\t\tconst interactiveMode = new InteractiveMode(runtime, {\n\t\t\tmigratedProviders,\n\t\t\tmodelFallbackMessage,\n\t\t\tinitialMessage,\n\t\t\tinitialImages,\n\t\t\tinitialMessages: parsed.messages,\n\t\t\tverbose: parsed.verbose,\n\t\t});\n\n\t\t// Optional hooteams bridge. `--team auto` discovers a config, spawns a\n\t\t// local hooteams child on a free port, and proceeds as if its URL had\n\t\t// been passed; the child is reaped on exit (clean or signal) via a\n\t\t// process \"exit\" hook plus the explicit stop below.\n\t\tlet autoTeam: { url: string; stop(): Promise<void> } | undefined;\n\t\tlet teamUrl = parsed.team;\n\t\tif (teamUrl === \"auto\") {\n\t\t\tconst { startAutoTeam } = await import(\"./core/team-auto.js\");\n\t\t\ttry {\n\t\t\t\tautoTeam = await startAutoTeam(process.cwd(), { log: (message) => console.log(chalk.dim(message)) });\n\t\t\t\tteamUrl = autoTeam.url;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(chalk.red(error instanceof Error ? error.message : String(error)));\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t}\n\n\t\t// Team mirror + client. Fire-and-forget: connect failures and drops warn\n\t\t// in the background and never block the main agent. Warnings go through\n\t\t// the chat, not console.error: a raw stderr write while the TUI owns the\n\t\t// screen scribbles over the render and can leave the editor looking\n\t\t// frozen. The same connection powers team focus / nudge / attach.\n\t\tlet teamView: { stop(): void } | undefined;\n\t\tif (teamUrl) {\n\t\t\tconst { connectTeamView } = await import(\"./core/team-view.js\");\n\t\t\tconst teamClient = connectTeamView(teamUrl, {\n\t\t\t\twarn: (message) => interactiveMode.showWarning(message),\n\t\t\t});\n\t\t\tteamView = teamClient;\n\t\t\tinteractiveMode.attachTeamClient(teamClient);\n\t\t}\n\t\tif (startupBenchmark) {\n\t\t\tawait interactiveMode.init();\n\t\t\ttime(\"interactiveMode.init\");\n\t\t\tprintTimings();\n\t\t\tteamView?.stop();\n\t\t\tawait autoTeam?.stop();\n\t\t\tinteractiveMode.stop();\n\t\t\tstopThemeWatcher();\n\t\t\tif (process.stdout.writableLength > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => process.stdout.once(\"drain\", resolve));\n\t\t\t}\n\t\t\tif (process.stderr.writableLength > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => process.stderr.once(\"drain\", resolve));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tprintTimings();\n\t\ttry {\n\t\t\tawait interactiveMode.run();\n\t\t} finally {\n\t\t\tteamView?.stop();\n\t\t\tawait autoTeam?.stop();\n\t\t\tawait embsearchService?.dispose();\n\t\t\tunregisterEmbsearchService(sessionManager.getCwd());\n\t\t}\n\t} else {\n\t\tprintTimings();\n\t\tconst exitCode = await runPrintMode(runtime, {\n\t\t\tmode: toPrintOutputMode(appMode),\n\t\t\tmessages: parsed.messages,\n\t\t\tinitialMessage,\n\t\t\tinitialImages,\n\t\t\ttaskId: parsed.taskId,\n\t\t\tmaxTurns: parsed.maxTurns,\n\t\t});\n\t\tawait embsearchService?.dispose();\n\t\tunregisterEmbsearchService(sessionManager.getCwd());\n\t\tstopThemeWatcher();\n\t\trestoreStdout();\n\t\tif (exitCode !== 0) {\n\t\t\tprocess.exitCode = exitCode;\n\t\t}\n\t\t// Spawned subagents (run with a task id) must exit promptly once their work is\n\t\t// done and result.json is written. The child's runtime can leave handles open\n\t\t// (e.g. MCP client connections) that keep the event loop alive, so a natural\n\t\t// exit may never happen. When that occurs the parent lifeguard SIGKILLs the idle\n\t\t// child at the 60s heartbeat threshold and misreports an already-completed task\n\t\t// as \"stalled\". Force a clean exit after draining output to avoid that false stall.\n\t\tconst ranAsSubagent = typeof parsed.taskId === \"string\" && parsed.taskId.length > 0;\n\t\tif (ranAsSubagent) {\n\t\t\tif (process.stdout.writableLength > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => process.stdout.once(\"drain\", resolve));\n\t\t\t}\n\t\t\tif (process.stderr.writableLength > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => process.stderr.once(\"drain\", resolve));\n\t\t\t}\n\t\t\tprocess.exit(exitCode);\n\t\t}\n\t\treturn;\n\t}\n}\n"]}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Main entry point for the coding agent CLI.\n *\n * This file handles CLI argument parsing and translates them into\n * createAgentSession() options. The SDK does the heavy lifting.\n */\n\nimport { resolve } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport { type ImageContent, modelsAreEqual } from \"@kolisachint/hoocode-ai\";\nimport { ProcessTerminal, setKeybindings, TUI } from \"@kolisachint/hoocode-tui\";\nimport chalk from \"chalk\";\nimport { type Args, type Mode, parseArgs, printHelp } from \"./cli/args.js\";\nimport { processFileArguments } from \"./cli/file-processor.js\";\nimport { buildInitialMessage } from \"./cli/initial-message.js\";\nimport { listModels } from \"./cli/list-models.js\";\nimport { selectSession } from \"./cli/session-picker.js\";\nimport { ENV_SESSION_DIR, expandTildePath, getAgentDir, VERSION } from \"./config.js\";\nimport { setAgentCliPaths } from \"./core/agent-manifest-paths.js\";\nimport { type CreateAgentSessionRuntimeFactory, createAgentSessionRuntime } from \"./core/agent-session-runtime.js\";\nimport {\n\ttype AgentSessionRuntimeDiagnostic,\n\tcreateAgentSessionFromServices,\n\tcreateAgentSessionServices,\n} from \"./core/agent-session-services.js\";\nimport { formatNoModelsAvailableMessage } from \"./core/auth-guidance.js\";\nimport { AuthStorage } from \"./core/auth-storage.js\";\nimport { builtinSkillPaths } from \"./core/builtin-skills.js\";\nimport { analyzeDeferral, formatDeferral } from \"./core/capabilities/deferral.js\";\nimport { reportEmbsearchProgress } from \"./core/embsearch/embsearch-progress.js\";\nimport {\n\tEmbsearchService,\n\tregisterEmbsearchService,\n\tunregisterEmbsearchService,\n} from \"./core/embsearch/embsearch-service.js\";\nimport { exportFromFile } from \"./core/export-html/index.js\";\nimport { parsePlatforms, setPlatforms } from \"./core/extensions/plugins/formats/platform-targets.js\";\nimport type { ExtensionAPI, ExtensionFactory } from \"./core/extensions/types.js\";\nimport { KeybindingsManager } from \"./core/keybindings.js\";\nimport {\n\tcreateLightTools,\n\tLIGHT_MODE_ENV,\n\tLIGHT_SYSTEM_PROMPT,\n\tLIGHT_TOOL_NAMES,\n\tmeasurePromptSurface,\n} from \"./core/light.js\";\nimport type { ModelRegistry } from \"./core/model-registry.js\";\nimport { resolveCliModel, resolveModelScope, type ScopedModel } from \"./core/model-resolver.js\";\nimport { restoreStdout, takeOverStdout } from \"./core/output-guard.js\";\nimport type { CreateAgentSessionOptions } from \"./core/sdk.js\";\nimport {\n\tformatMissingSessionCwdPrompt,\n\tgetMissingSessionCwdIssue,\n\tMissingSessionCwdError,\n\ttype SessionCwdIssue,\n} from \"./core/session-cwd.js\";\nimport { SessionManager } from \"./core/session-manager.js\";\nimport { SettingsManager } from \"./core/settings-manager.js\";\nimport {\n\tcanSpawnSubagent,\n\tDEFER_MCP_SCHEMAS_ENV,\n\tDELEGATE_ALLOW_ENV,\n\tNESTED_CONCURRENCY_ENV,\n\tresolveMaxSubagentDepth,\n\tresolveNestedConcurrency,\n\tSUBAGENT_MAX_DEPTH_ENV,\n} from \"./core/subagent-depth.js\";\nimport { printTimings, resetTimings, time } from \"./core/timings.js\";\nimport { createPackagePluginToolDefinition } from \"./core/tools/package-plugin.js\";\nimport { createPluginLifecycleToolDefinitions } from \"./core/tools/plugins.js\";\nimport { createProposePluginToolDefinitions } from \"./core/tools/propose-plugin.js\";\nimport {\n\tbuildTaskMainPrompt,\n\tcreateTaskOutputToolDefinition,\n\tcreateTaskToolDefinition,\n} from \"./core/tools/subagent.js\";\nimport { createTodoWriteToolDefinition } from \"./core/tools/todo.js\";\nimport { WARM_SUBAGENTS_ENV } from \"./core/warm-subagent-pool-instance.js\";\n// Static import (not dynamic) so `bun build --compile` statically reaches\n// hoo-core from the compiled entry chain (src/bun/cli.ts -> src/cli.ts ->\n// main.ts) and bundles it into the standalone binary. The node CLI reaches it\n// via this same path through DEFAULT_EXTENSION_FACTORIES below.\nimport hooCore from \"./extensions/core/hoo-core.js\";\nimport { runMigrations, showDeprecationWarnings } from \"./migrations.js\";\nimport { InteractiveMode, runPrintMode, runRpcMode } from \"./modes/index.js\";\nimport { ExtensionSelectorComponent } from \"./modes/interactive/components/extension-selector.js\";\nimport { initTheme, stopThemeWatcher } from \"./modes/interactive/theme/theme.js\";\nimport { handleConfigCommand, handlePackageCommand } from \"./package-manager-cli.js\";\nimport { handleResourcesCommand } from \"./resources-cli.js\";\nimport { isLocalPath } from \"./utils/paths.js\";\n\n/**\n * Read all content from piped stdin.\n * Returns undefined if stdin is a TTY (interactive terminal).\n */\nasync function readPipedStdin(): Promise<string | undefined> {\n\t// If stdin is a TTY, we're running interactively - don't read stdin\n\tif (process.stdin.isTTY) {\n\t\treturn undefined;\n\t}\n\n\treturn new Promise((resolve) => {\n\t\tlet data = \"\";\n\t\tprocess.stdin.setEncoding(\"utf8\");\n\t\tprocess.stdin.on(\"data\", (chunk) => {\n\t\t\tdata += chunk;\n\t\t});\n\t\tprocess.stdin.on(\"end\", () => {\n\t\t\tresolve(data.trim() || undefined);\n\t\t});\n\t\tprocess.stdin.resume();\n\t});\n}\n\nfunction collectSettingsDiagnostics(\n\tsettingsManager: SettingsManager,\n\tcontext: string,\n): AgentSessionRuntimeDiagnostic[] {\n\treturn settingsManager.drainErrors().map(({ scope, error }) => ({\n\t\ttype: \"warning\",\n\t\tmessage: `(${context}, ${scope} settings) ${error.message}`,\n\t}));\n}\n\nfunction reportDiagnostics(diagnostics: readonly AgentSessionRuntimeDiagnostic[]): void {\n\tfor (const diagnostic of diagnostics) {\n\t\tconst color = diagnostic.type === \"error\" ? chalk.red : diagnostic.type === \"warning\" ? chalk.yellow : chalk.dim;\n\t\tconst prefix = diagnostic.type === \"error\" ? \"Error: \" : diagnostic.type === \"warning\" ? \"Warning: \" : \"\";\n\t\tconsole.error(color(`${prefix}${diagnostic.message}`));\n\t}\n}\n\nfunction isTruthyEnvFlag(value: string | undefined): boolean {\n\tif (!value) return false;\n\treturn value === \"1\" || value.toLowerCase() === \"true\" || value.toLowerCase() === \"yes\";\n}\n\ntype AppMode = \"interactive\" | \"print\" | \"json\" | \"rpc\";\n\nfunction resolveAppMode(parsed: Args, stdinIsTTY: boolean): AppMode {\n\tif (parsed.mode === \"rpc\") {\n\t\treturn \"rpc\";\n\t}\n\tif (parsed.mode === \"json\") {\n\t\treturn \"json\";\n\t}\n\tif (parsed.print || !stdinIsTTY) {\n\t\treturn \"print\";\n\t}\n\treturn \"interactive\";\n}\n\nfunction toPrintOutputMode(appMode: AppMode): Exclude<Mode, \"rpc\"> {\n\treturn appMode === \"json\" ? \"json\" : \"text\";\n}\n\nasync function prepareInitialMessage(\n\tparsed: Args,\n\tautoResizeImages: boolean,\n\tstdinContent?: string,\n): Promise<{\n\tinitialMessage?: string;\n\tinitialImages?: ImageContent[];\n}> {\n\tif (parsed.fileArgs.length === 0) {\n\t\treturn buildInitialMessage({ parsed, stdinContent });\n\t}\n\n\tconst { text, images } = await processFileArguments(parsed.fileArgs, { autoResizeImages });\n\treturn buildInitialMessage({\n\t\tparsed,\n\t\tfileText: text,\n\t\tfileImages: images,\n\t\tstdinContent,\n\t});\n}\n\n/** Result from resolving a session argument */\ntype ResolvedSession =\n\t| { type: \"path\"; path: string } // Direct file path\n\t| { type: \"local\"; path: string } // Found in current project\n\t| { type: \"global\"; path: string; cwd: string } // Found in different project\n\t| { type: \"not_found\"; arg: string }; // Not found anywhere\n\n/**\n * Resolve a session argument to a file path.\n * If it looks like a path, use as-is. Otherwise try to match as session ID prefix.\n */\nasync function resolveSessionPath(sessionArg: string, cwd: string, sessionDir?: string): Promise<ResolvedSession> {\n\t// If it looks like a file path, use as-is\n\tif (sessionArg.includes(\"/\") || sessionArg.includes(\"\\\\\") || sessionArg.endsWith(\".jsonl\")) {\n\t\treturn { type: \"path\", path: sessionArg };\n\t}\n\n\t// Try to match as session ID in current project first\n\tconst localSessions = await SessionManager.list(cwd, sessionDir);\n\tconst localMatches = localSessions.filter((s) => s.id.startsWith(sessionArg));\n\n\tif (localMatches.length >= 1) {\n\t\treturn { type: \"local\", path: localMatches[0].path };\n\t}\n\n\t// Try global search across all projects\n\tconst allSessions = await SessionManager.listAll();\n\tconst globalMatches = allSessions.filter((s) => s.id.startsWith(sessionArg));\n\n\tif (globalMatches.length >= 1) {\n\t\tconst match = globalMatches[0];\n\t\treturn { type: \"global\", path: match.path, cwd: match.cwd };\n\t}\n\n\t// Not found anywhere\n\treturn { type: \"not_found\", arg: sessionArg };\n}\n\n/** Prompt user for yes/no confirmation */\nasync function promptConfirm(message: string): Promise<boolean> {\n\treturn new Promise((resolve) => {\n\t\tconst rl = createInterface({\n\t\t\tinput: process.stdin,\n\t\t\toutput: process.stdout,\n\t\t});\n\t\trl.question(`${message} [y/N] `, (answer) => {\n\t\t\trl.close();\n\t\t\tresolve(answer.toLowerCase() === \"y\" || answer.toLowerCase() === \"yes\");\n\t\t});\n\t});\n}\n\nfunction validateForkFlags(parsed: Args): void {\n\tif (!parsed.fork) return;\n\n\tconst conflictingFlags = [\n\t\tparsed.session ? \"--session\" : undefined,\n\t\tparsed.continue ? \"--continue\" : undefined,\n\t\tparsed.resume ? \"--resume\" : undefined,\n\t\tparsed.noSession ? \"--no-session\" : undefined,\n\t].filter((flag): flag is string => flag !== undefined);\n\n\tif (conflictingFlags.length > 0) {\n\t\tconsole.error(chalk.red(`Error: --fork cannot be combined with ${conflictingFlags.join(\", \")}`));\n\t\tprocess.exit(1);\n\t}\n}\n\nfunction forkSessionOrExit(sourcePath: string, cwd: string, sessionDir?: string): SessionManager {\n\ttry {\n\t\treturn SessionManager.forkFrom(sourcePath, cwd, sessionDir);\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tprocess.exit(1);\n\t}\n}\n\nasync function createSessionManager(\n\tparsed: Args,\n\tcwd: string,\n\tsessionDir: string | undefined,\n\tsettingsManager: SettingsManager,\n): Promise<SessionManager> {\n\tif (parsed.noSession) {\n\t\treturn SessionManager.inMemory();\n\t}\n\n\tif (parsed.fork) {\n\t\tconst resolved = await resolveSessionPath(parsed.fork, cwd, sessionDir);\n\n\t\tswitch (resolved.type) {\n\t\t\tcase \"path\":\n\t\t\tcase \"local\":\n\t\t\tcase \"global\":\n\t\t\t\treturn forkSessionOrExit(resolved.path, cwd, sessionDir);\n\n\t\t\tcase \"not_found\":\n\t\t\t\tconsole.error(chalk.red(`No session found matching '${resolved.arg}'`));\n\t\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\tif (parsed.session) {\n\t\tconst resolved = await resolveSessionPath(parsed.session, cwd, sessionDir);\n\n\t\tswitch (resolved.type) {\n\t\t\tcase \"path\":\n\t\t\tcase \"local\":\n\t\t\t\treturn SessionManager.open(resolved.path, sessionDir);\n\n\t\t\tcase \"global\": {\n\t\t\t\tconsole.log(chalk.yellow(`Session found in different project: ${resolved.cwd}`));\n\t\t\t\tconst shouldFork = await promptConfirm(\"Fork this session into current directory?\");\n\t\t\t\tif (!shouldFork) {\n\t\t\t\t\tconsole.log(chalk.dim(\"Aborted.\"));\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t\treturn forkSessionOrExit(resolved.path, cwd, sessionDir);\n\t\t\t}\n\n\t\t\tcase \"not_found\":\n\t\t\t\tconsole.error(chalk.red(`No session found matching '${resolved.arg}'`));\n\t\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\tif (parsed.resume) {\n\t\tinitTheme(settingsManager.getTheme(), true);\n\t\ttry {\n\t\t\tconst selectedPath = await selectSession(\n\t\t\t\t(onProgress) => SessionManager.list(cwd, sessionDir, onProgress),\n\t\t\t\tSessionManager.listAll,\n\t\t\t);\n\t\t\tif (!selectedPath) {\n\t\t\t\tconsole.log(chalk.dim(\"No session selected\"));\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t\treturn SessionManager.open(selectedPath, sessionDir);\n\t\t} finally {\n\t\t\tstopThemeWatcher();\n\t\t}\n\t}\n\n\tif (parsed.continue) {\n\t\treturn SessionManager.continueRecent(cwd, sessionDir);\n\t}\n\n\treturn SessionManager.create(cwd, sessionDir);\n}\n\nfunction buildSessionOptions(\n\tparsed: Args,\n\tscopedModels: ScopedModel[],\n\thasExistingSession: boolean,\n\tmodelRegistry: ModelRegistry,\n\tsettingsManager: SettingsManager,\n\tlightMode: boolean,\n): {\n\toptions: CreateAgentSessionOptions;\n\tcliThinkingFromModel: boolean;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n} {\n\tconst options: CreateAgentSessionOptions = {};\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\tlet cliThinkingFromModel = false;\n\n\t// Model from CLI\n\t// - supports --provider <name> --model <pattern>\n\t// - supports --model <provider>/<pattern>\n\tif (parsed.model) {\n\t\tconst resolved = resolveCliModel({\n\t\t\tcliProvider: parsed.provider,\n\t\t\tcliModel: parsed.model,\n\t\t\tmodelRegistry,\n\t\t});\n\t\tif (resolved.warning) {\n\t\t\tdiagnostics.push({ type: \"warning\", message: resolved.warning });\n\t\t}\n\t\tif (resolved.error) {\n\t\t\tdiagnostics.push({ type: \"error\", message: resolved.error });\n\t\t}\n\t\tif (resolved.model) {\n\t\t\toptions.model = resolved.model;\n\t\t\t// Allow \"--model <pattern>:<thinking>\" as a shorthand.\n\t\t\t// Explicit --thinking still takes precedence (applied later).\n\t\t\tif (!parsed.thinking && resolved.thinkingLevel) {\n\t\t\t\toptions.thinkingLevel = resolved.thinkingLevel;\n\t\t\t\tcliThinkingFromModel = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!options.model && scopedModels.length > 0 && !hasExistingSession) {\n\t\t// Check if saved default is in scoped models - use it if so, otherwise first scoped model\n\t\tconst savedProvider = settingsManager.getDefaultProvider();\n\t\tconst savedModelId = settingsManager.getDefaultModel();\n\t\tconst savedModel = savedProvider && savedModelId ? modelRegistry.find(savedProvider, savedModelId) : undefined;\n\t\tconst savedInScope = savedModel ? scopedModels.find((sm) => modelsAreEqual(sm.model, savedModel)) : undefined;\n\n\t\tif (savedInScope) {\n\t\t\toptions.model = savedInScope.model;\n\t\t\t// Use thinking level from scoped model config if explicitly set\n\t\t\tif (!parsed.thinking && savedInScope.thinkingLevel) {\n\t\t\t\toptions.thinkingLevel = savedInScope.thinkingLevel;\n\t\t\t}\n\t\t} else {\n\t\t\toptions.model = scopedModels[0].model;\n\t\t\t// Use thinking level from first scoped model if explicitly set\n\t\t\tif (!parsed.thinking && scopedModels[0].thinkingLevel) {\n\t\t\t\toptions.thinkingLevel = scopedModels[0].thinkingLevel;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Thinking level from CLI (takes precedence over scoped model thinking levels set above)\n\tif (parsed.thinking) {\n\t\toptions.thinkingLevel = parsed.thinking;\n\t}\n\n\t// Scoped models for Ctrl+P cycling\n\t// Keep thinking level undefined when not explicitly set in the model pattern.\n\t// Undefined means \"inherit current session thinking level\" during cycling.\n\tif (scopedModels.length > 0) {\n\t\toptions.scopedModels = scopedModels.map((sm) => ({\n\t\t\tmodel: sm.model,\n\t\t\tthinkingLevel: sm.thinkingLevel,\n\t\t}));\n\t}\n\n\t// API key from CLI - set in authStorage\n\t// (handled by caller before createAgentSession)\n\n\t// Tools\n\tif (parsed.noTools) {\n\t\toptions.noTools = \"all\";\n\t} else if (parsed.noBuiltinTools) {\n\t\toptions.noTools = \"builtin\";\n\t}\n\tif (parsed.tools) {\n\t\toptions.tools = [...parsed.tools];\n\t}\n\tif (parsed.disallowedTools) {\n\t\toptions.disallowedTools = [...parsed.disallowedTools];\n\t}\n\t// Persisted per-tool disables from the TUI (/settings → Tools). These compose\n\t// with any CLI denylist and always subtract from the active tool set: a tool\n\t// listed here stays off even if it also appears in the --tools allowlist.\n\tconst disabledTools = settingsManager.getDisabledTools();\n\tif (disabledTools.length > 0) {\n\t\toptions.disallowedTools = [...new Set([...(options.disallowedTools ?? []), ...disabledTools])];\n\t}\n\t// Light preset: restrict to the four core tools unless the user passed an\n\t// explicit allowlist or suppression flag (explicit flags win over the preset).\n\t// The allowlist also blocks Task/TodoWrite/plugin tools from becoming active.\n\tif (lightMode && !parsed.tools && !parsed.noTools && !parsed.noBuiltinTools) {\n\t\toptions.tools = [...LIGHT_TOOL_NAMES];\n\t}\n\t// Artifact platform targeting: the --platform flag (falls back to the\n\t// `platform` setting, which /settings also writes) picks which vendor\n\t// layout(s) hoocode writes when it produces artifacts — authored plugins\n\t// (ProposePlugin) and the /new-skill //new-agent //new-command scaffolds.\n\t// Stored as process-wide state next to the format registry; readers of every\n\t// format stay unaffected.\n\tconst platformTokens = parsed.platform ?? settingsManager.getPlatform();\n\tif (platformTokens && platformTokens.length > 0) {\n\t\tconst { platforms, invalid } = parsePlatforms(platformTokens);\n\t\tfor (const token of invalid) {\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"warning\",\n\t\t\t\tmessage: `Unknown --platform \"${token}\" (valid: claude, copilot|github|gh, agents|native)`,\n\t\t\t});\n\t\t}\n\t\tif (platforms.length > 0) {\n\t\t\tsetPlatforms(platforms);\n\t\t} else {\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"warning\",\n\t\t\t\tmessage: \"--platform resolved no valid platforms; using the default targets\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Web tools (webfetch + websearch): opt-in via --enable-webtools flag or the\n\t// enableWebTools setting. They are registered as base tools but inactive by\n\t// default; this adds them to the default active set.\n\tif (parsed.enableWebTools ?? settingsManager.getEnableWebTools()) {\n\t\toptions.enableWebTools = true;\n\t}\n\t// Ranked code search (search tool, lexical + semantic hybrid). The search tool\n\t// is active by default. The enableSemanticIndex setting controls whether the\n\t// optional semantic index layer starts; when off, search degrades to lexical-only.\n\tif (parsed.enableSemanticIndex ?? settingsManager.getEnableSemanticIndex()) {\n\t\toptions.enableSemanticIndex = true;\n\t}\n\n\t// Optional Task (subagent) tool: opt-in via --enable-subagents flag or the enableSubagent setting.\n\t// Registered as a custom tool; respects --tools/--no-tools allowlists like any other tool.\n\t//\n\t// Nesting is bounded by the tree-wide cap (maxSubagentDepth, default 1). The root\n\t// seeds the cap into the environment so every descendant agrees on one value; the\n\t// Task tool is registered only while this process's depth is below that cap. At the\n\t// default cap this reproduces the original guard exactly: subagents (depth >= 1) get\n\t// no Task tool and cannot recursively dispatch.\n\tconst isSubagentChild = parsed.taskId !== undefined;\n\tif (process.env[SUBAGENT_MAX_DEPTH_ENV] === undefined) {\n\t\t// The root seeds the tree-wide cap; the --max-subagent-depth flag overrides the\n\t\t// setting. resolveMaxSubagentDepth clamps it to the supported range so the seeded\n\t\t// env (and everything that inherits it) carries a sane value. Descendants inherit\n\t\t// it via the environment (env already set => keep it).\n\t\tprocess.env[SUBAGENT_MAX_DEPTH_ENV] = String(\n\t\t\tresolveMaxSubagentDepth(parsed.maxSubagentDepth ?? settingsManager.getMaxSubagentDepth()),\n\t\t);\n\t}\n\tif (process.env[NESTED_CONCURRENCY_ENV] === undefined) {\n\t\t// Seed the nested-pool concurrency from settings so descendants agree on one value.\n\t\tprocess.env[NESTED_CONCURRENCY_ENV] = String(\n\t\t\tresolveNestedConcurrency(settingsManager.getNestedSubagentConcurrency()),\n\t\t);\n\t}\n\t// Scoped delegation: --delegate-allow is the authoritative restriction for this\n\t// process. Set it from the flag, or clear any inherited value so a restricted\n\t// parent's scope never leaks into a child that wasn't given its own.\n\tif (parsed.delegateAllow && parsed.delegateAllow.length > 0) {\n\t\tprocess.env[DELEGATE_ALLOW_ENV] = parsed.delegateAllow.join(\",\");\n\t} else {\n\t\tdelete process.env[DELEGATE_ALLOW_ENV];\n\t}\n\tif (!lightMode && canSpawnSubagent() && (parsed.subagent ?? settingsManager.getEnableSubagent())) {\n\t\toptions.customTools = [\n\t\t\t...(options.customTools ?? []),\n\t\t\tcreateTaskToolDefinition(),\n\t\t\tcreateTaskOutputToolDefinition(),\n\t\t];\n\t\t// Warm subagents (experimental): dispatch eligible foreground subagents on\n\t\t// reused RPC workers to skip the cold-boot. Root-only — the Task tool exists\n\t\t// only where canSpawnSubagent holds and never inside a spawned child — and\n\t\t// carried via env so the Task tool reads it without threading a setting.\n\t\tif (!isSubagentChild && (parsed.warmSubagents ?? settingsManager.getWarmSubagents())) {\n\t\t\tprocess.env[WARM_SUBAGENTS_ENV] = \"1\";\n\t\t}\n\t}\n\n\t// Optional TodoWrite tool: opt-in via --enable-todowrite flag or the\n\t// enableTodoWrite setting. Never registered inside a spawned subagent child —\n\t// its todos would otherwise leak into the parent's \"main\" task group in the pane.\n\tif (!isSubagentChild && !lightMode && (parsed.todoWrite ?? settingsManager.getEnableTodoWrite())) {\n\t\toptions.customTools = [...(options.customTools ?? []), createTodoWriteToolDefinition()];\n\t}\n\n\t// Deferred MCP tool schemas (default on; disable via deferMcpSchemas=false): set\n\t// for the top-level agent only. Subagent\n\t// children clear this env (see subagent-pool) so a child that needs MCP resolves\n\t// its allowlisted tools eagerly at dispatch.\n\tif (!isSubagentChild && settingsManager.getDeferMcpSchemas()) {\n\t\tprocess.env[DEFER_MCP_SCHEMAS_ENV] = \"1\";\n\t}\n\n\t// Plugin lifecycle tools (SearchPlugins, InstallPlugin, ...). Top-level agent\n\t// only: these are capability-acquisition tools and must never be available to\n\t// a spawned subagent child (privilege-amplification guardrail, spec §3).\n\t// `enablePluginTools` is the master switch for the whole autonomous plugin\n\t// system (default off) — it gates both these tools and the runtime reuse\n\t// nudge (see extensions/core/prompt-reactive), so both flip together.\n\tif (!isSubagentChild && !lightMode && (parsed.enablePluginTools ?? settingsManager.getEnablePluginTools())) {\n\t\toptions.customTools = [\n\t\t\t...(options.customTools ?? []),\n\t\t\t...createPluginLifecycleToolDefinitions(),\n\t\t\t...createProposePluginToolDefinitions(),\n\t\t\tcreatePackagePluginToolDefinition(),\n\t\t];\n\t}\n\n\treturn { options, cliThinkingFromModel, diagnostics };\n}\n\nfunction resolveCliPaths(cwd: string, paths: string[] | undefined): string[] | undefined {\n\treturn paths?.map((value) => (isLocalPath(value) ? resolve(cwd, value) : value));\n}\n\nasync function promptForMissingSessionCwd(\n\tissue: SessionCwdIssue,\n\tsettingsManager: SettingsManager,\n): Promise<string | undefined> {\n\tinitTheme(settingsManager.getTheme());\n\tsetKeybindings(KeybindingsManager.create());\n\n\treturn new Promise((resolve) => {\n\t\tconst ui = new TUI(new ProcessTerminal(), settingsManager.getShowHardwareCursor());\n\t\tui.setClearOnShrink(settingsManager.getClearOnShrink());\n\n\t\tlet settled = false;\n\t\tconst finish = (result: string | undefined) => {\n\t\t\tif (settled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettled = true;\n\t\t\tui.stop();\n\t\t\tresolve(result);\n\t\t};\n\n\t\tconst selector = new ExtensionSelectorComponent(\n\t\t\tformatMissingSessionCwdPrompt(issue),\n\t\t\t[\"Continue\", \"Cancel\"],\n\t\t\t(option) => finish(option === \"Continue\" ? issue.fallbackCwd : undefined),\n\t\t\t() => finish(undefined),\n\t\t\t{ tui: ui },\n\t\t);\n\t\tui.addChild(selector);\n\t\tui.setFocus(selector);\n\t\tui.start();\n\t});\n}\n\nexport interface MainOptions {\n\textensionFactories?: ExtensionFactory[];\n}\n\n/**\n * Built-in extension factories loaded when the caller supplies none. This is\n * the single source of truth for the app's built-ins (hoo-core: /loop, /plugin,\n * /mode, /cost, scaffold commands, the MCP loader + remote-MCP/OAuth flow).\n * Both entry points — the node CLI (bin/hoocode.js) and the compiled binary\n * (src/cli.ts) — call main() without factories and inherit this default.\n * Downstream embedders that pass their own extensionFactories override it.\n */\nconst DEFAULT_EXTENSION_FACTORIES: ExtensionFactory[] = [hooCore];\n\nexport async function main(args: string[], options?: MainOptions) {\n\tresetTimings();\n\tconst offlineMode = args.includes(\"--offline\") || isTruthyEnvFlag(process.env.HOOCODE_OFFLINE);\n\tif (offlineMode) {\n\t\tprocess.env.HOOCODE_OFFLINE = \"1\";\n\t\tprocess.env.HOOCODE_SKIP_VERSION_CHECK = \"1\";\n\t}\n\n\tif (await handlePackageCommand(args)) {\n\t\treturn;\n\t}\n\n\tif (await handleConfigCommand(args)) {\n\t\treturn;\n\t}\n\n\tif (await handleResourcesCommand(args)) {\n\t\treturn;\n\t}\n\n\tconst parsed = parseArgs(args);\n\tif (parsed.diagnostics.length > 0) {\n\t\tfor (const d of parsed.diagnostics) {\n\t\t\tconst color = d.type === \"error\" ? chalk.red : chalk.yellow;\n\t\t\tconsole.error(color(`${d.type === \"error\" ? \"Error\" : \"Warning\"}: ${d.message}`));\n\t\t}\n\t\tif (parsed.diagnostics.some((d) => d.type === \"error\")) {\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\ttime(\"parseArgs\");\n\tlet appMode = resolveAppMode(parsed, process.stdin.isTTY);\n\tconst shouldTakeOverStdout = appMode !== \"interactive\";\n\tif (shouldTakeOverStdout) {\n\t\ttakeOverStdout();\n\t}\n\n\tif (parsed.version) {\n\t\tconsole.log(VERSION);\n\t\tprocess.exit(0);\n\t}\n\n\tif (parsed.export) {\n\t\tlet result: string;\n\t\ttry {\n\t\t\tconst outputPath = parsed.messages.length > 0 ? parsed.messages[0] : undefined;\n\t\t\tresult = await exportFromFile(parsed.export, outputPath);\n\t\t} catch (error: unknown) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Failed to export session\";\n\t\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconsole.log(`Exported to: ${result}`);\n\t\tprocess.exit(0);\n\t}\n\n\tif (parsed.mode === \"rpc\" && parsed.fileArgs.length > 0) {\n\t\tconsole.error(chalk.red(\"Error: @file arguments are not supported in RPC mode\"));\n\t\tprocess.exit(1);\n\t}\n\n\tvalidateForkFlags(parsed);\n\n\t// Run migrations (pass cwd for project-local migrations)\n\tconst { migratedAuthProviders: migratedProviders, deprecationWarnings } = runMigrations(process.cwd());\n\ttime(\"runMigrations\");\n\n\tconst cwd = process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst startupSettingsManager = SettingsManager.create(cwd, agentDir);\n\treportDiagnostics(collectSettingsDiagnostics(startupSettingsManager, \"startup session lookup\"));\n\n\t// Decide the final runtime cwd before creating cwd-bound runtime services.\n\t// --session and --resume may select a session from another project, so project-local\n\t// settings, resources, provider registrations, and models must be resolved only after\n\t// the target session cwd is known. The startup-cwd settings manager is used only for\n\t// sessionDir lookup during session selection.\n\tconst envSessionDir = process.env[ENV_SESSION_DIR];\n\tconst sessionDir =\n\t\tparsed.sessionDir ??\n\t\t(envSessionDir ? expandTildePath(envSessionDir) : undefined) ??\n\t\tstartupSettingsManager.getSessionDir();\n\tlet sessionManager = await createSessionManager(parsed, cwd, sessionDir, startupSettingsManager);\n\tconst missingSessionCwdIssue = getMissingSessionCwdIssue(sessionManager, cwd);\n\tif (missingSessionCwdIssue) {\n\t\tif (appMode === \"interactive\") {\n\t\t\tconst selectedCwd = await promptForMissingSessionCwd(missingSessionCwdIssue, startupSettingsManager);\n\t\t\tif (!selectedCwd) {\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t\tsessionManager = SessionManager.open(missingSessionCwdIssue.sessionFile!, sessionDir, selectedCwd);\n\t\t} else {\n\t\t\tconsole.error(chalk.red(new MissingSessionCwdError(missingSessionCwdIssue).message));\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\ttime(\"createSessionManager\");\n\n\tconst resolvedExtensionPaths = resolveCliPaths(cwd, parsed.extensions);\n\tconst resolvedSkillPaths = resolveCliPaths(cwd, parsed.skills);\n\tconst resolvedAgentPaths = resolveCliPaths(cwd, parsed.agents);\n\tconst resolvedPromptTemplatePaths = resolveCliPaths(cwd, parsed.promptTemplates);\n\tconst resolvedSlashCommandPaths = resolveCliPaths(cwd, parsed.slashCommands);\n\tconst resolvedThemePaths = resolveCliPaths(cwd, parsed.themes);\n\n\t// Populate the module-level CLI agent store before any session is created.\n\tsetAgentCliPaths(resolvedAgentPaths ?? []);\n\n\t// Synthetic factory: feed CLI --mode-path values into the extension runtime\n\t// so hoo-core (and any other extension that reads pi.getModeSearchPaths)\n\t// sees them alongside extension-registered dirs.\n\tconst cliModePaths = parsed.modePaths ?? [];\n\tconst cliResourcePathFactories: ExtensionFactory[] =\n\t\tcliModePaths.length === 0\n\t\t\t? []\n\t\t\t: [\n\t\t\t\t\tObject.assign(\n\t\t\t\t\t\t(pi: ExtensionAPI) => {\n\t\t\t\t\t\t\tfor (const p of cliModePaths) pi.addModeSearchPath(p);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ internal: true },\n\t\t\t\t\t),\n\t\t\t\t];\n\t// `??` (not `[...a, ...b]`) so an explicit list — from bin/hoocode.js or a\n\t// downstream embedder — fully replaces the default and hoo-core is never\n\t// registered twice.\n\tconst allExtensionFactories: ExtensionFactory[] = [\n\t\t...cliResourcePathFactories,\n\t\t...(options?.extensionFactories ?? DEFAULT_EXTENSION_FACTORIES),\n\t];\n\tconst authStorage = AuthStorage.create();\n\t// A spawned subagent (run with a task id) is a single-shot, non-interactive\n\t// process: it renders no TUI and its prompt is a plain task, never a slash\n\t// command. Themes, slash commands, and prompt templates are dead weight in that\n\t// path, so skip loading them to trim the child's cold-boot cost. Skills, context\n\t// files, and extensions (which carry the core tools) are kept — they affect the\n\t// subagent's actual work.\n\tconst isSubagentBoot = parsed.taskId !== undefined;\n\tconst createRuntime: CreateAgentSessionRuntimeFactory = async ({\n\t\tcwd,\n\t\tagentDir,\n\t\tsessionManager,\n\t\tsessionStartEvent,\n\t}) => {\n\t\t// Light preset: resolve before services so it can shape resource loading\n\t\t// (no skills/context files, terse system prompt). The env flag tells code\n\t\t// that cannot see flags or settings — the hoo-core modes extension — to\n\t\t// skip its system-prompt appendix.\n\t\tconst earlySettingsManager = SettingsManager.create(cwd, agentDir);\n\t\tconst lightMode = parsed.light ?? earlySettingsManager.getLight();\n\t\tif (lightMode) {\n\t\t\tprocess.env[LIGHT_MODE_ENV] = \"1\";\n\t\t} else {\n\t\t\tdelete process.env[LIGHT_MODE_ENV];\n\t\t}\n\t\t// Skills hoocode ships itself. Contributed as explicit paths rather than a\n\t\t// default directory so `--no-skills` and light mode suppress them the same\n\t\t// way they suppress everything else, and so a gated-off skill is never\n\t\t// materialized at all.\n\t\tconst builtinSkills =\n\t\t\tparsed.noSkills || lightMode\n\t\t\t\t? []\n\t\t\t\t: builtinSkillPaths({ enablePluginTools: earlySettingsManager.getEnablePluginTools() }, agentDir);\n\n\t\tconst services = await createAgentSessionServices({\n\t\t\tcwd,\n\t\t\tagentDir,\n\t\t\tauthStorage,\n\t\t\tsettingsManager: earlySettingsManager,\n\t\t\textensionFlagValues: parsed.unknownFlags,\n\t\t\tresourceLoaderOptions: {\n\t\t\t\tadditionalExtensionPaths: resolvedExtensionPaths,\n\t\t\t\t// Built-ins last. Skill paths are first-wins by name, so anything the\n\t\t\t\t// user pointed at - `--skills`, a settings path, `~/.agents/skills`,\n\t\t\t\t// `.hoocode/skills` - beats a skill hoocode ships under the same name,\n\t\t\t\t// and the collision is still reported as a diagnostic. Left untouched\n\t\t\t\t// when there are no built-ins, so that path is byte for byte what it was.\n\t\t\t\tadditionalSkillPaths:\n\t\t\t\t\tbuiltinSkills.length > 0 ? [...(resolvedSkillPaths ?? []), ...builtinSkills] : resolvedSkillPaths,\n\t\t\t\tadditionalPromptTemplatePaths: resolvedPromptTemplatePaths,\n\t\t\t\tadditionalSlashCommandPaths: resolvedSlashCommandPaths,\n\t\t\t\tadditionalThemePaths: resolvedThemePaths,\n\t\t\t\tnoExtensions: parsed.noExtensions,\n\t\t\t\tnoSkills: parsed.noSkills || lightMode,\n\t\t\t\tnoPromptTemplates: parsed.noPromptTemplates || isSubagentBoot,\n\t\t\t\tnoSlashCommands: parsed.noSlashCommands || isSubagentBoot,\n\t\t\t\tnoThemes: parsed.noThemes || isSubagentBoot,\n\t\t\t\tnoContextFiles: parsed.noContextFiles || lightMode,\n\t\t\t\tsystemPrompt: parsed.systemPrompt ?? (lightMode ? LIGHT_SYSTEM_PROMPT : undefined),\n\t\t\t\textensionFactories: allExtensionFactories,\n\t\t\t},\n\t\t});\n\t\tconst { settingsManager, modelRegistry, resourceLoader } = services;\n\t\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [\n\t\t\t...services.diagnostics,\n\t\t\t...collectSettingsDiagnostics(settingsManager, \"runtime creation\"),\n\t\t\t// Warnings here describe an extension that loaded with something held back\n\t\t\t// (workspace trust withholding a plugin's hooks and MCP servers). They are\n\t\t\t// reported and stepped over; only real load failures abort startup below.\n\t\t\t...resourceLoader\n\t\t\t\t.getExtensions()\n\t\t\t\t.errors.map(({ path, error, severity }) =>\n\t\t\t\t\tseverity === \"warning\"\n\t\t\t\t\t\t? { type: \"warning\" as const, message: `${error} (${path})` }\n\t\t\t\t\t\t: { type: \"error\" as const, message: `Failed to load extension \"${path}\": ${error}` },\n\t\t\t\t),\n\t\t];\n\n\t\t// When subagent tooling is enabled, append the main session subagent instructions.\n\t\tif (!lightMode && (parsed.subagent ?? settingsManager.getEnableSubagent())) {\n\t\t\tresourceLoader.addAppendSystemPrompt(buildTaskMainPrompt());\n\t\t}\n\n\t\tconst modelPatterns = parsed.models ?? settingsManager.getEnabledModels();\n\t\tconst scopedModels =\n\t\t\tmodelPatterns && modelPatterns.length > 0 ? await resolveModelScope(modelPatterns, modelRegistry) : [];\n\t\tconst {\n\t\t\toptions: sessionOptions,\n\t\t\tcliThinkingFromModel,\n\t\t\tdiagnostics: sessionOptionDiagnostics,\n\t\t} = buildSessionOptions(\n\t\t\tparsed,\n\t\t\tscopedModels,\n\t\t\tsessionManager.buildSessionContext().messages.length > 0,\n\t\t\tmodelRegistry,\n\t\t\tsettingsManager,\n\t\t\tlightMode,\n\t\t);\n\t\tdiagnostics.push(...sessionOptionDiagnostics);\n\t\t// Swap in the short-schema read/write/edit/bash tool variants. Skipped\n\t\t// when the user's own --tools allowlist overrode the light tool set.\n\t\tif (lightMode && !parsed.tools) {\n\t\t\tsessionOptions.baseToolsOverride = createLightTools(cwd);\n\t\t}\n\n\t\tif (parsed.apiKey) {\n\t\t\tif (!sessionOptions.model) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tmessage: \"--api-key requires a model to be specified via --model, --provider/--model, or --models\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tauthStorage.setRuntimeApiKey(sessionOptions.model.provider, parsed.apiKey);\n\t\t\t}\n\t\t}\n\n\t\tconst created = await createAgentSessionFromServices({\n\t\t\tservices,\n\t\t\tsessionManager,\n\t\t\tsessionStartEvent,\n\t\t\tmodel: sessionOptions.model,\n\t\t\tthinkingLevel: sessionOptions.thinkingLevel,\n\t\t\tscopedModels: sessionOptions.scopedModels,\n\t\t\ttools: sessionOptions.tools,\n\t\t\tnoTools: sessionOptions.noTools,\n\t\t\tdisallowedTools: sessionOptions.disallowedTools,\n\t\t\tcustomTools: sessionOptions.customTools,\n\t\t\tenableWebTools: sessionOptions.enableWebTools,\n\t\t\tenableSemanticIndex: sessionOptions.enableSemanticIndex,\n\t\t\tbaseToolsOverride: sessionOptions.baseToolsOverride,\n\t\t});\n\t\tconst cliThinkingOverride = parsed.thinking !== undefined || cliThinkingFromModel;\n\t\tif (created.session.model && cliThinkingOverride) {\n\t\t\tcreated.session.setThinkingLevel(created.session.thinkingLevel);\n\t\t}\n\n\t\treturn {\n\t\t\t...created,\n\t\t\tservices,\n\t\t\tdiagnostics,\n\t\t};\n\t};\n\ttime(\"createRuntime\");\n\tconst runtime = await createAgentSessionRuntime(createRuntime, {\n\t\tcwd: sessionManager.getCwd(),\n\t\tagentDir,\n\t\tsessionManager,\n\t});\n\tconst { services, session, modelFallbackMessage } = runtime;\n\tconst { settingsManager, modelRegistry, resourceLoader } = services;\n\n\tif (parsed.help) {\n\t\tconst extensionFlags = resourceLoader\n\t\t\t.getExtensions()\n\t\t\t.extensions.flatMap((extension) => Array.from(extension.flags.values()));\n\t\tprintHelp(extensionFlags);\n\t\tprocess.exit(0);\n\t}\n\n\tif (parsed.listModels !== undefined) {\n\t\tconst searchPattern = typeof parsed.listModels === \"string\" ? parsed.listModels : undefined;\n\t\tawait listModels(modelRegistry, searchPattern);\n\t\tprocess.exit(0);\n\t}\n\n\tif (parsed.printTokenSurface) {\n\t\tconst surface = measurePromptSurface(session);\n\t\tconsole.log(\"Fixed per-turn surface (chars/4 token estimate):\");\n\t\tconsole.log(` system prompt: ${surface.systemPromptTokens} tokens`);\n\t\tfor (const tool of surface.tools) {\n\t\t\tconsole.log(` tool ${tool.name}: ${tool.tokens} tokens`);\n\t\t}\n\t\tconsole.log(` tool schemas total: ${surface.toolSchemaTokens} tokens`);\n\t\tconsole.log(` total: ${surface.totalTokens} tokens`);\n\n\t\t// The surface above says what the schemas cost; this says whether\n\t\t// withholding them is worth what a resolve costs (§6.3, §8.6 item 6).\n\t\tconst deferrable = surface.tools.filter((t) => t.name.startsWith(\"mcp_\"));\n\t\tconst deferredTokens = deferrable.reduce((sum, t) => sum + t.tokens, 0);\n\t\tconsole.log(`\\nDeferrable (MCP) tools: ${deferrable.length}, ${deferredTokens} tokens`);\n\t\tif (session.model) {\n\t\t\tconsole.log(\n\t\t\t\tformatDeferral(\n\t\t\t\t\tanalyzeDeferral({\n\t\t\t\t\t\tdeferredTokens,\n\t\t\t\t\t\tprefixTokens: surface.totalTokens,\n\t\t\t\t\t\tprices: session.model.cost,\n\t\t\t\t\t}),\n\t\t\t\t\t{ prefixIsFloor: true },\n\t\t\t\t),\n\t\t\t);\n\t\t} else {\n\t\t\tconsole.log(\" deferral: no model resolved, so the trade-off cannot be costed\");\n\t\t}\n\t\tprocess.exit(0);\n\t}\n\n\t// Read piped stdin content (if any) - skip for RPC mode which uses stdin for JSON-RPC\n\tlet stdinContent: string | undefined;\n\tif (appMode !== \"rpc\") {\n\t\tstdinContent = await readPipedStdin();\n\t\tif (stdinContent !== undefined && appMode === \"interactive\") {\n\t\t\tappMode = \"print\";\n\t\t}\n\t}\n\ttime(\"readPipedStdin\");\n\n\tconst { initialMessage, initialImages } = await prepareInitialMessage(\n\t\tparsed,\n\t\tsettingsManager.getImageAutoResize(),\n\t\tstdinContent,\n\t);\n\ttime(\"prepareInitialMessage\");\n\tinitTheme(settingsManager.getTheme(), appMode === \"interactive\");\n\ttime(\"initTheme\");\n\n\t// Show deprecation warnings in interactive mode\n\tif (appMode === \"interactive\" && deprecationWarnings.length > 0) {\n\t\tawait showDeprecationWarnings(deprecationWarnings);\n\t}\n\n\tconst scopedModels = [...session.scopedModels];\n\ttime(\"resolveModelScope\");\n\treportDiagnostics(runtime.diagnostics);\n\tif (runtime.diagnostics.some((diagnostic) => diagnostic.type === \"error\")) {\n\t\tprocess.exit(1);\n\t}\n\ttime(\"createAgentSession\");\n\n\tif (appMode !== \"interactive\" && !session.model) {\n\t\tconsole.error(chalk.red(formatNoModelsAvailableMessage()));\n\t\tprocess.exit(1);\n\t}\n\n\tconst startupBenchmark = isTruthyEnvFlag(process.env.HOOCODE_STARTUP_BENCHMARK);\n\tif (startupBenchmark && appMode !== \"interactive\") {\n\t\tconsole.error(chalk.red(\"Error: HOOCODE_STARTUP_BENCHMARK only supports interactive mode\"));\n\t\tprocess.exit(1);\n\t}\n\n\t// Start the optional local embedding index service in the background. The\n\t// `SearchCodebase` tool is always available and runs lexical-only by default; this\n\t// semantic-index layer is completely off unless --enable-semantic-index (or the\n\t// setting) is true. When on, the tool fuses semantic hits once the index\n\t// reports available.\n\tlet embsearchService: EmbsearchService | undefined;\n\tif (parsed.enableSemanticIndex ?? settingsManager.getEnableSemanticIndex()) {\n\t\tconst isInteractive = appMode === \"interactive\";\n\t\tembsearchService = new EmbsearchService({\n\t\t\tcwd: sessionManager.getCwd(),\n\t\t\tbinaryPath: settingsManager.getEmbsearchBinaryPath(),\n\t\t\tthresholdBytes: settingsManager.getEmbsearchThresholdBytes(),\n\t\t\t// Interactive routes to the footer's startupProgress store; non-interactive\n\t\t\t// logs to stderr. See reportEmbsearchProgress for the per-phase mapping.\n\t\t\tonProgress: (state) => reportEmbsearchProgress(state, { interactive: isInteractive }),\n\t\t});\n\t\tregisterEmbsearchService(sessionManager.getCwd(), embsearchService);\n\t\tembsearchService.start().catch(() => {\n\t\t\t// Errors are logged by the onProgress unavailable state; swallow to avoid\n\t\t\t// crashing the session because of an optional background index.\n\t\t});\n\t}\n\n\tif (appMode === \"rpc\") {\n\t\tprintTimings();\n\t\ttry {\n\t\t\tawait runRpcMode(runtime);\n\t\t} finally {\n\t\t\tawait embsearchService?.dispose();\n\t\t\tunregisterEmbsearchService(sessionManager.getCwd());\n\t\t}\n\t} else if (appMode === \"interactive\") {\n\t\tif (scopedModels.length > 0 && (parsed.verbose || !settingsManager.getQuietStartup())) {\n\t\t\tconst modelList = scopedModels\n\t\t\t\t.map((sm) => {\n\t\t\t\t\tconst thinkingStr = sm.thinkingLevel ? `:${sm.thinkingLevel}` : \"\";\n\t\t\t\t\treturn `${sm.model.id}${thinkingStr}`;\n\t\t\t\t})\n\t\t\t\t.join(\", \");\n\t\t\tconsole.log(chalk.dim(`Model scope: ${modelList} ${chalk.gray(\"(Ctrl+P to cycle)\")}`));\n\t\t}\n\n\t\tconst interactiveMode = new InteractiveMode(runtime, {\n\t\t\tmigratedProviders,\n\t\t\tmodelFallbackMessage,\n\t\t\tinitialMessage,\n\t\t\tinitialImages,\n\t\t\tinitialMessages: parsed.messages,\n\t\t\tverbose: parsed.verbose,\n\t\t});\n\n\t\t// Optional hooteams bridge. `--team auto` discovers a config, spawns a\n\t\t// local hooteams child on a free port, and proceeds as if its URL had\n\t\t// been passed; the child is reaped on exit (clean or signal) via a\n\t\t// process \"exit\" hook plus the explicit stop below.\n\t\tlet autoTeam: { url: string; stop(): Promise<void> } | undefined;\n\t\tlet teamUrl = parsed.team;\n\t\tif (teamUrl === \"auto\") {\n\t\t\tconst { startAutoTeam } = await import(\"./core/team-auto.js\");\n\t\t\ttry {\n\t\t\t\tautoTeam = await startAutoTeam(process.cwd(), { log: (message) => console.log(chalk.dim(message)) });\n\t\t\t\tteamUrl = autoTeam.url;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(chalk.red(error instanceof Error ? error.message : String(error)));\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t}\n\n\t\t// Team mirror + client. Fire-and-forget: connect failures and drops warn\n\t\t// in the background and never block the main agent. Warnings go through\n\t\t// the chat, not console.error: a raw stderr write while the TUI owns the\n\t\t// screen scribbles over the render and can leave the editor looking\n\t\t// frozen. The same connection powers team focus / nudge / attach.\n\t\tlet teamView: { stop(): void } | undefined;\n\t\tif (teamUrl) {\n\t\t\tconst { connectTeamView } = await import(\"./core/team-view.js\");\n\t\t\tconst teamClient = connectTeamView(teamUrl, {\n\t\t\t\twarn: (message) => interactiveMode.showWarning(message),\n\t\t\t});\n\t\t\tteamView = teamClient;\n\t\t\tinteractiveMode.attachTeamClient(teamClient);\n\t\t}\n\t\tif (startupBenchmark) {\n\t\t\tawait interactiveMode.init();\n\t\t\ttime(\"interactiveMode.init\");\n\t\t\tprintTimings();\n\t\t\tteamView?.stop();\n\t\t\tawait autoTeam?.stop();\n\t\t\tinteractiveMode.stop();\n\t\t\tstopThemeWatcher();\n\t\t\tif (process.stdout.writableLength > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => process.stdout.once(\"drain\", resolve));\n\t\t\t}\n\t\t\tif (process.stderr.writableLength > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => process.stderr.once(\"drain\", resolve));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tprintTimings();\n\t\ttry {\n\t\t\tawait interactiveMode.run();\n\t\t} finally {\n\t\t\tteamView?.stop();\n\t\t\tawait autoTeam?.stop();\n\t\t\tawait embsearchService?.dispose();\n\t\t\tunregisterEmbsearchService(sessionManager.getCwd());\n\t\t}\n\t} else {\n\t\tprintTimings();\n\t\tconst exitCode = await runPrintMode(runtime, {\n\t\t\tmode: toPrintOutputMode(appMode),\n\t\t\tmessages: parsed.messages,\n\t\t\tinitialMessage,\n\t\t\tinitialImages,\n\t\t\ttaskId: parsed.taskId,\n\t\t\tmaxTurns: parsed.maxTurns,\n\t\t});\n\t\tawait embsearchService?.dispose();\n\t\tunregisterEmbsearchService(sessionManager.getCwd());\n\t\tstopThemeWatcher();\n\t\trestoreStdout();\n\t\tif (exitCode !== 0) {\n\t\t\tprocess.exitCode = exitCode;\n\t\t}\n\t\t// Spawned subagents (run with a task id) must exit promptly once their work is\n\t\t// done and result.json is written. The child's runtime can leave handles open\n\t\t// (e.g. MCP client connections) that keep the event loop alive, so a natural\n\t\t// exit may never happen. When that occurs the parent lifeguard SIGKILLs the idle\n\t\t// child at the 60s heartbeat threshold and misreports an already-completed task\n\t\t// as \"stalled\". Force a clean exit after draining output to avoid that false stall.\n\t\tconst ranAsSubagent = typeof parsed.taskId === \"string\" && parsed.taskId.length > 0;\n\t\tif (ranAsSubagent) {\n\t\t\tif (process.stdout.writableLength > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => process.stdout.once(\"drain\", resolve));\n\t\t\t}\n\t\t\tif (process.stderr.writableLength > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => process.stderr.once(\"drain\", resolve));\n\t\t\t}\n\t\t\tprocess.exit(exitCode);\n\t\t}\n\t\treturn;\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tool-chain-summary.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tool-chain-summary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,iDAAiD;AACjD,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,2DAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,uBAAuB;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,UAAU;AACrB,6CAA6C;AAC3C,SAAS;AACX,yDAAyD;GACvD,MAAM;AACR,0EAA0E;GACxE,aAAa,CAAC;AAEjB,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,OAAO,GAAG,SAAS,CAAC;AAErD,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,WAAW,CAAC;CAClB;AAgFD,yEAAkE;AAClE,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,YAAY,EAAE,CAEnE;AAMD,kDAAkD;AAClD,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAoB3E;AA2JD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAqCzD","sourcesContent":["/**\n * The radar view's chain line: one line for a run of consecutive tool calls.\n *\n * Two renderings of the same chain, because a run that is still going and a run\n * that is over answer different questions.\n *\n * While it runs you want the shape — what it did, in order, and where it broke:\n *\n * ◐ grep › read › bash✗ › edit › bash… 4 done · 1 failed · running\n *\n * Once it is over the order has stopped mattering and what is left is what it\n * amounted to:\n *\n * ● Edited packages/tui/src/keys.ts 5 calls · 1 failed\n *\n * A chain that did *not* finish keeps the running form plus a marker. The\n * settled form is a claim about what was accomplished, and a chain cut off\n * partway through has no such claim to make — the same reason\n * `settleDanglingMainTasks` refuses to mark an aborted turn's plan items done.\n *\n * Everything here is pure and deterministic. A model-written phase label would\n * read better than the inferred one, but it would cost tokens on every turn and\n * this agent's whole premise is that nothing happens you did not pay for on\n * purpose.\n */\n\n/** One tool call's contribution to its chain. */\nexport interface ChainEntry {\n\ttool: string;\n\t/** The call's subject — a path, a command, a pattern. */\n\tsubject: string;\n\tisError: boolean;\n\t/** Still executing. */\n\tisPartial: boolean;\n\t/** Lines of text output the call returned. */\n\toutputLines: number;\n}\n\nexport type ChainState =\n\t/** Calls are still arriving or executing. */\n\t| \"running\"\n\t/** Every call finished and the turn moved on cleanly. */\n\t| \"done\"\n\t/** The turn was aborted, errored, or hit a length cap partway through. */\n\t| \"interrupted\";\n\nexport type SegmentTone = \"ok\" | \"error\" | \"running\";\n\nexport interface ChainSegment {\n\tlabel: string;\n\ttone: SegmentTone;\n}\n\n/** Segments beyond this many are elided in the middle rather than wrapped. */\nconst MAX_SEGMENTS = 8;\n/** Kept at the head when eliding. */\nconst HEAD_SEGMENTS = 3;\n/** Kept at the tail when eliding. */\nconst TAIL_SEGMENTS = 2;\n\nfunction tone(entry: ChainEntry): SegmentTone {\n\tif (entry.isError) return \"error\";\n\tif (entry.isPartial) return \"running\";\n\treturn \"ok\";\n}\n\n/**\n * Collapse consecutive calls to the same tool into one segment.\n *\n * A run of five reads is one act, not five, and spelling it out crowds out the\n * calls either side of it. A failure never merges: `read ×4` hiding one broken\n * read would defeat the point of the line.\n */\nfunction collapseRepeats(entries: ChainEntry[]): ChainSegment[] {\n\tconst segments: ChainSegment[] = [];\n\tlet index = 0;\n\twhile (index < entries.length) {\n\t\tconst entry = entries[index];\n\t\tconst entryTone = tone(entry);\n\t\tlet run = 1;\n\t\twhile (\n\t\t\tindex + run < entries.length &&\n\t\t\tentries[index + run].tool === entry.tool &&\n\t\t\ttone(entries[index + run]) === entryTone &&\n\t\t\tentryTone === \"ok\"\n\t\t) {\n\t\t\trun++;\n\t\t}\n\t\tconst marker = entryTone === \"error\" ? \"✗\" : \"\";\n\t\tsegments.push({ label: run > 1 ? `${entry.tool} ×${run}` : `${entry.tool}${marker}`, tone: entryTone });\n\t\tindex += run;\n\t}\n\treturn segments;\n}\n\n/**\n * Elide the middle of a long chain, keeping both ends legible.\n *\n * Failures are never elided. Where a run broke is the one thing the line exists\n * to show, and a long chain is exactly when you most need it — hiding the ✗\n * inside \"… 22 more …\" would leave the stats claiming a failure the line cannot\n * point at.\n */\nfunction capSegments(segments: ChainSegment[]): ChainSegment[] {\n\tif (segments.length <= MAX_SEGMENTS) return segments;\n\n\tconst keep = new Set<number>();\n\tfor (let i = 0; i < HEAD_SEGMENTS; i++) keep.add(i);\n\tfor (let i = segments.length - TAIL_SEGMENTS; i < segments.length; i++) keep.add(i);\n\tsegments.forEach((segment, i) => {\n\t\tif (segment.tone === \"error\") keep.add(i);\n\t});\n\n\tconst out: ChainSegment[] = [];\n\tlet gap = 0;\n\tconst flushGap = () => {\n\t\tif (gap > 0) out.push({ label: `… ${gap} more …`, tone: \"ok\" });\n\t\tgap = 0;\n\t};\n\tsegments.forEach((segment, i) => {\n\t\tif (keep.has(i)) {\n\t\t\tflushGap();\n\t\t\tout.push(segment);\n\t\t} else {\n\t\t\tgap++;\n\t\t}\n\t});\n\tflushGap();\n\treturn out;\n}\n\n/** The `grep › read × 3 › bash✗` part of a running chain line. */\nexport function chainSegments(entries: ChainEntry[]): ChainSegment[] {\n\treturn capSegments(collapseRepeats(entries));\n}\n\nfunction plural(n: number, one: string, many = `${one}s`): string {\n\treturn `${n} ${n === 1 ? one : many}`;\n}\n\n/** The flush-right stats for either rendering. */\nexport function chainStats(entries: ChainEntry[], state: ChainState): string {\n\tconst failed = entries.filter((e) => e.isError).length;\n\tconst parts: string[] = [];\n\n\tif (state === \"running\") {\n\t\tparts.push(`${entries.filter((e) => !e.isPartial).length} done`);\n\t} else {\n\t\tparts.push(plural(entries.length, \"call\"));\n\t}\n\tif (failed > 0) parts.push(`${failed} failed`);\n\n\tif (state === \"running\") {\n\t\tparts.push(\"running\");\n\t} else if (state === \"interrupted\") {\n\t\tparts.push(\"interrupted\");\n\t} else {\n\t\tconst lines = entries.reduce((sum, e) => sum + e.outputLines, 0);\n\t\tif (lines > 0) parts.push(plural(lines, \"line\"));\n\t}\n\treturn parts.join(\" · \");\n}\n\ninterface ToolFamily {\n\tverb: string;\n\t/** Noun for the headline's count form: \"Edited 3 files\". */\n\tnoun: string;\n\t/** Noun for the secondary clause, which has no verb to lean on: \"· 38 reads\". */\n\ttail: string;\n\ttools: string[];\n\t/**\n\t * Whether this family's subjects name a place on disk.\n\t *\n\t * Only these may be reduced to a shared location. A command is not a path\n\t * however much it looks like one: three calls that all begin\n\t * `cd /Users/me/repo && …` share a long slash-separated prefix, and treating\n\t * it as a location produced `Ran cd /Users/me/repo` — a headline naming the\n\t * one part of the command that did nothing.\n\t */\n\tsubjectIsPath: boolean;\n\t/** Reduce a subject to the act it performed, when the raw form carries noise. */\n\tact?: (subject: string) => string;\n}\n\n/** Leading `cd <dir> &&` runs, however many are chained. */\nconst CD_PREFIX_RE = /^(?:cd\\s+(?:\"[^\"]*\"|'[^']*'|[^\\s;&|]+)\\s*&&\\s*)+/;\n\n/**\n * A command's act, with the navigation stripped off the front.\n *\n * `cd packages/tui && bun run check` is one act performed somewhere, not two,\n * and the somewhere is not what the chain did.\n */\nfunction commandAct(subject: string): string {\n\treturn subject.replace(CD_PREFIX_RE, \"\").trim() || subject;\n}\n\n/**\n * Tool families, in the order a settled chain reports them.\n *\n * The ordering is the whole trick: a chain that read six files and then changed\n * one is remembered as the edit. Mutation outranks execution outranks reading\n * outranks searching, so the phrase names the most consequential thing the\n * chain did rather than the most frequent.\n *\n * Priority alone is only sound while the chain is small enough for every call\n * to plausibly serve the headline act. See `INCIDENTAL_SHARE`.\n */\nconst FAMILIES: ToolFamily[] = [\n\t{\n\t\tverb: \"Edited\",\n\t\tnoun: \"file\",\n\t\ttail: \"edit\",\n\t\ttools: [\"edit\", \"write\", \"MultiEdit\", \"NotebookEdit\"],\n\t\tsubjectIsPath: true,\n\t},\n\t{ verb: \"Ran\", noun: \"command\", tail: \"command\", tools: [\"bash\"], subjectIsPath: false, act: commandAct },\n\t{ verb: \"Delegated\", noun: \"task\", tail: \"task\", tools: [\"Task\", \"TaskOutput\"], subjectIsPath: false },\n\t{ verb: \"Fetched\", noun: \"page\", tail: \"fetch\", tools: [\"webfetch\", \"websearch\"], subjectIsPath: false },\n\t{ verb: \"Read\", noun: \"file\", tail: \"read\", tools: [\"read\"], subjectIsPath: true },\n\t{ verb: \"Searched\", noun: \"search\", tail: \"search\", tools: [\"search\"], subjectIsPath: true },\n];\n\n/**\n * Calls from here up, a chain is long enough that priority order alone starts\n * lying, and the three rules below switch on.\n *\n * Below it the existing behaviour is left exactly as it was. Measured over this\n * repo's own sessions, 87% of chains are three calls or fewer and 75% touch a\n * single family; the failure these rules address does not exist down there, so\n * neither should the rules.\n */\nconst LONG_CHAIN_CALLS = 10;\n\n/**\n * A family this far below the chain's own size did not characterise it.\n *\n * Priority order says a chain that read six files and changed one is the edit,\n * and at seven calls that is true. At seventy-three it is not: 28 greps, 37\n * reads and one edit is an investigation that ended in a small change, and\n * calling it \"Edited subagent.ts\" describes 1 call out of 73.\n */\nconst INCIDENTAL_SHARE = 0.1;\n\n/** Below this, a secondary family is a footnote and not worth the width. */\nconst MIN_SECONDARY_CALLS = 3;\n\n/**\n * Longest common directory prefix of the given paths, or \"\" when they share none.\n *\n * `long` chains additionally reject a single-segment prefix: across forty files\n * the shared root collapses to something like `packages`, which names a location\n * so broad it is worse than the count it displaced. Short chains keep theirs —\n * `Edited docs` is a genuine location, and three files rarely share a vague one.\n */\nfunction commonPathPrefix(paths: string[], long: boolean): string {\n\tif (paths.length === 0) return \"\";\n\tconst split = paths.map((p) => p.split(\"/\").filter(Boolean));\n\tconst [first, ...rest] = split;\n\tconst prefix: string[] = [];\n\tfor (let i = 0; i < first.length; i++) {\n\t\tif (rest.every((parts) => parts[i] === first[i])) prefix.push(first[i]);\n\t\telse break;\n\t}\n\tif (prefix.length === 0) return \"\";\n\tif (long && prefix.length < 2) return \"\";\n\tconst joined = prefix.join(\"/\");\n\t// `filter(Boolean)` drops the empty leading segment of an absolute path.\n\treturn paths[0].startsWith(\"/\") ? `/${joined}` : joined;\n}\n\n/**\n * Whether a subject can stand in for a location.\n *\n * Globs are excluded even though they look pathlike: \"Searched *.test.ts\" reads\n * as a place the chain worked in, which is exactly what it is not.\n */\nfunction usableAsTarget(subject: string): boolean {\n\tif (/[*?]/.test(subject)) return false;\n\treturn subject.includes(\"/\") || /\\.[a-zA-Z0-9]+$/.test(subject);\n}\n\n/** The headline clause for one family's calls. */\nfunction familyPhrase(family: ToolFamily, matched: ChainEntry[], long: boolean): string {\n\tconst subjects = matched.map((e) => (family.act ? family.act(e.subject) : e.subject)).filter(Boolean);\n\n\t// A lone call is fully described by its own subject, whatever shape it is:\n\t// a command, a pattern, a URL, a path. So is a run that did the same thing\n\t// every time — `bun run check` twice is that command, not \"2 commands\".\n\tif (subjects.length === matched.length && new Set(subjects).size === 1) {\n\t\treturn `${family.verb} ${subjects[0]}`;\n\t}\n\n\t// Several calls: name the place they share, or fall back to a count.\n\tconst target = family.subjectIsPath ? commonPathPrefix(subjects.filter(usableAsTarget), long) : \"\";\n\tif (target) return `${family.verb} ${target}`;\n\t// Searching has no natural plural noun (\"3 searches\" says nothing the\n\t// stats do not), so the bare verb carries it.\n\tif (family.noun === \"search\") return \"Explored\";\n\treturn `${family.verb} ${plural(matched.length, family.noun)}`;\n}\n\n/** The family with the most calls other than `chosen`, if any reaches the floor. */\nfunction largestOtherFamily(\n\tentries: ChainEntry[],\n\tchosen: ToolFamily,\n): { family: ToolFamily; count: number } | undefined {\n\tlet best: { family: ToolFamily; count: number } | undefined;\n\tfor (const family of FAMILIES) {\n\t\tif (family === chosen) continue;\n\t\tconst count = entries.filter((e) => family.tools.includes(e.tool)).length;\n\t\tif (count > (best?.count ?? 0)) best = { family, count };\n\t}\n\treturn best && best.count >= MIN_SECONDARY_CALLS ? best : undefined;\n}\n\n/**\n * The settled chain's phrase: what this run amounted to.\n *\n * Deliberately close to one clause, not an inventory. \"Edited packages/tui, read\n * 6 files, searched packages\" is a worse line than \"Edited packages/tui\" — the\n * count is already in the stats, and the per-call detail is one `alt+u` away.\n *\n * A long chain earns at most one more clause, and only when its headline family\n * is a minority of the calls. That is the case where a single clause stops being\n * terse and starts being false: 31 edits among 182 calls is worth naming, but so\n * is the fact that 76 of the rest were commands. Listing every family it touched\n * is not the alternative — a chain that reports \"(ran, delegated, read,\n * searched)\" has said only that it was busy.\n *\n * A location is only named when the calls actually share one. Naming a single\n * arbitrary file out of five would read as a claim the chain never made, so\n * several unrelated targets collapse to a count instead.\n */\nexport function chainPhrase(entries: ChainEntry[]): string {\n\tif (entries.length === 0) return \"No calls\";\n\tconst long = entries.length >= LONG_CHAIN_CALLS;\n\n\tlet chosen: ToolFamily | undefined;\n\tlet matched: ChainEntry[] = [];\n\tfor (const family of FAMILIES) {\n\t\tconst m = entries.filter((e) => family.tools.includes(e.tool));\n\t\tif (m.length === 0) continue;\n\t\tif (long && m.length / entries.length < INCIDENTAL_SHARE) continue;\n\t\tchosen = family;\n\t\tmatched = m;\n\t\tbreak;\n\t}\n\n\t// Every family was incidental — a long chain spread thin across many tools.\n\t// The largest still describes it better than the priority order's first hit.\n\tif (!chosen) {\n\t\tfor (const family of FAMILIES) {\n\t\t\tconst m = entries.filter((e) => family.tools.includes(e.tool));\n\t\t\tif (m.length > matched.length) {\n\t\t\t\tchosen = family;\n\t\t\t\tmatched = m;\n\t\t\t}\n\t\t}\n\t}\n\n\t// An unrecognised tool set still gets a line rather than a blank.\n\tif (!chosen) {\n\t\tconst names = [...new Set(entries.map((e) => e.tool))];\n\t\treturn names.length === 1 ? `Called ${names[0]}` : `Called ${plural(names.length, \"tool\")}`;\n\t}\n\n\tconst head = familyPhrase(chosen, matched, long);\n\tif (!long || matched.length / entries.length >= 0.5) return head;\n\tconst secondary = largestOtherFamily(entries, chosen);\n\treturn secondary ? `${head} · ${plural(secondary.count, secondary.family.tail)}` : head;\n}\n"]}
1
+ {"version":3,"file":"tool-chain-summary.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tool-chain-summary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,iDAAiD;AACjD,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,2DAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,uBAAuB;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,UAAU;AACrB,6CAA6C;AAC3C,SAAS;AACX,yDAAyD;GACvD,MAAM;AACR,0EAA0E;GACxE,aAAa,CAAC;AAEjB,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,OAAO,GAAG,SAAS,CAAC;AAErD,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,WAAW,CAAC;CAClB;AAgFD,yEAAkE;AAClE,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,YAAY,EAAE,CAEnE;AAMD,kDAAkD;AAClD,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAoB3E;AA2JD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAqCzD","sourcesContent":["/**\n * The radar view's chain line: one line for a run of consecutive tool calls.\n *\n * Two renderings of the same chain, because a run that is still going and a run\n * that is over answer different questions.\n *\n * While it runs you want the shape — what it did, in order, and where it broke:\n *\n * ◐ grep › read › bash✗ › edit › bash… 4 done · 1 failed · running\n *\n * Once it is over the order has stopped mattering and what is left is what it\n * amounted to:\n *\n * ● Edited packages/tui/src/keys.ts 5 calls · 1 failed\n *\n * A chain that did *not* finish keeps the running form plus a marker. The\n * settled form is a claim about what was accomplished, and a chain cut off\n * partway through has no such claim to make — the same reason\n * `settleDanglingMainTasks` refuses to mark an aborted turn's plan items done.\n *\n * Everything here is pure and deterministic. A model-written phase label would\n * read better than the inferred one, but it would cost tokens on every turn and\n * this agent's whole premise is that nothing happens you did not pay for on\n * purpose.\n */\n\n/** One tool call's contribution to its chain. */\nexport interface ChainEntry {\n\ttool: string;\n\t/** The call's subject — a path, a command, a pattern. */\n\tsubject: string;\n\tisError: boolean;\n\t/** Still executing. */\n\tisPartial: boolean;\n\t/** Lines of text output the call returned. */\n\toutputLines: number;\n}\n\nexport type ChainState =\n\t/** Calls are still arriving or executing. */\n\t| \"running\"\n\t/** Every call finished and the turn moved on cleanly. */\n\t| \"done\"\n\t/** The turn was aborted, errored, or hit a length cap partway through. */\n\t| \"interrupted\";\n\nexport type SegmentTone = \"ok\" | \"error\" | \"running\";\n\nexport interface ChainSegment {\n\tlabel: string;\n\ttone: SegmentTone;\n}\n\n/** Segments beyond this many are elided in the middle rather than wrapped. */\nconst MAX_SEGMENTS = 8;\n/** Kept at the head when eliding. */\nconst HEAD_SEGMENTS = 3;\n/** Kept at the tail when eliding. */\nconst TAIL_SEGMENTS = 2;\n\nfunction tone(entry: ChainEntry): SegmentTone {\n\tif (entry.isError) return \"error\";\n\tif (entry.isPartial) return \"running\";\n\treturn \"ok\";\n}\n\n/**\n * Collapse consecutive calls to the same tool into one segment.\n *\n * A run of five reads is one act, not five, and spelling it out crowds out the\n * calls either side of it. A failure never merges: `read ×4` hiding one broken\n * read would defeat the point of the line.\n */\nfunction collapseRepeats(entries: ChainEntry[]): ChainSegment[] {\n\tconst segments: ChainSegment[] = [];\n\tlet index = 0;\n\twhile (index < entries.length) {\n\t\tconst entry = entries[index];\n\t\tconst entryTone = tone(entry);\n\t\tlet run = 1;\n\t\twhile (\n\t\t\tindex + run < entries.length &&\n\t\t\tentries[index + run].tool === entry.tool &&\n\t\t\ttone(entries[index + run]) === entryTone &&\n\t\t\tentryTone === \"ok\"\n\t\t) {\n\t\t\trun++;\n\t\t}\n\t\tconst marker = entryTone === \"error\" ? \"✗\" : \"\";\n\t\tsegments.push({ label: run > 1 ? `${entry.tool} ×${run}` : `${entry.tool}${marker}`, tone: entryTone });\n\t\tindex += run;\n\t}\n\treturn segments;\n}\n\n/**\n * Elide the middle of a long chain, keeping both ends legible.\n *\n * Failures are never elided. Where a run broke is the one thing the line exists\n * to show, and a long chain is exactly when you most need it — hiding the ✗\n * inside \"… 22 more …\" would leave the stats claiming a failure the line cannot\n * point at.\n */\nfunction capSegments(segments: ChainSegment[]): ChainSegment[] {\n\tif (segments.length <= MAX_SEGMENTS) return segments;\n\n\tconst keep = new Set<number>();\n\tfor (let i = 0; i < HEAD_SEGMENTS; i++) keep.add(i);\n\tfor (let i = segments.length - TAIL_SEGMENTS; i < segments.length; i++) keep.add(i);\n\tsegments.forEach((segment, i) => {\n\t\tif (segment.tone === \"error\") keep.add(i);\n\t});\n\n\tconst out: ChainSegment[] = [];\n\tlet gap = 0;\n\tconst flushGap = () => {\n\t\tif (gap > 0) out.push({ label: `… ${gap} more …`, tone: \"ok\" });\n\t\tgap = 0;\n\t};\n\tsegments.forEach((segment, i) => {\n\t\tif (keep.has(i)) {\n\t\t\tflushGap();\n\t\t\tout.push(segment);\n\t\t} else {\n\t\t\tgap++;\n\t\t}\n\t});\n\tflushGap();\n\treturn out;\n}\n\n/** The `grep › read × 3 › bash✗` part of a running chain line. */\nexport function chainSegments(entries: ChainEntry[]): ChainSegment[] {\n\treturn capSegments(collapseRepeats(entries));\n}\n\nfunction plural(n: number, one: string, many = `${one}s`): string {\n\treturn `${n} ${n === 1 ? one : many}`;\n}\n\n/** The flush-right stats for either rendering. */\nexport function chainStats(entries: ChainEntry[], state: ChainState): string {\n\tconst failed = entries.filter((e) => e.isError).length;\n\tconst parts: string[] = [];\n\n\tif (state === \"running\") {\n\t\tparts.push(`${entries.filter((e) => !e.isPartial).length} done`);\n\t} else {\n\t\tparts.push(plural(entries.length, \"call\"));\n\t}\n\tif (failed > 0) parts.push(`${failed} failed`);\n\n\tif (state === \"running\") {\n\t\tparts.push(\"running\");\n\t} else if (state === \"interrupted\") {\n\t\tparts.push(\"interrupted\");\n\t} else {\n\t\tconst lines = entries.reduce((sum, e) => sum + e.outputLines, 0);\n\t\tif (lines > 0) parts.push(plural(lines, \"line\"));\n\t}\n\treturn parts.join(\" · \");\n}\n\ninterface ToolFamily {\n\tverb: string;\n\t/** Noun for the headline's count form: \"Edited 3 files\". */\n\tnoun: string;\n\t/** Noun for the secondary clause, which has no verb to lean on: \"· 38 reads\". */\n\ttail: string;\n\ttools: string[];\n\t/**\n\t * Whether this family's subjects name a place on disk.\n\t *\n\t * Only these may be reduced to a shared location. A command is not a path\n\t * however much it looks like one: three calls that all begin\n\t * `cd /Users/me/repo && …` share a long slash-separated prefix, and treating\n\t * it as a location produced `Ran cd /Users/me/repo` — a headline naming the\n\t * one part of the command that did nothing.\n\t */\n\tsubjectIsPath: boolean;\n\t/** Reduce a subject to the act it performed, when the raw form carries noise. */\n\tact?: (subject: string) => string;\n}\n\n/** Leading `cd <dir> &&` runs, however many are chained. */\nconst CD_PREFIX_RE = /^(?:cd\\s+(?:\"[^\"]*\"|'[^']*'|[^\\s;&|]+)\\s*&&\\s*)+/;\n\n/**\n * A command's act, with the navigation stripped off the front.\n *\n * `cd packages/tui && bun run check` is one act performed somewhere, not two,\n * and the somewhere is not what the chain did.\n */\nfunction commandAct(subject: string): string {\n\treturn subject.replace(CD_PREFIX_RE, \"\").trim() || subject;\n}\n\n/**\n * Tool families, in the order a settled chain reports them.\n *\n * The ordering is the whole trick: a chain that read six files and then changed\n * one is remembered as the edit. Mutation outranks execution outranks reading\n * outranks searching, so the phrase names the most consequential thing the\n * chain did rather than the most frequent.\n *\n * Priority alone is only sound while the chain is small enough for every call\n * to plausibly serve the headline act. See `INCIDENTAL_SHARE`.\n */\nconst FAMILIES: ToolFamily[] = [\n\t{\n\t\tverb: \"Edited\",\n\t\tnoun: \"file\",\n\t\ttail: \"edit\",\n\t\ttools: [\"edit\", \"write\", \"MultiEdit\", \"NotebookEdit\"],\n\t\tsubjectIsPath: true,\n\t},\n\t{ verb: \"Ran\", noun: \"command\", tail: \"command\", tools: [\"bash\"], subjectIsPath: false, act: commandAct },\n\t{ verb: \"Delegated\", noun: \"task\", tail: \"task\", tools: [\"Task\", \"TaskOutput\"], subjectIsPath: false },\n\t{ verb: \"Fetched\", noun: \"page\", tail: \"fetch\", tools: [\"webfetch\", \"websearch\"], subjectIsPath: false },\n\t{ verb: \"Read\", noun: \"file\", tail: \"read\", tools: [\"read\"], subjectIsPath: true },\n\t{ verb: \"Searched\", noun: \"search\", tail: \"search\", tools: [\"SearchCodebase\"], subjectIsPath: true },\n];\n\n/**\n * Calls from here up, a chain is long enough that priority order alone starts\n * lying, and the three rules below switch on.\n *\n * Below it the existing behaviour is left exactly as it was. Measured over this\n * repo's own sessions, 87% of chains are three calls or fewer and 75% touch a\n * single family; the failure these rules address does not exist down there, so\n * neither should the rules.\n */\nconst LONG_CHAIN_CALLS = 10;\n\n/**\n * A family this far below the chain's own size did not characterise it.\n *\n * Priority order says a chain that read six files and changed one is the edit,\n * and at seven calls that is true. At seventy-three it is not: 28 greps, 37\n * reads and one edit is an investigation that ended in a small change, and\n * calling it \"Edited subagent.ts\" describes 1 call out of 73.\n */\nconst INCIDENTAL_SHARE = 0.1;\n\n/** Below this, a secondary family is a footnote and not worth the width. */\nconst MIN_SECONDARY_CALLS = 3;\n\n/**\n * Longest common directory prefix of the given paths, or \"\" when they share none.\n *\n * `long` chains additionally reject a single-segment prefix: across forty files\n * the shared root collapses to something like `packages`, which names a location\n * so broad it is worse than the count it displaced. Short chains keep theirs —\n * `Edited docs` is a genuine location, and three files rarely share a vague one.\n */\nfunction commonPathPrefix(paths: string[], long: boolean): string {\n\tif (paths.length === 0) return \"\";\n\tconst split = paths.map((p) => p.split(\"/\").filter(Boolean));\n\tconst [first, ...rest] = split;\n\tconst prefix: string[] = [];\n\tfor (let i = 0; i < first.length; i++) {\n\t\tif (rest.every((parts) => parts[i] === first[i])) prefix.push(first[i]);\n\t\telse break;\n\t}\n\tif (prefix.length === 0) return \"\";\n\tif (long && prefix.length < 2) return \"\";\n\tconst joined = prefix.join(\"/\");\n\t// `filter(Boolean)` drops the empty leading segment of an absolute path.\n\treturn paths[0].startsWith(\"/\") ? `/${joined}` : joined;\n}\n\n/**\n * Whether a subject can stand in for a location.\n *\n * Globs are excluded even though they look pathlike: \"Searched *.test.ts\" reads\n * as a place the chain worked in, which is exactly what it is not.\n */\nfunction usableAsTarget(subject: string): boolean {\n\tif (/[*?]/.test(subject)) return false;\n\treturn subject.includes(\"/\") || /\\.[a-zA-Z0-9]+$/.test(subject);\n}\n\n/** The headline clause for one family's calls. */\nfunction familyPhrase(family: ToolFamily, matched: ChainEntry[], long: boolean): string {\n\tconst subjects = matched.map((e) => (family.act ? family.act(e.subject) : e.subject)).filter(Boolean);\n\n\t// A lone call is fully described by its own subject, whatever shape it is:\n\t// a command, a pattern, a URL, a path. So is a run that did the same thing\n\t// every time — `bun run check` twice is that command, not \"2 commands\".\n\tif (subjects.length === matched.length && new Set(subjects).size === 1) {\n\t\treturn `${family.verb} ${subjects[0]}`;\n\t}\n\n\t// Several calls: name the place they share, or fall back to a count.\n\tconst target = family.subjectIsPath ? commonPathPrefix(subjects.filter(usableAsTarget), long) : \"\";\n\tif (target) return `${family.verb} ${target}`;\n\t// Searching has no natural plural noun (\"3 searches\" says nothing the\n\t// stats do not), so the bare verb carries it.\n\tif (family.noun === \"search\") return \"Explored\";\n\treturn `${family.verb} ${plural(matched.length, family.noun)}`;\n}\n\n/** The family with the most calls other than `chosen`, if any reaches the floor. */\nfunction largestOtherFamily(\n\tentries: ChainEntry[],\n\tchosen: ToolFamily,\n): { family: ToolFamily; count: number } | undefined {\n\tlet best: { family: ToolFamily; count: number } | undefined;\n\tfor (const family of FAMILIES) {\n\t\tif (family === chosen) continue;\n\t\tconst count = entries.filter((e) => family.tools.includes(e.tool)).length;\n\t\tif (count > (best?.count ?? 0)) best = { family, count };\n\t}\n\treturn best && best.count >= MIN_SECONDARY_CALLS ? best : undefined;\n}\n\n/**\n * The settled chain's phrase: what this run amounted to.\n *\n * Deliberately close to one clause, not an inventory. \"Edited packages/tui, read\n * 6 files, searched packages\" is a worse line than \"Edited packages/tui\" — the\n * count is already in the stats, and the per-call detail is one `alt+u` away.\n *\n * A long chain earns at most one more clause, and only when its headline family\n * is a minority of the calls. That is the case where a single clause stops being\n * terse and starts being false: 31 edits among 182 calls is worth naming, but so\n * is the fact that 76 of the rest were commands. Listing every family it touched\n * is not the alternative — a chain that reports \"(ran, delegated, read,\n * searched)\" has said only that it was busy.\n *\n * A location is only named when the calls actually share one. Naming a single\n * arbitrary file out of five would read as a claim the chain never made, so\n * several unrelated targets collapse to a count instead.\n */\nexport function chainPhrase(entries: ChainEntry[]): string {\n\tif (entries.length === 0) return \"No calls\";\n\tconst long = entries.length >= LONG_CHAIN_CALLS;\n\n\tlet chosen: ToolFamily | undefined;\n\tlet matched: ChainEntry[] = [];\n\tfor (const family of FAMILIES) {\n\t\tconst m = entries.filter((e) => family.tools.includes(e.tool));\n\t\tif (m.length === 0) continue;\n\t\tif (long && m.length / entries.length < INCIDENTAL_SHARE) continue;\n\t\tchosen = family;\n\t\tmatched = m;\n\t\tbreak;\n\t}\n\n\t// Every family was incidental — a long chain spread thin across many tools.\n\t// The largest still describes it better than the priority order's first hit.\n\tif (!chosen) {\n\t\tfor (const family of FAMILIES) {\n\t\t\tconst m = entries.filter((e) => family.tools.includes(e.tool));\n\t\t\tif (m.length > matched.length) {\n\t\t\t\tchosen = family;\n\t\t\t\tmatched = m;\n\t\t\t}\n\t\t}\n\t}\n\n\t// An unrecognised tool set still gets a line rather than a blank.\n\tif (!chosen) {\n\t\tconst names = [...new Set(entries.map((e) => e.tool))];\n\t\treturn names.length === 1 ? `Called ${names[0]}` : `Called ${plural(names.length, \"tool\")}`;\n\t}\n\n\tconst head = familyPhrase(chosen, matched, long);\n\tif (!long || matched.length / entries.length >= 0.5) return head;\n\tconst secondary = largestOtherFamily(entries, chosen);\n\treturn secondary ? `${head} · ${plural(secondary.count, secondary.family.tail)}` : head;\n}\n"]}
@@ -167,7 +167,7 @@ const FAMILIES = [
167
167
  { verb: "Delegated", noun: "task", tail: "task", tools: ["Task", "TaskOutput"], subjectIsPath: false },
168
168
  { verb: "Fetched", noun: "page", tail: "fetch", tools: ["webfetch", "websearch"], subjectIsPath: false },
169
169
  { verb: "Read", noun: "file", tail: "read", tools: ["read"], subjectIsPath: true },
170
- { verb: "Searched", noun: "search", tail: "search", tools: ["search"], subjectIsPath: true },
170
+ { verb: "Searched", noun: "search", tail: "search", tools: ["SearchCodebase"], subjectIsPath: true },
171
171
  ];
172
172
  /**
173
173
  * Calls from here up, a chain is long enough that priority order alone starts