@greppleai/grip 0.0.1 → 0.1.4

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 (221) hide show
  1. package/CHANGELOG.md +114 -0
  2. package/README.md +13 -7
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js +4 -2
  5. package/dist/bun/cli.js.map +1 -1
  6. package/dist/bun/embedded-assets.d.ts +3 -0
  7. package/dist/bun/embedded-assets.d.ts.map +1 -0
  8. package/dist/bun/embedded-assets.js +52 -0
  9. package/dist/bun/embedded-assets.js.map +1 -0
  10. package/dist/cli/args.d.ts.map +1 -1
  11. package/dist/cli/args.js +1 -0
  12. package/dist/cli/args.js.map +1 -1
  13. package/dist/config.d.ts.map +1 -1
  14. package/dist/config.js +3 -3
  15. package/dist/config.js.map +1 -1
  16. package/dist/core/agent-session.d.ts.map +1 -1
  17. package/dist/core/agent-session.js +17 -2
  18. package/dist/core/agent-session.js.map +1 -1
  19. package/dist/core/extensions/types.d.ts +5 -1
  20. package/dist/core/extensions/types.d.ts.map +1 -1
  21. package/dist/core/extensions/types.js.map +1 -1
  22. package/dist/core/remote-workspace-protocol/contract.d.ts +13 -4
  23. package/dist/core/remote-workspace-protocol/contract.d.ts.map +1 -1
  24. package/dist/core/remote-workspace-protocol/contract.js +17 -1
  25. package/dist/core/remote-workspace-protocol/contract.js.map +1 -1
  26. package/dist/core/remote-workspace-protocol/guest-shared-client.d.ts +16 -0
  27. package/dist/core/remote-workspace-protocol/guest-shared-client.d.ts.map +1 -0
  28. package/dist/core/remote-workspace-protocol/guest-shared-client.js +54 -0
  29. package/dist/core/remote-workspace-protocol/guest-shared-client.js.map +1 -0
  30. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.d.ts +23 -0
  31. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.d.ts.map +1 -0
  32. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js +112 -0
  33. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js.map +1 -0
  34. package/dist/core/remote-workspace-protocol/guest-shared-uplink.d.ts +30 -0
  35. package/dist/core/remote-workspace-protocol/guest-shared-uplink.d.ts.map +1 -0
  36. package/dist/core/remote-workspace-protocol/guest-shared-uplink.js +243 -0
  37. package/dist/core/remote-workspace-protocol/guest-shared-uplink.js.map +1 -0
  38. package/dist/core/remote-workspace-protocol/lima-owner-directory.d.ts +3 -0
  39. package/dist/core/remote-workspace-protocol/lima-owner-directory.d.ts.map +1 -0
  40. package/dist/core/remote-workspace-protocol/lima-owner-directory.js +31 -0
  41. package/dist/core/remote-workspace-protocol/lima-owner-directory.js.map +1 -0
  42. package/dist/core/remote-workspace-protocol/lima-owner-lock.d.ts +9 -0
  43. package/dist/core/remote-workspace-protocol/lima-owner-lock.d.ts.map +1 -0
  44. package/dist/core/remote-workspace-protocol/lima-owner-lock.js +89 -0
  45. package/dist/core/remote-workspace-protocol/lima-owner-lock.js.map +1 -0
  46. package/dist/core/remote-workspace-protocol/session.d.ts +2 -0
  47. package/dist/core/remote-workspace-protocol/session.d.ts.map +1 -1
  48. package/dist/core/remote-workspace-protocol/session.js +3 -0
  49. package/dist/core/remote-workspace-protocol/session.js.map +1 -1
  50. package/dist/core/remote-workspace-protocol/shared-transport.d.ts +71 -0
  51. package/dist/core/remote-workspace-protocol/shared-transport.d.ts.map +1 -0
  52. package/dist/core/remote-workspace-protocol/shared-transport.js +68 -0
  53. package/dist/core/remote-workspace-protocol/shared-transport.js.map +1 -0
  54. package/dist/core/sandbox/command.d.ts +2 -4
  55. package/dist/core/sandbox/command.d.ts.map +1 -1
  56. package/dist/core/sandbox/command.js +24 -46
  57. package/dist/core/sandbox/command.js.map +1 -1
  58. package/dist/core/sandbox/config.d.ts +91 -0
  59. package/dist/core/sandbox/config.d.ts.map +1 -0
  60. package/dist/core/sandbox/config.js +88 -0
  61. package/dist/core/sandbox/config.js.map +1 -0
  62. package/dist/core/sandbox/lima-guest-binary.d.ts +11 -0
  63. package/dist/core/sandbox/lima-guest-binary.d.ts.map +1 -0
  64. package/dist/core/sandbox/lima-guest-binary.js +140 -0
  65. package/dist/core/sandbox/lima-guest-binary.js.map +1 -0
  66. package/dist/core/sandbox/lima.d.ts +22 -3
  67. package/dist/core/sandbox/lima.d.ts.map +1 -1
  68. package/dist/core/sandbox/lima.js +434 -42
  69. package/dist/core/sandbox/lima.js.map +1 -1
  70. package/dist/core/sandbox/shared-lima-roots.d.ts +11 -0
  71. package/dist/core/sandbox/shared-lima-roots.d.ts.map +1 -0
  72. package/dist/core/sandbox/shared-lima-roots.js +25 -0
  73. package/dist/core/sandbox/shared-lima-roots.js.map +1 -0
  74. package/dist/core/sandbox/update-shared-guest-binary.d.ts +8 -0
  75. package/dist/core/sandbox/update-shared-guest-binary.d.ts.map +1 -0
  76. package/dist/core/sandbox/update-shared-guest-binary.js +100 -0
  77. package/dist/core/sandbox/update-shared-guest-binary.js.map +1 -0
  78. package/dist/core/settings-manager.d.ts +1 -5
  79. package/dist/core/settings-manager.d.ts.map +1 -1
  80. package/dist/core/settings-manager.js.map +1 -1
  81. package/dist/core/tools/bash.d.ts.map +1 -1
  82. package/dist/core/tools/bash.js +25 -14
  83. package/dist/core/tools/bash.js.map +1 -1
  84. package/dist/core/tools/file-mutation-queue.d.ts +2 -0
  85. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  86. package/dist/core/tools/file-mutation-queue.js +9 -0
  87. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  88. package/dist/core/tools/find.d.ts.map +1 -1
  89. package/dist/core/tools/find.js +2 -3
  90. package/dist/core/tools/find.js.map +1 -1
  91. package/dist/core/tools/grep.d.ts.map +1 -1
  92. package/dist/core/tools/grep.js +2 -3
  93. package/dist/core/tools/grep.js.map +1 -1
  94. package/dist/core/tools/ls.d.ts.map +1 -1
  95. package/dist/core/tools/ls.js +2 -3
  96. package/dist/core/tools/ls.js.map +1 -1
  97. package/dist/core/tools/operations.d.ts +13 -2
  98. package/dist/core/tools/operations.d.ts.map +1 -1
  99. package/dist/core/tools/operations.js +132 -36
  100. package/dist/core/tools/operations.js.map +1 -1
  101. package/dist/core/tools/read.d.ts.map +1 -1
  102. package/dist/core/tools/read.js +3 -3
  103. package/dist/core/tools/read.js.map +1 -1
  104. package/dist/core/tools/render-utils.d.ts +1 -0
  105. package/dist/core/tools/render-utils.d.ts.map +1 -1
  106. package/dist/core/tools/render-utils.js +5 -0
  107. package/dist/core/tools/render-utils.js.map +1 -1
  108. package/dist/core/tools/write.d.ts.map +1 -1
  109. package/dist/core/tools/write.js +2 -3
  110. package/dist/core/tools/write.js.map +1 -1
  111. package/dist/daemon/activity-budget.d.ts +10 -0
  112. package/dist/daemon/activity-budget.d.ts.map +1 -0
  113. package/dist/daemon/activity-budget.js +34 -0
  114. package/dist/daemon/activity-budget.js.map +1 -0
  115. package/dist/daemon/config.d.ts +2 -0
  116. package/dist/daemon/config.d.ts.map +1 -1
  117. package/dist/daemon/config.js +15 -0
  118. package/dist/daemon/config.js.map +1 -1
  119. package/dist/daemon/outbound-budget.d.ts +10 -0
  120. package/dist/daemon/outbound-budget.d.ts.map +1 -0
  121. package/dist/daemon/outbound-budget.js +30 -0
  122. package/dist/daemon/outbound-budget.js.map +1 -0
  123. package/dist/daemon/security.d.ts.map +1 -1
  124. package/dist/daemon/security.js +3 -1
  125. package/dist/daemon/security.js.map +1 -1
  126. package/dist/daemon/server.d.ts.map +1 -1
  127. package/dist/daemon/server.js +104 -24
  128. package/dist/daemon/server.js.map +1 -1
  129. package/dist/daemon/shared-connection.d.ts +33 -0
  130. package/dist/daemon/shared-connection.d.ts.map +1 -0
  131. package/dist/daemon/shared-connection.js +271 -0
  132. package/dist/daemon/shared-connection.js.map +1 -0
  133. package/dist/daemon/shared-revision.d.ts +5 -0
  134. package/dist/daemon/shared-revision.d.ts.map +1 -0
  135. package/dist/daemon/shared-revision.js +61 -0
  136. package/dist/daemon/shared-revision.js.map +1 -0
  137. package/dist/daemon/shared-roots.d.ts +9 -0
  138. package/dist/daemon/shared-roots.d.ts.map +1 -0
  139. package/dist/daemon/shared-roots.js +33 -0
  140. package/dist/daemon/shared-roots.js.map +1 -0
  141. package/dist/daemon/workspace-runtime.d.ts +1 -1
  142. package/dist/daemon/workspace-runtime.d.ts.map +1 -1
  143. package/dist/daemon/workspace-runtime.js +42 -10
  144. package/dist/daemon/workspace-runtime.js.map +1 -1
  145. package/dist/main.d.ts.map +1 -1
  146. package/dist/main.js +5 -3
  147. package/dist/main.js.map +1 -1
  148. package/dist/modes/interactive/components/assistant-message.d.ts +1 -0
  149. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  150. package/dist/modes/interactive/components/assistant-message.js +13 -3
  151. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  152. package/dist/modes/interactive/components/branch-summary-message.d.ts +4 -3
  153. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  154. package/dist/modes/interactive/components/branch-summary-message.js +5 -4
  155. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  156. package/dist/modes/interactive/components/compaction-summary-message.d.ts +4 -3
  157. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  158. package/dist/modes/interactive/components/compaction-summary-message.js +5 -4
  159. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  160. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  161. package/dist/modes/interactive/components/custom-message.js +4 -3
  162. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  163. package/dist/modes/interactive/components/hook-execution.d.ts +3 -0
  164. package/dist/modes/interactive/components/hook-execution.d.ts.map +1 -1
  165. package/dist/modes/interactive/components/hook-execution.js +20 -2
  166. package/dist/modes/interactive/components/hook-execution.js.map +1 -1
  167. package/dist/modes/interactive/components/message-card.d.ts +9 -0
  168. package/dist/modes/interactive/components/message-card.d.ts.map +1 -0
  169. package/dist/modes/interactive/components/message-card.js +24 -0
  170. package/dist/modes/interactive/components/message-card.js.map +1 -0
  171. package/dist/modes/interactive/components/skill-invocation-message.d.ts +4 -3
  172. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  173. package/dist/modes/interactive/components/skill-invocation-message.js +5 -4
  174. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  175. package/dist/modes/interactive/components/tool-execution.d.ts +1 -1
  176. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  177. package/dist/modes/interactive/components/tool-execution.js +27 -21
  178. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  179. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  180. package/dist/modes/interactive/components/user-message.js +3 -2
  181. package/dist/modes/interactive/components/user-message.js.map +1 -1
  182. package/dist/modes/interactive/interactive-mode.d.ts +1 -3
  183. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  184. package/dist/modes/interactive/interactive-mode.js +106 -47
  185. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  186. package/dist/modes/interactive/theme/theme.d.ts +3 -0
  187. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  188. package/dist/modes/interactive/theme/theme.js +10 -0
  189. package/dist/modes/interactive/theme/theme.js.map +1 -1
  190. package/dist/utils/clipboard-native.d.ts.map +1 -1
  191. package/dist/utils/clipboard-native.js +1 -1
  192. package/dist/utils/clipboard-native.js.map +1 -1
  193. package/dist/utils/image-resize.d.ts.map +1 -1
  194. package/dist/utils/image-resize.js +5 -0
  195. package/dist/utils/image-resize.js.map +1 -1
  196. package/dist/utils/photon.d.ts.map +1 -1
  197. package/dist/utils/photon.js +1 -0
  198. package/dist/utils/photon.js.map +1 -1
  199. package/docs/daemon.md +6 -4
  200. package/docs/docs.json +1 -1
  201. package/docs/extensions.md +3 -0
  202. package/docs/index.md +8 -12
  203. package/docs/packages.md +3 -3
  204. package/docs/quickstart.md +11 -19
  205. package/docs/sandbox.md +40 -117
  206. package/docs/settings.md +12 -11
  207. package/docs/termux.md +1 -18
  208. package/docs/usage.md +2 -2
  209. package/examples/README.md +0 -2
  210. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  211. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  212. package/examples/extensions/sandbox/package.json +1 -1
  213. package/examples/extensions/with-deps/package.json +1 -1
  214. package/npm-shrinkwrap.json +12 -12
  215. package/package.json +5 -6
  216. package/dist/core/sandbox/docker.d.ts +0 -169
  217. package/dist/core/sandbox/docker.d.ts.map +0 -1
  218. package/dist/core/sandbox/docker.js +0 -633
  219. package/dist/core/sandbox/docker.js.map +0 -1
  220. package/examples/sandbox-docker/Dockerfile +0 -274
  221. package/examples/sandbox-docker/README.md +0 -88
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuBH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,OAAO,EAGN,KAAK,sBAAsB,EAC3B,qBAAqB,EACrB,MAAM,6BAA6B,CAAC;AAiBrC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AA0a7D,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEhE,wBAAsB,yBAAyB,CAC9C,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,eAAe,GAC9B,OAAO,CAAC,sBAAsB,CAAC,CAkCjC;AACD,MAAM,WAAW,6BAA6B;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,KAAK,EAAE,qBAAqB,CAAC;IAC7B,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC3E,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,sBAAsB;IACtC,cAAc,CAAC,yBAAyB,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrE,yBAAyB,IAAI,MAAM,GAAG,SAAS,CAAC;IAChD,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,sBAAsB,CAAC;IAC1E,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7D;AAmED,mFAAmF;AACnF,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,6BAA6B,GAAG,sBAAsB,CA8C3G;AAED,MAAM,WAAW,WAAW;IAC3B,kBAAkB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACxC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,6EAA6E;IAC7E,sBAAsB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC5F,yEAAyE;IACzE,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;CAC9C;AAsKD,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,iBAmK/D","sourcesContent":["/**\n * Main entry point for the coding agent CLI.\n *\n * This file handles CLI argument parsing and translates them into\n * GripAgent options. GripAgent does the heavy lifting.\n */\n\nimport { createInterface } from \"node:readline\";\nimport { modelsAreEqual } from \"@greppleai/grip-ai\";\nimport { ProcessTerminal, setKeybindings, TuiMainScreen } from \"@greppleai/grip-tui\";\nimport chalk from \"chalk\";\nimport { type Args, parseArgs, printHelp } from \"./cli/args.ts\";\nimport { processFileArguments } from \"./cli/file-processor.ts\";\nimport { buildInitialMessage, type InitialMessageResult } from \"./cli/initial-message.ts\";\nimport { listModels } from \"./cli/list-models.ts\";\nimport { selectSession } from \"./cli/session-picker.ts\";\nimport {\n\tENV_REMOTE_PROJECT_ID,\n\tENV_REMOTE_SESSION_BASE_URL,\n\tENV_REMOTE_SESSION_TOKEN,\n\tENV_SESSION_DIR,\n\texpandTildePath,\n\tgetAgentDir,\n\tgetPackageDir,\n\tVERSION,\n} from \"./config.ts\";\nimport { AuthStorage } from \"./core/auth-storage.ts\";\nimport { exportFromFile } from \"./core/export-html/index.ts\";\nimport type { ExtensionFactory } from \"./core/extensions/types.ts\";\nimport type { GripAgentAppMode, GripAgentDiagnostic, GripAgentSessionOptions } from \"./core/grip-agent.ts\";\nimport { GripAgent, isFatalGripAgentDiagnostic } from \"./core/grip-agent.ts\";\nimport {\n\tcanonicalProjectHookIdentity,\n\thasProjectHookConfiguration,\n\ttype ProjectHookTrustResult,\n\tProjectHookTrustStore,\n} from \"./core/hooks/trust-store.ts\";\nimport { configureHttpDispatcher } from \"./core/http-dispatcher.ts\";\nimport { KeybindingsManager } from \"./core/keybindings.ts\";\nimport type { LspConfigurationInput } from \"./core/lsp/config-loader.ts\";\nimport type { ModelRegistry } from \"./core/model-registry.ts\";\nimport { resolveCliModel, resolveModelScope, type ScopedModel } from \"./core/model-resolver.ts\";\nimport { InMemorySessionManager } from \"./core/session/in-memory-session-manager.ts\";\nimport { LocalSessionManager } from \"./core/session/local-session-manager.ts\";\nimport { RemoteSessionManager } from \"./core/session/remote-session-manager.ts\";\nimport type { Session } from \"./core/session/session.ts\";\nimport type { SessionManager } from \"./core/session/session-manager.ts\";\nimport {\n\tformatMissingSessionCwdPrompt,\n\tgetMissingSessionCwdIssue,\n\tMissingSessionCwdError,\n\ttype SessionCwdIssue,\n} from \"./core/session-cwd.ts\";\nimport { SettingsManager } from \"./core/settings-manager.ts\";\nimport { resetTimings, time } from \"./core/timings.ts\";\nimport {\n\tcreateRemoteToolOperations,\n\tDeferredRemoteToolOperations,\n\ttype ToolOperations,\n} from \"./core/tools/operations.ts\";\nimport { runDaemonCommand } from \"./daemon/command.ts\";\nimport { isDaemonCommand } from \"./daemon/config.ts\";\nimport { runMigrations, showDeprecationWarnings } from \"./migrations.ts\";\nimport { ExtensionSelectorComponent } from \"./modes/interactive/components/extension-selector.ts\";\nimport { initTheme, stopThemeWatcher } from \"./modes/interactive/theme/theme.ts\";\nimport { handleConfigCommand, handlePackageCommand } from \"./package-manager-cli.ts\";\nimport { isLocalPath, normalizePath, resolvePath } from \"./utils/paths.ts\";\nimport { cleanupWindowsSelfUpdateQuarantine } from \"./utils/windows-self-update.ts\";\n\nfunction collectSettingsDiagnostics(settingsManager: SettingsManager, context: string): GripAgentDiagnostic[] {\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 GripAgentDiagnostic[]): 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\nfunction resolveAppMode(parsed: Args, stdinIsTTY: boolean): GripAgentAppMode {\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\nasync function prepareInitialMessage(\n\tparsed: Args,\n\tautoResizeImages: boolean,\n\tstdinContent?: string,\n): Promise<InitialMessageResult> {\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, resolve it before handing it to the session manager.\n\tif (sessionArg.includes(\"/\") || sessionArg.includes(\"\\\\\") || sessionArg.endsWith(\".jsonl\")) {\n\t\treturn { type: \"path\", path: resolvePath(sessionArg, cwd) };\n\t}\n\n\t// Try to match as session ID in current project first\n\tconst localSessions = await new LocalSessionManager({ cwd: cwd, sessionDir: sessionDir }).list();\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 new LocalSessionManager({ cwd: process.cwd(), sessionDir }).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): Session {\n\ttry {\n\t\treturn new LocalSessionManager({ cwd: cwd, sessionDir: sessionDir }).forkFrom(sourcePath);\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\nfunction openSessionOrExit(path: string, cwd: string, sessionDir?: string): Session {\n\ttry {\n\t\treturn new LocalSessionManager({ cwd, sessionDir }).openReference(path);\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\ninterface RemoteSessionCliOptions {\n\tbaseUrl: string;\n\ttoken: string;\n\tprojectId?: string;\n}\n\ninterface LifecycleSessionManagerOptions {\n\tcwd: string;\n\tsessionDir?: string;\n\tremote?: RemoteSessionCliOptions;\n}\n\nfunction resolveRemoteSessionCliOptions(parsed: Args): RemoteSessionCliOptions | undefined {\n\tconst baseUrl = parsed.remoteSessionBaseUrl ?? process.env[ENV_REMOTE_SESSION_BASE_URL];\n\tconst token = parsed.remoteSessionToken ?? process.env[ENV_REMOTE_SESSION_TOKEN];\n\tconst projectId = parsed.remoteProjectId ?? process.env[ENV_REMOTE_PROJECT_ID];\n\n\tif (!baseUrl && !token && !projectId) {\n\t\treturn undefined;\n\t}\n\tif (!baseUrl || !token) {\n\t\tconsole.error(\n\t\t\tchalk.red(\n\t\t\t\t`Error: remote sessions require both --remote-session-base-url and --remote-session-token, or ${ENV_REMOTE_SESSION_BASE_URL} and ${ENV_REMOTE_SESSION_TOKEN}`,\n\t\t\t),\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\n\treturn { baseUrl, token, projectId };\n}\n\nfunction createLifecycleSessionManager(options: LifecycleSessionManagerOptions): SessionManager {\n\tif (options.remote) {\n\t\treturn new RemoteSessionManager({\n\t\t\tbaseUrl: options.remote.baseUrl,\n\t\t\ttoken: options.remote.token,\n\t\t\tcwd: options.cwd,\n\t\t\tprojectId: options.remote.projectId,\n\t\t});\n\t}\n\treturn new LocalSessionManager({ cwd: options.cwd, sessionDir: options.sessionDir });\n}\n\nasync function resolveRemoteInitialSession(parsed: Args, manager: SessionManager): Promise<Session> {\n\tif (parsed.fork) {\n\t\treturn await manager.forkFrom(parsed.fork);\n\t}\n\tif (parsed.session) {\n\t\treturn await manager.openReference(parsed.session);\n\t}\n\tif (parsed.resume) {\n\t\tconst selectedReference = await selectSession(\n\t\t\t(onProgress) => manager.list(onProgress),\n\t\t\t(onProgress) => manager.listAll(onProgress),\n\t\t);\n\t\tif (!selectedReference) {\n\t\t\tconsole.log(chalk.dim(\"No session selected\"));\n\t\t\tprocess.exit(0);\n\t\t}\n\t\treturn await manager.openReference(selectedReference);\n\t}\n\tif (parsed.continue) {\n\t\treturn await manager.continueRecent();\n\t}\n\treturn await manager.create();\n}\n\nasync function resolveLocalRequestedSession(sessionArg: string, cwd: string, sessionDir?: string): Promise<Session> {\n\tconst resolved = await resolveSessionPath(sessionArg, cwd, sessionDir);\n\tswitch (resolved.type) {\n\t\tcase \"path\":\n\t\tcase \"local\":\n\t\t\treturn openSessionOrExit(resolved.path, process.cwd(), sessionDir);\n\t\tcase \"global\": {\n\t\t\tconsole.log(chalk.yellow(`Session found in different project: ${resolved.cwd}`));\n\t\t\tconst shouldFork = await promptConfirm(\"Fork this session into current directory?\");\n\t\t\tif (!shouldFork) {\n\t\t\t\tconsole.log(chalk.dim(\"Aborted.\"));\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t\treturn forkSessionOrExit(resolved.path, cwd, sessionDir);\n\t\t}\n\t\tcase \"not_found\":\n\t\t\tconsole.error(chalk.red(`No session found matching '${resolved.arg}'`));\n\t\t\tprocess.exit(1);\n\t}\n}\n\nasync function resolveInitialSession(\n\tparsed: Args,\n\tcwd: string,\n\tsessionDir: string | undefined,\n\tsettingsManager: SettingsManager,\n\tremoteOptions?: RemoteSessionCliOptions,\n): Promise<Session> {\n\tif (parsed.noSession) {\n\t\treturn new InMemorySessionManager().create();\n\t}\n\n\tif (remoteOptions) {\n\t\treturn resolveRemoteInitialSession(\n\t\t\tparsed,\n\t\t\tnew RemoteSessionManager({\n\t\t\t\tbaseUrl: remoteOptions.baseUrl,\n\t\t\t\ttoken: remoteOptions.token,\n\t\t\t\tcwd,\n\t\t\t\tprojectId: remoteOptions.projectId,\n\t\t\t}),\n\t\t);\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) return resolveLocalRequestedSession(parsed.session, cwd, sessionDir);\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) => new LocalSessionManager({ cwd, sessionDir }).list(onProgress),\n\t\t\t\t(onProgress) => new LocalSessionManager({ cwd: process.cwd(), sessionDir }).listAll(onProgress),\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 openSessionOrExit(selectedPath, process.cwd(), sessionDir);\n\t\t} finally {\n\t\t\tstopThemeWatcher();\n\t\t}\n\t}\n\n\tif (parsed.continue) {\n\t\treturn new LocalSessionManager({ cwd: cwd, sessionDir: sessionDir }).continueRecent();\n\t}\n\n\treturn new LocalSessionManager({ cwd: cwd, sessionDir: sessionDir }).create();\n}\n\ninterface SessionOptionsResolution {\n\toptions: GripAgentSessionOptions;\n\tcliThinkingFromModel: boolean;\n\tdiagnostics: GripAgentDiagnostic[];\n}\n\nfunction applyCliModelSelection(\n\tparsed: Args,\n\tmodelRegistry: ModelRegistry,\n\tresolution: SessionOptionsResolution,\n): void {\n\tif (!parsed.model) return;\n\tconst resolved = resolveCliModel({\n\t\tcliProvider: parsed.provider,\n\t\tcliModel: parsed.model,\n\t\tmodelRegistry,\n\t});\n\tif (resolved.warning) resolution.diagnostics.push({ type: \"warning\", message: resolved.warning });\n\tif (resolved.error) resolution.diagnostics.push({ type: \"error\", message: resolved.error });\n\tif (!resolved.model) return;\n\tresolution.options.model = resolved.model;\n\tif (!parsed.thinking && resolved.thinkingLevel) {\n\t\tresolution.options.thinkingLevel = resolved.thinkingLevel;\n\t\tresolution.cliThinkingFromModel = true;\n\t}\n}\n\nfunction selectDefaultScopedModel(\n\tscopedModels: ScopedModel[],\n\tmodelRegistry: ModelRegistry,\n\tsettingsManager: SettingsManager,\n): ScopedModel {\n\tconst savedProvider = settingsManager.getDefaultProvider();\n\tconst savedModelId = settingsManager.getDefaultModel();\n\tconst savedModel = savedProvider && savedModelId ? modelRegistry.find(savedProvider, savedModelId) : undefined;\n\treturn (\n\t\t(savedModel ? scopedModels.find((scoped) => modelsAreEqual(scoped.model, savedModel)) : undefined) ??\n\t\tscopedModels[0]\n\t);\n}\n\nfunction applyCliToolSelection(parsed: Args, options: GripAgentSessionOptions): void {\n\tif (parsed.noTools) options.noTools = \"all\";\n\telse if (parsed.noBuiltinTools) options.noTools = \"builtin\";\n\tif (parsed.tools) options.tools = [...parsed.tools];\n\tif (parsed.enableLspTools) options.enableLspTools = true;\n}\n\nfunction buildSessionOptions(\n\tparsed: Args,\n\tscopedModels: ScopedModel[],\n\thasExistingSession: boolean,\n\tmodelRegistry: ModelRegistry,\n\tsettingsManager: SettingsManager,\n): SessionOptionsResolution {\n\tconst resolution: SessionOptionsResolution = {\n\t\toptions: {},\n\t\tcliThinkingFromModel: false,\n\t\tdiagnostics: [],\n\t};\n\tapplyCliModelSelection(parsed, modelRegistry, resolution);\n\tconst { options } = resolution;\n\n\tif (!options.model && scopedModels.length > 0 && !hasExistingSession) {\n\t\tconst selected = selectDefaultScopedModel(scopedModels, modelRegistry, settingsManager);\n\t\toptions.model = selected.model;\n\t\tif (!parsed.thinking && selected.thinkingLevel) options.thinkingLevel = selected.thinkingLevel;\n\t}\n\n\tif (parsed.thinking) options.thinkingLevel = parsed.thinking;\n\tif (scopedModels.length > 0) {\n\t\toptions.scopedModels = scopedModels.map((scoped) => ({\n\t\t\tmodel: scoped.model,\n\t\t\tthinkingLevel: scoped.thinkingLevel,\n\t\t}));\n\t}\n\tapplyCliToolSelection(parsed, options);\n\treturn resolution;\n}\n\nfunction resolveCliPaths(cwd: string, paths: string[] | undefined): string[] | undefined {\n\treturn paths?.map((value) => (isLocalPath(value) ? resolvePath(value, cwd) : 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 TuiMainScreen(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 type ProjectHookTrustChoice = \"deny\" | \"once\" | \"always\";\n\nexport async function promptForProjectHookTrust(\n\tcwd: string,\n\tidentity: string,\n\tsettingsManager: SettingsManager,\n): Promise<ProjectHookTrustChoice> {\n\tinitTheme(settingsManager.getTheme());\n\tsetKeybindings(KeybindingsManager.create());\n\tconst title = [\n\t\t`Project hooks were found in ${cwd}.`,\n\t\t\"Project hooks execute in the active workspace: as your host user locally, or inside an active sandbox/remote backend.\",\n\t\t`Trust always authorizes all current and future hook changes in ${identity}.`,\n\t].join(\"\\n\");\n\n\treturn new Promise((resolve) => {\n\t\tconst ui = new TuiMainScreen(new ProcessTerminal(), settingsManager.getShowHardwareCursor());\n\t\tui.setClearOnShrink(settingsManager.getClearOnShrink());\n\t\tlet settled = false;\n\t\tconst finish = (choice: ProjectHookTrustChoice) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tui.stop();\n\t\t\tresolve(choice);\n\t\t};\n\t\tconst selector = new ExtensionSelectorComponent(\n\t\t\ttitle,\n\t\t\t[\"Don't trust\", \"Trust once\", \"Trust always\"],\n\t\t\t(option) => {\n\t\t\t\tif (option === \"Trust once\") finish(\"once\");\n\t\t\t\telse if (option === \"Trust always\") finish(\"always\");\n\t\t\t\telse finish(\"deny\");\n\t\t\t},\n\t\t\t() => finish(\"deny\"),\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}\nexport interface ProjectHookTrustPolicyOptions {\n\tinitialCwd: string;\n\tinitialSessionId: string;\n\texplicitTrust: boolean;\n\tinteractive: boolean;\n\tskipInitialPrompt: boolean;\n\tstore: ProjectHookTrustStore;\n\tprompt: (cwd: string, identity: string) => Promise<ProjectHookTrustChoice>;\n\treportError?: (error: string | undefined) => void;\n}\n\nexport interface ProjectHookTrustPolicy {\n\tresolveInitial(backendAllowsProjectHooks: boolean): Promise<boolean>;\n\tgetInitialTrustedIdentity(): string | undefined;\n\tresolveFor(sessionCwd: string, sessionId: string): ProjectHookTrustResult;\n\tisTrustedFor(sessionCwd: string, sessionId: string): boolean;\n}\ninterface ProjectHookTrustPolicyState {\n\tinitialTrusted: boolean;\n\tinitialTrustedIdentity: string | undefined;\n\ttrustOnceIdentity: string | undefined;\n\ttrustOnceSessionId: string | undefined;\n\ttrustOnceConsumed: boolean;\n}\n\ntype ProjectHookTrustErrorReporter = (error: string | undefined) => void;\n\nfunction identifyInitialProjectHooks(cwd: string, reportError: ProjectHookTrustErrorReporter): string | undefined {\n\ttry {\n\t\treturn canonicalProjectHookIdentity(cwd);\n\t} catch (error) {\n\t\treportError(\n\t\t\t`Unable to identify project hooks repository: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t\treturn undefined;\n\t}\n}\n\nfunction applyInitialProjectHookTrustChoice(\n\tchoice: ProjectHookTrustChoice,\n\tidentity: string,\n\toptions: ProjectHookTrustPolicyOptions,\n\tstate: ProjectHookTrustPolicyState,\n\treportError: ProjectHookTrustErrorReporter,\n): void {\n\tif (choice === \"once\" || choice === \"always\") {\n\t\tstate.initialTrusted = true;\n\t\tstate.initialTrustedIdentity = identity;\n\t}\n\tif (choice === \"once\") {\n\t\tstate.trustOnceIdentity = identity;\n\t\tstate.trustOnceSessionId = options.initialSessionId;\n\t}\n\tif (choice === \"always\") {\n\t\tconst saved = options.store.trustAlwaysIdentity(identity);\n\t\treportError(saved.error);\n\t}\n}\n\nasync function resolveInitialProjectHookTrust(\n\tbackendAllowsProjectHooks: boolean,\n\toptions: ProjectHookTrustPolicyOptions,\n\tstate: ProjectHookTrustPolicyState,\n\treportError: ProjectHookTrustErrorReporter,\n): Promise<boolean> {\n\tif (!backendAllowsProjectHooks) return state.initialTrusted;\n\tif (state.initialTrusted) return true;\n\tif (options.skipInitialPrompt) return false;\n\tif (!hasProjectHookConfiguration(options.initialCwd)) return false;\n\n\tconst persisted = options.store.isTrusted(options.initialCwd);\n\treportError(persisted.error);\n\tstate.initialTrusted = persisted.trusted;\n\tstate.initialTrustedIdentity = persisted.trusted ? persisted.identity : undefined;\n\tif (state.initialTrusted || !options.interactive) return state.initialTrusted;\n\n\tconst identity = identifyInitialProjectHooks(options.initialCwd, reportError);\n\tif (!identity) return false;\n\tconst choice = await options.prompt(options.initialCwd, identity);\n\tapplyInitialProjectHookTrustChoice(choice, identity, options, state, reportError);\n\treturn state.initialTrusted;\n}\n\n/** Orchestrates the CLI's startup and per-session project-hook trust decisions. */\nexport function createProjectHookTrustPolicy(options: ProjectHookTrustPolicyOptions): ProjectHookTrustPolicy {\n\tconst state: ProjectHookTrustPolicyState = {\n\t\tinitialTrusted: options.explicitTrust,\n\t\tinitialTrustedIdentity: undefined,\n\t\ttrustOnceIdentity: undefined,\n\t\ttrustOnceSessionId: undefined,\n\t\ttrustOnceConsumed: false,\n\t};\n\tconst reportError = options.reportError ?? (() => {});\n\n\treturn {\n\t\tresolveInitial(backendAllowsProjectHooks: boolean): Promise<boolean> {\n\t\t\treturn resolveInitialProjectHookTrust(backendAllowsProjectHooks, options, state, reportError);\n\t\t},\n\n\t\tgetInitialTrustedIdentity(): string | undefined {\n\t\t\treturn state.initialTrustedIdentity;\n\t\t},\n\n\t\tresolveFor(sessionCwd: string, sessionId: string): ProjectHookTrustResult {\n\t\t\tif (options.explicitTrust) return { trusted: true };\n\t\t\tif (!hasProjectHookConfiguration(sessionCwd)) return { trusted: false };\n\t\t\ttry {\n\t\t\t\tif (\n\t\t\t\t\t!state.trustOnceConsumed &&\n\t\t\t\t\tstate.trustOnceIdentity &&\n\t\t\t\t\tstate.trustOnceSessionId === sessionId &&\n\t\t\t\t\tcanonicalProjectHookIdentity(sessionCwd) === state.trustOnceIdentity\n\t\t\t\t) {\n\t\t\t\t\tstate.trustOnceConsumed = true;\n\t\t\t\t\treturn { trusted: true, identity: state.trustOnceIdentity };\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconst message = `Unable to identify project hooks repository: ${error instanceof Error ? error.message : String(error)}`;\n\t\t\t\treportError(message);\n\t\t\t\treturn { trusted: false, error: message };\n\t\t\t}\n\t\t\tconst persisted = options.store.isTrusted(sessionCwd);\n\t\t\treportError(persisted.error);\n\t\t\treturn persisted;\n\t\t},\n\n\t\tisTrustedFor(sessionCwd: string, sessionId: string): boolean {\n\t\t\treturn this.resolveFor(sessionCwd, sessionId).trusted;\n\t\t},\n\t};\n}\n\nexport interface MainOptions {\n\textensionFactories?: ExtensionFactory[];\n\tdaemonRunner?: (args: readonly string[]) => Promise<void>;\n\t/** Test/embedding override for the interactive project-hook trust prompt. */\n\tprojectHookTrustPrompt?: (cwd: string, identity: string) => Promise<ProjectHookTrustChoice>;\n\t/** Test/embedding override for persistent project-hook trust storage. */\n\tprojectHookTrustStore?: ProjectHookTrustStore;\n}\ninterface ParsedMainInvocation {\n\tparsed: Args;\n\tappMode: GripAgentAppMode;\n}\n\ninterface StartupSessionResolution {\n\tcwd: string;\n\tagentDir: string;\n\tstartupSettingsManager: SettingsManager;\n\tsessionDir: string | undefined;\n\tremoteSessionOptions: RemoteSessionCliOptions | undefined;\n\tinitialSession: Session;\n}\n\nasync function runCliPreflight(args: string[], options: MainOptions | undefined): Promise<boolean> {\n\tif (isDaemonCommand(args)) {\n\t\tawait (options?.daemonRunner ?? runDaemonCommand)(args);\n\t\treturn true;\n\t}\n\tconfigureHttpDispatcher();\n\tresetTimings();\n\tconst offlineMode = args.includes(\"--offline\") || isTruthyEnvFlag(process.env.GRIP_OFFLINE);\n\tif (offlineMode) {\n\t\tprocess.env.GRIP_OFFLINE = \"1\";\n\t\tprocess.env.GRIP_SKIP_VERSION_CHECK = \"1\";\n\t}\n\tif (process.platform === \"win32\") cleanupWindowsSelfUpdateQuarantine(getPackageDir());\n\tif (await handlePackageCommand(args)) return true;\n\treturn handleConfigCommand(args);\n}\n\nfunction reportArgumentDiagnostics(parsed: Args): void {\n\tif (parsed.diagnostics.length === 0) return;\n\tfor (const diagnostic of parsed.diagnostics) {\n\t\tconst color = diagnostic.type === \"error\" ? chalk.red : chalk.yellow;\n\t\tconsole.error(color(`${diagnostic.type === \"error\" ? \"Error\" : \"Warning\"}: ${diagnostic.message}`));\n\t}\n\tif (parsed.diagnostics.some((diagnostic) => diagnostic.type === \"error\")) process.exit(1);\n}\n\nasync function handleCliMetadataCommands(parsed: Args): Promise<void> {\n\tif (parsed.version) {\n\t\tconsole.log(VERSION);\n\t\tprocess.exit(0);\n\t}\n\tif (!parsed.export) return;\n\tlet result: string;\n\ttry {\n\t\tconst outputPath = parsed.messages.length > 0 ? parsed.messages[0] : undefined;\n\t\tresult = await exportFromFile(parsed.export, outputPath);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Failed to export session\";\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tprocess.exit(1);\n\t}\n\tconsole.log(`Exported to: ${result}`);\n\tprocess.exit(0);\n}\n\nasync function parseMainInvocation(args: string[]): Promise<ParsedMainInvocation> {\n\tconst parsed = parseArgs(args);\n\treportArgumentDiagnostics(parsed);\n\ttime(\"parseArgs\");\n\tconst appMode = resolveAppMode(parsed, process.stdin.isTTY);\n\tGripAgent.setupStdio({ mode: appMode });\n\tawait handleCliMetadataCommands(parsed);\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\tvalidateForkFlags(parsed);\n\treturn { parsed, appMode };\n}\n\nasync function resolveStartupSession(parsed: Args, appMode: GripAgentAppMode): Promise<StartupSessionResolution> {\n\tconst cwd = process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst startupSettingsManager = SettingsManager.create(cwd, agentDir);\n\treportDiagnostics(collectSettingsDiagnostics(startupSettingsManager, \"startup session lookup\"));\n\tconst envSessionDir = process.env[ENV_SESSION_DIR];\n\tconst sessionDir =\n\t\t(parsed.sessionDir ? normalizePath(parsed.sessionDir) : undefined) ??\n\t\t(envSessionDir ? expandTildePath(envSessionDir) : undefined) ??\n\t\tstartupSettingsManager.getSessionDir();\n\tconst remoteSessionOptions = resolveRemoteSessionCliOptions(parsed);\n\tlet initialSession = await resolveInitialSession(\n\t\tparsed,\n\t\tcwd,\n\t\tsessionDir,\n\t\tstartupSettingsManager,\n\t\tremoteSessionOptions,\n\t);\n\tconst missingSessionCwdIssue = getMissingSessionCwdIssue(initialSession, cwd);\n\tif (missingSessionCwdIssue) {\n\t\tif (appMode !== \"interactive\") {\n\t\t\tconsole.error(chalk.red(new MissingSessionCwdError(missingSessionCwdIssue).message));\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst selectedCwd = await promptForMissingSessionCwd(missingSessionCwdIssue, startupSettingsManager);\n\t\tif (!selectedCwd) process.exit(0);\n\t\tinitialSession = await createLifecycleSessionManager({\n\t\t\tcwd,\n\t\t\tsessionDir,\n\t\t\tremote: remoteSessionOptions,\n\t\t}).openReference(missingSessionCwdIssue.sessionReference!, { cwdOverride: selectedCwd });\n\t}\n\ttime(\"resolveInitialSession\");\n\treturn { cwd, agentDir, startupSettingsManager, sessionDir, remoteSessionOptions, initialSession };\n}\n\nasync function resolveStartupToolOperations(parsed: Args): Promise<ToolOperations | undefined> {\n\tconst remoteDeferred = parsed.remoteDeferred;\n\tif (remoteDeferred && parsed.remote && !parsed.help) {\n\t\tconsole.error(chalk.red(\"Error: --remote-deferred and --remote cannot be used together\"));\n\t\tprocess.exit(1);\n\t}\n\tif (parsed.remote && !parsed.help) {\n\t\ttry {\n\t\t\treturn await createRemoteToolOperations(parsed.remote);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconsole.error(chalk.red(`Error: failed to initialize remote tool operations: ${message}`));\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\tif (!remoteDeferred || parsed.help) return undefined;\n\tif (!parsed.remoteCwd) {\n\t\tconsole.error(chalk.red(\"Error: --remote-deferred requires --remote-cwd <path>\"));\n\t\tprocess.exit(1);\n\t}\n\treturn new DeferredRemoteToolOperations(parsed.remoteCwd);\n}\n\nfunction createCliLspInputs(parsed: Args, cwd: string): LspConfigurationInput[] {\n\tconst inputs: LspConfigurationInput[] = [];\n\tif (parsed.lspConfig) inputs.push({ type: \"file\", path: resolvePath(parsed.lspConfig, cwd), scope: \"cli\" });\n\tif (parsed.noLsp) inputs.push({ type: \"disabled\", source: \"--no-lsp\", scope: \"cli\" });\n\treturn inputs;\n}\nasync function handleRuntimeInformationCommands(parsed: Args, gripAgent: GripAgent): Promise<void> {\n\tconst { modelRegistry, resourceLoader } = gripAgent.services;\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\tif (parsed.listModels === undefined) return;\n\tconst searchPattern = typeof parsed.listModels === \"string\" ? parsed.listModels : undefined;\n\tawait listModels(modelRegistry, searchPattern);\n\tprocess.exit(0);\n}\n\nasync function reportRuntimeStartupDiagnostics(gripAgent: GripAgent, deprecationWarnings: string[]): Promise<void> {\n\tif (gripAgent.mode === \"interactive\" && deprecationWarnings.length > 0) {\n\t\tawait showDeprecationWarnings(deprecationWarnings);\n\t}\n\ttime(\"resolveModelScope\");\n\tconst hasFatalDiagnostics = gripAgent.diagnostics.some(isFatalGripAgentDiagnostic);\n\tif (gripAgent.mode !== \"interactive\" || hasFatalDiagnostics) reportDiagnostics(gripAgent.diagnostics);\n\tif (hasFatalDiagnostics) process.exit(1);\n\ttime(\"createAgentSession\");\n}\n\nexport async function main(args: string[], options?: MainOptions) {\n\tif (await runCliPreflight(args, options)) return;\n\tconst { parsed, appMode } = await parseMainInvocation(args);\n\n\t// Run migrations (pass cwd for project-local migrations)\n\tconst { migratedAuthProviders: migratedProviders, deprecationWarnings } = runMigrations(process.cwd());\n\ttime(\"runMigrations\");\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 { cwd, agentDir, startupSettingsManager, sessionDir, remoteSessionOptions, initialSession } =\n\t\tawait resolveStartupSession(parsed, appMode);\n\tconst projectHookTrustStore = options?.projectHookTrustStore ?? new ProjectHookTrustStore(agentDir);\n\tconst reportedProjectHookTrustErrors = new Set<string>();\n\tconst reportProjectHookTrustError = (error: string | undefined) => {\n\t\tif (!error || reportedProjectHookTrustErrors.has(error)) return;\n\t\treportedProjectHookTrustErrors.add(error);\n\t\tconsole.error(chalk.yellow(`Warning: ${error}`));\n\t};\n\tconst initialHookCwd = initialSession.getCwd();\n\tconst projectHookTrustPolicy = createProjectHookTrustPolicy({\n\t\tinitialCwd: initialHookCwd,\n\t\tinitialSessionId: initialSession.getSessionId(),\n\t\texplicitTrust: parsed.trustProjectHooks === true,\n\t\tinteractive: appMode === \"interactive\",\n\t\tskipInitialPrompt: parsed.help || parsed.listModels !== undefined,\n\t\tstore: projectHookTrustStore,\n\t\tprompt:\n\t\t\toptions?.projectHookTrustPrompt ??\n\t\t\t((promptCwd, promptIdentity) => promptForProjectHookTrust(promptCwd, promptIdentity, startupSettingsManager)),\n\t\treportError: reportProjectHookTrustError,\n\t});\n\tconst authStorage = AuthStorage.create();\n\tconst runtimeSessionManager = parsed.noSession\n\t\t? new InMemorySessionManager(initialSession.getCwd())\n\t\t: createLifecycleSessionManager({ cwd: initialSession.getCwd(), sessionDir, remote: remoteSessionOptions });\n\tconst toolOperations = await resolveStartupToolOperations(parsed);\n\tconst initialHookBackend = toolOperations?.getBackendInfo?.();\n\tconst initialProjectHooksTrusted = await projectHookTrustPolicy.resolveInitial(\n\t\ttoolOperations === undefined || initialHookBackend?.type === \"local\",\n\t);\n\tconst initialTrustedProjectHooksIdentity = projectHookTrustPolicy.getInitialTrustedIdentity();\n\tconst backendType = toolOperations?.getBackendInfo?.()?.type;\n\tconst instructionPathCwd = toolOperations && backendType === \"remote\" ? toolOperations.cwd : cwd;\n\tconst resolvedExtensionPaths = resolveCliPaths(cwd, parsed.extensions);\n\tconst resolvedSkillPaths = resolveCliPaths(instructionPathCwd, parsed.skills);\n\tconst resolvedRulePaths = resolveCliPaths(instructionPathCwd, parsed.rules);\n\tconst resolvedPromptTemplatePaths = resolveCliPaths(instructionPathCwd, parsed.promptTemplates);\n\tconst resolvedThemePaths = resolveCliPaths(cwd, parsed.themes);\n\tconst cliLspInputs = createCliLspInputs(parsed, cwd);\n\tconst gripAgent = await GripAgent.create({\n\t\ttoolOperations,\n\t\townsToolOperations: toolOperations !== undefined,\n\t\tmode: appMode,\n\t\tcwd: initialSession.getCwd(),\n\t\tagentDir,\n\t\tsessionManager: runtimeSessionManager,\n\t\tauthStorage,\n\t\ttrustProjectHooks: initialProjectHooksTrusted,\n\t\ttrustedProjectHooksIdentity: initialTrustedProjectHooksIdentity,\n\t\textensionFlagValues: parsed.unknownFlags,\n\t\tresourceLoaderOptions: {\n\t\t\ttoolOperations,\n\t\t\tadditionalExtensionPaths: resolvedExtensionPaths,\n\t\t\tadditionalSkillPaths: resolvedSkillPaths,\n\t\t\tadditionalRulePaths: resolvedRulePaths,\n\t\t\tadditionalPromptTemplatePaths: resolvedPromptTemplatePaths,\n\t\t\tadditionalThemePaths: resolvedThemePaths,\n\t\t\tnoExtensions: parsed.noExtensions,\n\t\t\tnoSkills: parsed.noSkills,\n\t\t\tnoRules: parsed.noRules,\n\t\t\tnoPromptTemplates: parsed.noPromptTemplates,\n\t\t\tnoThemes: parsed.noThemes,\n\t\t\tnoContextFiles: parsed.noContextFiles,\n\t\t\tsystemPrompt: parsed.systemPrompt,\n\t\t\tappendSystemPrompt: parsed.appendSystemPrompt,\n\t\t\textensionFactories: options?.extensionFactories,\n\t\t},\n\t\tresolveSessionOptions: async ({ services, session }) => {\n\t\t\tconst { settingsManager, modelRegistry } = services;\n\t\t\tconst diagnostics: GripAgentDiagnostic[] = [\n\t\t\t\t...collectSettingsDiagnostics(settingsManager, \"runtime creation\"),\n\t\t\t];\n\t\t\tconst modelPatterns = parsed.models ?? settingsManager.getEnabledModels();\n\t\t\tconst scopedModels =\n\t\t\t\tmodelPatterns && modelPatterns.length > 0 ? await resolveModelScope(modelPatterns, modelRegistry) : [];\n\t\t\tconst { options: sessionOptions, diagnostics: sessionOptionDiagnostics } = buildSessionOptions(\n\t\t\t\tparsed,\n\t\t\t\tscopedModels,\n\t\t\t\tsession.buildSessionContext().messages.length > 0,\n\t\t\t\tmodelRegistry,\n\t\t\t\tsettingsManager,\n\t\t\t);\n\t\t\tdiagnostics.push(...sessionOptionDiagnostics);\n\n\t\t\tif (parsed.apiKey) {\n\t\t\t\tif (!sessionOptions.model) {\n\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\ttype: \"error\",\n\t\t\t\t\t\tmessage: \"--api-key requires a model to be specified via --model, --provider/--model, or --models\",\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tauthStorage.setRuntimeApiKey(sessionOptions.model.provider, parsed.apiKey);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (toolOperations) {\n\t\t\t\tconst backend = toolOperations.getBackendInfo?.();\n\t\t\t\tlet message = `Deferred remote backend mode enabled (cwd: ${toolOperations.cwd})`;\n\t\t\t\tif (backend?.type === \"remote\" && backend.configured) {\n\t\t\t\t\tmessage = `Remote tool operations enabled: ${backend.url} (cwd: ${backend.cwd})`;\n\t\t\t\t}\n\t\t\t\tdiagnostics.push({ type: \"info\", message });\n\t\t\t}\n\t\t\tconst projectHookTrust = projectHookTrustPolicy.resolveFor(services.cwd, session.getSessionId());\n\n\t\t\treturn {\n\t\t\t\tmodel: sessionOptions.model,\n\t\t\t\tthinkingLevel: sessionOptions.thinkingLevel,\n\t\t\t\tscopedModels: sessionOptions.scopedModels,\n\t\t\t\ttools: sessionOptions.tools,\n\t\t\t\tenableLspTools: sessionOptions.enableLspTools,\n\t\t\t\tnoTools: sessionOptions.noTools,\n\t\t\t\tcustomTools: sessionOptions.customTools,\n\t\t\t\ttoolOperations,\n\t\t\t\ttrustProjectHooks: projectHookTrust.trusted,\n\t\t\t\ttrustedProjectHooksIdentity: projectHookTrust.identity,\n\t\t\t\tlsp: cliLspInputs,\n\t\t\t\tdiagnostics,\n\t\t\t};\n\t\t},\n\t});\n\tawait gripAgent.createAgentSession({ session: initialSession });\n\ttime(\"createAgentSessionRuntime\");\n\tconst { settingsManager } = gripAgent.services;\n\tawait handleRuntimeInformationCommands(parsed, gripAgent);\n\n\tconst stdinContent = await gripAgent.readPipedStdin();\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(), gripAgent.mode === \"interactive\");\n\ttime(\"initTheme\");\n\n\tawait reportRuntimeStartupDiagnostics(gripAgent, deprecationWarnings);\n\n\tawait gripAgent.runMode({\n\t\tmigratedProviders,\n\t\tinitialMessage,\n\t\tinitialImages,\n\t\tinitialMessages: parsed.messages,\n\t\tverbose: parsed.verbose,\n\t\ttuiMode: parsed.tuiMode,\n\t\tstartupBenchmark: isTruthyEnvFlag(process.env.GRIP_STARTUP_BENCHMARK),\n\t});\n}\n"]}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuBH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,OAAO,EAGN,KAAK,sBAAsB,EAC3B,qBAAqB,EACrB,MAAM,6BAA6B,CAAC;AAiBrC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AA0a7D,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEhE,wBAAsB,yBAAyB,CAC9C,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,eAAe,GAC9B,OAAO,CAAC,sBAAsB,CAAC,CAkCjC;AACD,MAAM,WAAW,6BAA6B;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,KAAK,EAAE,qBAAqB,CAAC;IAC7B,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC3E,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,sBAAsB;IACtC,cAAc,CAAC,yBAAyB,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrE,yBAAyB,IAAI,MAAM,GAAG,SAAS,CAAC;IAChD,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,sBAAsB,CAAC;IAC1E,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7D;AAmED,mFAAmF;AACnF,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,6BAA6B,GAAG,sBAAsB,CA8C3G;AAED,MAAM,WAAW,WAAW;IAC3B,kBAAkB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACxC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,6EAA6E;IAC7E,sBAAsB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC5F,yEAAyE;IACzE,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;CAC9C;AAuKD,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,iBAmK/D","sourcesContent":["/**\n * Main entry point for the coding agent CLI.\n *\n * This file handles CLI argument parsing and translates them into\n * GripAgent options. GripAgent does the heavy lifting.\n */\n\nimport { createInterface } from \"node:readline\";\nimport { modelsAreEqual } from \"@greppleai/grip-ai\";\nimport { ProcessTerminal, setKeybindings, TuiMainScreen } from \"@greppleai/grip-tui\";\nimport chalk from \"chalk\";\nimport { type Args, parseArgs, printHelp } from \"./cli/args.ts\";\nimport { processFileArguments } from \"./cli/file-processor.ts\";\nimport { buildInitialMessage, type InitialMessageResult } from \"./cli/initial-message.ts\";\nimport { listModels } from \"./cli/list-models.ts\";\nimport { selectSession } from \"./cli/session-picker.ts\";\nimport {\n\tENV_REMOTE_PROJECT_ID,\n\tENV_REMOTE_SESSION_BASE_URL,\n\tENV_REMOTE_SESSION_TOKEN,\n\tENV_SESSION_DIR,\n\texpandTildePath,\n\tgetAgentDir,\n\tgetPackageDir,\n\tVERSION,\n} from \"./config.ts\";\nimport { AuthStorage } from \"./core/auth-storage.ts\";\nimport { exportFromFile } from \"./core/export-html/index.ts\";\nimport type { ExtensionFactory } from \"./core/extensions/types.ts\";\nimport type { GripAgentAppMode, GripAgentDiagnostic, GripAgentSessionOptions } from \"./core/grip-agent.ts\";\nimport { GripAgent, isFatalGripAgentDiagnostic } from \"./core/grip-agent.ts\";\nimport {\n\tcanonicalProjectHookIdentity,\n\thasProjectHookConfiguration,\n\ttype ProjectHookTrustResult,\n\tProjectHookTrustStore,\n} from \"./core/hooks/trust-store.ts\";\nimport { configureHttpDispatcher } from \"./core/http-dispatcher.ts\";\nimport { KeybindingsManager } from \"./core/keybindings.ts\";\nimport type { LspConfigurationInput } from \"./core/lsp/config-loader.ts\";\nimport type { ModelRegistry } from \"./core/model-registry.ts\";\nimport { resolveCliModel, resolveModelScope, type ScopedModel } from \"./core/model-resolver.ts\";\nimport { InMemorySessionManager } from \"./core/session/in-memory-session-manager.ts\";\nimport { LocalSessionManager } from \"./core/session/local-session-manager.ts\";\nimport { RemoteSessionManager } from \"./core/session/remote-session-manager.ts\";\nimport type { Session } from \"./core/session/session.ts\";\nimport type { SessionManager } from \"./core/session/session-manager.ts\";\nimport {\n\tformatMissingSessionCwdPrompt,\n\tgetMissingSessionCwdIssue,\n\tMissingSessionCwdError,\n\ttype SessionCwdIssue,\n} from \"./core/session-cwd.ts\";\nimport { SettingsManager } from \"./core/settings-manager.ts\";\nimport { resetTimings, time } from \"./core/timings.ts\";\nimport {\n\tcreateRemoteToolOperations,\n\tDeferredRemoteToolOperations,\n\ttype ToolOperations,\n} from \"./core/tools/operations.ts\";\nimport { runDaemonCommand } from \"./daemon/command.ts\";\nimport { isDaemonCommand } from \"./daemon/config.ts\";\nimport { runMigrations, showDeprecationWarnings } from \"./migrations.ts\";\nimport { ExtensionSelectorComponent } from \"./modes/interactive/components/extension-selector.ts\";\nimport { initTheme, stopThemeWatcher } from \"./modes/interactive/theme/theme.ts\";\nimport { handleConfigCommand, handlePackageCommand } from \"./package-manager-cli.ts\";\nimport { isLocalPath, normalizePath, resolvePath } from \"./utils/paths.ts\";\nimport { cleanupWindowsSelfUpdateQuarantine } from \"./utils/windows-self-update.ts\";\n\nfunction collectSettingsDiagnostics(settingsManager: SettingsManager, context: string): GripAgentDiagnostic[] {\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 GripAgentDiagnostic[]): 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\nfunction resolveAppMode(parsed: Args, stdinIsTTY: boolean): GripAgentAppMode {\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\nasync function prepareInitialMessage(\n\tparsed: Args,\n\tautoResizeImages: boolean,\n\tstdinContent?: string,\n): Promise<InitialMessageResult> {\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, resolve it before handing it to the session manager.\n\tif (sessionArg.includes(\"/\") || sessionArg.includes(\"\\\\\") || sessionArg.endsWith(\".jsonl\")) {\n\t\treturn { type: \"path\", path: resolvePath(sessionArg, cwd) };\n\t}\n\n\t// Try to match as session ID in current project first\n\tconst localSessions = await new LocalSessionManager({ cwd: cwd, sessionDir: sessionDir }).list();\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 new LocalSessionManager({ cwd: process.cwd(), sessionDir }).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): Session {\n\ttry {\n\t\treturn new LocalSessionManager({ cwd: cwd, sessionDir: sessionDir }).forkFrom(sourcePath);\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\nfunction openSessionOrExit(path: string, cwd: string, sessionDir?: string): Session {\n\ttry {\n\t\treturn new LocalSessionManager({ cwd, sessionDir }).openReference(path);\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\ninterface RemoteSessionCliOptions {\n\tbaseUrl: string;\n\ttoken: string;\n\tprojectId?: string;\n}\n\ninterface LifecycleSessionManagerOptions {\n\tcwd: string;\n\tsessionDir?: string;\n\tremote?: RemoteSessionCliOptions;\n}\n\nfunction resolveRemoteSessionCliOptions(parsed: Args): RemoteSessionCliOptions | undefined {\n\tconst baseUrl = parsed.remoteSessionBaseUrl ?? process.env[ENV_REMOTE_SESSION_BASE_URL];\n\tconst token = parsed.remoteSessionToken ?? process.env[ENV_REMOTE_SESSION_TOKEN];\n\tconst projectId = parsed.remoteProjectId ?? process.env[ENV_REMOTE_PROJECT_ID];\n\n\tif (!baseUrl && !token && !projectId) {\n\t\treturn undefined;\n\t}\n\tif (!baseUrl || !token) {\n\t\tconsole.error(\n\t\t\tchalk.red(\n\t\t\t\t`Error: remote sessions require both --remote-session-base-url and --remote-session-token, or ${ENV_REMOTE_SESSION_BASE_URL} and ${ENV_REMOTE_SESSION_TOKEN}`,\n\t\t\t),\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\n\treturn { baseUrl, token, projectId };\n}\n\nfunction createLifecycleSessionManager(options: LifecycleSessionManagerOptions): SessionManager {\n\tif (options.remote) {\n\t\treturn new RemoteSessionManager({\n\t\t\tbaseUrl: options.remote.baseUrl,\n\t\t\ttoken: options.remote.token,\n\t\t\tcwd: options.cwd,\n\t\t\tprojectId: options.remote.projectId,\n\t\t});\n\t}\n\treturn new LocalSessionManager({ cwd: options.cwd, sessionDir: options.sessionDir });\n}\n\nasync function resolveRemoteInitialSession(parsed: Args, manager: SessionManager): Promise<Session> {\n\tif (parsed.fork) {\n\t\treturn await manager.forkFrom(parsed.fork);\n\t}\n\tif (parsed.session) {\n\t\treturn await manager.openReference(parsed.session);\n\t}\n\tif (parsed.resume) {\n\t\tconst selectedReference = await selectSession(\n\t\t\t(onProgress) => manager.list(onProgress),\n\t\t\t(onProgress) => manager.listAll(onProgress),\n\t\t);\n\t\tif (!selectedReference) {\n\t\t\tconsole.log(chalk.dim(\"No session selected\"));\n\t\t\tprocess.exit(0);\n\t\t}\n\t\treturn await manager.openReference(selectedReference);\n\t}\n\tif (parsed.continue) {\n\t\treturn await manager.continueRecent();\n\t}\n\treturn await manager.create();\n}\n\nasync function resolveLocalRequestedSession(sessionArg: string, cwd: string, sessionDir?: string): Promise<Session> {\n\tconst resolved = await resolveSessionPath(sessionArg, cwd, sessionDir);\n\tswitch (resolved.type) {\n\t\tcase \"path\":\n\t\tcase \"local\":\n\t\t\treturn openSessionOrExit(resolved.path, process.cwd(), sessionDir);\n\t\tcase \"global\": {\n\t\t\tconsole.log(chalk.yellow(`Session found in different project: ${resolved.cwd}`));\n\t\t\tconst shouldFork = await promptConfirm(\"Fork this session into current directory?\");\n\t\t\tif (!shouldFork) {\n\t\t\t\tconsole.log(chalk.dim(\"Aborted.\"));\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t\treturn forkSessionOrExit(resolved.path, cwd, sessionDir);\n\t\t}\n\t\tcase \"not_found\":\n\t\t\tconsole.error(chalk.red(`No session found matching '${resolved.arg}'`));\n\t\t\tprocess.exit(1);\n\t}\n}\n\nasync function resolveInitialSession(\n\tparsed: Args,\n\tcwd: string,\n\tsessionDir: string | undefined,\n\tsettingsManager: SettingsManager,\n\tremoteOptions?: RemoteSessionCliOptions,\n): Promise<Session> {\n\tif (parsed.noSession) {\n\t\treturn new InMemorySessionManager().create();\n\t}\n\n\tif (remoteOptions) {\n\t\treturn resolveRemoteInitialSession(\n\t\t\tparsed,\n\t\t\tnew RemoteSessionManager({\n\t\t\t\tbaseUrl: remoteOptions.baseUrl,\n\t\t\t\ttoken: remoteOptions.token,\n\t\t\t\tcwd,\n\t\t\t\tprojectId: remoteOptions.projectId,\n\t\t\t}),\n\t\t);\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) return resolveLocalRequestedSession(parsed.session, cwd, sessionDir);\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) => new LocalSessionManager({ cwd, sessionDir }).list(onProgress),\n\t\t\t\t(onProgress) => new LocalSessionManager({ cwd: process.cwd(), sessionDir }).listAll(onProgress),\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 openSessionOrExit(selectedPath, process.cwd(), sessionDir);\n\t\t} finally {\n\t\t\tstopThemeWatcher();\n\t\t}\n\t}\n\n\tif (parsed.continue) {\n\t\treturn new LocalSessionManager({ cwd: cwd, sessionDir: sessionDir }).continueRecent();\n\t}\n\n\treturn new LocalSessionManager({ cwd: cwd, sessionDir: sessionDir }).create();\n}\n\ninterface SessionOptionsResolution {\n\toptions: GripAgentSessionOptions;\n\tcliThinkingFromModel: boolean;\n\tdiagnostics: GripAgentDiagnostic[];\n}\n\nfunction applyCliModelSelection(\n\tparsed: Args,\n\tmodelRegistry: ModelRegistry,\n\tresolution: SessionOptionsResolution,\n): void {\n\tif (!parsed.model) return;\n\tconst resolved = resolveCliModel({\n\t\tcliProvider: parsed.provider,\n\t\tcliModel: parsed.model,\n\t\tmodelRegistry,\n\t});\n\tif (resolved.warning) resolution.diagnostics.push({ type: \"warning\", message: resolved.warning });\n\tif (resolved.error) resolution.diagnostics.push({ type: \"error\", message: resolved.error });\n\tif (!resolved.model) return;\n\tresolution.options.model = resolved.model;\n\tif (!parsed.thinking && resolved.thinkingLevel) {\n\t\tresolution.options.thinkingLevel = resolved.thinkingLevel;\n\t\tresolution.cliThinkingFromModel = true;\n\t}\n}\n\nfunction selectDefaultScopedModel(\n\tscopedModels: ScopedModel[],\n\tmodelRegistry: ModelRegistry,\n\tsettingsManager: SettingsManager,\n): ScopedModel {\n\tconst savedProvider = settingsManager.getDefaultProvider();\n\tconst savedModelId = settingsManager.getDefaultModel();\n\tconst savedModel = savedProvider && savedModelId ? modelRegistry.find(savedProvider, savedModelId) : undefined;\n\treturn (\n\t\t(savedModel ? scopedModels.find((scoped) => modelsAreEqual(scoped.model, savedModel)) : undefined) ??\n\t\tscopedModels[0]\n\t);\n}\n\nfunction applyCliToolSelection(parsed: Args, options: GripAgentSessionOptions): void {\n\tif (parsed.noTools) options.noTools = \"all\";\n\telse if (parsed.noBuiltinTools) options.noTools = \"builtin\";\n\tif (parsed.tools) options.tools = [...parsed.tools];\n\tif (parsed.enableLspTools) options.enableLspTools = true;\n}\n\nfunction buildSessionOptions(\n\tparsed: Args,\n\tscopedModels: ScopedModel[],\n\thasExistingSession: boolean,\n\tmodelRegistry: ModelRegistry,\n\tsettingsManager: SettingsManager,\n): SessionOptionsResolution {\n\tconst resolution: SessionOptionsResolution = {\n\t\toptions: {},\n\t\tcliThinkingFromModel: false,\n\t\tdiagnostics: [],\n\t};\n\tapplyCliModelSelection(parsed, modelRegistry, resolution);\n\tconst { options } = resolution;\n\n\tif (!options.model && scopedModels.length > 0 && !hasExistingSession) {\n\t\tconst selected = selectDefaultScopedModel(scopedModels, modelRegistry, settingsManager);\n\t\toptions.model = selected.model;\n\t\tif (!parsed.thinking && selected.thinkingLevel) options.thinkingLevel = selected.thinkingLevel;\n\t}\n\n\tif (parsed.thinking) options.thinkingLevel = parsed.thinking;\n\tif (scopedModels.length > 0) {\n\t\toptions.scopedModels = scopedModels.map((scoped) => ({\n\t\t\tmodel: scoped.model,\n\t\t\tthinkingLevel: scoped.thinkingLevel,\n\t\t}));\n\t}\n\tapplyCliToolSelection(parsed, options);\n\treturn resolution;\n}\n\nfunction resolveCliPaths(cwd: string, paths: string[] | undefined): string[] | undefined {\n\treturn paths?.map((value) => (isLocalPath(value) ? resolvePath(value, cwd) : 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 TuiMainScreen(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 type ProjectHookTrustChoice = \"deny\" | \"once\" | \"always\";\n\nexport async function promptForProjectHookTrust(\n\tcwd: string,\n\tidentity: string,\n\tsettingsManager: SettingsManager,\n): Promise<ProjectHookTrustChoice> {\n\tinitTheme(settingsManager.getTheme());\n\tsetKeybindings(KeybindingsManager.create());\n\tconst title = [\n\t\t`Project hooks were found in ${cwd}.`,\n\t\t\"Project hooks execute in the active workspace: as your host user locally, or inside an active sandbox/remote backend.\",\n\t\t`Trust always authorizes all current and future hook changes in ${identity}.`,\n\t].join(\"\\n\");\n\n\treturn new Promise((resolve) => {\n\t\tconst ui = new TuiMainScreen(new ProcessTerminal(), settingsManager.getShowHardwareCursor());\n\t\tui.setClearOnShrink(settingsManager.getClearOnShrink());\n\t\tlet settled = false;\n\t\tconst finish = (choice: ProjectHookTrustChoice) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tui.stop();\n\t\t\tresolve(choice);\n\t\t};\n\t\tconst selector = new ExtensionSelectorComponent(\n\t\t\ttitle,\n\t\t\t[\"Don't trust\", \"Trust once\", \"Trust always\"],\n\t\t\t(option) => {\n\t\t\t\tif (option === \"Trust once\") finish(\"once\");\n\t\t\t\telse if (option === \"Trust always\") finish(\"always\");\n\t\t\t\telse finish(\"deny\");\n\t\t\t},\n\t\t\t() => finish(\"deny\"),\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}\nexport interface ProjectHookTrustPolicyOptions {\n\tinitialCwd: string;\n\tinitialSessionId: string;\n\texplicitTrust: boolean;\n\tinteractive: boolean;\n\tskipInitialPrompt: boolean;\n\tstore: ProjectHookTrustStore;\n\tprompt: (cwd: string, identity: string) => Promise<ProjectHookTrustChoice>;\n\treportError?: (error: string | undefined) => void;\n}\n\nexport interface ProjectHookTrustPolicy {\n\tresolveInitial(backendAllowsProjectHooks: boolean): Promise<boolean>;\n\tgetInitialTrustedIdentity(): string | undefined;\n\tresolveFor(sessionCwd: string, sessionId: string): ProjectHookTrustResult;\n\tisTrustedFor(sessionCwd: string, sessionId: string): boolean;\n}\ninterface ProjectHookTrustPolicyState {\n\tinitialTrusted: boolean;\n\tinitialTrustedIdentity: string | undefined;\n\ttrustOnceIdentity: string | undefined;\n\ttrustOnceSessionId: string | undefined;\n\ttrustOnceConsumed: boolean;\n}\n\ntype ProjectHookTrustErrorReporter = (error: string | undefined) => void;\n\nfunction identifyInitialProjectHooks(cwd: string, reportError: ProjectHookTrustErrorReporter): string | undefined {\n\ttry {\n\t\treturn canonicalProjectHookIdentity(cwd);\n\t} catch (error) {\n\t\treportError(\n\t\t\t`Unable to identify project hooks repository: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t\treturn undefined;\n\t}\n}\n\nfunction applyInitialProjectHookTrustChoice(\n\tchoice: ProjectHookTrustChoice,\n\tidentity: string,\n\toptions: ProjectHookTrustPolicyOptions,\n\tstate: ProjectHookTrustPolicyState,\n\treportError: ProjectHookTrustErrorReporter,\n): void {\n\tif (choice === \"once\" || choice === \"always\") {\n\t\tstate.initialTrusted = true;\n\t\tstate.initialTrustedIdentity = identity;\n\t}\n\tif (choice === \"once\") {\n\t\tstate.trustOnceIdentity = identity;\n\t\tstate.trustOnceSessionId = options.initialSessionId;\n\t}\n\tif (choice === \"always\") {\n\t\tconst saved = options.store.trustAlwaysIdentity(identity);\n\t\treportError(saved.error);\n\t}\n}\n\nasync function resolveInitialProjectHookTrust(\n\tbackendAllowsProjectHooks: boolean,\n\toptions: ProjectHookTrustPolicyOptions,\n\tstate: ProjectHookTrustPolicyState,\n\treportError: ProjectHookTrustErrorReporter,\n): Promise<boolean> {\n\tif (!backendAllowsProjectHooks) return state.initialTrusted;\n\tif (state.initialTrusted) return true;\n\tif (options.skipInitialPrompt) return false;\n\tif (!hasProjectHookConfiguration(options.initialCwd)) return false;\n\n\tconst persisted = options.store.isTrusted(options.initialCwd);\n\treportError(persisted.error);\n\tstate.initialTrusted = persisted.trusted;\n\tstate.initialTrustedIdentity = persisted.trusted ? persisted.identity : undefined;\n\tif (state.initialTrusted || !options.interactive) return state.initialTrusted;\n\n\tconst identity = identifyInitialProjectHooks(options.initialCwd, reportError);\n\tif (!identity) return false;\n\tconst choice = await options.prompt(options.initialCwd, identity);\n\tapplyInitialProjectHookTrustChoice(choice, identity, options, state, reportError);\n\treturn state.initialTrusted;\n}\n\n/** Orchestrates the CLI's startup and per-session project-hook trust decisions. */\nexport function createProjectHookTrustPolicy(options: ProjectHookTrustPolicyOptions): ProjectHookTrustPolicy {\n\tconst state: ProjectHookTrustPolicyState = {\n\t\tinitialTrusted: options.explicitTrust,\n\t\tinitialTrustedIdentity: undefined,\n\t\ttrustOnceIdentity: undefined,\n\t\ttrustOnceSessionId: undefined,\n\t\ttrustOnceConsumed: false,\n\t};\n\tconst reportError = options.reportError ?? (() => {});\n\n\treturn {\n\t\tresolveInitial(backendAllowsProjectHooks: boolean): Promise<boolean> {\n\t\t\treturn resolveInitialProjectHookTrust(backendAllowsProjectHooks, options, state, reportError);\n\t\t},\n\n\t\tgetInitialTrustedIdentity(): string | undefined {\n\t\t\treturn state.initialTrustedIdentity;\n\t\t},\n\n\t\tresolveFor(sessionCwd: string, sessionId: string): ProjectHookTrustResult {\n\t\t\tif (options.explicitTrust) return { trusted: true };\n\t\t\tif (!hasProjectHookConfiguration(sessionCwd)) return { trusted: false };\n\t\t\ttry {\n\t\t\t\tif (\n\t\t\t\t\t!state.trustOnceConsumed &&\n\t\t\t\t\tstate.trustOnceIdentity &&\n\t\t\t\t\tstate.trustOnceSessionId === sessionId &&\n\t\t\t\t\tcanonicalProjectHookIdentity(sessionCwd) === state.trustOnceIdentity\n\t\t\t\t) {\n\t\t\t\t\tstate.trustOnceConsumed = true;\n\t\t\t\t\treturn { trusted: true, identity: state.trustOnceIdentity };\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconst message = `Unable to identify project hooks repository: ${error instanceof Error ? error.message : String(error)}`;\n\t\t\t\treportError(message);\n\t\t\t\treturn { trusted: false, error: message };\n\t\t\t}\n\t\t\tconst persisted = options.store.isTrusted(sessionCwd);\n\t\t\treportError(persisted.error);\n\t\t\treturn persisted;\n\t\t},\n\n\t\tisTrustedFor(sessionCwd: string, sessionId: string): boolean {\n\t\t\treturn this.resolveFor(sessionCwd, sessionId).trusted;\n\t\t},\n\t};\n}\n\nexport interface MainOptions {\n\textensionFactories?: ExtensionFactory[];\n\tdaemonRunner?: (args: readonly string[]) => Promise<void>;\n\t/** Test/embedding override for the interactive project-hook trust prompt. */\n\tprojectHookTrustPrompt?: (cwd: string, identity: string) => Promise<ProjectHookTrustChoice>;\n\t/** Test/embedding override for persistent project-hook trust storage. */\n\tprojectHookTrustStore?: ProjectHookTrustStore;\n}\ninterface ParsedMainInvocation {\n\tparsed: Args;\n\tappMode: GripAgentAppMode;\n}\n\ninterface StartupSessionResolution {\n\tcwd: string;\n\tagentDir: string;\n\tstartupSettingsManager: SettingsManager;\n\tsessionDir: string | undefined;\n\tremoteSessionOptions: RemoteSessionCliOptions | undefined;\n\tinitialSession: Session;\n}\n\nasync function runCliPreflight(args: string[], options: MainOptions | undefined): Promise<boolean> {\n\tif (isDaemonCommand(args)) {\n\t\tawait (options?.daemonRunner ?? runDaemonCommand)(args);\n\t\treturn true;\n\t}\n\tconfigureHttpDispatcher();\n\tresetTimings();\n\tconst offlineMode = args.includes(\"--offline\") || isTruthyEnvFlag(process.env.GRIP_OFFLINE);\n\tif (offlineMode) {\n\t\tprocess.env.GRIP_OFFLINE = \"1\";\n\t\tprocess.env.GRIP_SKIP_VERSION_CHECK = \"1\";\n\t}\n\tif (process.platform === \"win32\") cleanupWindowsSelfUpdateQuarantine(getPackageDir());\n\tif (await handlePackageCommand(args)) return true;\n\treturn handleConfigCommand(args);\n}\n\nfunction reportArgumentDiagnostics(parsed: Args): void {\n\tif (parsed.diagnostics.length === 0) return;\n\tfor (const diagnostic of parsed.diagnostics) {\n\t\tconst color = diagnostic.type === \"error\" ? chalk.red : chalk.yellow;\n\t\tconsole.error(color(`${diagnostic.type === \"error\" ? \"Error\" : \"Warning\"}: ${diagnostic.message}`));\n\t}\n\tif (parsed.diagnostics.some((diagnostic) => diagnostic.type === \"error\")) process.exit(1);\n}\n\nasync function handleCliMetadataCommands(parsed: Args): Promise<void> {\n\tif (parsed.version) {\n\t\tconsole.log(VERSION);\n\t\tprocess.exit(0);\n\t}\n\tif (!parsed.export) return;\n\tlet result: string;\n\ttry {\n\t\tconst outputPath = parsed.messages.length > 0 ? parsed.messages[0] : undefined;\n\t\tresult = await exportFromFile(parsed.export, outputPath);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Failed to export session\";\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tprocess.exit(1);\n\t}\n\tconsole.log(`Exported to: ${result}`);\n\tprocess.exit(0);\n}\n\nasync function parseMainInvocation(args: string[]): Promise<ParsedMainInvocation> {\n\tconst parsed = parseArgs(args);\n\treportArgumentDiagnostics(parsed);\n\ttime(\"parseArgs\");\n\tconst appMode = resolveAppMode(parsed, process.stdin.isTTY);\n\tGripAgent.setupStdio({ mode: appMode });\n\tawait handleCliMetadataCommands(parsed);\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\tvalidateForkFlags(parsed);\n\treturn { parsed, appMode };\n}\n\nasync function resolveStartupSession(parsed: Args, appMode: GripAgentAppMode): Promise<StartupSessionResolution> {\n\tconst cwd = process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst startupSettingsManager = SettingsManager.create(cwd, agentDir);\n\treportDiagnostics(collectSettingsDiagnostics(startupSettingsManager, \"startup session lookup\"));\n\tconst envSessionDir = process.env[ENV_SESSION_DIR];\n\tconst sessionDir =\n\t\t(parsed.sessionDir ? normalizePath(parsed.sessionDir) : undefined) ??\n\t\t(envSessionDir ? expandTildePath(envSessionDir) : undefined) ??\n\t\tstartupSettingsManager.getSessionDir();\n\tconst remoteSessionOptions = resolveRemoteSessionCliOptions(parsed);\n\tlet initialSession = await resolveInitialSession(\n\t\tparsed,\n\t\tcwd,\n\t\tsessionDir,\n\t\tstartupSettingsManager,\n\t\tremoteSessionOptions,\n\t);\n\tconst missingSessionCwdIssue = getMissingSessionCwdIssue(initialSession, cwd);\n\tif (missingSessionCwdIssue) {\n\t\tif (appMode !== \"interactive\") {\n\t\t\tconsole.error(chalk.red(new MissingSessionCwdError(missingSessionCwdIssue).message));\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst selectedCwd = await promptForMissingSessionCwd(missingSessionCwdIssue, startupSettingsManager);\n\t\tif (!selectedCwd) process.exit(0);\n\t\tinitialSession = await createLifecycleSessionManager({\n\t\t\tcwd,\n\t\t\tsessionDir,\n\t\t\tremote: remoteSessionOptions,\n\t\t}).openReference(missingSessionCwdIssue.sessionReference!, { cwdOverride: selectedCwd });\n\t}\n\ttime(\"resolveInitialSession\");\n\treturn { cwd, agentDir, startupSettingsManager, sessionDir, remoteSessionOptions, initialSession };\n}\n\nasync function resolveStartupToolOperations(parsed: Args): Promise<ToolOperations | undefined> {\n\tif (parsed.help) return undefined;\n\tconst remoteDeferred = parsed.remoteDeferred;\n\tif (remoteDeferred && parsed.remote) {\n\t\tconsole.error(chalk.red(\"Error: --remote-deferred and --remote cannot be used together\"));\n\t\tprocess.exit(1);\n\t}\n\tif (parsed.remote) {\n\t\ttry {\n\t\t\treturn await createRemoteToolOperations(parsed.remote);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconsole.error(chalk.red(`Error: failed to initialize remote tool operations: ${message}`));\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\tif (!remoteDeferred) return undefined;\n\tif (!parsed.remoteCwd) {\n\t\tconsole.error(chalk.red(\"Error: --remote-deferred requires --remote-cwd <path>\"));\n\t\tprocess.exit(1);\n\t}\n\treturn new DeferredRemoteToolOperations(parsed.remoteCwd);\n}\n\nfunction createCliLspInputs(parsed: Args, cwd: string): LspConfigurationInput[] {\n\tconst inputs: LspConfigurationInput[] = [];\n\tif (parsed.lspConfig) inputs.push({ type: \"file\", path: resolvePath(parsed.lspConfig, cwd), scope: \"cli\" });\n\tif (parsed.noLsp) inputs.push({ type: \"disabled\", source: \"--no-lsp\", scope: \"cli\" });\n\treturn inputs;\n}\nasync function handleRuntimeInformationCommands(parsed: Args, gripAgent: GripAgent): Promise<void> {\n\tconst { modelRegistry, resourceLoader } = gripAgent.services;\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\tif (parsed.listModels === undefined) return;\n\tconst searchPattern = typeof parsed.listModels === \"string\" ? parsed.listModels : undefined;\n\tawait listModels(modelRegistry, searchPattern);\n\tprocess.exit(0);\n}\n\nasync function reportRuntimeStartupDiagnostics(gripAgent: GripAgent, deprecationWarnings: string[]): Promise<void> {\n\tif (gripAgent.mode === \"interactive\" && deprecationWarnings.length > 0) {\n\t\tawait showDeprecationWarnings(deprecationWarnings);\n\t}\n\ttime(\"resolveModelScope\");\n\tconst hasFatalDiagnostics = gripAgent.diagnostics.some(isFatalGripAgentDiagnostic);\n\tif (gripAgent.mode !== \"interactive\" || hasFatalDiagnostics) reportDiagnostics(gripAgent.diagnostics);\n\tif (hasFatalDiagnostics) process.exit(1);\n\ttime(\"createAgentSession\");\n}\n\nexport async function main(args: string[], options?: MainOptions) {\n\tif (await runCliPreflight(args, options)) return;\n\tconst { parsed, appMode } = await parseMainInvocation(args);\n\n\t// Run migrations (pass cwd for project-local migrations)\n\tconst { migratedAuthProviders: migratedProviders, deprecationWarnings } = runMigrations(process.cwd());\n\ttime(\"runMigrations\");\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 { cwd, agentDir, startupSettingsManager, sessionDir, remoteSessionOptions, initialSession } =\n\t\tawait resolveStartupSession(parsed, appMode);\n\tconst projectHookTrustStore = options?.projectHookTrustStore ?? new ProjectHookTrustStore(agentDir);\n\tconst reportedProjectHookTrustErrors = new Set<string>();\n\tconst reportProjectHookTrustError = (error: string | undefined) => {\n\t\tif (!error || reportedProjectHookTrustErrors.has(error)) return;\n\t\treportedProjectHookTrustErrors.add(error);\n\t\tconsole.error(chalk.yellow(`Warning: ${error}`));\n\t};\n\tconst initialHookCwd = initialSession.getCwd();\n\tconst projectHookTrustPolicy = createProjectHookTrustPolicy({\n\t\tinitialCwd: initialHookCwd,\n\t\tinitialSessionId: initialSession.getSessionId(),\n\t\texplicitTrust: parsed.trustProjectHooks === true,\n\t\tinteractive: appMode === \"interactive\",\n\t\tskipInitialPrompt: parsed.help || parsed.listModels !== undefined,\n\t\tstore: projectHookTrustStore,\n\t\tprompt:\n\t\t\toptions?.projectHookTrustPrompt ??\n\t\t\t((promptCwd, promptIdentity) => promptForProjectHookTrust(promptCwd, promptIdentity, startupSettingsManager)),\n\t\treportError: reportProjectHookTrustError,\n\t});\n\tconst authStorage = AuthStorage.create();\n\tconst runtimeSessionManager = parsed.noSession\n\t\t? new InMemorySessionManager(initialSession.getCwd())\n\t\t: createLifecycleSessionManager({ cwd: initialSession.getCwd(), sessionDir, remote: remoteSessionOptions });\n\tconst toolOperations = await resolveStartupToolOperations(parsed);\n\tconst initialHookBackend = toolOperations?.getBackendInfo?.();\n\tconst initialProjectHooksTrusted = await projectHookTrustPolicy.resolveInitial(\n\t\ttoolOperations === undefined || initialHookBackend?.type === \"local\",\n\t);\n\tconst initialTrustedProjectHooksIdentity = projectHookTrustPolicy.getInitialTrustedIdentity();\n\tconst backendType = toolOperations?.getBackendInfo?.()?.type;\n\tconst instructionPathCwd = toolOperations && backendType === \"remote\" ? toolOperations.cwd : cwd;\n\tconst resolvedExtensionPaths = resolveCliPaths(cwd, parsed.extensions);\n\tconst resolvedSkillPaths = resolveCliPaths(instructionPathCwd, parsed.skills);\n\tconst resolvedRulePaths = resolveCliPaths(instructionPathCwd, parsed.rules);\n\tconst resolvedPromptTemplatePaths = resolveCliPaths(instructionPathCwd, parsed.promptTemplates);\n\tconst resolvedThemePaths = resolveCliPaths(cwd, parsed.themes);\n\tconst cliLspInputs = createCliLspInputs(parsed, cwd);\n\tconst gripAgent = await GripAgent.create({\n\t\ttoolOperations,\n\t\townsToolOperations: toolOperations !== undefined,\n\t\tmode: appMode,\n\t\tcwd: initialSession.getCwd(),\n\t\tagentDir,\n\t\tsessionManager: runtimeSessionManager,\n\t\tauthStorage,\n\t\ttrustProjectHooks: initialProjectHooksTrusted,\n\t\ttrustedProjectHooksIdentity: initialTrustedProjectHooksIdentity,\n\t\textensionFlagValues: parsed.unknownFlags,\n\t\tresourceLoaderOptions: {\n\t\t\ttoolOperations,\n\t\t\tadditionalExtensionPaths: resolvedExtensionPaths,\n\t\t\tadditionalSkillPaths: resolvedSkillPaths,\n\t\t\tadditionalRulePaths: resolvedRulePaths,\n\t\t\tadditionalPromptTemplatePaths: resolvedPromptTemplatePaths,\n\t\t\tadditionalThemePaths: resolvedThemePaths,\n\t\t\tnoExtensions: parsed.noExtensions,\n\t\t\tnoSkills: parsed.noSkills,\n\t\t\tnoRules: parsed.noRules,\n\t\t\tnoPromptTemplates: parsed.noPromptTemplates,\n\t\t\tnoThemes: parsed.noThemes,\n\t\t\tnoContextFiles: parsed.noContextFiles,\n\t\t\tsystemPrompt: parsed.systemPrompt,\n\t\t\tappendSystemPrompt: parsed.appendSystemPrompt,\n\t\t\textensionFactories: options?.extensionFactories,\n\t\t},\n\t\tresolveSessionOptions: async ({ services, session }) => {\n\t\t\tconst { settingsManager, modelRegistry } = services;\n\t\t\tconst diagnostics: GripAgentDiagnostic[] = [\n\t\t\t\t...collectSettingsDiagnostics(settingsManager, \"runtime creation\"),\n\t\t\t];\n\t\t\tconst modelPatterns = parsed.models ?? settingsManager.getEnabledModels();\n\t\t\tconst scopedModels =\n\t\t\t\tmodelPatterns && modelPatterns.length > 0 ? await resolveModelScope(modelPatterns, modelRegistry) : [];\n\t\t\tconst { options: sessionOptions, diagnostics: sessionOptionDiagnostics } = buildSessionOptions(\n\t\t\t\tparsed,\n\t\t\t\tscopedModels,\n\t\t\t\tsession.buildSessionContext().messages.length > 0,\n\t\t\t\tmodelRegistry,\n\t\t\t\tsettingsManager,\n\t\t\t);\n\t\t\tdiagnostics.push(...sessionOptionDiagnostics);\n\n\t\t\tif (parsed.apiKey) {\n\t\t\t\tif (!sessionOptions.model) {\n\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\ttype: \"error\",\n\t\t\t\t\t\tmessage: \"--api-key requires a model to be specified via --model, --provider/--model, or --models\",\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tauthStorage.setRuntimeApiKey(sessionOptions.model.provider, parsed.apiKey);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (toolOperations) {\n\t\t\t\tconst backend = toolOperations.getBackendInfo?.();\n\t\t\t\tlet message = `Deferred remote backend mode enabled (cwd: ${toolOperations.cwd})`;\n\t\t\t\tif (backend?.type === \"remote\" && backend.configured) {\n\t\t\t\t\tmessage = `Remote tool operations enabled: ${backend.url} (cwd: ${backend.cwd})`;\n\t\t\t\t}\n\t\t\t\tdiagnostics.push({ type: \"info\", message });\n\t\t\t}\n\t\t\tconst projectHookTrust = projectHookTrustPolicy.resolveFor(services.cwd, session.getSessionId());\n\n\t\t\treturn {\n\t\t\t\tmodel: sessionOptions.model,\n\t\t\t\tthinkingLevel: sessionOptions.thinkingLevel,\n\t\t\t\tscopedModels: sessionOptions.scopedModels,\n\t\t\t\ttools: sessionOptions.tools,\n\t\t\t\tenableLspTools: sessionOptions.enableLspTools,\n\t\t\t\tnoTools: sessionOptions.noTools,\n\t\t\t\tcustomTools: sessionOptions.customTools,\n\t\t\t\ttoolOperations,\n\t\t\t\ttrustProjectHooks: projectHookTrust.trusted,\n\t\t\t\ttrustedProjectHooksIdentity: projectHookTrust.identity,\n\t\t\t\tlsp: cliLspInputs,\n\t\t\t\tdiagnostics,\n\t\t\t};\n\t\t},\n\t});\n\tawait gripAgent.createAgentSession({ session: initialSession });\n\ttime(\"createAgentSessionRuntime\");\n\tconst { settingsManager } = gripAgent.services;\n\tawait handleRuntimeInformationCommands(parsed, gripAgent);\n\n\tconst stdinContent = await gripAgent.readPipedStdin();\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(), gripAgent.mode === \"interactive\");\n\ttime(\"initTheme\");\n\n\tawait reportRuntimeStartupDiagnostics(gripAgent, deprecationWarnings);\n\n\tawait gripAgent.runMode({\n\t\tmigratedProviders,\n\t\tinitialMessage,\n\t\tinitialImages,\n\t\tinitialMessages: parsed.messages,\n\t\tverbose: parsed.verbose,\n\t\ttuiMode: parsed.tuiMode,\n\t\tstartupBenchmark: isTruthyEnvFlag(process.env.GRIP_STARTUP_BENCHMARK),\n\t});\n}\n"]}
package/dist/main.js CHANGED
@@ -559,12 +559,14 @@ async function resolveStartupSession(parsed, appMode) {
559
559
  return { cwd, agentDir, startupSettingsManager, sessionDir, remoteSessionOptions, initialSession };
560
560
  }
