praxis-agent 0.7.0 → 0.8.0

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 (301) hide show
  1. package/README.md +8 -0
  2. package/dist/application/background-agent-manager.d.ts +5 -0
  3. package/dist/application/background-agent-manager.js +21 -0
  4. package/dist/application/background-bash-manager.d.ts +14 -0
  5. package/dist/application/background-bash-manager.js +42 -4
  6. package/dist/application/background-task-runtime.d.ts +34 -0
  7. package/dist/application/background-task-runtime.js +59 -0
  8. package/dist/application/session-service.d.ts +21 -1
  9. package/dist/application/session-service.js +188 -17
  10. package/dist/application/session-worktree.d.ts +1 -0
  11. package/dist/application/session-worktree.js +13 -2
  12. package/dist/application/subagent-service.d.ts +3 -0
  13. package/dist/application/subagent-service.js +6 -0
  14. package/dist/application/workflow-manager.d.ts +70 -2
  15. package/dist/application/workflow-manager.js +21 -4
  16. package/dist/cli/agents-dashboard.d.ts +9 -0
  17. package/dist/cli/agents-dashboard.js +16 -5
  18. package/dist/cli/interactive.d.ts +41 -3
  19. package/dist/cli/interactive.js +1281 -183
  20. package/dist/cli/tui/claude-style.d.ts +31 -3
  21. package/dist/cli/tui/claude-style.js +165 -54
  22. package/dist/cli/tui/config-dashboard.d.ts +63 -0
  23. package/dist/cli/tui/config-dashboard.js +150 -0
  24. package/dist/cli/tui/config-settings.d.ts +32 -0
  25. package/dist/cli/tui/config-settings.js +276 -0
  26. package/dist/cli/tui/custom-themes.d.ts +21 -0
  27. package/dist/cli/tui/custom-themes.js +284 -0
  28. package/dist/cli/tui/file-picker.d.ts +3 -1
  29. package/dist/cli/tui/file-picker.js +8 -2
  30. package/dist/cli/tui/keybindings.js +0 -1
  31. package/dist/cli/tui/mcp-panel-controller.d.ts +32 -0
  32. package/dist/cli/tui/mcp-panel-controller.js +80 -0
  33. package/dist/cli/tui/mcp-panel-projector.d.ts +79 -0
  34. package/dist/cli/tui/mcp-panel-projector.js +181 -0
  35. package/dist/cli/tui/mcp-panel.d.ts +8 -0
  36. package/dist/cli/tui/mcp-panel.js +99 -0
  37. package/dist/cli/tui/recently-denied.d.ts +15 -0
  38. package/dist/cli/tui/recently-denied.js +19 -0
  39. package/dist/cli/tui/runtime-interactions.d.ts +17 -0
  40. package/dist/cli/tui/runtime-interactions.js +100 -0
  41. package/dist/cli/tui/runtime-settings.d.ts +40 -0
  42. package/dist/cli/tui/runtime-settings.js +84 -0
  43. package/dist/cli/tui/slash-commands.js +10 -0
  44. package/dist/cli/tui/task-panel.d.ts +53 -0
  45. package/dist/cli/tui/task-panel.js +204 -0
  46. package/dist/cli/tui/terminal-notifications.d.ts +10 -0
  47. package/dist/cli/tui/terminal-notifications.js +48 -0
  48. package/dist/cli/tui/terminal-setup.d.ts +24 -0
  49. package/dist/cli/tui/terminal-setup.js +618 -0
  50. package/dist/cli/tui/theme-settings.d.ts +8 -0
  51. package/dist/cli/tui/theme-settings.js +132 -0
  52. package/dist/cli/tui/theme.d.ts +53 -0
  53. package/dist/cli/tui/theme.js +265 -0
  54. package/dist/cli.d.ts +9 -0
  55. package/dist/cli.js +97 -17
  56. package/dist/compatibility/claude/schema.js +2 -0
  57. package/dist/core/runtime.d.ts +12 -0
  58. package/dist/core/runtime.js +24 -0
  59. package/dist/maintenance/self-update.js +1 -1
  60. package/dist/mcp/claude-mcp-management.d.ts +6 -1
  61. package/dist/mcp/claude-mcp-management.js +191 -44
  62. package/dist/mcp/claude-mcp-oauth.js +2 -0
  63. package/dist/mcp/claude-mcp-tools.d.ts +31 -3
  64. package/dist/mcp/claude-mcp-tools.js +116 -34
  65. package/dist/permissions/claude-permission-resolver.d.ts +3 -0
  66. package/dist/permissions/claude-permission-resolver.js +42 -20
  67. package/dist/platform/claude-version.js +2 -1
  68. package/dist/plugins/claude-plugin-runtime.js +11 -3
  69. package/dist/tools/claude-interactive-tools.d.ts +7 -0
  70. package/dist/tools/claude-interactive-tools.js +21 -8
  71. package/dist/tools/claude-task-tools.d.ts +4 -0
  72. package/dist/tools/claude-task-tools.js +7 -0
  73. package/package.json +2 -1
  74. package/dist/application/background-agent-manager.d.ts.map +0 -1
  75. package/dist/application/background-agent-manager.js.map +0 -1
  76. package/dist/application/background-bash-manager.d.ts.map +0 -1
  77. package/dist/application/background-bash-manager.js.map +0 -1
  78. package/dist/application/background-task-id.d.ts.map +0 -1
  79. package/dist/application/background-task-id.js.map +0 -1
  80. package/dist/application/claude-project-purge.d.ts.map +0 -1
  81. package/dist/application/claude-project-purge.js.map +0 -1
  82. package/dist/application/managed-worktree.d.ts.map +0 -1
  83. package/dist/application/managed-worktree.js.map +0 -1
  84. package/dist/application/model-compactor.d.ts.map +0 -1
  85. package/dist/application/model-compactor.js.map +0 -1
  86. package/dist/application/scheduled-prompt-manager.d.ts.map +0 -1
  87. package/dist/application/scheduled-prompt-manager.js.map +0 -1
  88. package/dist/application/session-service.d.ts.map +0 -1
  89. package/dist/application/session-service.js.map +0 -1
  90. package/dist/application/session-worktree.d.ts.map +0 -1
  91. package/dist/application/session-worktree.js.map +0 -1
  92. package/dist/application/subagent-service.d.ts.map +0 -1
  93. package/dist/application/subagent-service.js.map +0 -1
  94. package/dist/application/tool-use-summary.d.ts.map +0 -1
  95. package/dist/application/tool-use-summary.js.map +0 -1
  96. package/dist/application/top-level-agent-manager.d.ts.map +0 -1
  97. package/dist/application/top-level-agent-manager.js.map +0 -1
  98. package/dist/application/workflow-manager.d.ts.map +0 -1
  99. package/dist/application/workflow-manager.js.map +0 -1
  100. package/dist/application/workflow-meta.d.ts.map +0 -1
  101. package/dist/application/workflow-meta.js.map +0 -1
  102. package/dist/application/workflow-runtime.d.ts.map +0 -1
  103. package/dist/application/workflow-runtime.js.map +0 -1
  104. package/dist/application/workflow-worktree.d.ts.map +0 -1
  105. package/dist/application/workflow-worktree.js.map +0 -1
  106. package/dist/cli/agents-dashboard.d.ts.map +0 -1
  107. package/dist/cli/agents-dashboard.js.map +0 -1
  108. package/dist/cli/controls.d.ts.map +0 -1
  109. package/dist/cli/controls.js.map +0 -1
  110. package/dist/cli/debug.d.ts.map +0 -1
  111. package/dist/cli/debug.js.map +0 -1
  112. package/dist/cli/interactive.d.ts.map +0 -1
  113. package/dist/cli/interactive.js.map +0 -1
  114. package/dist/cli/protocol.d.ts.map +0 -1
  115. package/dist/cli/protocol.js.map +0 -1
  116. package/dist/cli/tui/claude-style.d.ts.map +0 -1
  117. package/dist/cli/tui/claude-style.js.map +0 -1
  118. package/dist/cli/tui/clipboard.d.ts.map +0 -1
  119. package/dist/cli/tui/clipboard.js.map +0 -1
  120. package/dist/cli/tui/composer-editor.d.ts.map +0 -1
  121. package/dist/cli/tui/composer-editor.js.map +0 -1
  122. package/dist/cli/tui/composer-images.d.ts.map +0 -1
  123. package/dist/cli/tui/composer-images.js.map +0 -1
  124. package/dist/cli/tui/conversation-export.d.ts.map +0 -1
  125. package/dist/cli/tui/conversation-export.js.map +0 -1
  126. package/dist/cli/tui/external-editor.d.ts.map +0 -1
  127. package/dist/cli/tui/external-editor.js.map +0 -1
  128. package/dist/cli/tui/file-picker.d.ts.map +0 -1
  129. package/dist/cli/tui/file-picker.js.map +0 -1
  130. package/dist/cli/tui/git-diff.d.ts.map +0 -1
  131. package/dist/cli/tui/git-diff.js.map +0 -1
  132. package/dist/cli/tui/hook-settings.d.ts.map +0 -1
  133. package/dist/cli/tui/hook-settings.js.map +0 -1
  134. package/dist/cli/tui/keybindings.d.ts.map +0 -1
  135. package/dist/cli/tui/keybindings.js.map +0 -1
  136. package/dist/cli/tui/memory-files.d.ts.map +0 -1
  137. package/dist/cli/tui/memory-files.js.map +0 -1
  138. package/dist/cli/tui/permission-settings.d.ts.map +0 -1
  139. package/dist/cli/tui/permission-settings.js.map +0 -1
  140. package/dist/cli/tui/slash-commands.d.ts.map +0 -1
  141. package/dist/cli/tui/slash-commands.js.map +0 -1
  142. package/dist/cli/tui/terminal-suspend.d.ts.map +0 -1
  143. package/dist/cli/tui/terminal-suspend.js.map +0 -1
  144. package/dist/cli/tui/workspace-directories.d.ts.map +0 -1
  145. package/dist/cli/tui/workspace-directories.js.map +0 -1
  146. package/dist/cli.d.ts.map +0 -1
  147. package/dist/cli.js.map +0 -1
  148. package/dist/compatibility/claude/compaction.d.ts.map +0 -1
  149. package/dist/compatibility/claude/compaction.js.map +0 -1
  150. package/dist/compatibility/claude/context.d.ts.map +0 -1
  151. package/dist/compatibility/claude/context.js.map +0 -1
  152. package/dist/compatibility/claude/dynamic-context.d.ts.map +0 -1
  153. package/dist/compatibility/claude/dynamic-context.js.map +0 -1
  154. package/dist/compatibility/claude/file-history.d.ts.map +0 -1
  155. package/dist/compatibility/claude/file-history.js.map +0 -1
  156. package/dist/compatibility/claude/file-resources.d.ts.map +0 -1
  157. package/dist/compatibility/claude/file-resources.js.map +0 -1
  158. package/dist/compatibility/claude/fork.d.ts.map +0 -1
  159. package/dist/compatibility/claude/fork.js.map +0 -1
  160. package/dist/compatibility/claude/history.d.ts.map +0 -1
  161. package/dist/compatibility/claude/history.js.map +0 -1
  162. package/dist/compatibility/claude/ownership.d.ts.map +0 -1
  163. package/dist/compatibility/claude/ownership.js.map +0 -1
  164. package/dist/compatibility/claude/paths.d.ts.map +0 -1
  165. package/dist/compatibility/claude/paths.js.map +0 -1
  166. package/dist/compatibility/claude/pr-links.d.ts.map +0 -1
  167. package/dist/compatibility/claude/pr-links.js.map +0 -1
  168. package/dist/compatibility/claude/projection.d.ts.map +0 -1
  169. package/dist/compatibility/claude/projection.js.map +0 -1
  170. package/dist/compatibility/claude/schema.d.ts.map +0 -1
  171. package/dist/compatibility/claude/schema.js.map +0 -1
  172. package/dist/compatibility/claude/shared-resources.d.ts.map +0 -1
  173. package/dist/compatibility/claude/shared-resources.js.map +0 -1
  174. package/dist/compatibility/claude/sidechain.d.ts.map +0 -1
  175. package/dist/compatibility/claude/sidechain.js.map +0 -1
  176. package/dist/compatibility/claude/tool-links.d.ts.map +0 -1
  177. package/dist/compatibility/claude/tool-links.js.map +0 -1
  178. package/dist/compatibility/claude/translation.d.ts.map +0 -1
  179. package/dist/compatibility/claude/translation.js.map +0 -1
  180. package/dist/compatibility/claude/workflow-replay.d.ts.map +0 -1
  181. package/dist/compatibility/claude/workflow-replay.js.map +0 -1
  182. package/dist/compatibility/claude/workflow.d.ts.map +0 -1
  183. package/dist/compatibility/claude/workflow.js.map +0 -1
  184. package/dist/core/compaction.d.ts.map +0 -1
  185. package/dist/core/compaction.js.map +0 -1
  186. package/dist/core/context-budget.d.ts.map +0 -1
  187. package/dist/core/context-budget.js.map +0 -1
  188. package/dist/core/context.d.ts.map +0 -1
  189. package/dist/core/context.js.map +0 -1
  190. package/dist/core/runtime.d.ts.map +0 -1
  191. package/dist/core/runtime.js.map +0 -1
  192. package/dist/core/usage.d.ts.map +0 -1
  193. package/dist/core/usage.js.map +0 -1
  194. package/dist/extensions/claude-extension-tools.d.ts.map +0 -1
  195. package/dist/extensions/claude-extension-tools.js.map +0 -1
  196. package/dist/extensions/claude-extensions.d.ts.map +0 -1
  197. package/dist/extensions/claude-extensions.js.map +0 -1
  198. package/dist/hooks/claude-hook-tools.d.ts.map +0 -1
  199. package/dist/hooks/claude-hook-tools.js.map +0 -1
  200. package/dist/hooks/claude-hooks.d.ts.map +0 -1
  201. package/dist/hooks/claude-hooks.js.map +0 -1
  202. package/dist/maintenance/doctor.d.ts.map +0 -1
  203. package/dist/maintenance/doctor.js.map +0 -1
  204. package/dist/maintenance/self-update.d.ts.map +0 -1
  205. package/dist/maintenance/self-update.js.map +0 -1
  206. package/dist/mcp/claude-mcp-management.d.ts.map +0 -1
  207. package/dist/mcp/claude-mcp-management.js.map +0 -1
  208. package/dist/mcp/claude-mcp-oauth.d.ts.map +0 -1
  209. package/dist/mcp/claude-mcp-oauth.js.map +0 -1
  210. package/dist/mcp/claude-mcp-tools.d.ts.map +0 -1
  211. package/dist/mcp/claude-mcp-tools.js.map +0 -1
  212. package/dist/mcp/praxis-mcp-server.d.ts.map +0 -1
  213. package/dist/mcp/praxis-mcp-server.js.map +0 -1
  214. package/dist/permissions/claude-auto-classifier.d.ts.map +0 -1
  215. package/dist/permissions/claude-auto-classifier.js.map +0 -1
  216. package/dist/permissions/claude-permission-resolver.d.ts.map +0 -1
  217. package/dist/permissions/claude-permission-resolver.js.map +0 -1
  218. package/dist/persistence/claude-job-store.d.ts.map +0 -1
  219. package/dist/persistence/claude-job-store.js.map +0 -1
  220. package/dist/persistence/claude-scheduled-task-store.d.ts.map +0 -1
  221. package/dist/persistence/claude-scheduled-task-store.js.map +0 -1
  222. package/dist/persistence/claude-sidechain-store.d.ts.map +0 -1
  223. package/dist/persistence/claude-sidechain-store.js.map +0 -1
  224. package/dist/persistence/claude-task-store.d.ts.map +0 -1
  225. package/dist/persistence/claude-task-store.js.map +0 -1
  226. package/dist/persistence/claude-transcript-store.d.ts.map +0 -1
  227. package/dist/persistence/claude-transcript-store.js.map +0 -1
  228. package/dist/persistence/claude-workflow-store.d.ts.map +0 -1
  229. package/dist/persistence/claude-workflow-store.js.map +0 -1
  230. package/dist/persistence/in-memory-sidechain-store.d.ts.map +0 -1
  231. package/dist/persistence/in-memory-sidechain-store.js.map +0 -1
  232. package/dist/persistence/in-memory-transcript-store.d.ts.map +0 -1
  233. package/dist/persistence/in-memory-transcript-store.js.map +0 -1
  234. package/dist/platform/atomic-write.d.ts.map +0 -1
  235. package/dist/platform/atomic-write.js.map +0 -1
  236. package/dist/platform/bounded-process-runner.d.ts.map +0 -1
  237. package/dist/platform/bounded-process-runner.js.map +0 -1
  238. package/dist/platform/claude-version.d.ts.map +0 -1
  239. package/dist/platform/claude-version.js.map +0 -1
  240. package/dist/platform/command-shell.d.ts.map +0 -1
  241. package/dist/platform/command-shell.js.map +0 -1
  242. package/dist/platform/exclusive-file-lease.d.ts.map +0 -1
  243. package/dist/platform/exclusive-file-lease.js.map +0 -1
  244. package/dist/platform/sensitive-data.d.ts.map +0 -1
  245. package/dist/platform/sensitive-data.js.map +0 -1
  246. package/dist/platform/tmux-worktree.d.ts.map +0 -1
  247. package/dist/platform/tmux-worktree.js.map +0 -1
  248. package/dist/plugins/claude-plugin-eval-discovery.d.ts.map +0 -1
  249. package/dist/plugins/claude-plugin-eval-discovery.js.map +0 -1
  250. package/dist/plugins/claude-plugin-eval-graders.d.ts.map +0 -1
  251. package/dist/plugins/claude-plugin-eval-graders.js.map +0 -1
  252. package/dist/plugins/claude-plugin-eval-runner.d.ts.map +0 -1
  253. package/dist/plugins/claude-plugin-eval-runner.js.map +0 -1
  254. package/dist/plugins/claude-plugin-eval-schema.d.ts.map +0 -1
  255. package/dist/plugins/claude-plugin-eval-schema.js.map +0 -1
  256. package/dist/plugins/claude-plugin-eval.d.ts.map +0 -1
  257. package/dist/plugins/claude-plugin-eval.js.map +0 -1
  258. package/dist/plugins/claude-plugin-maintenance.d.ts.map +0 -1
  259. package/dist/plugins/claude-plugin-maintenance.js.map +0 -1
  260. package/dist/plugins/claude-plugin-marketplace.d.ts.map +0 -1
  261. package/dist/plugins/claude-plugin-marketplace.js.map +0 -1
  262. package/dist/plugins/claude-plugin-mcpb.d.ts.map +0 -1
  263. package/dist/plugins/claude-plugin-mcpb.js.map +0 -1
  264. package/dist/plugins/claude-plugin-runtime.d.ts.map +0 -1
  265. package/dist/plugins/claude-plugin-runtime.js.map +0 -1
  266. package/dist/providers/anthropic-compatible.d.ts.map +0 -1
  267. package/dist/providers/anthropic-compatible.js.map +0 -1
  268. package/dist/providers/environment.d.ts.map +0 -1
  269. package/dist/providers/environment.js.map +0 -1
  270. package/dist/providers/fallback-provider.d.ts.map +0 -1
  271. package/dist/providers/fallback-provider.js.map +0 -1
  272. package/dist/providers/openai-compatible.d.ts.map +0 -1
  273. package/dist/providers/openai-compatible.js.map +0 -1
  274. package/dist/tools/claude-interactive-tools.d.ts.map +0 -1
  275. package/dist/tools/claude-interactive-tools.js.map +0 -1
  276. package/dist/tools/claude-lsp-formatters.d.ts.map +0 -1
  277. package/dist/tools/claude-lsp-formatters.js.map +0 -1
  278. package/dist/tools/claude-lsp-tool.d.ts.map +0 -1
  279. package/dist/tools/claude-lsp-tool.js.map +0 -1
  280. package/dist/tools/claude-scheduled-tools.d.ts.map +0 -1
  281. package/dist/tools/claude-scheduled-tools.js.map +0 -1
  282. package/dist/tools/claude-task-tools.d.ts.map +0 -1
  283. package/dist/tools/claude-task-tools.js.map +0 -1
  284. package/dist/tools/claude-user-message.d.ts.map +0 -1
  285. package/dist/tools/claude-user-message.js.map +0 -1
  286. package/dist/tools/claude-workflow-tools.d.ts.map +0 -1
  287. package/dist/tools/claude-workflow-tools.js.map +0 -1
  288. package/dist/tools/claude-worktree-tools.d.ts.map +0 -1
  289. package/dist/tools/claude-worktree-tools.js.map +0 -1
  290. package/dist/tools/filtered-tool-registry.d.ts.map +0 -1
  291. package/dist/tools/filtered-tool-registry.js.map +0 -1
  292. package/dist/tools/glob.d.ts.map +0 -1
  293. package/dist/tools/glob.js.map +0 -1
  294. package/dist/tools/local-tools.d.ts.map +0 -1
  295. package/dist/tools/local-tools.js.map +0 -1
  296. package/dist/tools/notebook.d.ts.map +0 -1
  297. package/dist/tools/notebook.js.map +0 -1
  298. package/dist/tools/pdf.d.ts.map +0 -1
  299. package/dist/tools/pdf.js.map +0 -1
  300. package/dist/tools/web.d.ts.map +0 -1
  301. package/dist/tools/web.js.map +0 -1
