@draht/coding-agent 2026.3.25-1 → 2026.4.5

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 (111) hide show
  1. package/CHANGELOG.md +107 -0
  2. package/README.md +6 -2
  3. package/dist/core/agent-session-runtime.d.ts +136 -0
  4. package/dist/core/agent-session-runtime.d.ts.map +1 -0
  5. package/dist/core/agent-session-runtime.js +267 -0
  6. package/dist/core/agent-session-runtime.js.map +1 -0
  7. package/dist/core/agent-session.d.ts +22 -44
  8. package/dist/core/agent-session.d.ts.map +1 -1
  9. package/dist/core/agent-session.js +44 -248
  10. package/dist/core/agent-session.js.map +1 -1
  11. package/dist/core/auth-storage.d.ts +3 -1
  12. package/dist/core/auth-storage.d.ts.map +1 -1
  13. package/dist/core/auth-storage.js +5 -2
  14. package/dist/core/auth-storage.js.map +1 -1
  15. package/dist/core/compaction/branch-summarization.d.ts +2 -0
  16. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  17. package/dist/core/compaction/branch-summarization.js +2 -2
  18. package/dist/core/compaction/branch-summarization.js.map +1 -1
  19. package/dist/core/compaction/compaction.d.ts +2 -2
  20. package/dist/core/compaction/compaction.d.ts.map +1 -1
  21. package/dist/core/compaction/compaction.js +9 -9
  22. package/dist/core/compaction/compaction.js.map +1 -1
  23. package/dist/core/export-html/tool-renderer.d.ts +2 -0
  24. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  25. package/dist/core/export-html/tool-renderer.js +2 -2
  26. package/dist/core/export-html/tool-renderer.js.map +1 -1
  27. package/dist/core/extensions/index.d.ts +2 -2
  28. package/dist/core/extensions/index.d.ts.map +1 -1
  29. package/dist/core/extensions/index.js +1 -1
  30. package/dist/core/extensions/index.js.map +1 -1
  31. package/dist/core/extensions/types.d.ts +16 -16
  32. package/dist/core/extensions/types.d.ts.map +1 -1
  33. package/dist/core/extensions/types.js +10 -0
  34. package/dist/core/extensions/types.js.map +1 -1
  35. package/dist/core/footer-data-provider.d.ts +5 -1
  36. package/dist/core/footer-data-provider.d.ts.map +1 -1
  37. package/dist/core/footer-data-provider.js +70 -8
  38. package/dist/core/footer-data-provider.js.map +1 -1
  39. package/dist/core/index.d.ts +2 -1
  40. package/dist/core/index.d.ts.map +1 -1
  41. package/dist/core/index.js +2 -1
  42. package/dist/core/index.js.map +1 -1
  43. package/dist/core/model-registry.d.ts +21 -3
  44. package/dist/core/model-registry.d.ts.map +1 -1
  45. package/dist/core/model-registry.js +90 -70
  46. package/dist/core/model-registry.js.map +1 -1
  47. package/dist/core/model-resolver.d.ts.map +1 -1
  48. package/dist/core/model-resolver.js +4 -4
  49. package/dist/core/model-resolver.js.map +1 -1
  50. package/dist/core/resolve-config-value.d.ts +6 -0
  51. package/dist/core/resolve-config-value.d.ts.map +1 -1
  52. package/dist/core/resolve-config-value.js +37 -5
  53. package/dist/core/resolve-config-value.js.map +1 -1
  54. package/dist/core/resource-loader.d.ts +2 -0
  55. package/dist/core/resource-loader.d.ts.map +1 -1
  56. package/dist/core/resource-loader.js +5 -1
  57. package/dist/core/resource-loader.js.map +1 -1
  58. package/dist/core/sdk.d.ts +6 -3
  59. package/dist/core/sdk.d.ts.map +1 -1
  60. package/dist/core/sdk.js +17 -23
  61. package/dist/core/sdk.js.map +1 -1
  62. package/dist/index.d.ts +3 -3
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +3 -3
  65. package/dist/index.js.map +1 -1
  66. package/dist/main.d.ts.map +1 -1
  67. package/dist/main.js +49 -10
  68. package/dist/main.js.map +1 -1
  69. package/dist/modes/interactive/components/footer.d.ts +1 -0
  70. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  71. package/dist/modes/interactive/components/footer.js +4 -1
  72. package/dist/modes/interactive/components/footer.js.map +1 -1
  73. package/dist/modes/interactive/interactive-mode.d.ts +8 -4
  74. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  75. package/dist/modes/interactive/interactive-mode.js +90 -87
  76. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  77. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  78. package/dist/modes/interactive/theme/theme.js +6 -11
  79. package/dist/modes/interactive/theme/theme.js.map +1 -1
  80. package/dist/modes/print-mode.d.ts +4 -4
  81. package/dist/modes/print-mode.d.ts.map +1 -1
  82. package/dist/modes/print-mode.js +87 -74
  83. package/dist/modes/print-mode.js.map +1 -1
  84. package/dist/modes/rpc/rpc-mode.d.ts +2 -2
  85. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  86. package/dist/modes/rpc/rpc-mode.js +69 -49
  87. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  88. package/docs/development.md +2 -2
  89. package/docs/extensions.md +78 -22
  90. package/docs/models.md +6 -0
  91. package/docs/packages.md +3 -3
  92. package/docs/rpc.md +2 -2
  93. package/docs/sdk.md +170 -82
  94. package/docs/tree.md +1 -1
  95. package/examples/extensions/custom-compaction.ts +17 -4
  96. package/examples/extensions/handoff.ts +5 -2
  97. package/examples/extensions/hello.ts +18 -17
  98. package/examples/extensions/qna.ts +5 -2
  99. package/examples/extensions/rpc-demo.ts +3 -9
  100. package/examples/extensions/status-line.ts +0 -8
  101. package/examples/extensions/subagent/index.ts +1 -1
  102. package/examples/extensions/summarize.ts +15 -4
  103. package/examples/extensions/todo.ts +0 -2
  104. package/examples/extensions/tools.ts +0 -5
  105. package/examples/extensions/widget-placement.ts +4 -12
  106. package/examples/sdk/02-custom-model.ts +1 -1
  107. package/examples/sdk/09-api-keys-and-oauth.ts +3 -3
  108. package/examples/sdk/12-full-control.ts +1 -1
  109. package/examples/sdk/13-session-runtime.ts +49 -0
  110. package/examples/sdk/README.md +5 -4
  111. package/package.json +4 -4
