@elyracode/coding-agent 0.1.0 → 0.3.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 (177) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cli/config-selector.d.ts +1 -1
  3. package/dist/cli/config-selector.d.ts.map +1 -1
  4. package/dist/cli/config-selector.js +1 -1
  5. package/dist/cli/config-selector.js.map +1 -1
  6. package/dist/config.d.ts +1 -1
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +2 -2
  9. package/dist/config.js.map +1 -1
  10. package/dist/core/agent-session-runtime.d.ts +1 -0
  11. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  12. package/dist/core/agent-session-runtime.js +35 -0
  13. package/dist/core/agent-session-runtime.js.map +1 -1
  14. package/dist/core/agent-session.d.ts +7 -1
  15. package/dist/core/agent-session.d.ts.map +1 -1
  16. package/dist/core/agent-session.js +55 -3
  17. package/dist/core/agent-session.js.map +1 -1
  18. package/dist/core/bash-executor.d.ts.map +1 -1
  19. package/dist/core/bash-executor.js +1 -1
  20. package/dist/core/bash-executor.js.map +1 -1
  21. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  22. package/dist/core/compaction/branch-summarization.js +1 -1
  23. package/dist/core/compaction/branch-summarization.js.map +1 -1
  24. package/dist/core/compaction/compaction.d.ts.map +1 -1
  25. package/dist/core/compaction/compaction.js +1 -1
  26. package/dist/core/compaction/compaction.js.map +1 -1
  27. package/dist/core/extensions/loader.d.ts.map +1 -1
  28. package/dist/core/extensions/loader.js +3 -3
  29. package/dist/core/extensions/loader.js.map +1 -1
  30. package/dist/core/extensions/runner.d.ts.map +1 -1
  31. package/dist/core/extensions/runner.js +1 -1
  32. package/dist/core/extensions/runner.js.map +1 -1
  33. package/dist/core/extensions/types.d.ts +9 -9
  34. package/dist/core/extensions/types.d.ts.map +1 -1
  35. package/dist/core/extensions/types.js.map +1 -1
  36. package/dist/core/memory.d.ts +23 -0
  37. package/dist/core/memory.d.ts.map +1 -0
  38. package/dist/core/memory.js +173 -0
  39. package/dist/core/memory.js.map +1 -0
  40. package/dist/core/package-manager.d.ts.map +1 -1
  41. package/dist/core/package-manager.js +12 -12
  42. package/dist/core/package-manager.js.map +1 -1
  43. package/dist/core/session-manager.d.ts +6 -6
  44. package/dist/core/session-manager.d.ts.map +1 -1
  45. package/dist/core/session-manager.js +4 -4
  46. package/dist/core/session-manager.js.map +1 -1
  47. package/dist/core/settings-manager.d.ts +6 -0
  48. package/dist/core/settings-manager.d.ts.map +1 -1
  49. package/dist/core/settings-manager.js +16 -0
  50. package/dist/core/settings-manager.js.map +1 -1
  51. package/dist/core/smart-router.d.ts +43 -0
  52. package/dist/core/smart-router.d.ts.map +1 -0
  53. package/dist/core/smart-router.js +206 -0
  54. package/dist/core/smart-router.js.map +1 -0
  55. package/dist/core/stack-detector.d.ts +21 -0
  56. package/dist/core/stack-detector.d.ts.map +1 -0
  57. package/dist/core/stack-detector.js +120 -0
  58. package/dist/core/stack-detector.js.map +1 -0
  59. package/dist/core/system-prompt.d.ts +4 -0
  60. package/dist/core/system-prompt.d.ts.map +1 -1
  61. package/dist/core/system-prompt.js +27 -1
  62. package/dist/core/system-prompt.js.map +1 -1
  63. package/dist/core/tools/bash.d.ts +2 -2
  64. package/dist/core/tools/bash.d.ts.map +1 -1
  65. package/dist/core/tools/bash.js +3 -3
  66. package/dist/core/tools/bash.js.map +1 -1
  67. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  68. package/dist/core/tools/output-accumulator.js +1 -1
  69. package/dist/core/tools/output-accumulator.js.map +1 -1
  70. package/dist/migrations.d.ts.map +1 -1
  71. package/dist/migrations.js +1 -1
  72. package/dist/migrations.js.map +1 -1
  73. package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
  74. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  75. package/dist/modes/interactive/components/settings-selector.js +20 -0
  76. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  77. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  78. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  79. package/dist/modes/interactive/interactive-mode.js +26 -0
  80. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  81. package/dist/package-manager-cli.d.ts.map +1 -1
  82. package/dist/package-manager-cli.js +10 -10
  83. package/dist/package-manager-cli.js.map +1 -1
  84. package/dist/utils/clipboard-image.d.ts.map +1 -1
  85. package/dist/utils/clipboard-image.js +1 -1
  86. package/dist/utils/clipboard-image.js.map +1 -1
  87. package/docs/extensions.md +17 -17
  88. package/docs/index.md +1 -1
  89. package/docs/prompt-templates.md +1 -1
  90. package/docs/providers.md +1 -1
  91. package/docs/quickstart.md +5 -5
  92. package/docs/rpc.md +6 -6
  93. package/docs/sdk.md +2 -2
  94. package/docs/session-format.md +3 -3
  95. package/docs/settings.md +4 -4
  96. package/docs/skills.md +2 -2
  97. package/docs/termux.md +3 -3
  98. package/docs/themes.md +1 -1
  99. package/docs/tui.md +1 -1
  100. package/docs/usage.md +2 -2
  101. package/examples/extensions/auto-commit-on-exit.ts +5 -5
  102. package/examples/extensions/bash-spawn-hook.ts +2 -2
  103. package/examples/extensions/bookmark.ts +5 -5
  104. package/examples/extensions/border-status-editor.ts +7 -7
  105. package/examples/extensions/built-in-tool-renderer.ts +5 -5
  106. package/examples/extensions/claude-rules.ts +3 -3
  107. package/examples/extensions/commands.ts +4 -4
  108. package/examples/extensions/confirm-destructive.ts +3 -3
  109. package/examples/extensions/custom-compaction.ts +2 -2
  110. package/examples/extensions/custom-footer.ts +2 -2
  111. package/examples/extensions/custom-header.ts +3 -3
  112. package/examples/extensions/custom-provider-anthropic/index.ts +2 -2
  113. package/examples/extensions/custom-provider-anthropic/package.json +2 -2
  114. package/examples/extensions/custom-provider-gitlab-duo/index.ts +2 -2
  115. package/examples/extensions/custom-provider-gitlab-duo/package.json +2 -2
  116. package/examples/extensions/dirty-repo-guard.ts +7 -7
  117. package/examples/extensions/doom-overlay/index.ts +2 -2
  118. package/examples/extensions/dynamic-resources/index.ts +2 -2
  119. package/examples/extensions/dynamic-tools.ts +4 -4
  120. package/examples/extensions/event-bus.ts +8 -8
  121. package/examples/extensions/file-trigger.ts +3 -3
  122. package/examples/extensions/git-checkpoint.ts +7 -7
  123. package/examples/extensions/github-issue-autocomplete.ts +6 -6
  124. package/examples/extensions/handoff.ts +2 -2
  125. package/examples/extensions/hello.ts +2 -2
  126. package/examples/extensions/hidden-thinking-label.ts +3 -3
  127. package/examples/extensions/inline-bash.ts +3 -3
  128. package/examples/extensions/input-transform.ts +2 -2
  129. package/examples/extensions/interactive-shell.ts +2 -2
  130. package/examples/extensions/mac-system-theme.ts +3 -3
  131. package/examples/extensions/message-renderer.ts +4 -4
  132. package/examples/extensions/minimal-mode.ts +8 -8
  133. package/examples/extensions/modal-editor.ts +2 -2
  134. package/examples/extensions/model-status.ts +2 -2
  135. package/examples/extensions/notify.ts +2 -2
  136. package/examples/extensions/overlay-qa-tests.ts +14 -14
  137. package/examples/extensions/overlay-test.ts +2 -2
  138. package/examples/extensions/permission-gate.ts +2 -2
  139. package/examples/extensions/pirate.ts +3 -3
  140. package/examples/extensions/plan-mode/index.ts +22 -22
  141. package/examples/extensions/preset.ts +23 -23
  142. package/examples/extensions/prompt-customizer.ts +2 -2
  143. package/examples/extensions/protected-paths.ts +2 -2
  144. package/examples/extensions/provider-payload.ts +3 -3
  145. package/examples/extensions/qna.ts +2 -2
  146. package/examples/extensions/question.ts +2 -2
  147. package/examples/extensions/questionnaire.ts +2 -2
  148. package/examples/extensions/rainbow-editor.ts +2 -2
  149. package/examples/extensions/reload-runtime.ts +4 -4
  150. package/examples/extensions/rpc-demo.ts +10 -10
  151. package/examples/extensions/sandbox/index.ts +8 -8
  152. package/examples/extensions/sandbox/package.json +2 -2
  153. package/examples/extensions/send-user-message.ts +13 -13
  154. package/examples/extensions/session-name.ts +4 -4
  155. package/examples/extensions/shutdown-command.ts +10 -10
  156. package/examples/extensions/snake.ts +3 -3
  157. package/examples/extensions/space-invaders.ts +3 -3
  158. package/examples/extensions/ssh.ts +10 -10
  159. package/examples/extensions/status-line.ts +4 -4
  160. package/examples/extensions/structured-output.ts +2 -2
  161. package/examples/extensions/subagent/index.ts +3 -3
  162. package/examples/extensions/summarize.ts +2 -2
  163. package/examples/extensions/system-prompt-header.ts +3 -3
  164. package/examples/extensions/tic-tac-toe.ts +15 -15
  165. package/examples/extensions/timed-confirm.ts +4 -4
  166. package/examples/extensions/titlebar-spinner.ts +8 -8
  167. package/examples/extensions/todo.ts +5 -5
  168. package/examples/extensions/tool-override.ts +3 -3
  169. package/examples/extensions/tools.ts +9 -9
  170. package/examples/extensions/trigger-compact.ts +3 -3
  171. package/examples/extensions/truncated-tool.ts +3 -3
  172. package/examples/extensions/widget-placement.ts +2 -2
  173. package/examples/extensions/with-deps/index.ts +2 -2
  174. package/examples/extensions/with-deps/package.json +2 -2
  175. package/examples/extensions/working-indicator.ts +5 -5
  176. package/examples/extensions/working-message-test.ts +2 -2
  177. package/package.json +5 -5