561
561
  async function resolveStartupToolOperations(parsed) {
562
+ if (parsed.help)
563
+ return undefined;
562
564
  const remoteDeferred = parsed.remoteDeferred;
563
- if (remoteDeferred && parsed.remote && !parsed.help) {
565
+ if (remoteDeferred && parsed.remote) {
564
566
  console.error(chalk.red("Error: --remote-deferred and --remote cannot be used together"));
565
567
  process.exit(1);
566
568
  }
567
- if (parsed.remote && !parsed.help) {
569
+ if (parsed.remote) {
568
570
  try {
569
571
  return await createRemoteToolOperations(parsed.remote);
570
572
  }
@@ -574,7 +576,7 @@ async function resolveStartupToolOperations(parsed) {
574
576
  process.exit(1);
575
577
  }
576
578
  }
577
- if (!remoteDeferred || parsed.help)
579
+ if (!remoteDeferred)
578
580
  return undefined;
579
581
  if (!parsed.remoteCwd) {
580
582
  console.error(chalk.red("Error: --remote-deferred requires --remote-cwd <path>"));
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 * GripAgent options. GripAgent does the heavy lifting.\n */\n\nimport { createInterface } from \"node:readline\";\nimport { modelsAreEqual } from \"@greppleai/grip-ai\";\nimport { ProcessTerminal, setKeybindings, TuiMainScreen } from \"@greppleai/grip-tui\";\nimport chalk from \"chalk\";\nimport { type Args, parseArgs, printHelp } from \"./cli/args.ts\";\nimport { processFileArguments } from \"./cli/file-processor.ts\";\nimport { buildInitialMessage, type InitialMessageResult } from \"./cli/initial-message.ts\";\nimport { listModels } from \"./cli/list-models.ts\";\nimport { selectSession } from \"./cli/session-picker.ts\";\nimport {\n\tENV_REMOTE_PROJECT_ID,\n\tENV_REMOTE_SESSION_BASE_URL,\n\tENV_REMOTE_SESSION_TOKEN,\n\tENV_SESSION_DIR,\n\texpandTildePath,\n\tgetAgentDir,\n\tgetPackageDir,\n\tVERSION,\n} from \"./config.ts\";\nimport { AuthStorage } from \"./core/auth-storage.ts\";\nimport { exportFromFile } from \"./core/export-html/index.ts\";\nimport type { ExtensionFactory } from \"./core/extensions/types.ts\";\nimport type { GripAgentAppMode, GripAgentDiagnostic, GripAgentSessionOptions } from \"./core/grip-agent.ts\";\nimport { GripAgent, isFatalGripAgentDiagnostic } from \"./core/grip-agent.ts\";\nimport {\n\tcanonicalProjectHookIdentity,\n\thasProjectHookConfiguration,\n\ttype ProjectHookTrustResult,\n\tProjectHookTrustStore,\n} from \"./core/hooks/trust-store.ts\";\nimport { configureHttpDispatcher } from \"./core/http-dispatcher.ts\";\nimport { KeybindingsManager } from \"./core/keybindings.ts\";\nimport type { LspConfigurationInput } from \"./core/lsp/config-loader.ts\";\nimport type { ModelRegistry } from \"./core/model-registry.ts\";\nimport { resolveCliModel, resolveModelScope, type ScopedModel } from \"./core/model-resolver.ts\";\nimport { InMemorySessionManager } from \"./core/session/in-memory-session-manager.ts\";\nimport { LocalSessionManager } from \"./core/session/local-session-manager.ts\";\nimport { RemoteSessionManager } from \"./core/session/remote-session-manager.ts\";\nimport type { Session } from \"./core/session/session.ts\";\nimport type { SessionManager } from \"./core/session/session-manager.ts\";\nimport {\n\tformatMissingSessionCwdPrompt,\n\tgetMissingSessionCwdIssue,\n\tMissingSessionCwdError,\n\ttype SessionCwdIssue,\n} from \"./core/session-cwd.ts\";\nimport { SettingsManager } from \"./core/settings-manager.ts\";\nimport { resetTimings, time } from \"./core/timings.ts\";\nimport {\n\tcreateRemoteToolOperations,\n\tDeferredRemoteToolOperations,\n\ttype ToolOperations,\n} from \"./core/tools/operations.ts\";\nimport { runDaemonCommand } from \"./daemon/command.ts\";\nimport { isDaemonCommand } from \"./daemon/config.ts\";\nimport { runMigrations, showDeprecationWarnings } from \"./migrations.ts\";\nimport { ExtensionSelectorComponent } from \"./modes/interactive/components/extension-selector.ts\";\nimport { initTheme, stopThemeWatcher } from \"./modes/interactive/theme/theme.ts\";\nimport { handleConfigCommand, handlePackageCommand } from \"./package-manager-cli.ts\";\nimport { isLocalPath, normalizePath, resolvePath } from \"./utils/paths.ts\";\nimport { cleanupWindowsSelfUpdateQuarantine } from \"./utils/windows-self-update.ts\";\n\nfunction collectSettingsDiagnostics(settingsManager: SettingsManager, context: string): GripAgentDiagnostic[] {\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 GripAgentDiagnostic[]): 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\nfunction resolveAppMode(parsed: Args, stdinIsTTY: boolean): GripAgentAppMode {\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\nasync function prepareInitialMessage(\n\tparsed: Args,\n\tautoResizeImages: boolean,\n\tstdinContent?: string,\n): Promise<InitialMessageResult> {\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, resolve it before handing it to the session manager.\n\tif (sessionArg.includes(\"/\") || sessionArg.includes(\"\\\\\") || sessionArg.endsWith(\".jsonl\")) {\n\t\treturn { type: \"path\", path: resolvePath(sessionArg, cwd) };\n\t}\n\n\t// Try to match as session ID in current project first\n\tconst localSessions = await new LocalSessionManager({ cwd: cwd, sessionDir: sessionDir }).list();\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 new LocalSessionManager({ cwd: process.cwd(), sessionDir }).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): Session {\n\ttry {\n\t\treturn new LocalSessionManager({ cwd: cwd, sessionDir: sessionDir }).forkFrom(sourcePath);\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\nfunction openSessionOrExit(path: string, cwd: string, sessionDir?: string): Session {\n\ttry {\n\t\treturn new LocalSessionManager({ cwd, sessionDir }).openReference(path);\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\ninterface RemoteSessionCliOptions {\n\tbaseUrl: string;\n\ttoken: string;\n\tprojectId?: string;\n}\n\ninterface LifecycleSessionManagerOptions {\n\tcwd: string;\n\tsessionDir?: string;\n\tremote?: RemoteSessionCliOptions;\n}\n\nfunction resolveRemoteSessionCliOptions(parsed: Args): RemoteSessionCliOptions | undefined {\n\tconst baseUrl = parsed.remoteSessionBaseUrl ?? process.env[ENV_REMOTE_SESSION_BASE_URL];\n\tconst token = parsed.remoteSessionToken ?? process.env[ENV_REMOTE_SESSION_TOKEN];\n\tconst projectId = parsed.remoteProjectId ?? process.env[ENV_REMOTE_PROJECT_ID];\n\n\tif (!baseUrl && !token && !projectId) {\n\t\treturn undefined;\n\t}\n\tif (!baseUrl || !token) {\n\t\tconsole.error(\n\t\t\tchalk.red(\n\t\t\t\t`Error: remote sessions require both --remote-session-base-url and --remote-session-token, or ${ENV_REMOTE_SESSION_BASE_URL} and ${ENV_REMOTE_SESSION_TOKEN}`,\n\t\t\t),\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\n\treturn { baseUrl, token, projectId };\n}\n\nfunction createLifecycleSessionManager(options: LifecycleSessionManagerOptions): SessionManager {\n\tif (options.remote) {\n\t\treturn new RemoteSessionManager({\n\t\t\tbaseUrl: options.remote.baseUrl,\n\t\t\ttoken: options.remote.token,\n\t\t\tcwd: options.cwd,\n\t\t\tprojectId: options.remote.projectId,\n\t\t});\n\t}\n\treturn new LocalSessionManager({ cwd: options.cwd, sessionDir: options.sessionDir });\n}\n\nasync function resolveRemoteInitialSession(parsed: Args, manager: SessionManager): Promise<Session> {\n\tif (parsed.fork) {\n\t\treturn await manager.forkFrom(parsed.fork);\n\t}\n\tif (parsed.session) {\n\t\treturn await manager.openReference(parsed.session);\n\t}\n\tif (parsed.resume) {\n\t\tconst selectedReference = await selectSession(\n\t\t\t(onProgress) => manager.list(onProgress),\n\t\t\t(onProgress) => manager.listAll(onProgress),\n\t\t);\n\t\tif (!selectedReference) {\n\t\t\tconsole.log(chalk.dim(\"No session selected\"));\n\t\t\tprocess.exit(0);\n\t\t}\n\t\treturn await manager.openReference(selectedReference);\n\t}\n\tif (parsed.continue) {\n\t\treturn await manager.continueRecent();\n\t}\n\treturn await manager.create();\n}\n\nasync function resolveLocalRequestedSession(sessionArg: string, cwd: string, sessionDir?: string): Promise<Session> {\n\tconst resolved = await resolveSessionPath(sessionArg, cwd, sessionDir);\n\tswitch (resolved.type) {\n\t\tcase \"path\":\n\t\tcase \"local\":\n\t\t\treturn openSessionOrExit(resolved.path, process.cwd(), sessionDir);\n\t\tcase \"global\": {\n\t\t\tconsole.log(chalk.yellow(`Session found in different project: ${resolved.cwd}`));\n\t\t\tconst shouldFork = await promptConfirm(\"Fork this session into current directory?\");\n\t\t\tif (!shouldFork) {\n\t\t\t\tconsole.log(chalk.dim(\"Aborted.\"));\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t\treturn forkSessionOrExit(resolved.path, cwd, sessionDir);\n\t\t}\n\t\tcase \"not_found\":\n\t\t\tconsole.error(chalk.red(`No session found matching '${resolved.arg}'`));\n\t\t\tprocess.exit(1);\n\t}\n}\n\nasync function resolveInitialSession(\n\tparsed: Args,\n\tcwd: string,\n\tsessionDir: string | undefined,\n\tsettingsManager: SettingsManager,\n\tremoteOptions?: RemoteSessionCliOptions,\n): Promise<Session> {\n\tif (parsed.noSession) {\n\t\treturn new InMemorySessionManager().create();\n\t}\n\n\tif (remoteOptions) {\n\t\treturn resolveRemoteInitialSession(\n\t\t\tparsed,\n\t\t\tnew RemoteSessionManager({\n\t\t\t\tbaseUrl: remoteOptions.baseUrl,\n\t\t\t\ttoken: remoteOptions.token,\n\t\t\t\tcwd,\n\t\t\t\tprojectId: remoteOptions.projectId,\n\t\t\t}),\n\t\t);\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) return resolveLocalRequestedSession(parsed.session, cwd, sessionDir);\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) => new LocalSessionManager({ cwd, sessionDir }).list(onProgress),\n\t\t\t\t(onProgress) => new LocalSessionManager({ cwd: process.cwd(), sessionDir }).listAll(onProgress),\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 openSessionOrExit(selectedPath, process.cwd(), sessionDir);\n\t\t} finally {\n\t\t\tstopThemeWatcher();\n\t\t}\n\t}\n\n\tif (parsed.continue) {\n\t\treturn new LocalSessionManager({ cwd: cwd, sessionDir: sessionDir }).continueRecent();\n\t}\n\n\treturn new LocalSessionManager({ cwd: cwd, sessionDir: sessionDir }).create();\n}\n\ninterface SessionOptionsResolution {\n\toptions: GripAgentSessionOptions;\n\tcliThinkingFromModel: boolean;\n\tdiagnostics: GripAgentDiagnostic[];\n}\n\nfunction applyCliModelSelection(\n\tparsed: Args,\n\tmodelRegistry: ModelRegistry,\n\tresolution: SessionOptionsResolution,\n): void {\n\tif (!parsed.model) return;\n\tconst resolved = resolveCliModel({\n\t\tcliProvider: parsed.provider,\n\t\tcliModel: parsed.model,\n\t\tmodelRegistry,\n\t});\n\tif (resolved.warning) resolution.diagnostics.push({ type: \"warning\", message: resolved.warning });\n\tif (resolved.error) resolution.diagnostics.push({ type: \"error\", message: resolved.error });\n\tif (!resolved.model) return;\n\tresolution.options.model = resolved.model;\n\tif (!parsed.thinking && resolved.thinkingLevel) {\n\t\tresolution.options.thinkingLevel = resolved.thinkingLevel;\n\t\tresolution.cliThinkingFromModel = true;\n\t}\n}\n\nfunction selectDefaultScopedModel(\n\tscopedModels: ScopedModel[],\n\tmodelRegistry: ModelRegistry,\n\tsettingsManager: SettingsManager,\n): ScopedModel {\n\tconst savedProvider = settingsManager.getDefaultProvider();\n\tconst savedModelId = settingsManager.getDefaultModel();\n\tconst savedModel = savedProvider && savedModelId ? modelRegistry.find(savedProvider, savedModelId) : undefined;\n\treturn (\n\t\t(savedModel ? scopedModels.find((scoped) => modelsAreEqual(scoped.model, savedModel)) : undefined) ??\n\t\tscopedModels[0]\n\t);\n}\n\nfunction applyCliToolSelection(parsed: Args, options: GripAgentSessionOptions): void {\n\tif (parsed.noTools) options.noTools = \"all\";\n\telse if (parsed.noBuiltinTools) options.noTools = \"builtin\";\n\tif (parsed.tools) options.tools = [...parsed.tools];\n\tif (parsed.enableLspTools) options.enableLspTools = true;\n}\n\nfunction buildSessionOptions(\n\tparsed: Args,\n\tscopedModels: ScopedModel[],\n\thasExistingSession: boolean,\n\tmodelRegistry: ModelRegistry,\n\tsettingsManager: SettingsManager,\n): SessionOptionsResolution {\n\tconst resolution: SessionOptionsResolution = {\n\t\toptions: {},\n\t\tcliThinkingFromModel: false,\n\t\tdiagnostics: [],\n\t};\n\tapplyCliModelSelection(parsed, modelRegistry, resolution);\n\tconst { options } = resolution;\n\n\tif (!options.model && scopedModels.length > 0 && !hasExistingSession) {\n\t\tconst selected = selectDefaultScopedModel(scopedModels, modelRegistry, settingsManager);\n\t\toptions.model = selected.model;\n\t\tif (!parsed.thinking && selected.thinkingLevel) options.thinkingLevel = selected.thinkingLevel;\n\t}\n\n\tif (parsed.thinking) options.thinkingLevel = parsed.thinking;\n\tif (scopedModels.length > 0) {\n\t\toptions.scopedModels = scopedModels.map((scoped) => ({\n\t\t\tmodel: scoped.model,\n\t\t\tthinkingLevel: scoped.thinkingLevel,\n\t\t}));\n\t}\n\tapplyCliToolSelection(parsed, options);\n\treturn resolution;\n}\n\nfunction resolveCliPaths(cwd: string, paths: string[] | undefined): string[] | undefined {\n\treturn paths?.map((value) => (isLocalPath(value) ? resolvePath(value, cwd) : 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 TuiMainScreen(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 type ProjectHookTrustChoice = \"deny\" | \"once\" | \"always\";\n\nexport async function promptForProjectHookTrust(\n\tcwd: string,\n\tidentity: string,\n\tsettingsManager: SettingsManager,\n): Promise<ProjectHookTrustChoice> {\n\tinitTheme(settingsManager.getTheme());\n\tsetKeybindings(KeybindingsManager.create());\n\tconst title = [\n\t\t`Project hooks were found in ${cwd}.`,\n\t\t\"Project hooks execute in the active workspace: as your host user locally, or inside an active sandbox/remote backend.\",\n\t\t`Trust always authorizes all current and future hook changes in ${identity}.`,\n\t].join(\"\\n\");\n\n\treturn new Promise((resolve) => {\n\t\tconst ui = new TuiMainScreen(new ProcessTerminal(), settingsManager.getShowHardwareCursor());\n\t\tui.setClearOnShrink(settingsManager.getClearOnShrink());\n\t\tlet settled = false;\n\t\tconst finish = (choice: ProjectHookTrustChoice) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tui.stop();\n\t\t\tresolve(choice);\n\t\t};\n\t\tconst selector = new ExtensionSelectorComponent(\n\t\t\ttitle,\n\t\t\t[\"Don't trust\", \"Trust once\", \"Trust always\"],\n\t\t\t(option) => {\n\t\t\t\tif (option === \"Trust once\") finish(\"once\");\n\t\t\t\telse if (option === \"Trust always\") finish(\"always\");\n\t\t\t\telse finish(\"deny\");\n\t\t\t},\n\t\t\t() => finish(\"deny\"),\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}\nexport interface ProjectHookTrustPolicyOptions {\n\tinitialCwd: string;\n\tinitialSessionId: string;\n\texplicitTrust: boolean;\n\tinteractive: boolean;\n\tskipInitialPrompt: boolean;\n\tstore: ProjectHookTrustStore;\n\tprompt: (cwd: string, identity: string) => Promise<ProjectHookTrustChoice>;\n\treportError?: (error: string | undefined) => void;\n}\n\nexport interface ProjectHookTrustPolicy {\n\tresolveInitial(backendAllowsProjectHooks: boolean): Promise<boolean>;\n\tgetInitialTrustedIdentity(): string | undefined;\n\tresolveFor(sessionCwd: string, sessionId: string): ProjectHookTrustResult;\n\tisTrustedFor(sessionCwd: string, sessionId: string): boolean;\n}\ninterface ProjectHookTrustPolicyState {\n\tinitialTrusted: boolean;\n\tinitialTrustedIdentity: string | undefined;\n\ttrustOnceIdentity: string | undefined;\n\ttrustOnceSessionId: string | undefined;\n\ttrustOnceConsumed: boolean;\n}\n\ntype ProjectHookTrustErrorReporter = (error: string | undefined) => void;\n\nfunction identifyInitialProjectHooks(cwd: string, reportError: ProjectHookTrustErrorReporter): string | undefined {\n\ttry {\n\t\treturn canonicalProjectHookIdentity(cwd);\n\t} catch (error) {\n\t\treportError(\n\t\t\t`Unable to identify project hooks repository: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t\treturn undefined;\n\t}\n}\n\nfunction applyInitialProjectHookTrustChoice(\n\tchoice: ProjectHookTrustChoice,\n\tidentity: string,\n\toptions: ProjectHookTrustPolicyOptions,\n\tstate: ProjectHookTrustPolicyState,\n\treportError: ProjectHookTrustErrorReporter,\n): void {\n\tif (choice === \"once\" || choice === \"always\") {\n\t\tstate.initialTrusted = true;\n\t\tstate.initialTrustedIdentity = identity;\n\t}\n\tif (choice === \"once\") {\n\t\tstate.trustOnceIdentity = identity;\n\t\tstate.trustOnceSessionId = options.initialSessionId;\n\t}\n\tif (choice === \"always\") {\n\t\tconst saved = options.store.trustAlwaysIdentity(identity);\n\t\treportError(saved.error);\n\t}\n}\n\nasync function resolveInitialProjectHookTrust(\n\tbackendAllowsProjectHooks: boolean,\n\toptions: ProjectHookTrustPolicyOptions,\n\tstate: ProjectHookTrustPolicyState,\n\treportError: ProjectHookTrustErrorReporter,\n): Promise<boolean> {\n\tif (!backendAllowsProjectHooks) return state.initialTrusted;\n\tif (state.initialTrusted) return true;\n\tif (options.skipInitialPrompt) return false;\n\tif (!hasProjectHookConfiguration(options.initialCwd)) return false;\n\n\tconst persisted = options.store.isTrusted(options.initialCwd);\n\treportError(persisted.error);\n\tstate.initialTrusted = persisted.trusted;\n\tstate.initialTrustedIdentity = persisted.trusted ? persisted.identity : undefined;\n\tif (state.initialTrusted || !options.interactive) return state.initialTrusted;\n\n\tconst identity = identifyInitialProjectHooks(options.initialCwd, reportError);\n\tif (!identity) return false;\n\tconst choice = await options.prompt(options.initialCwd, identity);\n\tapplyInitialProjectHookTrustChoice(choice, identity, options, state, reportError);\n\treturn state.initialTrusted;\n}\n\n/** Orchestrates the CLI's startup and per-session project-hook trust decisions. */\nexport function createProjectHookTrustPolicy(options: ProjectHookTrustPolicyOptions): ProjectHookTrustPolicy {\n\tconst state: ProjectHookTrustPolicyState = {\n\t\tinitialTrusted: options.explicitTrust,\n\t\tinitialTrustedIdentity: undefined,\n\t\ttrustOnceIdentity: undefined,\n\t\ttrustOnceSessionId: undefined,\n\t\ttrustOnceConsumed: false,\n\t};\n\tconst reportError = options.reportError ?? (() => {});\n\n\treturn {\n\t\tresolveInitial(backendAllowsProjectHooks: boolean): Promise<boolean> {\n\t\t\treturn resolveInitialProjectHookTrust(backendAllowsProjectHooks, options, state, reportError);\n\t\t},\n\n\t\tgetInitialTrustedIdentity(): string | undefined {\n\t\t\treturn state.initialTrustedIdentity;\n\t\t},\n\n\t\tresolveFor(sessionCwd: string, sessionId: string): ProjectHookTrustResult {\n\t\t\tif (options.explicitTrust) return { trusted: true };\n\t\t\tif (!hasProjectHookConfiguration(sessionCwd)) return { trusted: false };\n\t\t\ttry {\n\t\t\t\tif (\n\t\t\t\t\t!state.trustOnceConsumed &&\n\t\t\t\t\tstate.trustOnceIdentity &&\n\t\t\t\t\tstate.trustOnceSessionId === sessionId &&\n\t\t\t\t\tcanonicalProjectHookIdentity(sessionCwd) === state.trustOnceIdentity\n\t\t\t\t) {\n\t\t\t\t\tstate.trustOnceConsumed = true;\n\t\t\t\t\treturn { trusted: true, identity: state.trustOnceIdentity };\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconst message = `Unable to identify project hooks repository: ${error instanceof Error ? error.message : String(error)}`;\n\t\t\t\treportError(message);\n\t\t\t\treturn { trusted: false, error: message };\n\t\t\t}\n\t\t\tconst persisted = options.store.isTrusted(sessionCwd);\n\t\t\treportError(persisted.error);\n\t\t\treturn persisted;\n\t\t},\n\n\t\tisTrustedFor(sessionCwd: string, sessionId: string): boolean {\n\t\t\treturn this.resolveFor(sessionCwd, sessionId).trusted;\n\t\t},\n\t};\n}\n\nexport interface MainOptions {\n\textensionFactories?: ExtensionFactory[];\n\tdaemonRunner?: (args: readonly string[]) => Promise<void>;\n\t/** Test/embedding override for the interactive project-hook trust prompt. */\n\tprojectHookTrustPrompt?: (cwd: string, identity: string) => Promise<ProjectHookTrustChoice>;\n\t/** Test/embedding override for persistent project-hook trust storage. */\n\tprojectHookTrustStore?: ProjectHookTrustStore;\n}\ninterface ParsedMainInvocation {\n\tparsed: Args;\n\tappMode: GripAgentAppMode;\n}\n\ninterface StartupSessionResolution {\n\tcwd: string;\n\tagentDir: string;\n\tstartupSettingsManager: SettingsManager;\n\tsessionDir: string | undefined;\n\tremoteSessionOptions: RemoteSessionCliOptions | undefined;\n\tinitialSession: Session;\n}\n\nasync function runCliPreflight(args: string[], options: MainOptions | undefined): Promise<boolean> {\n\tif (isDaemonCommand(args)) {\n\t\tawait (options?.daemonRunner ?? runDaemonCommand)(args);\n\t\treturn true;\n\t}\n\tconfigureHttpDispatcher();\n\tresetTimings();\n\tconst offlineMode = args.includes(\"--offline\") || isTruthyEnvFlag(process.env.GRIP_OFFLINE);\n\tif (offlineMode) {\n\t\tprocess.env.GRIP_OFFLINE = \"1\";\n\t\tprocess.env.GRIP_SKIP_VERSION_CHECK = \"1\";\n\t}\n\tif (process.platform === \"win32\") cleanupWindowsSelfUpdateQuarantine(getPackageDir());\n\tif (await handlePackageCommand(args)) return true;\n\treturn handleConfigCommand(args);\n}\n\nfunction reportArgumentDiagnostics(parsed: Args): void {\n\tif (parsed.diagnostics.length === 0) return;\n\tfor (const diagnostic of parsed.diagnostics) {\n\t\tconst color = diagnostic.type === \"error\" ? chalk.red : chalk.yellow;\n\t\tconsole.error(color(`${diagnostic.type === \"error\" ? \"Error\" : \"Warning\"}: ${diagnostic.message}`));\n\t}\n\tif (parsed.diagnostics.some((diagnostic) => diagnostic.type === \"error\")) process.exit(1);\n}\n\nasync function handleCliMetadataCommands(parsed: Args): Promise<void> {\n\tif (parsed.version) {\n\t\tconsole.log(VERSION);\n\t\tprocess.exit(0);\n\t}\n\tif (!parsed.export) return;\n\tlet result: string;\n\ttry {\n\t\tconst outputPath = parsed.messages.length > 0 ? parsed.messages[0] : undefined;\n\t\tresult = await exportFromFile(parsed.export, outputPath);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Failed to export session\";\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tprocess.exit(1);\n\t}\n\tconsole.log(`Exported to: ${result}`);\n\tprocess.exit(0);\n}\n\nasync function parseMainInvocation(args: string[]): Promise<ParsedMainInvocation> {\n\tconst parsed = parseArgs(args);\n\treportArgumentDiagnostics(parsed);\n\ttime(\"parseArgs\");\n\tconst appMode = resolveAppMode(parsed, process.stdin.isTTY);\n\tGripAgent.setupStdio({ mode: appMode });\n\tawait handleCliMetadataCommands(parsed);\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\tvalidateForkFlags(parsed);\n\treturn { parsed, appMode };\n}\n\nasync function resolveStartupSession(parsed: Args, appMode: GripAgentAppMode): Promise<StartupSessionResolution> {\n\tconst cwd = process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst startupSettingsManager = SettingsManager.create(cwd, agentDir);\n\treportDiagnostics(collectSettingsDiagnostics(startupSettingsManager, \"startup session lookup\"));\n\tconst envSessionDir = process.env[ENV_SESSION_DIR];\n\tconst sessionDir =\n\t\t(parsed.sessionDir ? normalizePath(parsed.sessionDir) : undefined) ??\n\t\t(envSessionDir ? expandTildePath(envSessionDir) : undefined) ??\n\t\tstartupSettingsManager.getSessionDir();\n\tconst remoteSessionOptions = resolveRemoteSessionCliOptions(parsed);\n\tlet initialSession = await resolveInitialSession(\n\t\tparsed,\n\t\tcwd,\n\t\tsessionDir,\n\t\tstartupSettingsManager,\n\t\tremoteSessionOptions,\n\t);\n\tconst missingSessionCwdIssue = getMissingSessionCwdIssue(initialSession, cwd);\n\tif (missingSessionCwdIssue) {\n\t\tif (appMode !== \"interactive\") {\n\t\t\tconsole.error(chalk.red(new MissingSessionCwdError(missingSessionCwdIssue).message));\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst selectedCwd = await promptForMissingSessionCwd(missingSessionCwdIssue, startupSettingsManager);\n\t\tif (!selectedCwd) process.exit(0);\n\t\tinitialSession = await createLifecycleSessionManager({\n\t\t\tcwd,\n\t\t\tsessionDir,\n\t\t\tremote: remoteSessionOptions,\n\t\t}).openReference(missingSessionCwdIssue.sessionReference!, { cwdOverride: selectedCwd });\n\t}\n\ttime(\"resolveInitialSession\");\n\treturn { cwd, agentDir, startupSettingsManager, sessionDir, remoteSessionOptions, initialSession };\n}\n\nasync function resolveStartupToolOperations(parsed: Args): Promise<ToolOperations | undefined> {\n\tconst remoteDeferred = parsed.remoteDeferred;\n\tif (remoteDeferred && parsed.remote && !parsed.help) {\n\t\tconsole.error(chalk.red(\"Error: --remote-deferred and --remote cannot be used together\"));\n\t\tprocess.exit(1);\n\t}\n\tif (parsed.remote && !parsed.help) {\n\t\ttry {\n\t\t\treturn await createRemoteToolOperations(parsed.remote);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconsole.error(chalk.red(`Error: failed to initialize remote tool operations: ${message}`));\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\tif (!remoteDeferred || parsed.help) return undefined;\n\tif (!parsed.remoteCwd) {\n\t\tconsole.error(chalk.red(\"Error: --remote-deferred requires --remote-cwd <path>\"));\n\t\tprocess.exit(1);\n\t}\n\treturn new DeferredRemoteToolOperations(parsed.remoteCwd);\n}\n\nfunction createCliLspInputs(parsed: Args, cwd: string): LspConfigurationInput[] {\n\tconst inputs: LspConfigurationInput[] = [];\n\tif (parsed.lspConfig) inputs.push({ type: \"file\", path: resolvePath(parsed.lspConfig, cwd), scope: \"cli\" });\n\tif (parsed.noLsp) inputs.push({ type: \"disabled\", source: \"--no-lsp\", scope: \"cli\" });\n\treturn inputs;\n}\nasync function handleRuntimeInformationCommands(parsed: Args, gripAgent: GripAgent): Promise<void> {\n\tconst { modelRegistry, resourceLoader } = gripAgent.services;\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\tif (parsed.listModels === undefined) return;\n\tconst searchPattern = typeof parsed.listModels === \"string\" ? parsed.listModels : undefined;\n\tawait listModels(modelRegistry, searchPattern);\n\tprocess.exit(0);\n}\n\nasync function reportRuntimeStartupDiagnostics(gripAgent: GripAgent, deprecationWarnings: string[]): Promise<void> {\n\tif (gripAgent.mode === \"interactive\" && deprecationWarnings.length > 0) {\n\t\tawait showDeprecationWarnings(deprecationWarnings);\n\t}\n\ttime(\"resolveModelScope\");\n\tconst hasFatalDiagnostics = gripAgent.diagnostics.some(isFatalGripAgentDiagnostic);\n\tif (gripAgent.mode !== \"interactive\" || hasFatalDiagnostics) reportDiagnostics(gripAgent.diagnostics);\n\tif (hasFatalDiagnostics) process.exit(1);\n\ttime(\"createAgentSession\");\n}\n\nexport async function main(args: string[], options?: MainOptions) {\n\tif (await runCliPreflight(args, options)) return;\n\tconst { parsed, appMode } = await parseMainInvocation(args);\n\n\t// Run migrations (pass cwd for project-local migrations)\n\tconst { migratedAuthProviders: migratedProviders, deprecationWarnings } = runMigrations(process.cwd());\n\ttime(\"runMigrations\");\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 { cwd, agentDir, startupSettingsManager, sessionDir, remoteSessionOptions, initialSession } =\n\t\tawait resolveStartupSession(parsed, appMode);\n\tconst projectHookTrustStore = options?.projectHookTrustStore ?? new ProjectHookTrustStore(agentDir);\n\tconst reportedProjectHookTrustErrors = new Set<string>();\n\tconst reportProjectHookTrustError = (error: string | undefined) => {\n\t\tif (!error || reportedProjectHookTrustErrors.has(error)) return;\n\t\treportedProjectHookTrustErrors.add(error);\n\t\tconsole.error(chalk.yellow(`Warning: ${error}`));\n\t};\n\tconst initialHookCwd = initialSession.getCwd();\n\tconst projectHookTrustPolicy = createProjectHookTrustPolicy({\n\t\tinitialCwd: initialHookCwd,\n\t\tinitialSessionId: initialSession.getSessionId(),\n\t\texplicitTrust: parsed.trustProjectHooks === true,\n\t\tinteractive: appMode === \"interactive\",\n\t\tskipInitialPrompt: parsed.help || parsed.listModels !== undefined,\n\t\tstore: projectHookTrustStore,\n\t\tprompt:\n\t\t\toptions?.projectHookTrustPrompt ??\n\t\t\t((promptCwd, promptIdentity) => promptForProjectHookTrust(promptCwd, promptIdentity, startupSettingsManager)),\n\t\treportError: reportProjectHookTrustError,\n\t});\n\tconst authStorage = AuthStorage.create();\n\tconst runtimeSessionManager = parsed.noSession\n\t\t? new InMemorySessionManager(initialSession.getCwd())\n\t\t: createLifecycleSessionManager({ cwd: initialSession.getCwd(), sessionDir, remote: remoteSessionOptions });\n\tconst toolOperations = await resolveStartupToolOperations(parsed);\n\tconst initialHookBackend = toolOperations?.getBackendInfo?.();\n\tconst initialProjectHooksTrusted = await projectHookTrustPolicy.resolveInitial(\n\t\ttoolOperations === undefined || initialHookBackend?.type === \"local\",\n\t);\n\tconst initialTrustedProjectHooksIdentity = projectHookTrustPolicy.getInitialTrustedIdentity();\n\tconst backendType = toolOperations?.getBackendInfo?.()?.type;\n\tconst instructionPathCwd = toolOperations && backendType === \"remote\" ? toolOperations.cwd : cwd;\n\tconst resolvedExtensionPaths = resolveCliPaths(cwd, parsed.extensions);\n\tconst resolvedSkillPaths = resolveCliPaths(instructionPathCwd, parsed.skills);\n\tconst resolvedRulePaths = resolveCliPaths(instructionPathCwd, parsed.rules);\n\tconst resolvedPromptTemplatePaths = resolveCliPaths(instructionPathCwd, parsed.promptTemplates);\n\tconst resolvedThemePaths = resolveCliPaths(cwd, parsed.themes);\n\tconst cliLspInputs = createCliLspInputs(parsed, cwd);\n\tconst gripAgent = await GripAgent.create({\n\t\ttoolOperations,\n\t\townsToolOperations: toolOperations !== undefined,\n\t\tmode: appMode,\n\t\tcwd: initialSession.getCwd(),\n\t\tagentDir,\n\t\tsessionManager: runtimeSessionManager,\n\t\tauthStorage,\n\t\ttrustProjectHooks: initialProjectHooksTrusted,\n\t\ttrustedProjectHooksIdentity: initialTrustedProjectHooksIdentity,\n\t\textensionFlagValues: parsed.unknownFlags,\n\t\tresourceLoaderOptions: {\n\t\t\ttoolOperations,\n\t\t\tadditionalExtensionPaths: resolvedExtensionPaths,\n\t\t\tadditionalSkillPaths: resolvedSkillPaths,\n\t\t\tadditionalRulePaths: resolvedRulePaths,\n\t\t\tadditionalPromptTemplatePaths: resolvedPromptTemplatePaths,\n\t\t\tadditionalThemePaths: resolvedThemePaths,\n\t\t\tnoExtensions: parsed.noExtensions,\n\t\t\tnoSkills: parsed.noSkills,\n\t\t\tnoRules: parsed.noRules,\n\t\t\tnoPromptTemplates: parsed.noPromptTemplates,\n\t\t\tnoThemes: parsed.noThemes,\n\t\t\tnoContextFiles: parsed.noContextFiles,\n\t\t\tsystemPrompt: parsed.systemPrompt,\n\t\t\tappendSystemPrompt: parsed.appendSystemPrompt,\n\t\t\textensionFactories: options?.extensionFactories,\n\t\t},\n\t\tresolveSessionOptions: async ({ services, session }) => {\n\t\t\tconst { settingsManager, modelRegistry } = services;\n\t\t\tconst diagnostics: GripAgentDiagnostic[] = [\n\t\t\t\t...collectSettingsDiagnostics(settingsManager, \"runtime creation\"),\n\t\t\t];\n\t\t\tconst modelPatterns = parsed.models ?? settingsManager.getEnabledModels();\n\t\t\tconst scopedModels =\n\t\t\t\tmodelPatterns && modelPatterns.length > 0 ? await resolveModelScope(modelPatterns, modelRegistry) : [];\n\t\t\tconst { options: sessionOptions, diagnostics: sessionOptionDiagnostics } = buildSessionOptions(\n\t\t\t\tparsed,\n\t\t\t\tscopedModels,\n\t\t\t\tsession.buildSessionContext().messages.length > 0,\n\t\t\t\tmodelRegistry,\n\t\t\t\tsettingsManager,\n\t\t\t);\n\t\t\tdiagnostics.push(...sessionOptionDiagnostics);\n\n\t\t\tif (parsed.apiKey) {\n\t\t\t\tif (!sessionOptions.model) {\n\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\ttype: \"error\",\n\t\t\t\t\t\tmessage: \"--api-key requires a model to be specified via --model, --provider/--model, or --models\",\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tauthStorage.setRuntimeApiKey(sessionOptions.model.provider, parsed.apiKey);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (toolOperations) {\n\t\t\t\tconst backend = toolOperations.getBackendInfo?.();\n\t\t\t\tlet message = `Deferred remote backend mode enabled (cwd: ${toolOperations.cwd})`;\n\t\t\t\tif (backend?.type === \"remote\" && backend.configured) {\n\t\t\t\t\tmessage = `Remote tool operations enabled: ${backend.url} (cwd: ${backend.cwd})`;\n\t\t\t\t}\n\t\t\t\tdiagnostics.push({ type: \"info\", message });\n\t\t\t}\n\t\t\tconst projectHookTrust = projectHookTrustPolicy.resolveFor(services.cwd, session.getSessionId());\n\n\t\t\treturn {\n\t\t\t\tmodel: sessionOptions.model,\n\t\t\t\tthinkingLevel: sessionOptions.thinkingLevel,\n\t\t\t\tscopedModels: sessionOptions.scopedModels,\n\t\t\t\ttools: sessionOptions.tools,\n\t\t\t\tenableLspTools: sessionOptions.enableLspTools,\n\t\t\t\tnoTools: sessionOptions.noTools,\n\t\t\t\tcustomTools: sessionOptions.customTools,\n\t\t\t\ttoolOperations,\n\t\t\t\ttrustProjectHooks: projectHookTrust.trusted,\n\t\t\t\ttrustedProjectHooksIdentity: projectHookTrust.identity,\n\t\t\t\tlsp: cliLspInputs,\n\t\t\t\tdiagnostics,\n\t\t\t};\n\t\t},\n\t});\n\tawait gripAgent.createAgentSession({ session: initialSession });\n\ttime(\"createAgentSessionRuntime\");\n\tconst { settingsManager } = gripAgent.services;\n\tawait handleRuntimeInformationCommands(parsed, gripAgent);\n\n\tconst stdinContent = await gripAgent.readPipedStdin();\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(), gripAgent.mode === \"interactive\");\n\ttime(\"initTheme\");\n\n\tawait reportRuntimeStartupDiagnostics(gripAgent, deprecationWarnings);\n\n\tawait gripAgent.runMode({\n\t\tmigratedProviders,\n\t\tinitialMessage,\n\t\tinitialImages,\n\t\tinitialMessages: parsed.messages,\n\t\tverbose: parsed.verbose,\n\t\ttuiMode: parsed.tuiMode,\n\t\tstartupBenchmark: isTruthyEnvFlag(process.env.GRIP_STARTUP_BENCHMARK),\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 * GripAgent options. GripAgent does the heavy lifting.\n */\n\nimport { createInterface } from \"node:readline\";\nimport { modelsAreEqual } from \"@greppleai/grip-ai\";\nimport { ProcessTerminal, setKeybindings, TuiMainScreen } from \"@greppleai/grip-tui\";\nimport chalk from \"chalk\";\nimport { type Args, parseArgs, printHelp } from \"./cli/args.ts\";\nimport { processFileArguments } from \"./cli/file-processor.ts\";\nimport { buildInitialMessage, type InitialMessageResult } from \"./cli/initial-message.ts\";\nimport { listModels } from \"./cli/list-models.ts\";\nimport { selectSession } from \"./cli/session-picker.ts\";\nimport {\n\tENV_REMOTE_PROJECT_ID,\n\tENV_REMOTE_SESSION_BASE_URL,\n\tENV_REMOTE_SESSION_TOKEN,\n\tENV_SESSION_DIR,\n\texpandTildePath,\n\tgetAgentDir,\n\tgetPackageDir,\n\tVERSION,\n} from \"./config.ts\";\nimport { AuthStorage } from \"./core/auth-storage.ts\";\nimport { exportFromFile } from \"./core/export-html/index.ts\";\nimport type { ExtensionFactory } from \"./core/extensions/types.ts\";\nimport type { GripAgentAppMode, GripAgentDiagnostic, GripAgentSessionOptions } from \"./core/grip-agent.ts\";\nimport { GripAgent, isFatalGripAgentDiagnostic } from \"./core/grip-agent.ts\";\nimport {\n\tcanonicalProjectHookIdentity,\n\thasProjectHookConfiguration,\n\ttype ProjectHookTrustResult,\n\tProjectHookTrustStore,\n} from \"./core/hooks/trust-store.ts\";\nimport { configureHttpDispatcher } from \"./core/http-dispatcher.ts\";\nimport { KeybindingsManager } from \"./core/keybindings.ts\";\nimport type { LspConfigurationInput } from \"./core/lsp/config-loader.ts\";\nimport type { ModelRegistry } from \"./core/model-registry.ts\";\nimport { resolveCliModel, resolveModelScope, type ScopedModel } from \"./core/model-resolver.ts\";\nimport { InMemorySessionManager } from \"./core/session/in-memory-session-manager.ts\";\nimport { LocalSessionManager } from \"./core/session/local-session-manager.ts\";\nimport { RemoteSessionManager } from \"./core/session/remote-session-manager.ts\";\nimport type { Session } from \"./core/session/session.ts\";\nimport type { SessionManager } from \"./core/session/session-manager.ts\";\nimport {\n\tformatMissingSessionCwdPrompt,\n\tgetMissingSessionCwdIssue,\n\tMissingSessionCwdError,\n\ttype SessionCwdIssue,\n} from \"./core/session-cwd.ts\";\nimport { SettingsManager } from \"./core/settings-manager.ts\";\nimport { resetTimings, time } from \"./core/timings.ts\";\nimport {\n\tcreateRemoteToolOperations,\n\tDeferredRemoteToolOperations,\n\ttype ToolOperations,\n} from \"./core/tools/operations.ts\";\nimport { runDaemonCommand } from \"./daemon/command.ts\";\nimport { isDaemonCommand } from \"./daemon/config.ts\";\nimport { runMigrations, showDeprecationWarnings } from \"./migrations.ts\";\nimport { ExtensionSelectorComponent } from \"./modes/interactive/components/extension-selector.ts\";\nimport { initTheme, stopThemeWatcher } from \"./modes/interactive/theme/theme.ts\";\nimport { handleConfigCommand, handlePackageCommand } from \"./package-manager-cli.ts\";\nimport { isLocalPath, normalizePath, resolvePath } from \"./utils/paths.ts\";\nimport { cleanupWindowsSelfUpdateQuarantine } from \"./utils/windows-self-update.ts\";\n\nfunction collectSettingsDiagnostics(settingsManager: SettingsManager, context: string): GripAgentDiagnostic[] {\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 GripAgentDiagnostic[]): 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\nfunction resolveAppMode(parsed: Args, stdinIsTTY: boolean): GripAgentAppMode {\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\nasync function prepareInitialMessage(\n\tparsed: Args,\n\tautoResizeImages: boolean,\n\tstdinContent?: string,\n): Promise<InitialMessageResult> {\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, resolve it before handing it to the session manager.\n\tif (sessionArg.includes(\"/\") || sessionArg.includes(\"\\\\\") || sessionArg.endsWith(\".jsonl\")) {\n\t\treturn { type: \"path\", path: resolvePath(sessionArg, cwd) };\n\t}\n\n\t// Try to match as session ID in current project first\n\tconst localSessions = await new LocalSessionManager({ cwd: cwd, sessionDir: sessionDir }).list();\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 new LocalSessionManager({ cwd: process.cwd(), sessionDir }).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): Session {\n\ttry {\n\t\treturn new LocalSessionManager({ cwd: cwd, sessionDir: sessionDir }).forkFrom(sourcePath);\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\nfunction openSessionOrExit(path: string, cwd: string, sessionDir?: string): Session {\n\ttry {\n\t\treturn new LocalSessionManager({ cwd, sessionDir }).openReference(path);\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\ninterface RemoteSessionCliOptions {\n\tbaseUrl: string;\n\ttoken: string;\n\tprojectId?: string;\n}\n\ninterface LifecycleSessionManagerOptions {\n\tcwd: string;\n\tsessionDir?: string;\n\tremote?: RemoteSessionCliOptions;\n}\n\nfunction resolveRemoteSessionCliOptions(parsed: Args): RemoteSessionCliOptions | undefined {\n\tconst baseUrl = parsed.remoteSessionBaseUrl ?? process.env[ENV_REMOTE_SESSION_BASE_URL];\n\tconst token = parsed.remoteSessionToken ?? process.env[ENV_REMOTE_SESSION_TOKEN];\n\tconst projectId = parsed.remoteProjectId ?? process.env[ENV_REMOTE_PROJECT_ID];\n\n\tif (!baseUrl && !token && !projectId) {\n\t\treturn undefined;\n\t}\n\tif (!baseUrl || !token) {\n\t\tconsole.error(\n\t\t\tchalk.red(\n\t\t\t\t`Error: remote sessions require both --remote-session-base-url and --remote-session-token, or ${ENV_REMOTE_SESSION_BASE_URL} and ${ENV_REMOTE_SESSION_TOKEN}`,\n\t\t\t),\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\n\treturn { baseUrl, token, projectId };\n}\n\nfunction createLifecycleSessionManager(options: LifecycleSessionManagerOptions): SessionManager {\n\tif (options.remote) {\n\t\treturn new RemoteSessionManager({\n\t\t\tbaseUrl: options.remote.baseUrl,\n\t\t\ttoken: options.remote.token,\n\t\t\tcwd: options.cwd,\n\t\t\tprojectId: options.remote.projectId,\n\t\t});\n\t}\n\treturn new LocalSessionManager({ cwd: options.cwd, sessionDir: options.sessionDir });\n}\n\nasync function resolveRemoteInitialSession(parsed: Args, manager: SessionManager): Promise<Session> {\n\tif (parsed.fork) {\n\t\treturn await manager.forkFrom(parsed.fork);\n\t}\n\tif (parsed.session) {\n\t\treturn await manager.openReference(parsed.session);\n\t}\n\tif (parsed.resume) {\n\t\tconst selectedReference = await selectSession(\n\t\t\t(onProgress) => manager.list(onProgress),\n\t\t\t(onProgress) => manager.listAll(onProgress),\n\t\t);\n\t\tif (!selectedReference) {\n\t\t\tconsole.log(chalk.dim(\"No session selected\"));\n\t\t\tprocess.exit(0);\n\t\t}\n\t\treturn await manager.openReference(selectedReference);\n\t}\n\tif (parsed.continue) {\n\t\treturn await manager.continueRecent();\n\t}\n\treturn await manager.create();\n}\n\nasync function resolveLocalRequestedSession(sessionArg: string, cwd: string, sessionDir?: string): Promise<Session> {\n\tconst resolved = await resolveSessionPath(sessionArg, cwd, sessionDir);\n\tswitch (resolved.type) {\n\t\tcase \"path\":\n\t\tcase \"local\":\n\t\t\treturn openSessionOrExit(resolved.path, process.cwd(), sessionDir);\n\t\tcase \"global\": {\n\t\t\tconsole.log(chalk.yellow(`Session found in different project: ${resolved.cwd}`));\n\t\t\tconst shouldFork = await promptConfirm(\"Fork this session into current directory?\");\n\t\t\tif (!shouldFork) {\n\t\t\t\tconsole.log(chalk.dim(\"Aborted.\"));\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t\treturn forkSessionOrExit(resolved.path, cwd, sessionDir);\n\t\t}\n\t\tcase \"not_found\":\n\t\t\tconsole.error(chalk.red(`No session found matching '${resolved.arg}'`));\n\t\t\tprocess.exit(1);\n\t}\n}\n\nasync function resolveInitialSession(\n\tparsed: Args,\n\tcwd: string,\n\tsessionDir: string | undefined,\n\tsettingsManager: SettingsManager,\n\tremoteOptions?: RemoteSessionCliOptions,\n): Promise<Session> {\n\tif (parsed.noSession) {\n\t\treturn new InMemorySessionManager().create();\n\t}\n\n\tif (remoteOptions) {\n\t\treturn resolveRemoteInitialSession(\n\t\t\tparsed,\n\t\t\tnew RemoteSessionManager({\n\t\t\t\tbaseUrl: remoteOptions.baseUrl,\n\t\t\t\ttoken: remoteOptions.token,\n\t\t\t\tcwd,\n\t\t\t\tprojectId: remoteOptions.projectId,\n\t\t\t}),\n\t\t);\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) return resolveLocalRequestedSession(parsed.session, cwd, sessionDir);\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) => new LocalSessionManager({ cwd, sessionDir }).list(onProgress),\n\t\t\t\t(onProgress) => new LocalSessionManager({ cwd: process.cwd(), sessionDir }).listAll(onProgress),\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 openSessionOrExit(selectedPath, process.cwd(), sessionDir);\n\t\t} finally {\n\t\t\tstopThemeWatcher();\n\t\t}\n\t}\n\n\tif (parsed.continue) {\n\t\treturn new LocalSessionManager({ cwd: cwd, sessionDir: sessionDir }).continueRecent();\n\t}\n\n\treturn new LocalSessionManager({ cwd: cwd, sessionDir: sessionDir }).create();\n}\n\ninterface SessionOptionsResolution {\n\toptions: GripAgentSessionOptions;\n\tcliThinkingFromModel: boolean;\n\tdiagnostics: GripAgentDiagnostic[];\n}\n\nfunction applyCliModelSelection(\n\tparsed: Args,\n\tmodelRegistry: ModelRegistry,\n\tresolution: SessionOptionsResolution,\n): void {\n\tif (!parsed.model) return;\n\tconst resolved = resolveCliModel({\n\t\tcliProvider: parsed.provider,\n\t\tcliModel: parsed.model,\n\t\tmodelRegistry,\n\t});\n\tif (resolved.warning) resolution.diagnostics.push({ type: \"warning\", message: resolved.warning });\n\tif (resolved.error) resolution.diagnostics.push({ type: \"error\", message: resolved.error });\n\tif (!resolved.model) return;\n\tresolution.options.model = resolved.model;\n\tif (!parsed.thinking && resolved.thinkingLevel) {\n\t\tresolution.options.thinkingLevel = resolved.thinkingLevel;\n\t\tresolution.cliThinkingFromModel = true;\n\t}\n}\n\nfunction selectDefaultScopedModel(\n\tscopedModels: ScopedModel[],\n\tmodelRegistry: ModelRegistry,\n\tsettingsManager: SettingsManager,\n): ScopedModel {\n\tconst savedProvider = settingsManager.getDefaultProvider();\n\tconst savedModelId = settingsManager.getDefaultModel();\n\tconst savedModel = savedProvider && savedModelId ? modelRegistry.find(savedProvider, savedModelId) : undefined;\n\treturn (\n\t\t(savedModel ? scopedModels.find((scoped) => modelsAreEqual(scoped.model, savedModel)) : undefined) ??\n\t\tscopedModels[0]\n\t);\n}\n\nfunction applyCliToolSelection(parsed: Args, options: GripAgentSessionOptions): void {\n\tif (parsed.noTools) options.noTools = \"all\";\n\telse if (parsed.noBuiltinTools) options.noTools = \"builtin\";\n\tif (parsed.tools) options.tools = [...parsed.tools];\n\tif (parsed.enableLspTools) options.enableLspTools = true;\n}\n\nfunction buildSessionOptions(\n\tparsed: Args,\n\tscopedModels: ScopedModel[],\n\thasExistingSession: boolean,\n\tmodelRegistry: ModelRegistry,\n\tsettingsManager: SettingsManager,\n): SessionOptionsResolution {\n\tconst resolution: SessionOptionsResolution = {\n\t\toptions: {},\n\t\tcliThinkingFromModel: false,\n\t\tdiagnostics: [],\n\t};\n\tapplyCliModelSelection(parsed, modelRegistry, resolution);\n\tconst { options } = resolution;\n\n\tif (!options.model && scopedModels.length > 0 && !hasExistingSession) {\n\t\tconst selected = selectDefaultScopedModel(scopedModels, modelRegistry, settingsManager);\n\t\toptions.model = selected.model;\n\t\tif (!parsed.thinking && selected.thinkingLevel) options.thinkingLevel = selected.thinkingLevel;\n\t}\n\n\tif (parsed.thinking) options.thinkingLevel = parsed.thinking;\n\tif (scopedModels.length > 0) {\n\t\toptions.scopedModels = scopedModels.map((scoped) => ({\n\t\t\tmodel: scoped.model,\n\t\t\tthinkingLevel: scoped.thinkingLevel,\n\t\t}));\n\t}\n\tapplyCliToolSelection(parsed, options);\n\treturn resolution;\n}\n\nfunction resolveCliPaths(cwd: string, paths: string[] | undefined): string[] | undefined {\n\treturn paths?.map((value) => (isLocalPath(value) ? resolvePath(value, cwd) : 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 TuiMainScreen(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 type ProjectHookTrustChoice = \"deny\" | \"once\" | \"always\";\n\nexport async function promptForProjectHookTrust(\n\tcwd: string,\n\tidentity: string,\n\tsettingsManager: SettingsManager,\n): Promise<ProjectHookTrustChoice> {\n\tinitTheme(settingsManager.getTheme());\n\tsetKeybindings(KeybindingsManager.create());\n\tconst title = [\n\t\t`Project hooks were found in ${cwd}.`,\n\t\t\"Project hooks execute in the active workspace: as your host user locally, or inside an active sandbox/remote backend.\",\n\t\t`Trust always authorizes all current and future hook changes in ${identity}.`,\n\t].join(\"\\n\");\n\n\treturn new Promise((resolve) => {\n\t\tconst ui = new TuiMainScreen(new ProcessTerminal(), settingsManager.getShowHardwareCursor());\n\t\tui.setClearOnShrink(settingsManager.getClearOnShrink());\n\t\tlet settled = false;\n\t\tconst finish = (choice: ProjectHookTrustChoice) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tui.stop();\n\t\t\tresolve(choice);\n\t\t};\n\t\tconst selector = new ExtensionSelectorComponent(\n\t\t\ttitle,\n\t\t\t[\"Don't trust\", \"Trust once\", \"Trust always\"],\n\t\t\t(option) => {\n\t\t\t\tif (option === \"Trust once\") finish(\"once\");\n\t\t\t\telse if (option === \"Trust always\") finish(\"always\");\n\t\t\t\telse finish(\"deny\");\n\t\t\t},\n\t\t\t() => finish(\"deny\"),\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}\nexport interface ProjectHookTrustPolicyOptions {\n\tinitialCwd: string;\n\tinitialSessionId: string;\n\texplicitTrust: boolean;\n\tinteractive: boolean;\n\tskipInitialPrompt: boolean;\n\tstore: ProjectHookTrustStore;\n\tprompt: (cwd: string, identity: string) => Promise<ProjectHookTrustChoice>;\n\treportError?: (error: string | undefined) => void;\n}\n\nexport interface ProjectHookTrustPolicy {\n\tresolveInitial(backendAllowsProjectHooks: boolean): Promise<boolean>;\n\tgetInitialTrustedIdentity(): string | undefined;\n\tresolveFor(sessionCwd: string, sessionId: string): ProjectHookTrustResult;\n\tisTrustedFor(sessionCwd: string, sessionId: string): boolean;\n}\ninterface ProjectHookTrustPolicyState {\n\tinitialTrusted: boolean;\n\tinitialTrustedIdentity: string | undefined;\n\ttrustOnceIdentity: string | undefined;\n\ttrustOnceSessionId: string | undefined;\n\ttrustOnceConsumed: boolean;\n}\n\ntype ProjectHookTrustErrorReporter = (error: string | undefined) => void;\n\nfunction identifyInitialProjectHooks(cwd: string, reportError: ProjectHookTrustErrorReporter): string | undefined {\n\ttry {\n\t\treturn canonicalProjectHookIdentity(cwd);\n\t} catch (error) {\n\t\treportError(\n\t\t\t`Unable to identify project hooks repository: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t\treturn undefined;\n\t}\n}\n\nfunction applyInitialProjectHookTrustChoice(\n\tchoice: ProjectHookTrustChoice,\n\tidentity: string,\n\toptions: ProjectHookTrustPolicyOptions,\n\tstate: ProjectHookTrustPolicyState,\n\treportError: ProjectHookTrustErrorReporter,\n): void {\n\tif (choice === \"once\" || choice === \"always\") {\n\t\tstate.initialTrusted = true;\n\t\tstate.initialTrustedIdentity = identity;\n\t}\n\tif (choice === \"once\") {\n\t\tstate.trustOnceIdentity = identity;\n\t\tstate.trustOnceSessionId = options.initialSessionId;\n\t}\n\tif (choice === \"always\") {\n\t\tconst saved = options.store.trustAlwaysIdentity(identity);\n\t\treportError(saved.error);\n\t}\n}\n\nasync function resolveInitialProjectHookTrust(\n\tbackendAllowsProjectHooks: boolean,\n\toptions: ProjectHookTrustPolicyOptions,\n\tstate: ProjectHookTrustPolicyState,\n\treportError: ProjectHookTrustErrorReporter,\n): Promise<boolean> {\n\tif (!backendAllowsProjectHooks) return state.initialTrusted;\n\tif (state.initialTrusted) return true;\n\tif (options.skipInitialPrompt) return false;\n\tif (!hasProjectHookConfiguration(options.initialCwd)) return false;\n\n\tconst persisted = options.store.isTrusted(options.initialCwd);\n\treportError(persisted.error);\n\tstate.initialTrusted = persisted.trusted;\n\tstate.initialTrustedIdentity = persisted.trusted ? persisted.identity : undefined;\n\tif (state.initialTrusted || !options.interactive) return state.initialTrusted;\n\n\tconst identity = identifyInitialProjectHooks(options.initialCwd, reportError);\n\tif (!identity) return false;\n\tconst choice = await options.prompt(options.initialCwd, identity);\n\tapplyInitialProjectHookTrustChoice(choice, identity, options, state, reportError);\n\treturn state.initialTrusted;\n}\n\n/** Orchestrates the CLI's startup and per-session project-hook trust decisions. */\nexport function createProjectHookTrustPolicy(options: ProjectHookTrustPolicyOptions): ProjectHookTrustPolicy {\n\tconst state: ProjectHookTrustPolicyState = {\n\t\tinitialTrusted: options.explicitTrust,\n\t\tinitialTrustedIdentity: undefined,\n\t\ttrustOnceIdentity: undefined,\n\t\ttrustOnceSessionId: undefined,\n\t\ttrustOnceConsumed: false,\n\t};\n\tconst reportError = options.reportError ?? (() => {});\n\n\treturn {\n\t\tresolveInitial(backendAllowsProjectHooks: boolean): Promise<boolean> {\n\t\t\treturn resolveInitialProjectHookTrust(backendAllowsProjectHooks, options, state, reportError);\n\t\t},\n\n\t\tgetInitialTrustedIdentity(): string | undefined {\n\t\t\treturn state.initialTrustedIdentity;\n\t\t},\n\n\t\tresolveFor(sessionCwd: string, sessionId: string): ProjectHookTrustResult {\n\t\t\tif (options.explicitTrust) return { trusted: true };\n\t\t\tif (!hasProjectHookConfiguration(sessionCwd)) return { trusted: false };\n\t\t\ttry {\n\t\t\t\tif (\n\t\t\t\t\t!state.trustOnceConsumed &&\n\t\t\t\t\tstate.trustOnceIdentity &&\n\t\t\t\t\tstate.trustOnceSessionId === sessionId &&\n\t\t\t\t\tcanonicalProjectHookIdentity(sessionCwd) === state.trustOnceIdentity\n\t\t\t\t) {\n\t\t\t\t\tstate.trustOnceConsumed = true;\n\t\t\t\t\treturn { trusted: true, identity: state.trustOnceIdentity };\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconst message = `Unable to identify project hooks repository: ${error instanceof Error ? error.message : String(error)}`;\n\t\t\t\treportError(message);\n\t\t\t\treturn { trusted: false, error: message };\n\t\t\t}\n\t\t\tconst persisted = options.store.isTrusted(sessionCwd);\n\t\t\treportError(persisted.error);\n\t\t\treturn persisted;\n\t\t},\n\n\t\tisTrustedFor(sessionCwd: string, sessionId: string): boolean {\n\t\t\treturn this.resolveFor(sessionCwd, sessionId).trusted;\n\t\t},\n\t};\n}\n\nexport interface MainOptions {\n\textensionFactories?: ExtensionFactory[];\n\tdaemonRunner?: (args: readonly string[]) => Promise<void>;\n\t/** Test/embedding override for the interactive project-hook trust prompt. */\n\tprojectHookTrustPrompt?: (cwd: string, identity: string) => Promise<ProjectHookTrustChoice>;\n\t/** Test/embedding override for persistent project-hook trust storage. */\n\tprojectHookTrustStore?: ProjectHookTrustStore;\n}\ninterface ParsedMainInvocation {\n\tparsed: Args;\n\tappMode: GripAgentAppMode;\n}\n\ninterface StartupSessionResolution {\n\tcwd: string;\n\tagentDir: string;\n\tstartupSettingsManager: SettingsManager;\n\tsessionDir: string | undefined;\n\tremoteSessionOptions: RemoteSessionCliOptions | undefined;\n\tinitialSession: Session;\n}\n\nasync function runCliPreflight(args: string[], options: MainOptions | undefined): Promise<boolean> {\n\tif (isDaemonCommand(args)) {\n\t\tawait (options?.daemonRunner ?? runDaemonCommand)(args);\n\t\treturn true;\n\t}\n\tconfigureHttpDispatcher();\n\tresetTimings();\n\tconst offlineMode = args.includes(\"--offline\") || isTruthyEnvFlag(process.env.GRIP_OFFLINE);\n\tif (offlineMode) {\n\t\tprocess.env.GRIP_OFFLINE = \"1\";\n\t\tprocess.env.GRIP_SKIP_VERSION_CHECK = \"1\";\n\t}\n\tif (process.platform === \"win32\") cleanupWindowsSelfUpdateQuarantine(getPackageDir());\n\tif (await handlePackageCommand(args)) return true;\n\treturn handleConfigCommand(args);\n}\n\nfunction reportArgumentDiagnostics(parsed: Args): void {\n\tif (parsed.diagnostics.length === 0) return;\n\tfor (const diagnostic of parsed.diagnostics) {\n\t\tconst color = diagnostic.type === \"error\" ? chalk.red : chalk.yellow;\n\t\tconsole.error(color(`${diagnostic.type === \"error\" ? \"Error\" : \"Warning\"}: ${diagnostic.message}`));\n\t}\n\tif (parsed.diagnostics.some((diagnostic) => diagnostic.type === \"error\")) process.exit(1);\n}\n\nasync function handleCliMetadataCommands(parsed: Args): Promise<void> {\n\tif (parsed.version) {\n\t\tconsole.log(VERSION);\n\t\tprocess.exit(0);\n\t}\n\tif (!parsed.export) return;\n\tlet result: string;\n\ttry {\n\t\tconst outputPath = parsed.messages.length > 0 ? parsed.messages[0] : undefined;\n\t\tresult = await exportFromFile(parsed.export, outputPath);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Failed to export session\";\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tprocess.exit(1);\n\t}\n\tconsole.log(`Exported to: ${result}`);\n\tprocess.exit(0);\n}\n\nasync function parseMainInvocation(args: string[]): Promise<ParsedMainInvocation> {\n\tconst parsed = parseArgs(args);\n\treportArgumentDiagnostics(parsed);\n\ttime(\"parseArgs\");\n\tconst appMode = resolveAppMode(parsed, process.stdin.isTTY);\n\tGripAgent.setupStdio({ mode: appMode });\n\tawait handleCliMetadataCommands(parsed);\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\tvalidateForkFlags(parsed);\n\treturn { parsed, appMode };\n}\n\nasync function resolveStartupSession(parsed: Args, appMode: GripAgentAppMode): Promise<StartupSessionResolution> {\n\tconst cwd = process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst startupSettingsManager = SettingsManager.create(cwd, agentDir);\n\treportDiagnostics(collectSettingsDiagnostics(startupSettingsManager, \"startup session lookup\"));\n\tconst envSessionDir = process.env[ENV_SESSION_DIR];\n\tconst sessionDir =\n\t\t(parsed.sessionDir ? normalizePath(parsed.sessionDir) : undefined) ??\n\t\t(envSessionDir ? expandTildePath(envSessionDir) : undefined) ??\n\t\tstartupSettingsManager.getSessionDir();\n\tconst remoteSessionOptions = resolveRemoteSessionCliOptions(parsed);\n\tlet initialSession = await resolveInitialSession(\n\t\tparsed,\n\t\tcwd,\n\t\tsessionDir,\n\t\tstartupSettingsManager,\n\t\tremoteSessionOptions,\n\t);\n\tconst missingSessionCwdIssue = getMissingSessionCwdIssue(initialSession, cwd);\n\tif (missingSessionCwdIssue) {\n\t\tif (appMode !== \"interactive\") {\n\t\t\tconsole.error(chalk.red(new MissingSessionCwdError(missingSessionCwdIssue).message));\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst selectedCwd = await promptForMissingSessionCwd(missingSessionCwdIssue, startupSettingsManager);\n\t\tif (!selectedCwd) process.exit(0);\n\t\tinitialSession = await createLifecycleSessionManager({\n\t\t\tcwd,\n\t\t\tsessionDir,\n\t\t\tremote: remoteSessionOptions,\n\t\t}).openReference(missingSessionCwdIssue.sessionReference!, { cwdOverride: selectedCwd });\n\t}\n\ttime(\"resolveInitialSession\");\n\treturn { cwd, agentDir, startupSettingsManager, sessionDir, remoteSessionOptions, initialSession };\n}\n\nasync function resolveStartupToolOperations(parsed: Args): Promise<ToolOperations | undefined> {\n\tif (parsed.help) return undefined;\n\tconst remoteDeferred = parsed.remoteDeferred;\n\tif (remoteDeferred && parsed.remote) {\n\t\tconsole.error(chalk.red(\"Error: --remote-deferred and --remote cannot be used together\"));\n\t\tprocess.exit(1);\n\t}\n\tif (parsed.remote) {\n\t\ttry {\n\t\t\treturn await createRemoteToolOperations(parsed.remote);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconsole.error(chalk.red(`Error: failed to initialize remote tool operations: ${message}`));\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\tif (!remoteDeferred) return undefined;\n\tif (!parsed.remoteCwd) {\n\t\tconsole.error(chalk.red(\"Error: --remote-deferred requires --remote-cwd <path>\"));\n\t\tprocess.exit(1);\n\t}\n\treturn new DeferredRemoteToolOperations(parsed.remoteCwd);\n}\n\nfunction createCliLspInputs(parsed: Args, cwd: string): LspConfigurationInput[] {\n\tconst inputs: LspConfigurationInput[] = [];\n\tif (parsed.lspConfig) inputs.push({ type: \"file\", path: resolvePath(parsed.lspConfig, cwd), scope: \"cli\" });\n\tif (parsed.noLsp) inputs.push({ type: \"disabled\", source: \"--no-lsp\", scope: \"cli\" });\n\treturn inputs;\n}\nasync function handleRuntimeInformationCommands(parsed: Args, gripAgent: GripAgent): Promise<void> {\n\tconst { modelRegistry, resourceLoader } = gripAgent.services;\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\tif (parsed.listModels === undefined) return;\n\tconst searchPattern = typeof parsed.listModels === \"string\" ? parsed.listModels : undefined;\n\tawait listModels(modelRegistry, searchPattern);\n\tprocess.exit(0);\n}\n\nasync function reportRuntimeStartupDiagnostics(gripAgent: GripAgent, deprecationWarnings: string[]): Promise<void> {\n\tif (gripAgent.mode === \"interactive\" && deprecationWarnings.length > 0) {\n\t\tawait showDeprecationWarnings(deprecationWarnings);\n\t}\n\ttime(\"resolveModelScope\");\n\tconst hasFatalDiagnostics = gripAgent.diagnostics.some(isFatalGripAgentDiagnostic);\n\tif (gripAgent.mode !== \"interactive\" || hasFatalDiagnostics) reportDiagnostics(gripAgent.diagnostics);\n\tif (hasFatalDiagnostics) process.exit(1);\n\ttime(\"createAgentSession\");\n}\n\nexport async function main(args: string[], options?: MainOptions) {\n\tif (await runCliPreflight(args, options)) return;\n\tconst { parsed, appMode } = await parseMainInvocation(args);\n\n\t// Run migrations (pass cwd for project-local migrations)\n\tconst { migratedAuthProviders: migratedProviders, deprecationWarnings } = runMigrations(process.cwd());\n\ttime(\"runMigrations\");\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 { cwd, agentDir, startupSettingsManager, sessionDir, remoteSessionOptions, initialSession } =\n\t\tawait resolveStartupSession(parsed, appMode);\n\tconst projectHookTrustStore = options?.projectHookTrustStore ?? new ProjectHookTrustStore(agentDir);\n\tconst reportedProjectHookTrustErrors = new Set<string>();\n\tconst reportProjectHookTrustError = (error: string | undefined) => {\n\t\tif (!error || reportedProjectHookTrustErrors.has(error)) return;\n\t\treportedProjectHookTrustErrors.add(error);\n\t\tconsole.error(chalk.yellow(`Warning: ${error}`));\n\t};\n\tconst initialHookCwd = initialSession.getCwd();\n\tconst projectHookTrustPolicy = createProjectHookTrustPolicy({\n\t\tinitialCwd: initialHookCwd,\n\t\tinitialSessionId: initialSession.getSessionId(),\n\t\texplicitTrust: parsed.trustProjectHooks === true,\n\t\tinteractive: appMode === \"interactive\",\n\t\tskipInitialPrompt: parsed.help || parsed.listModels !== undefined,\n\t\tstore: projectHookTrustStore,\n\t\tprompt:\n\t\t\toptions?.projectHookTrustPrompt ??\n\t\t\t((promptCwd, promptIdentity) => promptForProjectHookTrust(promptCwd, promptIdentity, startupSettingsManager)),\n\t\treportError: reportProjectHookTrustError,\n\t});\n\tconst authStorage = AuthStorage.create();\n\tconst runtimeSessionManager = parsed.noSession\n\t\t? new InMemorySessionManager(initialSession.getCwd())\n\t\t: createLifecycleSessionManager({ cwd: initialSession.getCwd(), sessionDir, remote: remoteSessionOptions });\n\tconst toolOperations = await resolveStartupToolOperations(parsed);\n\tconst initialHookBackend = toolOperations?.getBackendInfo?.();\n\tconst initialProjectHooksTrusted = await projectHookTrustPolicy.resolveInitial(\n\t\ttoolOperations === undefined || initialHookBackend?.type === \"local\",\n\t);\n\tconst initialTrustedProjectHooksIdentity = projectHookTrustPolicy.getInitialTrustedIdentity();\n\tconst backendType = toolOperations?.getBackendInfo?.()?.type;\n\tconst instructionPathCwd = toolOperations && backendType === \"remote\" ? toolOperations.cwd : cwd;\n\tconst resolvedExtensionPaths = resolveCliPaths(cwd, parsed.extensions);\n\tconst resolvedSkillPaths = resolveCliPaths(instructionPathCwd, parsed.skills);\n\tconst resolvedRulePaths = resolveCliPaths(instructionPathCwd, parsed.rules);\n\tconst resolvedPromptTemplatePaths = resolveCliPaths(instructionPathCwd, parsed.promptTemplates);\n\tconst resolvedThemePaths = resolveCliPaths(cwd, parsed.themes);\n\tconst cliLspInputs = createCliLspInputs(parsed, cwd);\n\tconst gripAgent = await GripAgent.create({\n\t\ttoolOperations,\n\t\townsToolOperations: toolOperations !== undefined,\n\t\tmode: appMode,\n\t\tcwd: initialSession.getCwd(),\n\t\tagentDir,\n\t\tsessionManager: runtimeSessionManager,\n\t\tauthStorage,\n\t\ttrustProjectHooks: initialProjectHooksTrusted,\n\t\ttrustedProjectHooksIdentity: initialTrustedProjectHooksIdentity,\n\t\textensionFlagValues: parsed.unknownFlags,\n\t\tresourceLoaderOptions: {\n\t\t\ttoolOperations,\n\t\t\tadditionalExtensionPaths: resolvedExtensionPaths,\n\t\t\tadditionalSkillPaths: resolvedSkillPaths,\n\t\t\tadditionalRulePaths: resolvedRulePaths,\n\t\t\tadditionalPromptTemplatePaths: resolvedPromptTemplatePaths,\n\t\t\tadditionalThemePaths: resolvedThemePaths,\n\t\t\tnoExtensions: parsed.noExtensions,\n\t\t\tnoSkills: parsed.noSkills,\n\t\t\tnoRules: parsed.noRules,\n\t\t\tnoPromptTemplates: parsed.noPromptTemplates,\n\t\t\tnoThemes: parsed.noThemes,\n\t\t\tnoContextFiles: parsed.noContextFiles,\n\t\t\tsystemPrompt: parsed.systemPrompt,\n\t\t\tappendSystemPrompt: parsed.appendSystemPrompt,\n\t\t\textensionFactories: options?.extensionFactories,\n\t\t},\n\t\tresolveSessionOptions: async ({ services, session }) => {\n\t\t\tconst { settingsManager, modelRegistry } = services;\n\t\t\tconst diagnostics: GripAgentDiagnostic[] = [\n\t\t\t\t...collectSettingsDiagnostics(settingsManager, \"runtime creation\"),\n\t\t\t];\n\t\t\tconst modelPatterns = parsed.models ?? settingsManager.getEnabledModels();\n\t\t\tconst scopedModels =\n\t\t\t\tmodelPatterns && modelPatterns.length > 0 ? await resolveModelScope(modelPatterns, modelRegistry) : [];\n\t\t\tconst { options: sessionOptions, diagnostics: sessionOptionDiagnostics } = buildSessionOptions(\n\t\t\t\tparsed,\n\t\t\t\tscopedModels,\n\t\t\t\tsession.buildSessionContext().messages.length > 0,\n\t\t\t\tmodelRegistry,\n\t\t\t\tsettingsManager,\n\t\t\t);\n\t\t\tdiagnostics.push(...sessionOptionDiagnostics);\n\n\t\t\tif (parsed.apiKey) {\n\t\t\t\tif (!sessionOptions.model) {\n\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\ttype: \"error\",\n\t\t\t\t\t\tmessage: \"--api-key requires a model to be specified via --model, --provider/--model, or --models\",\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tauthStorage.setRuntimeApiKey(sessionOptions.model.provider, parsed.apiKey);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (toolOperations) {\n\t\t\t\tconst backend = toolOperations.getBackendInfo?.();\n\t\t\t\tlet message = `Deferred remote backend mode enabled (cwd: ${toolOperations.cwd})`;\n\t\t\t\tif (backend?.type === \"remote\" && backend.configured) {\n\t\t\t\t\tmessage = `Remote tool operations enabled: ${backend.url} (cwd: ${backend.cwd})`;\n\t\t\t\t}\n\t\t\t\tdiagnostics.push({ type: \"info\", message });\n\t\t\t}\n\t\t\tconst projectHookTrust = projectHookTrustPolicy.resolveFor(services.cwd, session.getSessionId());\n\n\t\t\treturn {\n\t\t\t\tmodel: sessionOptions.model,\n\t\t\t\tthinkingLevel: sessionOptions.thinkingLevel,\n\t\t\t\tscopedModels: sessionOptions.scopedModels,\n\t\t\t\ttools: sessionOptions.tools,\n\t\t\t\tenableLspTools: sessionOptions.enableLspTools,\n\t\t\t\tnoTools: sessionOptions.noTools,\n\t\t\t\tcustomTools: sessionOptions.customTools,\n\t\t\t\ttoolOperations,\n\t\t\t\ttrustProjectHooks: projectHookTrust.trusted,\n\t\t\t\ttrustedProjectHooksIdentity: projectHookTrust.identity,\n\t\t\t\tlsp: cliLspInputs,\n\t\t\t\tdiagnostics,\n\t\t\t};\n\t\t},\n\t});\n\tawait gripAgent.createAgentSession({ session: initialSession });\n\ttime(\"createAgentSessionRuntime\");\n\tconst { settingsManager } = gripAgent.services;\n\tawait handleRuntimeInformationCommands(parsed, gripAgent);\n\n\tconst stdinContent = await gripAgent.readPipedStdin();\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(), gripAgent.mode === \"interactive\");\n\ttime(\"initTheme\");\n\n\tawait reportRuntimeStartupDiagnostics(gripAgent, deprecationWarnings);\n\n\tawait gripAgent.runMode({\n\t\tmigratedProviders,\n\t\tinitialMessage,\n\t\tinitialImages,\n\t\tinitialMessages: parsed.messages,\n\t\tverbose: parsed.verbose,\n\t\ttuiMode: parsed.tuiMode,\n\t\tstartupBenchmark: isTruthyEnvFlag(process.env.GRIP_STARTUP_BENCHMARK),\n\t});\n}\n"]}
@@ -14,6 +14,7 @@ export declare class AssistantMessageComponent extends Container {
14
14
  private lastMessage?;
15
15
  private hasToolCalls;
16
16
  private isStreaming;
17
+ private isFinal;
17
18
  constructor(message?: AssistantMessage, hideThinkingBlock?: boolean, markdownTheme?: MarkdownTheme, hiddenThinkingLabel?: string, outputPad?: number, markdownTransformers?: readonly MarkdownTransformer[]);
18
19
  invalidate(): void;
19
20
  setHideThinkingBlock(hide: boolean): void;