package/dist/cli.js CHANGED
@@ -15,14 +15,15 @@ import { loadClaudeContextResources, loadClaudeSettings, loadClaudeSharedResourc
15
15
  import { AgentRunCancelledError, } from './core/runtime.js';
16
16
  import { projectTuiHooks, } from './cli/tui/hook-settings.js';
17
17
  import { DEFAULT_CLI_CONTROLS, resolveCliControls } from './cli/controls.js';
18
+ import { applyRuntimeSettingDefaults, loadRuntimeSettings, runtimeSettingsSystemPrompt, } from './cli/tui/runtime-settings.js';
18
19
  import { createCliDebugSink } from './cli/debug.js';
19
20
  import { ClaudePermissionResolver, } from './permissions/claude-permission-resolver.js';
20
21
  import { createClaudeModelAutoClassifier, defaultClaudeAutoModeConfig, loadClaudeAutoModeConfig, } from './permissions/claude-auto-classifier.js';
21
22
  import { ClaudeExtensionPermissionResolver, ClaudeExtensionToolRegistry, } from './extensions/claude-extension-tools.js';
22
23
  import { ClaudeExtensionCatalog } from './extensions/claude-extensions.js';
23
24
  import { ClaudeHookRunner } from './hooks/claude-hooks.js';
24
- import { ClaudeMcpToolRegistry } from './mcp/claude-mcp-tools.js';
25
- import { ClaudeMcpManagement, mcpScope, } from './mcp/claude-mcp-management.js';
25
+ import { ClaudeMcpToolRegistry, } from './mcp/claude-mcp-tools.js';
26
+ import { ClaudeMcpManagement, filterDisabledMcpResources, mcpScope, } from './mcp/claude-mcp-management.js';
26
27
  import { authenticateMcpServer, ClaudeMcpOAuthStore, mcpOAuthServerIdentity, readMcpClientSecret, } from './mcp/claude-mcp-oauth.js';
27
28
  import { servePraxisMcpStdio } from './mcp/praxis-mcp-server.js';
28
29
  import { detectInstalledClaudeVersion } from './platform/claude-version.js';
@@ -76,7 +77,7 @@ function fileResourceHeaders(environment, providerEnvironment, credential) {
76
77
  : {}),
77
78
  };