@@ -26,9 +26,12 @@ import { exportSessionToHtml } from "./export-html/index.js";
26
26
  import { createToolHtmlRenderer } from "./export-html/tool-renderer.js";
27
27
  import { ExtensionRunner, wrapRegisteredTools, } from "./extensions/index.js";
28
28
  import { emitSessionShutdownEvent } from "./extensions/runner.js";
29
+ import { loadMemory } from "./memory.js";
29
30
  import { expandPromptTemplate } from "./prompt-templates.js";
30
31
  import { CURRENT_SESSION_VERSION, getLatestCompactionEntry } from "./session-manager.js";
32
+ import { routeNextTurn } from "./smart-router.js";
31
33
  import { createSyntheticSourceInfo } from "./source-info.js";
34
+ import { detectStack } from "./stack-detector.js";
32
35
  import { buildSystemPrompt } from "./system-prompt.js";
33
36
  import { createLocalBashOperations } from "./tools/bash.js";
34
37
  import { createAllToolDefinitions } from "./tools/index.js";
@@ -130,6 +133,7 @@ export class AgentSession {
130
133
  // (session persistence, extensions, auto-compaction, retry logic)
131
134
  this._unsubscribeAgent = this.agent.subscribe(this._handleAgentEvent);
132
135
  this._installAgentToolHooks();
136
+ this._installSmartRouting();
133
137
  this._buildRuntime({
134
138
  activeToolNames: this._initialActiveToolNames,
135
139
  includeAllExtensionTools: true,
@@ -506,7 +510,7 @@ export class AgentSession {
506
510
  * Call this when completely done with the session.
507
511
  */
508
512
  dispose() {
509
- this._extensionRunner.invalidate("This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload().");
513
+ this._extensionRunner.invalidate("This extension ctx is stale after session replacement or reload. Do not use a captured elyra or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload().");
510
514
  this._disconnectFromAgent();
511
515
  this._eventListeners = [];
512
516
  cleanupSessionResources(this.sessionId);
@@ -663,6 +667,11 @@ export class AgentSession {
663
667
  const appendSystemPrompt = loaderAppendSystemPrompt.length > 0 ? loaderAppendSystemPrompt.join("\n\n") : undefined;
664
668
  const loadedSkills = this._resourceLoader.getSkills().skills;
665
669
  const loadedContextFiles = this._resourceLoader.getAgentsFiles().agentsFiles;
670
+ // Load codebase memory if enabled
671
+ const memoryContent = this.settingsManager.getCodebaseMemory() ? loadMemory(this._cwd) : undefined;
672
+ // Detect project technology stack
673
+ const stackResult = detectStack(this._cwd);
674
+ const stackInfo = stackResult.summary || undefined;
666
675
  this._baseSystemPromptOptions = {
667
676
  cwd: this._cwd,
668
677
  skills: loadedSkills,
@@ -672,6 +681,8 @@ export class AgentSession {
672
681
  selectedTools: validToolNames,
673
682
  toolSnippets,
674
683
  promptGuidelines,
684
+ memoryContent,
685
+ stackInfo,
675
686
  };
676
687
  return buildSystemPrompt(this._baseSystemPromptOptions);
677
688
  }
@@ -680,7 +691,7 @@ export class AgentSession {
680
691
  // =========================================================================
681
692
  /**
682
693
  * Send a prompt to the agent.
683
- * - Handles extension commands (registered via pi.registerCommand) immediately, even during streaming
694
+ * - Handles extension commands (registered via elyra.registerCommand) immediately, even during streaming
684
695
  * - Expands file-based prompt templates by default
685
696
  * - During streaming, queues via steer() or followUp() based on streamingBehavior option
686
697
  * - Validates model and API key before sending (when not streaming)
@@ -693,7 +704,7 @@ export class AgentSession {
693
704
  let messages;
694
705
  try {
695
706
  // Handle extension commands first (execute immediately, even during streaming)
696
- // Extension commands manage their own LLM interaction via pi.sendMessage()
707
+ // Extension commands manage their own LLM interaction via elyra.sendMessage()
697
708
  if (expandPromptTemplates && text.startsWith("/")) {
698
709
  const handled = await this._tryExecuteExtensionCommand(text);
699
710
  if (handled) {
@@ -1857,6 +1868,47 @@ export class AgentSession {
1857
1868
  }
1858
1869
  this.setActiveToolsByName([...new Set(nextActiveToolNames)]);
1859
1870
  }
1871
+ /**
1872
+ * Install smart model routing via the prepareNextTurn hook.
1873
+ * When enabled, the router analyzes turn complexity and swaps to a
1874
+ * cheaper or more powerful model automatically.
1875
+ */
1876
+ _installSmartRouting() {
1877
+ const existingHook = this.agent.prepareNextTurn;
1878
+ this.agent.prepareNextTurn = async (signal) => {
1879
+ // Run existing hook first (if any)
1880
+ const existing = existingHook ? await existingHook(signal) : undefined;
1881
+ if (!this.settingsManager.getSmartRouting()) {
1882
+ return existing;
1883
+ }
1884
+ // Build available models list from scoped models or all available
1885
+ let availableModels;
1886
+ if (this._scopedModels.length > 0) {
1887
+ availableModels = this._scopedModels
1888
+ .filter((sm) => this._modelRegistry.hasConfiguredAuth(sm.model))
1889
+ .map((sm) => sm.model);
1890
+ }
1891
+ else {
1892
+ availableModels = await this._modelRegistry.getAvailable();
1893
+ }
1894
+ if (availableModels.length <= 1) {
1895
+ return existing;
1896
+ }
1897
+ const config = {
1898
+ enabled: true,
1899
+ availableModels,
1900
+ preferredModel: this.agent.state.model,
1901
+ };
1902
+ const result = routeNextTurn({ messages: this.agent.state.messages, thinkingLevel: this.agent.state.thinkingLevel }, config);
1903
+ if (!result) {
1904
+ return existing;
1905
+ }
1906
+ return {
1907
+ ...existing,
1908
+ model: result.model,
1909
+ };
1910
+ };
1911
+ }
1860
1912
  _buildRuntime(options) {
1861
1913
  const autoResizeImages = this.settingsManager.getImageAutoResize();
1862
1914
  const shellCommandPrefix = this.settingsManager.getShellCommandPrefix();