@dreb/coding-agent 2.46.0 → 2.47.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 (48) hide show
  1. package/README.md +4 -2
  2. package/dist/core/agent-session.d.ts.map +1 -1
  3. package/dist/core/agent-session.js +19 -8
  4. package/dist/core/agent-session.js.map +1 -1
  5. package/dist/core/extensions/index.d.ts +1 -1
  6. package/dist/core/extensions/index.d.ts.map +1 -1
  7. package/dist/core/extensions/index.js.map +1 -1
  8. package/dist/core/extensions/runner.d.ts +7 -0
  9. package/dist/core/extensions/runner.d.ts.map +1 -1
  10. package/dist/core/extensions/runner.js +10 -0
  11. package/dist/core/extensions/runner.js.map +1 -1
  12. package/dist/core/extensions/types.d.ts +35 -0
  13. package/dist/core/extensions/types.d.ts.map +1 -1
  14. package/dist/core/extensions/types.js.map +1 -1
  15. package/dist/core/sdk.d.ts.map +1 -1
  16. package/dist/core/sdk.js +1 -0
  17. package/dist/core/sdk.js.map +1 -1
  18. package/dist/core/session-manager.d.ts.map +1 -1
  19. package/dist/core/session-manager.js +38 -2
  20. package/dist/core/session-manager.js.map +1 -1
  21. package/dist/core/tools/ask-user.d.ts +45 -0
  22. package/dist/core/tools/ask-user.d.ts.map +1 -0
  23. package/dist/core/tools/ask-user.js +210 -0
  24. package/dist/core/tools/ask-user.js.map +1 -0
  25. package/dist/core/tools/index.d.ts +11 -0
  26. package/dist/core/tools/index.d.ts.map +1 -1
  27. package/dist/core/tools/index.js +8 -0
  28. package/dist/core/tools/index.js.map +1 -1
  29. package/dist/modes/interactive/components/ask-user.d.ts +59 -0
  30. package/dist/modes/interactive/components/ask-user.d.ts.map +1 -0
  31. package/dist/modes/interactive/components/ask-user.js +240 -0
  32. package/dist/modes/interactive/components/ask-user.js.map +1 -0
  33. package/dist/modes/interactive/interactive-mode.d.ts +12 -0
  34. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  35. package/dist/modes/interactive/interactive-mode.js +92 -5
  36. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  37. package/dist/modes/rpc/rpc-mode.d.ts +16 -1
  38. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  39. package/dist/modes/rpc/rpc-mode.js +112 -59
  40. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  41. package/dist/modes/rpc/rpc-types.d.ts +24 -0
  42. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  43. package/dist/modes/rpc/rpc-types.js.map +1 -1
  44. package/docs/dashboard.md +1 -1
  45. package/docs/extensions.md +33 -3
  46. package/docs/rpc.md +45 -6
  47. package/docs/session.md +1 -1
  48. package/package.json +1 -1
@@ -883,7 +883,12 @@ export class AgentSession {
883
883
  }
884
884
  /** Emit extension events based on agent events */
885
885
  async _emitExtensionEvent(event) {
886
- if (!this._extensionRunner)
886
+ // The runner is created unconditionally (so built-in tools like ask_user
887
+ // always have a UI context). When no extensions are loaded there are no
888
+ // handlers to invoke — return synchronously to avoid inserting an extra
889
+ // await tick per event, which would otherwise delay the final agent_end
890
+ // emission past when prompt() resolves.
891
+ if (!this._extensionRunner || !this._extensionRunner.hasExtensions)
887
892
  return;
888
893
  if (event.type === "agent_start") {
889
894
  this._turnIndex = 0;
@@ -2443,9 +2448,15 @@ export class AgentSession {
2443
2448
  const wrappedExtensionTools = this._extensionRunner
2444
2449
  ? wrapRegisteredTools(allCustomTools, this._extensionRunner)
2445
2450
  : [];
2451
+ // Give base tools a per-execution extension context so built-ins like
2452
+ // ask_user can reach ctx.ui. createContext() snapshots hasUI at call time,
2453
+ // so print/RPC-without-host modes degrade to the no-op UI (hasUI === false).
2454
+ const baseToolCtxFactory = this._extensionRunner
2455
+ ? () => this._extensionRunner.createContext()
2456
+ : undefined;
2446
2457
  const toolRegistry = new Map(Array.from(this._baseToolDefinitions.values()).map((definition) => [
2447
2458
  definition.name,
2448
- wrapToolDefinition(definition),
2459
+ wrapToolDefinition(definition, baseToolCtxFactory),
2449
2460
  ]));
2450
2461
  for (const tool of wrappedExtensionTools) {
2451
2462
  toolRegistry.set(tool.name, tool);
@@ -2544,12 +2555,11 @@ export class AgentSession {
2544
2555
  extensionsResult.runtime.flagValues.set(name, value);
2545
2556
  }
2546
2557
  }
2547
- const hasExtensions = extensionsResult.extensions.length > 0;
2548
- const hasCustomTools = this._customTools.length > 0;
2549
- this._extensionRunner =
2550
- hasExtensions || hasCustomTools
2551
- ? new ExtensionRunner(extensionsResult.extensions, extensionsResult.runtime, this._cwd, this.sessionManager, this._modelRegistry)
2552
- : undefined;
2558
+ // The runner also owns the cross-surface UI context used by built-in
2559
+ // tools such as ask_user. Create it even when no third-party extensions
2560
+ // are loaded; otherwise ordinary TUI/Dashboard sessions give base tools
2561
+ // no ctx.ui and ask_user can never open its dialog.
2562
+ this._extensionRunner = new ExtensionRunner(extensionsResult.extensions, extensionsResult.runtime, this._cwd, this.sessionManager, this._modelRegistry);
2553
2563
  if (this._extensionRunnerRef) {
2554
2564
  this._extensionRunnerRef.current = this._extensionRunner;
2555
2565
  }
@@ -2572,6 +2582,7 @@ export class AgentSession {
2572
2582
  "subagent",
2573
2583
  "wait",
2574
2584
  "search",
2585
+ "ask_user",
2575
2586
  "skill",
2576
2587
  "tasks_update",
2577
2588
  "suggest_next",