78
79
  }
79
- function createProviderForModel(apiKey, providerEnvironment, context, controls) {
80
+ function createProviderForModel(apiKey, providerEnvironment, context, controls, explicitThinkingControls) {
80
81
  return (selectedModel) => {
81
82
  const providerOptions = {
82
83
  apiKey,
@@ -107,8 +108,8 @@ function createProviderForModel(apiKey, providerEnvironment, context, controls)
107
108
  })
108
109
  : new OpenAICompatibleProvider({
109
110
  ...providerOptions,
110
- ...(controls.thinking === undefined &&
111
- controls.maxThinkingTokens === undefined
111
+ ...(explicitThinkingControls.thinking === undefined &&
112
+ explicitThinkingControls.maxThinkingTokens === undefined
112
113
  ? {}
113
114
  : {
114
115
  thinking: {
@@ -686,7 +687,7 @@ const consoleIO = {
686
687
  isTTY: Boolean(process.stdin.isTTY && process.stdout.isTTY),
687
688
  readStdinLines: () => process.stdin,
688
689
  };
689
- const createDefaultService = async ({ eventSink, requireProvider, hooksOnly = false, approveRecovery, approveTool, agent, model: interactiveModel, effort: interactiveEffort, permissionMode: interactivePermissionMode, controls = DEFAULT_CLI_CONTROLS, interactive = false, sessionKind, signal, exposeToolRegistry = false, onElicitation, askUser, approvePlan, emitToolUseSummaries = false, cwd: requestedCwd, configRoot: requestedConfigRoot, environment, providerEnvironment: requestedProviderEnvironment, }) => {
690
+ const createDefaultService = async ({ eventSink, requireProvider, hooksOnly = false, approveRecovery, approveTool, agent, model: interactiveModel, effort: interactiveEffort, permissionMode: interactivePermissionMode, isSessionActionApproved, controls = DEFAULT_CLI_CONTROLS, interactive = false, sessionKind, signal, exposeToolRegistry = false, onElicitation, askUser, approvePlan, emitToolUseSummaries = false, cwd: requestedCwd, configRoot: requestedConfigRoot, environment, providerEnvironment: requestedProviderEnvironment, }) => {
690
691
  const runtimeEnvironment = requestedProviderEnvironment ?? process.env;
691
692
  const claudeVersion = await detectInstalledClaudeVersion();
692
693
  const cwd = requestedCwd ?? process.cwd();
@@ -696,14 +697,24 @@ const createDefaultService = async ({ eventSink, requireProvider, hooksOnly = fa
696
697
  const claudeStatePath = requestedConfigRoot || configuredRoot
697
698
  ? join(configRoot, '.claude.json')
698
699
  : resolve(homedir(), '.claude.json');
700
+ const runtimeSettings = controls.safeMode || controls.bare
701
+ ? undefined
702
+ : await loadRuntimeSettings({ configRoot, statePath: claudeStatePath });
703
+ const runtimeSettingsPrompt = runtimeSettingsSystemPrompt(runtimeSettings);
699
704
  const cli = await resolveCliControls({
700
- ...controls,
705
+ ...applyRuntimeSettingDefaults(controls, runtimeSettings),
701
706
  ...(interactiveModel === undefined ? {} : { model: interactiveModel }),
702
707
  ...(interactiveEffort === undefined ? {} : { effort: interactiveEffort }),
703
708
  ...(interactivePermissionMode === undefined
704
709
  ? {}
705
710
  : { permissionMode: interactivePermissionMode }),
706
711
  }, cwd);
712
+ const effectiveAppendSystemPrompt = [
713
+ runtimeSettingsPrompt,
714
+ cli.appendSystemPrompt,
715
+ ]
716
+ .filter((value) => value !== undefined)
717
+ .join('\n');
707
718
  const debug = cli.debug !== undefined || cli.debugFile !== undefined
708
719
  ? createCliDebugSink(eventSink, {
709
720
  cwd,
@@ -738,7 +749,7 @@ const createDefaultService = async ({ eventSink, requireProvider, hooksOnly = fa
738
749
  if (!providerEnvironment) {
739
750
  throw new Error('Provider environment is unavailable');
740
751
  }
741
- providerForModel = createProviderForModel(apiKey, providerEnvironment, context, cli);
752
+ providerForModel = createProviderForModel(apiKey, providerEnvironment, context, cli, controls);
742
753
  const models = [model, ...(cli.fallbackModels ?? [])].filter((candidate, index, all) => all.indexOf(candidate) === index);
743
754
  const createProvider = providerForModel;
744
755
  const providers = models.map((candidate) => createProvider(candidate));
@@ -932,6 +943,7 @@ const createDefaultService = async ({ eventSink, requireProvider, hooksOnly = fa
932
943
  allowedTools: cli.allowedTools,
933
944
  disallowedTools: cli.disallowedTools,
934
945
  permissionMode,
946
+ ...(isSessionActionApproved ? { isSessionActionApproved } : {}),
935
947
  ...(permissionMode === 'auto'
936
948
  ? {
937
949
  autoClassifier: createClaudeModelAutoClassifier(hostedToolProvider),
@@ -958,6 +970,13 @@ const createDefaultService = async ({ eventSink, requireProvider, hooksOnly = fa
958
970
  additionalReadDirectories: [claudeBackgroundTaskParent(cwd)],
959
971
  ...(environment ? { environment } : {}),
960
972
  });
973
+ const runtimeMcpResources = async (candidates) => {
974
+ const management = new ClaudeMcpManagement({
975
+ configRoot,
976
+ cwd: workspace.cwd(),
977
+ });
978
+ return filterDisabledMcpResources(candidates, await management.disabled());
979
+ };
961
980
  const mcpTools = await ClaudeMcpToolRegistry.connect({
962
981
  base: cli.bare
963
982
  ? localTools
@@ -965,11 +984,47 @@ const createDefaultService = async ({ eventSink, requireProvider, hooksOnly = fa
965
984
  base: localTools,
966
985
  provider: hostedToolProvider,
967
986
  }),
968
- resources: resources.mcp,
987
+ resources: await runtimeMcpResources(resources.mcp),
988
+ reloadResources: async () => {
989
+ if (cli.strictMcpConfig)
990
+ return runtimeMcpResources(cli.mcpResources);
991
+ const refreshed = await loadClaudeSharedResources({
992
+ configRoot,
993
+ cwd: workspace.cwd(),
994
+ claudeStatePath,
995
+ ...(automaticSettingSources === undefined
996
+ ? {}
997
+ : { settingSources: automaticSettingSources }),
998
+ });
999
+ return runtimeMcpResources([
1000
+ ...refreshed.mcp,
1001
+ ...pluginResources.mcp,
1002
+ ...cli.mcpResources,
1003
+ ]);
1004
+ },
969
1005
  cwd,
970
1006
  configRoot,
971
1007
  onWarning: (message) => runtimeEventSink({ type: 'warning', message }),
972
1008
  onPromptsChanged: (prompts) => extensions.setMcpPrompts(prompts),
1009
+ authenticateServer: async (name) => {
1010
+ const record = await new ClaudeMcpManagement({
1011
+ configRoot,
1012
+ cwd: workspace.cwd(),
1013
+ }).get(name);
1014
+ const server = mcpOAuthServerIdentity(record.name, record.config);
1015
+ const oauth = mcpOauthOptions(record.config);
1016
+ const clientSecret = oauth.clientId
1017
+ ? await new ClaudeMcpOAuthStore({ configRoot }).readClientSecret(server)
1018
+ : undefined;
1019
+ await authenticateMcpServer({
1020
+ configRoot,
1021
+ server,
1022
+ ...oauth,
1023
+ ...(clientSecret ? { clientSecret } : {}),
1024
+ noBrowser: false,
1025
+ write: (message) => process.stdout.write(message),
1026
+ });
1027
+ },
973
1028
  ...(onElicitation ? { onElicitation } : {}),
974
1029
  eventSink: runtimeEventSink,
975
1030
  ...(signal ? { signal } : {}),
@@ -1036,7 +1091,8 @@ const createDefaultService = async ({ eventSink, requireProvider, hooksOnly = fa
1036
1091
  cli.tools.includes('default') ||
1037
1092
  cli.tools.includes(name)) &&
1038
1093
  !cli.disallowedTools.includes(name));
1039
- const selectedWorkflowTools = workflowToolNames.filter((name) => cli.sessionPersistence &&
1094
+ const selectedWorkflowTools = workflowToolNames.filter((name) => (runtimeSettings?.workflows ?? true) &&
1095
+ cli.sessionPersistence &&
1040
1096
  !cli.bare &&
1041
1097
  (cli.tools === undefined ||
1042
1098
  cli.tools.includes('default') ||
@@ -1098,6 +1154,9 @@ const createDefaultService = async ({ eventSink, requireProvider, hooksOnly = fa
1098
1154
  enabledTools: selectedInteractiveTools,
1099
1155
  callbacks: { askUser, approvePlan },
1100
1156
  permissionResolverForMode,
1157
+ settings: {
1158
+ useAutoModeDuringPlan: runtimeSettings?.useAutoModeDuringPlan ?? true,
1159
+ },
1101
1160
  })
1102
1161
  : undefined;
1103
1162
  const service = new ClaudeSessionService({
@@ -1105,6 +1164,7 @@ const createDefaultService = async ({ eventSink, requireProvider, hooksOnly = fa
1105
1164
  provider: hostedToolProvider,
1106
1165
  ...(providerForModel ? { providerForModel } : {}),
1107
1166
  tools: filteredTools,
1167
+ mcp: mcpTools,
1108
1168
  permissions,
1109
1169
  permissionResolverForMode,
1110
1170
  extensions,
@@ -1117,6 +1177,9 @@ const createDefaultService = async ({ eventSink, requireProvider, hooksOnly = fa
1117
1177
  emitToolUseSummaries,
1118
1178
  enableWorktrees: cli.worktreeRequested || selectedWorktreeTools.length > 0,
1119
1179
  worktreeToolNames: selectedWorktreeTools,
1180
+ ...(runtimeSettings
1181
+ ? { worktreeBaseRef: runtimeSettings.worktreeBaseRef }
1182
+ : {}),
1120
1183
  ...(interactiveTools ? { interactiveTools } : {}),
1121
1184
  ...(hooks ? { hooks } : {}),
1122
1185
  ...(agent ? { agent } : {}),
@@ -1130,9 +1193,9 @@ const createDefaultService = async ({ eventSink, requireProvider, hooksOnly = fa
1130
1193
  ...(cli.systemPrompt === undefined
1131
1194
  ? {}
1132
1195
  : { systemPrompt: cli.systemPrompt }),
1133
- ...(cli.appendSystemPrompt === undefined
1134
- ? {}
1135
- : { appendSystemPrompt: cli.appendSystemPrompt }),
1196
+ ...(effectiveAppendSystemPrompt
1197
+ ? { appendSystemPrompt: effectiveAppendSystemPrompt }
1198
+ : {}),
1136
1199
  }),
1137
1200
  conditionalRuleResolver: new ClaudeConditionalRuleResolver({
1138
1201
  loadResources: loadContextResources,
@@ -1142,7 +1205,9 @@ const createDefaultService = async ({ eventSink, requireProvider, hooksOnly = fa
1142
1205
  : {}),
1143
1206
  ...(permissionApprover ? { approveTool: permissionApprover } : {}),
1144
1207
  ...(approveRecovery ? { approveRecovery } : {}),
1145
- fileCheckpointing: runtimeEnvironment.CLAUDE_CODE_ENABLE_SDK_FILE_CHECKPOINTING === 'true',
1208
+ fileCheckpointing: runtimeEnvironment.CLAUDE_CODE_ENABLE_SDK_FILE_CHECKPOINTING ===
1209
+ 'true' || runtimeSettings?.checkpoints === true,
1210
+ autoCompact: runtimeSettings?.autoCompact ?? true,
1146
1211
  fileRewindRoots: [
1147
1212
  ...cli.additionalDirectories,
1148
1213
  ...(memoryDirectory ? [memoryDirectory] : []),
@@ -1213,6 +1278,8 @@ const createDefaultService = async ({ eventSink, requireProvider, hooksOnly = fa
1213
1278
  rewindPoints: (sessionId) => service.rewindPoints(sessionId),
1214
1279
  changeCwd: (sessionId, cwd) => service.changeCwd(sessionId, cwd),
1215
1280
  recordCdUsage: (sessionId) => service.recordCdUsage(sessionId),
1281
+ approveRecentlyDenied: (sessionId, display) => service.approveRecentlyDenied(sessionId, display),
1282
+ retryRecentlyDenied: (sessionId, display, retrySignal) => service.retryRecentlyDenied(sessionId, display, retrySignal),
1216
1283
  answerSideQuestion: (sessionId, question, sideSignal, onDelta, permissionMode) => service.answerSideQuestion(sessionId, question, sideSignal, onDelta, permissionMode),
1217
1284
  recordBtwUsage: (sessionId, permissionMode) => service.recordBtwUsage(sessionId, permissionMode),
1218
1285
  recordBackgroundUsage: (sessionId, permissionMode) => service.recordBackgroundUsage(sessionId, permissionMode),
@@ -1257,6 +1324,13 @@ const createDefaultService = async ({ eventSink, requireProvider, hooksOnly = fa
1257
1324
  source: definition.kind,
1258
1325
  })),
1259
1326
  hookConfiguration: async () => projectTuiHooks(settings),
1327
+ mcpInspect: () => service.mcpInspect(),
1328
+ mcpReconnect: (name) => service.mcpReconnect(name),
1329
+ mcpAuthenticate: (name) => service.mcpAuthenticate(name),
1330
+ mcpReload: () => service.mcpReload(),
1331
+ mcpTools: (name) => service.mcpTools(name),
1332
+ taskSnapshots: (sessionId) => service.taskSnapshots(sessionId),
1333
+ stopTask: (sessionId, taskId) => service.stopTask(sessionId, taskId),
1260
1334
  agentDefinitions: () => extensions.agentDefinitions(),
1261
1335
  inspect: (sessionId) => service.inspect(sessionId),
1262
1336
  export: (sessionId) => service.export(sessionId),
@@ -1322,7 +1396,7 @@ const createDefaultAutoModeCritic = async ({ model }) => {
1322
1396
  if (!apiKey || !selectedModel) {
1323
1397
  throw new Error('PRAXIS_API_KEY and a model (--model or PRAXIS_MODEL) are required');
1324
1398
  }
1325
- return createProviderForModel(apiKey, parseProviderEnvironment(process.env), parseContextEnvironment(process.env), {})(selectedModel);
1399
+ return createProviderForModel(apiKey, parseProviderEnvironment(process.env), parseContextEnvironment(process.env), {}, {})(selectedModel);
1326
1400
  };
1327
1401
  const defaultPluginEvalRuntimeFactory = {
1328
1402
  create: async (options) => {
@@ -1413,7 +1487,7 @@ const defaultPluginEvalJudge = {
1413
1487
  const apiKey = environment.PRAXIS_API_KEY;
1414
1488
  if (!apiKey)
1415
1489
  throw new Error('PRAXIS_API_KEY is required for paid eval graders');
1416
- const provider = createProviderForModel(apiKey, parseProviderEnvironment(environment), parseContextEnvironment(environment), {})(model);
1490
+ const provider = createProviderForModel(apiKey, parseProviderEnvironment(environment), parseContextEnvironment(environment), {}, {})(model);
1417
1491
  const prompt = `You are an eval judge. Return only JSON matching {"passed":boolean,"explanation":string}.
1418
1492
 
1419
1493
  Criteria:
@@ -1928,7 +2002,13 @@ async function executeSelfUpdateCommand(argv, io, dependencies) {
1928
2002
  if (operands.length > 0) {
1929
2003
  throw new Error(`${command} takes no operands`);
1930
2004
  }
1931
- const result = await dependencies.selfUpdate?.({ operation: 'update' });
2005
+ const runtimeSettings = await loadRuntimeSettings();
2006
+ const result = await dependencies.selfUpdate?.({
2007
+ operation: 'update',
2008
+ ...(runtimeSettings.autoUpdatesChannel === 'latest'
2009
+ ? {}
2010
+ : { target: runtimeSettings.autoUpdatesChannel }),
2011
+ });
1932
2012
  if (!result)
1933
2013
  throw new Error('Self-update unavailable');
1934
2014
  if (json)
@@ -38,12 +38,14 @@ const FORKABLE_SYSTEM_SUBTYPES = new Set([
38
38
  'away_summary',
39
39
  'compact_boundary',
40
40
  'local_command',
41
+ 'permission_retry',
41
42
  'stop_hook_summary',
42
43
  'turn_duration',
43
44
  ]);
44
45
  const APPENDABLE_SYSTEM_SUBTYPES = new Set([
45
46
  'compact_boundary',
46
47
  'local_command',
48
+ 'permission_retry',
47
49
  ]);
48
50
  const FORKABLE_ATTACHMENT_TYPES = new Set([
49
51
  'agent_listing_delta',
@@ -167,6 +167,9 @@ export type RuntimeEvent = {
167
167
  type: 'permission-decision';
168
168
  callId: string;
169
169
  behavior: PermissionBehavior;
170
+ reason?: string;
171
+ source?: 'auto-classifier' | 'rule' | 'mode' | 'default';
172
+ autoModeOutcome?: AutoModePermissionOutcome;
170
173
  } | {
171
174
  type: 'tool-result';
172
175
  callId: string;
@@ -310,18 +313,27 @@ export interface PermissionResolutionContext {
310
313
  messages?: readonly ModelMessage[];
311
314
  signal?: AbortSignal;
312
315
  }
316
+ export type PermissionDecisionSource = 'auto-classifier' | 'rule' | 'mode' | 'default';
317
+ export type AutoModePermissionOutcome = 'blocked' | 'unavailable';
313
318
  export type PermissionDecision = {
314
319
  behavior: 'allow';
320
+ source?: PermissionDecisionSource;
315
321
  } | {
316
322
  behavior: 'ask';
317
323
  reason?: string;
324
+ source?: PermissionDecisionSource;
318
325
  } | {
319
326
  behavior: 'deny';
320
327
  reason: string;
328
+ source?: PermissionDecisionSource;
321
329
  };
322
330
  export interface PermissionResolver {
323
331
  resolve(call: ModelToolCall, context?: PermissionResolutionContext): PermissionDecision | Promise<PermissionDecision>;
324
332
  }
333
+ export declare function annotatePermissionDecision<T extends PermissionDecision>(decision: T, source: PermissionDecisionSource): T;
334
+ export declare function permissionDecisionSource(decision: PermissionDecision): PermissionDecisionSource | undefined;
335
+ export declare function annotateAutoModePermissionOutcome<T extends PermissionDecision>(decision: T, outcome: AutoModePermissionOutcome): T;
336
+ export declare function autoModePermissionOutcome(decision: PermissionDecision): AutoModePermissionOutcome | undefined;
325
337
  export interface AgentRunObserver {
326
338
  assistantCompleted(message: {
327
339
  content: string;
@@ -1,3 +1,20 @@
1
+ const permissionDecisionSources = new WeakMap();
2
+ const autoModePermissionOutcomes = new WeakMap();
3
+ export function annotatePermissionDecision(decision, source) {
4
+ if (decision.source === undefined)
5
+ permissionDecisionSources.set(decision, source);
6
+ return decision;
7
+ }
8
+ export function permissionDecisionSource(decision) {
9
+ return decision.source ?? permissionDecisionSources.get(decision);
10
+ }
11
+ export function annotateAutoModePermissionOutcome(decision, outcome) {
12
+ autoModePermissionOutcomes.set(decision, outcome);
13
+ return decision;
14
+ }
15
+ export function autoModePermissionOutcome(decision) {
16
+ return autoModePermissionOutcomes.get(decision);
17
+ }
1
18
  export class ModelProviderError extends Error {
2
19
  name = 'ModelProviderError';
3
20
  retryable;
@@ -446,10 +463,17 @@ export class AgentRuntime {
446
463
  }
447
464
  await this.requireRecoveryApproval(prepared, request);
448
465
  const decision = await permissions.resolve(prepared, context);
466
+ const source = permissionDecisionSource(decision);
467
+ const autoModeOutcome = autoModePermissionOutcome(decision);
449
468
  this.emit({
450
469
  type: 'permission-decision',
451
470
  callId: call.id,
452
471
  behavior: decision.behavior,
472
+ ...('reason' in decision && decision.reason !== undefined
473
+ ? { reason: decision.reason }
474
+ : {}),
475
+ ...(source === undefined ? {} : { source }),
476
+ ...(autoModeOutcome === undefined ? {} : { autoModeOutcome }),
453
477
  });
454
478
  let allowed = decision.behavior === 'allow';
455
479
  let denialReason;
@@ -41,7 +41,7 @@ export async function runSelfUpdate(options) {
41
41
  }
42
42
  const operation = options.operation;
43
43
  const force = options.force === true;
44
- const target = operation === 'install' ? requireTarget(options.target) : 'latest';
44
+ const target = requireTarget(options.target ?? (operation === 'install' ? 'stable' : 'latest'));
45
45
  const npmExecutable = options.npmExecutable ?? (process.platform === 'win32' ? 'npm.cmd' : 'npm');
46
46
  const spec = `${packageName}@${target}`;
47
47
  const args = [
@@ -1,4 +1,4 @@
1
- import { type ClaudeResourceScope } from '../compatibility/claude/shared-resources.js';
1
+ import { type ClaudeJsonResource, type ClaudeResourceScope } from '../compatibility/claude/shared-resources.js';
2
2
  export type McpScope = ClaudeResourceScope;
3
3
  export type McpServerConfig = Record<string, unknown>;
4
4
  export interface McpServerRecord {
@@ -10,16 +10,21 @@ export interface McpServerRecord {
10
10
  interface McpManagementOptions {
11
11
  configRoot?: string;
12
12
  cwd: string;
13
+ beforeCommit?: (path: string, attempt: number) => Promise<void>;
13
14
  }
15
+ export declare function filterDisabledMcpResources(resources: readonly ClaudeJsonResource[], disabledNames: readonly string[]): readonly ClaudeJsonResource[];
14
16
  export declare class ClaudeMcpManagement {
15
17
  private readonly configRoot;
16
18
  private readonly cwd;
19
+ private readonly beforeCommit?;
17
20
  constructor(options: McpManagementOptions);
18
21
  list(scope?: McpScope): Promise<McpServerRecord[]>;
19
22
  get(name: string, scope?: McpScope): Promise<McpServerRecord>;
20
23
  add(name: string, config: McpServerConfig, scope?: McpScope): Promise<McpServerRecord>;
21
24
  remove(name: string, scope?: McpScope): Promise<McpServerRecord>;
22
25
  resetProjectChoices(): Promise<void>;
26
+ disabled(): Promise<readonly string[]>;
27
+ setEnabled(name: string, scope: McpScope, enabled: boolean): Promise<void>;
23
28
  private target;
24
29
  private validateName;
25
30
  }