@@ -16,14 +16,14 @@ import type { Agent, AgentEvent, AgentMessage, AgentState, AgentTool, ThinkingLe
16
16
  import type { ImageContent, Model, TextContent } from "@draht/ai";
17
17
  import { type BashResult } from "./bash-executor.js";
18
18
  import { type CompactionResult } from "./compaction/index.js";
19
- import { type ContextUsage, type ExtensionCommandContextActions, type ExtensionErrorListener, ExtensionRunner, type ExtensionUIContext, type InputSource, type ShutdownHandler, type ToolDefinition, type ToolInfo } from "./extensions/index.js";
19
+ import { type ContextUsage, type ExtensionCommandContextActions, type ExtensionErrorListener, ExtensionRunner, type ExtensionUIContext, type InputSource, type SessionStartEvent, type ShutdownHandler, type ToolDefinition, type ToolInfo } from "./extensions/index.js";
20
20
  import type { CustomMessage } from "./messages.js";
21
21
  import type { ModelRegistry } from "./model-registry.js";
22
22
  import { type PromptTemplate } from "./prompt-templates.js";
23
23
  import type { ResourceLoader } from "./resource-loader.js";
24
24
  import type { BranchSummaryEntry, SessionManager } from "./session-manager.js";
25
25
  import type { SettingsManager } from "./settings-manager.js";
26
- import type { BashOperations } from "./tools/bash.js";
26
+ import { type BashOperations } from "./tools/bash.js";
27
27
  /** Parsed skill block from a user message */
28
28
  export interface ParsedSkillBlock {
29
29
  name: string;
@@ -46,6 +46,16 @@ export type AgentSessionEvent = AgentEvent | {
46
46
  aborted: boolean;
47
47
  willRetry: boolean;
48
48
  errorMessage?: string;
49
+ } | {
50
+ type: "compaction_start";
51
+ reason: "manual" | "threshold" | "overflow";
52
+ } | {
53
+ type: "compaction_end";
54
+ reason: "manual" | "threshold" | "overflow";
55
+ result: CompactionResult | undefined;
56
+ aborted: boolean;
57
+ willRetry: boolean;
58
+ errorMessage?: string;
49
59
  } | {
50
60
  type: "auto_retry_start";
51
61
  attempt: number;
@@ -57,6 +67,10 @@ export type AgentSessionEvent = AgentEvent | {
57
67
  success: boolean;
58
68
  attempt: number;
59
69
  finalError?: string;
70
+ } | {
71
+ type: "queue_update";
72
+ steering: readonly string[];
73
+ followUp: readonly string[];
60
74
  };
61
75
  /** Listener function for agent session events */
62
76
  export type AgentSessionEventListener = (event: AgentSessionEvent) => void;
@@ -89,6 +103,8 @@ export interface AgentSessionConfig {
89
103
  extensionRunnerRef?: {
90
104
  current?: ExtensionRunner;
91
105
  };
106
+ /** Session start event metadata emitted when extensions bind to this runtime. */
107
+ sessionStartEvent?: SessionStartEvent;
92
108
  }
93
109
  export interface ExtensionBindings {
94
110
  uiContext?: ExtensionUIContext;
@@ -166,6 +182,7 @@ export declare class AgentSession {
166
182
  private _extensionRunnerRef?;
167
183
  private _initialActiveToolNames?;
168
184
  private _baseToolsOverride?;
185
+ private _sessionStartEvent;
169
186
  private _extensionUIContext?;
170
187
  private _extensionCommandContextActions?;
171
188
  private _extensionShutdownHandler?;
@@ -180,6 +197,7 @@ export declare class AgentSession {
180
197
  constructor(config: AgentSessionConfig);
181
198
  /** Model registry for API key resolution and model discovery */
182
199
  get modelRegistry(): ModelRegistry;
200
+ private _getRequiredRequestAuth;
183
201
  /**
184
202
  * Install tool hooks once on the Agent instance.
185
203
  *
@@ -370,23 +388,11 @@ export declare class AgentSession {
370
388
  * Abort current operation and wait for agent to become idle.
371
389
  */
372
390
  abort(): Promise<void>;
373
- /**
374
- * Start a new session, optionally with initial messages and parent tracking.
375
- * Clears all messages and starts a new session.
376
- * Listeners are preserved and will continue receiving events.
377
- * @param options.parentSession - Optional parent session path for tracking
378
- * @param options.setup - Optional callback to initialize session (e.g., append messages)
379
- * @returns true if completed, false if cancelled by extension
380
- */
381
- newSession(options?: {
382
- parentSession?: string;
383
- setup?: (sessionManager: SessionManager) => Promise<void>;
384
- }): Promise<boolean>;
385
391
  private _emitModelSelect;
386
392
  /**
387
393
  * Set model directly.
388
- * Validates API key, saves to session and settings.
389
- * @throws Error if no API key available for the model
394
+ * Validates that auth is configured, saves to session and settings.
395
+ * @throws Error if no auth is configured for the model
390
396
  */
391
397
  setModel(model: Model<any>): Promise<void>;
392
398
  /**
@@ -396,7 +402,6 @@ export declare class AgentSession {
396
402
  * @returns The new model info, or undefined if only one model available
397
403
  */
398
404
  cycleModel(direction?: "forward" | "backward"): Promise<ModelCycleResult | undefined>;
399
- private _getScopedModelsWithApiKey;
400
405
  private _cycleScopedModel;
401
406
  private _cycleAvailableModel;
402
407
  /**
@@ -518,30 +523,10 @@ export declare class AgentSession {
518
523
  * Called after agent turn completes to maintain proper message ordering.
519
524
  */
520
525
  private _flushPendingBashMessages;
521
- /**
522
- * Switch to a different session file.
523
- * Aborts current operation, loads messages, restores model/thinking.
524
- * Listeners are preserved and will continue receiving events.
525
- * @returns true if switch completed, false if cancelled by extension
526
- */
527
- switchSession(sessionPath: string): Promise<boolean>;
528
526
  /**
529
527
  * Set a display name for the current session.
530
528
  */
531
529
  setSessionName(name: string): void;
532
- /**
533
- * Create a fork from a specific entry.
534
- * Emits before_fork/fork session events to extensions.
535
- *
536
- * @param entryId ID of the entry to fork from
537
- * @returns Object with:
538
- * - selectedText: The text of the selected user message (for editor pre-fill)
539
- * - cancelled: True if an extension cancelled the fork
540
- */
541
- fork(entryId: string): Promise<{
542
- selectedText: string;
543
- cancelled: boolean;
544
- }>;
545
530
  /**
546
531
  * Navigate to a different node in the session tree.
547
532
  * Unlike fork() which creates a new session file, this stays in the same file.
@@ -590,13 +575,6 @@ export declare class AgentSession {
590
575
  * @returns The resolved output file path.
591
576
  */
592
577
  exportToJsonl(outputPath?: string): string;
593
- /**
594
- * Import a JSONL session file.
595
- * Copies the file into the session directory and switches to it (like /resume).
596
- * @param inputPath Path to the JSONL file to import.
597
- * @returns true if the session was switched successfully.
598
- */
599
- importFromJsonl(inputPath: string): Promise<boolean>;
600
578
  /**
601
579
  * Get text content of last assistant message.
602
580
  * Useful for /copy command.