claude_agent 0.7.5 → 0.7.7

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7243ce9755ad2adeca4eee580a6011ba3a35f51f1bfe7d00a2df1f4b5313bc52
4
- data.tar.gz: 9331f577e970716bd9c3573eaa44e6e96b8ef5c3f3798673d4ff20eef0ca23f3
3
+ metadata.gz: 4d3e15e24cc94819c7790d628776f0f04aee71592ae3b2eff9daa40b47941302
4
+ data.tar.gz: 9b60ffaf27391f41168549ac9bb878a9d184f4edf0144916b268e79855dddc65
5
5
  SHA512:
6
- metadata.gz: b452df3dde194a5c092f2c1cae97c5b51fea119dce3aa8fe6bfadd2607ceb27e5d1fc9ded9206ed49f92db309acb6714e7fa38365150a373ea0fb3c77c5baa66
7
- data.tar.gz: b2016921e13e9a3c811d126f78ea545b121bc8480ecb064c23b55807a444d3db361f42e205128302d4c303de598bf5d30754fcf3169cfedaeeb2e4dfc550ca22
6
+ metadata.gz: '084b53215d8f9f9d95f2084d6c7b0e10a845bd028ad5e466ce7c822e245351b59916782f36591ab0f0088f996d27c127221843a603217bc2eb7adf569708aa85'
7
+ data.tar.gz: 1b30bec791d154c017daee5aa6ca93df25da998a19382554aae3610962c447294cce76bbdb96737614f7334bdc73cd3be148a3a8138bfa50bf9ef8d130a05f3d
data/.worktreeinclude ADDED
@@ -0,0 +1,13 @@
1
+ # Files to copy to new worktrees (must also be in .gitignore)
2
+
3
+ # Claude Configs
4
+ .claude/settings.local.json
5
+ .claude/**/local-*
6
+ .claude/**/local/
7
+
8
+ # MCP server configuration
9
+ .mcp.json
10
+
11
+ # Local dependencies and temp files
12
+ /tmp/**
13
+ /vendor/**
data/CHANGELOG.md CHANGED
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.7.7] - 2026-02-20
11
+
12
+ ### Added
13
+ - `TaskStartedMessage` for background task start notifications (TypeScript SDK v0.2.43 parity)
14
+ - `RateLimitEvent` message type for rate limit visibility (TypeScript SDK v0.2.44 parity)
15
+ - `PromptSuggestionMessage` type and `prompt_suggestions` option for suggested follow-up prompts (TypeScript SDK v0.2.46 parity)
16
+ - `ConfigChange` hook event with `ConfigChangeInput` class (TypeScript SDK v0.2.47 parity)
17
+ - `SandboxFilesystemConfig` with `allow_write`, `deny_write`, `deny_read` fields (TypeScript SDK v0.2.49 parity)
18
+ - RBS signatures for all new types
19
+
20
+ ## [0.7.6] - 2026-02-13
21
+
22
+ ### Added
23
+ - `stop_task` control request and `Client#stop_task` method for stopping running background tasks (TypeScript SDK parity)
24
+
10
25
  ## [0.7.5] - 2026-02-10
11
26
 
12
27
  ### Added
data/SPEC.md CHANGED
@@ -3,11 +3,11 @@
3
3
  This document provides a comprehensive specification of the Claude Agent SDK, comparing feature parity across the official TypeScript and Python SDKs with this Ruby implementation.
4
4
 
5
5
  **Reference Versions:**
6
- - TypeScript SDK: v0.2.38 (npm package)
7
- - Python SDK: v0.1.34 from GitHub (commit a969042)
6
+ - TypeScript SDK: v0.2.49 (npm package)
7
+ - Python SDK: v0.1.39 from GitHub (commit 146e3d6)
8
8
  - Ruby SDK: This repository
9
9
 
10
- **Last Updated:** 2026-02-09
10
+ **Last Updated:** 2026-02-20
11
11
 
12
12
  ---
13
13
 
@@ -41,14 +41,14 @@ Configuration options for SDK queries and clients.
41
41
  | `tools` | ✅ | ✅ | ✅ | Array or preset |
42
42
  | `allowedTools` | ✅ | ✅ | ✅ | Auto-allowed tools |
43
43
  | `disallowedTools` | ✅ | ✅ | ✅ | Blocked tools |
44
- | `permissionMode` | ✅ | ✅ | ✅ | default/acceptEdits/plan/bypassPermissions/delegate/dontAsk |
44
+ | `permissionMode` | ✅ | ✅ | ✅ | default/acceptEdits/plan/bypassPermissions/dontAsk |
45
45
  | `allowDangerouslySkipPermissions` | ✅ | ❌ | ✅ | Required for bypassPermissions |
46
46
  | `canUseTool` | ✅ | ✅ | ✅ | Permission callback |
47
47
  | `permissionPromptToolName` | ✅ | ✅ | ✅ | MCP tool for permission prompts |
48
48
  | `maxTurns` | ✅ | ✅ | ✅ | Max conversation turns |
49
49
  | `maxBudgetUsd` | ✅ | ✅ | ✅ | Max USD budget |
50
- | `thinking` | ✅ | | ✅ | Thinking mode config (adaptive/enabled/disabled) (v0.2.35+) |
51
- | `effort` | ✅ | | ✅ | Response effort level (low/medium/high/max) (v0.2.35+) |
50
+ | `thinking` | ✅ | | ✅ | Thinking mode config (adaptive/enabled/disabled) (v0.2.35+) |
51
+ | `effort` | ✅ | | ✅ | Response effort level (low/medium/high/max) (v0.2.35+) |
52
52
  | `maxThinkingTokens` | ✅ | ✅ | ✅ | Max thinking tokens (deprecated in TS, use `thinking`) |
53
53
  | `continue` | ✅ | ✅ | ✅ | Continue most recent conversation |
54
54
  | `resume` | ✅ | ✅ | ✅ | Resume session by ID |
@@ -83,6 +83,7 @@ Configuration options for SDK queries and clients.
83
83
  | `init` | ✅ | ❌ | ✅ | Run Setup hooks (init trigger), then continue (hidden CLI) |
84
84
  | `initOnly` | ✅ | ❌ | ✅ | Run Setup hooks (init trigger), then exit (hidden CLI) |
85
85
  | `maintenance` | ✅ | ❌ | ✅ | Run Setup hooks (maintenance trigger), continue (hidden CLI) |
86
+ | `promptSuggestions` | ✅ | ❌ | ✅ | Enable prompt suggestion after each turn (v0.2.47) |
86
87
  | `debug` | ✅ | ❌ | ✅ | Enable verbose debug logging |
87
88
  | `debugFile` | ✅ | ❌ | ✅ | Write debug logs to specific file path |
88
89
 
@@ -109,6 +110,9 @@ Messages exchanged between SDK and CLI.
109
110
  | `AuthStatusMessage` | ✅ | ❌ | ✅ | Authentication status |
110
111
  | `TaskNotificationMessage` | ✅ | ❌ | ✅ | Background task completion |
111
112
  | `ToolUseSummaryMessage` | ✅ | ❌ | ✅ | Summary of tool use (collapsed) |
113
+ | `TaskStartedMessage` | ✅ | ❌ | ✅ | Subagent task registered (v0.2.45) |
114
+ | `RateLimitEvent` | ✅ | ❌ | ✅ | Rate limit status changes |
115
+ | `PromptSuggestionMessage` | ✅ | ❌ | ✅ | Suggested next prompt (v0.2.47) |
112
116
  | `FilesPersistedEvent` | ✅ | ❌ | ✅ | File persistence confirmation |
113
117
 
114
118
  ### Message Fields
@@ -227,6 +231,7 @@ Bidirectional control protocol for SDK-CLI communication.
227
231
  | `mcp_status` | ✅ | ✅ | ✅ | Get MCP server status |
228
232
  | `mcp_reconnect` | ✅ | ❌ | ✅ | Reconnect to MCP server |
229
233
  | `mcp_toggle` | ✅ | ❌ | ✅ | Enable/disable MCP server |
234
+ | `stop_task` | ✅ | ❌ | ✅ | Stop a running background task |
230
235
  | `supported_commands` | ✅ | ❌ | ✅ | Get available slash commands |
231
236
  | `supported_models` | ✅ | ❌ | ✅ | Get available models |
232
237
  | `account_info` | ✅ | ❌ | ✅ | Get account information |
@@ -268,6 +273,7 @@ Event hooks for intercepting and modifying SDK behavior.
268
273
  | `Setup` | ✅ | ❌ | ✅ | Initial setup/maintenance |
269
274
  | `TeammateIdle` | ✅ | ❌ | ✅ | Teammate idle (v0.2.33) |
270
275
  | `TaskCompleted` | ✅ | ❌ | ✅ | Task completed (v0.2.33) |
276
+ | `ConfigChange` | ✅ | ❌ | ✅ | Config file changed (v0.2.49) |
271
277
 
272
278
  ### Hook Input Types
273
279
 
@@ -288,6 +294,7 @@ Event hooks for intercepting and modifying SDK behavior.
288
294
  | `SetupHookInput` | ✅ | ❌ | ✅ |
289
295
  | `TeammateIdleHookInput` | ✅ | ❌ | ✅ |
290
296
  | `TaskCompletedHookInput` | ✅ | ❌ | ✅ |
297
+ | `ConfigChangeHookInput` | ✅ | ❌ | ✅ |
291
298
 
292
299
  ### Hook Output Types
293
300
 
@@ -387,7 +394,6 @@ Permission handling and updates.
387
394
  | `acceptEdits` | ✅ | ✅ | ✅ | Auto-accept edits |
388
395
  | `plan` | ✅ | ✅ | ✅ | Planning mode |
389
396
  | `bypassPermissions` | ✅ | ✅ | ✅ | Skip all checks |
390
- | `delegate` | ✅ | ❌ | ✅ | Delegate mode |
391
397
  | `dontAsk` | ✅ | ❌ | ✅ | Never prompt |
392
398
 
393
399
  ### Permission Result Types
@@ -555,6 +561,15 @@ Sandbox configuration for command execution isolation.
555
561
  | `ignoreViolations` | ✅ | ✅ | ✅ |
556
562
  | `enableWeakerNestedSandbox` | ✅ | ✅ | ✅ |
557
563
  | `ripgrep` | ✅ | ❌ | ✅ |
564
+ | `filesystem` | ✅ | ❌ | ✅ |
565
+
566
+ ### SandboxFilesystemConfig
567
+
568
+ | Field | TypeScript | Python | Ruby |
569
+ |--------------|:----------:|:------:|:----:|
570
+ | `allowWrite` | ✅ | ❌ | ✅ |
571
+ | `denyWrite` | ✅ | ❌ | ✅ |
572
+ | `denyRead` | ✅ | ❌ | ✅ |
558
573
 
559
574
  ### SandboxNetworkConfig
560
575
 
@@ -628,6 +643,7 @@ Public API surface for SDK clients.
628
643
  | `setMcpServers()` | ✅ | ❌ | ✅ | Dynamic MCP servers |
629
644
  | `reconnectMcpServer()` | ✅ | ❌ | ✅ | Reconnect MCP server |
630
645
  | `toggleMcpServer()` | ✅ | ❌ | ✅ | Enable/disable MCP |
646
+ | `stopTask()` | ✅ | ❌ | ✅ | Stop running task |
631
647
  | `streamInput()` | ✅ | ✅ | ✅ | Stream user input |
632
648
  | `initializationResult()` | ✅ | ❌ | ✅ | Full init response |
633
649
  | `close()` | ✅ | ✅ | ✅ | Close query/session |
@@ -671,19 +687,25 @@ Public API surface for SDK clients.
671
687
  - Source is bundled/minified, but `sdk.d.ts` provides complete type definitions
672
688
  - Includes unstable V2 session API
673
689
  - `executable`/`executableArgs` are JS-specific (`node`/`bun`/`deno`)
690
+ - v0.2.45: Added `TaskStartedMessage`, `RateLimitEvent` message types
691
+ - v0.2.47: Added `promptSuggestions` option and `PromptSuggestionMessage`
692
+ - v0.2.49: Added `ConfigChange` hook event, `SandboxFilesystemConfig`
674
693
 
675
694
  ### Python SDK
676
695
  - Full source available with `Transport` abstract class
677
696
  - Partial control protocol: query and client support interrupt, setPermissionMode, setModel, rewindFiles, mcpStatus
678
- - Missing hooks: SessionStart, SessionEnd, Setup, TeammateIdle, TaskCompleted
679
- - Missing permission modes: `delegate`, `dontAsk`
680
- - Missing options: `thinking`, `effort`, `allowDangerouslySkipPermissions`, `persistSession`, `resumeSessionAt`, `sessionId`, `strictMcpConfig`, `init`/`initOnly`/`maintenance`, `debug`/`debugFile`
697
+ - Missing hooks: SessionStart, SessionEnd, Setup, TeammateIdle, TaskCompleted, ConfigChange
698
+ - Missing permission modes: `dontAsk`
699
+ - Missing options: `allowDangerouslySkipPermissions`, `persistSession`, `resumeSessionAt`, `sessionId`, `strictMcpConfig`, `init`/`initOnly`/`maintenance`, `debug`/`debugFile`, `promptSuggestions`
681
700
  - `ToolPermissionContext` missing `blockedPath`, `decisionReason`, `toolUseID`, `agentID`, `description`
682
701
  - Has SDK MCP server support with `tool()` helper and annotations
702
+ - Added `thinking` config and `effort` option in v0.1.36
703
+ - Handles `rate_limit_event` and unknown message types gracefully (v0.1.39)
683
704
 
684
705
  ### Ruby SDK (This Repository)
685
- - Feature parity with TypeScript SDK v0.2.38
706
+ - Feature parity with TypeScript SDK v0.2.42
686
707
  - Ruby-idiomatic patterns (Data.define, snake_case)
687
708
  - Complete control protocol, hook, and V2 Session API support
688
709
  - Dedicated Client class for multi-turn conversations
689
710
  - `executable`/`executableArgs` marked N/A (JS runtime options)
711
+ - Gaps from TS v0.2.43-v0.2.49: `promptSuggestions`, `TaskStartedMessage`, `RateLimitEvent`, `PromptSuggestionMessage`, `ConfigChange` hook, `SandboxFilesystemConfig`
@@ -281,6 +281,23 @@ module ClaudeAgent
281
281
  @protocol.initialization_result
282
282
  end
283
283
 
284
+ # Stop a running background task (TypeScript SDK parity)
285
+ #
286
+ # Sends a stop signal to a running task. A task_notification message
287
+ # with status 'stopped' will be emitted when the task stops.
288
+ #
289
+ # @param task_id [String] The task ID from task_notification events
290
+ # @return [void]
291
+ #
292
+ # @example
293
+ # client.stop_task("task-123")
294
+ #
295
+ def stop_task(task_id)
296
+ require_connection!
297
+
298
+ @protocol.stop_task(task_id)
299
+ end
300
+
284
301
  # Dynamically set MCP servers for this session (TypeScript SDK parity)
285
302
  #
286
303
  # This replaces the current set of dynamically-added MCP servers.
@@ -443,6 +443,21 @@ module ClaudeAgent
443
443
  send_control_request(subtype: "mcp_toggle", serverName: server_name, enabled: enabled)
444
444
  end
445
445
 
446
+ # Stop a running background task (TypeScript SDK parity)
447
+ #
448
+ # Sends a stop signal to a running task. A task_notification message
449
+ # with status 'stopped' will be emitted when the task stops.
450
+ #
451
+ # @param task_id [String] The task ID from task_notification events
452
+ # @return [void]
453
+ #
454
+ # @example
455
+ # protocol.stop_task("task-123")
456
+ #
457
+ def stop_task(task_id)
458
+ send_control_request(subtype: "stop_task", task_id: task_id)
459
+ end
460
+
446
461
  # Dynamically set MCP servers for this session (TypeScript SDK parity)
447
462
  #
448
463
  # This replaces the current set of dynamically-added MCP servers.
@@ -517,6 +532,7 @@ module ClaudeAgent
517
532
 
518
533
  request = { subtype: "initialize" }
519
534
  request[:hooks] = hooks_config if hooks_config
535
+ request[:promptSuggestions] = true if options.prompt_suggestions
520
536
 
521
537
  send_control_request(**request)
522
538
  end
@@ -18,6 +18,7 @@ module ClaudeAgent
18
18
  Setup
19
19
  TeammateIdle
20
20
  TaskCompleted
21
+ ConfigChange
21
22
  ].freeze
22
23
 
23
24
  # Matcher configuration for hooks
@@ -278,6 +279,31 @@ module ClaudeAgent
278
279
  end
279
280
  end
280
281
 
282
+ # Input for ConfigChange hook (TypeScript SDK v0.2.49 parity)
283
+ #
284
+ # Fired when a configuration file changes.
285
+ #
286
+ # @example
287
+ # input = ConfigChangeInput.new(
288
+ # source: "user_settings",
289
+ # file_path: "~/.claude/settings.json",
290
+ # session_id: "sess-123"
291
+ # )
292
+ #
293
+ class ConfigChangeInput < BaseHookInput
294
+ attr_reader :source, :file_path
295
+
296
+ SOURCES = %w[user_settings project_settings local_settings policy_settings skills].freeze
297
+
298
+ # @param source [String] One of SOURCES
299
+ # @param file_path [String, nil] Path to the changed file
300
+ def initialize(source:, file_path: nil, **kwargs)
301
+ super(hook_event_name: "ConfigChange", **kwargs)
302
+ @source = source
303
+ @file_path = file_path
304
+ end
305
+ end
306
+
281
307
  # Input for TaskCompleted hook (TypeScript SDK v0.2.33 parity)
282
308
  #
283
309
  # Fired when a task completes.
@@ -16,7 +16,7 @@ module ClaudeAgent
16
16
  # Parse a raw message hash into a typed message object
17
17
  #
18
18
  # @param raw [Hash] Raw message from CLI
19
- # @return [UserMessage, UserMessageReplay, AssistantMessage, SystemMessage, ResultMessage, StreamEvent, CompactBoundaryMessage, StatusMessage, ToolProgressMessage, HookResponseMessage, AuthStatusMessage, TaskNotificationMessage, HookStartedMessage, HookProgressMessage, ToolUseSummaryMessage, FilesPersistedEvent]
19
+ # @return [UserMessage, UserMessageReplay, AssistantMessage, SystemMessage, ResultMessage, StreamEvent, CompactBoundaryMessage, StatusMessage, ToolProgressMessage, HookResponseMessage, AuthStatusMessage, TaskNotificationMessage, HookStartedMessage, HookProgressMessage, ToolUseSummaryMessage, FilesPersistedEvent, TaskStartedMessage, RateLimitEvent, PromptSuggestionMessage]
20
20
  # @raise [MessageParseError] If message cannot be parsed
21
21
  def parse(raw)
22
22
  type = raw["type"]
@@ -44,6 +44,8 @@ module ClaudeAgent
44
44
  parse_hook_progress_message(raw)
45
45
  when "files_persisted"
46
46
  parse_files_persisted_event(raw)
47
+ when "task_started"
48
+ parse_task_started_message(raw)
47
49
  else
48
50
  parse_system_message(raw)
49
51
  end
@@ -57,6 +59,10 @@ module ClaudeAgent
57
59
  parse_auth_status_message(raw)
58
60
  when "tool_use_summary"
59
61
  parse_tool_use_summary_message(raw)
62
+ when "rate_limit_event"
63
+ parse_rate_limit_event(raw)
64
+ when "prompt_suggestion"
65
+ parse_prompt_suggestion_message(raw)
60
66
  else
61
67
  logger.error("parser") { "Unknown message type: #{type}" }
62
68
  raise MessageParseError.new("Unknown message type: #{type}", raw_message: raw)
@@ -336,5 +342,32 @@ module ClaudeAgent
336
342
  processed_at: fetch_dual(raw, :processed_at)
337
343
  )
338
344
  end
345
+
346
+ def parse_task_started_message(raw)
347
+ TaskStartedMessage.new(
348
+ uuid: raw["uuid"] || "",
349
+ session_id: fetch_dual(raw, :session_id, ""),
350
+ task_id: fetch_dual(raw, :task_id, ""),
351
+ tool_use_id: fetch_dual(raw, :tool_use_id),
352
+ description: raw["description"],
353
+ task_type: fetch_dual(raw, :task_type)
354
+ )
355
+ end
356
+
357
+ def parse_rate_limit_event(raw)
358
+ RateLimitEvent.new(
359
+ rate_limit_info: fetch_dual(raw, :rate_limit_info, {}),
360
+ uuid: raw["uuid"] || "",
361
+ session_id: fetch_dual(raw, :session_id, "")
362
+ )
363
+ end
364
+
365
+ def parse_prompt_suggestion_message(raw)
366
+ PromptSuggestionMessage.new(
367
+ uuid: raw["uuid"] || "",
368
+ session_id: fetch_dual(raw, :session_id, ""),
369
+ suggestion: raw["suggestion"] || ""
370
+ )
371
+ end
339
372
  end
340
373
  end
@@ -616,6 +616,100 @@ module ClaudeAgent
616
616
  end
617
617
  end
618
618
 
619
+ # Task started message (TypeScript SDK v0.2.45 parity)
620
+ #
621
+ # Sent when a new task (subagent) is started.
622
+ #
623
+ # @example
624
+ # msg = TaskStartedMessage.new(
625
+ # uuid: "msg-123",
626
+ # session_id: "session-abc",
627
+ # task_id: "task-456",
628
+ # tool_use_id: "tool-789",
629
+ # description: "Running tests",
630
+ # task_type: "bash"
631
+ # )
632
+ #
633
+ TaskStartedMessage = Data.define(
634
+ :uuid,
635
+ :session_id,
636
+ :task_id,
637
+ :tool_use_id,
638
+ :description,
639
+ :task_type
640
+ ) do
641
+ def initialize(
642
+ uuid:,
643
+ session_id:,
644
+ task_id:,
645
+ tool_use_id: nil,
646
+ description: nil,
647
+ task_type: nil
648
+ )
649
+ super
650
+ end
651
+
652
+ def type
653
+ :task_started
654
+ end
655
+ end
656
+
657
+ # Rate limit event (TypeScript SDK v0.2.45 parity)
658
+ #
659
+ # Reports rate limit status and utilization information.
660
+ #
661
+ # @example
662
+ # msg = RateLimitEvent.new(
663
+ # uuid: "msg-123",
664
+ # session_id: "session-abc",
665
+ # rate_limit_info: {
666
+ # "status" => "allowed_warning",
667
+ # "resetsAt" => 1700000000,
668
+ # "rateLimitType" => "five_hour",
669
+ # "utilization" => 0.85,
670
+ # "isUsingOverage" => false,
671
+ # "overageStatus" => "available"
672
+ # }
673
+ # )
674
+ # msg.status # => "allowed_warning"
675
+ #
676
+ RateLimitEvent = Data.define(:rate_limit_info, :uuid, :session_id) do
677
+ def initialize(rate_limit_info:, uuid: nil, session_id: nil)
678
+ super
679
+ end
680
+
681
+ def type
682
+ :rate_limit_event
683
+ end
684
+
685
+ # Get the rate limit status
686
+ # @return [String, nil]
687
+ def status
688
+ rate_limit_info["status"] || rate_limit_info[:status]
689
+ end
690
+ end
691
+
692
+ # Prompt suggestion message (TypeScript SDK v0.2.47 parity)
693
+ #
694
+ # Contains a suggested prompt for the user.
695
+ #
696
+ # @example
697
+ # msg = PromptSuggestionMessage.new(
698
+ # uuid: "msg-123",
699
+ # session_id: "session-abc",
700
+ # suggestion: "Tell me about this project"
701
+ # )
702
+ #
703
+ PromptSuggestionMessage = Data.define(:uuid, :session_id, :suggestion) do
704
+ def initialize(uuid: nil, session_id: nil, suggestion:)
705
+ super
706
+ end
707
+
708
+ def type
709
+ :prompt_suggestion
710
+ end
711
+ end
712
+
619
713
  # Files persisted event (TypeScript SDK v0.2.25 parity)
620
714
  #
621
715
  # Sent when files are persisted to storage during a session.
@@ -670,6 +764,9 @@ module ClaudeAgent
670
764
  HookStartedMessage,
671
765
  HookProgressMessage,
672
766
  ToolUseSummaryMessage,
673
- FilesPersistedEvent
767
+ FilesPersistedEvent,
768
+ TaskStartedMessage,
769
+ RateLimitEvent,
770
+ PromptSuggestionMessage
674
771
  ].freeze
675
772
  end
@@ -4,7 +4,7 @@ require "json"
4
4
 
5
5
  module ClaudeAgent
6
6
  # Permission modes for tool execution (TypeScript SDK parity)
7
- PERMISSION_MODES = %w[default acceptEdits plan bypassPermissions delegate dontAsk].freeze
7
+ PERMISSION_MODES = %w[default acceptEdits plan bypassPermissions dontAsk].freeze
8
8
 
9
9
  # Configuration options for ClaudeAgent queries and clients
10
10
  #
@@ -42,6 +42,7 @@ module ClaudeAgent
42
42
  init: false,
43
43
  init_only: false,
44
44
  maintenance: false,
45
+ prompt_suggestions: false,
45
46
  debug: false,
46
47
  debug_file: nil
47
48
  }.freeze
@@ -61,7 +62,7 @@ module ClaudeAgent
61
62
  settings sandbox cwd add_dirs env user agent
62
63
  cli_path extra_args agents setting_sources plugins
63
64
  include_partial_messages output_format enable_file_checkpointing
64
- persist_session betas max_buffer_size stderr_callback
65
+ persist_session prompt_suggestions betas max_buffer_size stderr_callback
65
66
  abort_controller spawn_claude_code_process
66
67
  init init_only maintenance
67
68
  debug debug_file
@@ -260,6 +261,7 @@ module ClaudeAgent
260
261
  args.push("--no-persist-session") if persist_session == false
261
262
  args.push("--json-schema", JSON.generate(output_format)) if output_format
262
263
  args.push("--include-partial-messages") if include_partial_messages
264
+ args.push("--prompt-suggestions") if prompt_suggestions
263
265
  if agents
264
266
  agents_hash = agents.transform_values(&:to_h)
265
267
  args.push("--agents", JSON.generate(agents_hash))
@@ -85,6 +85,29 @@ module ClaudeAgent
85
85
  end
86
86
  end
87
87
 
88
+ # Filesystem-specific configuration for sandbox mode (TypeScript SDK v0.2.49 parity)
89
+ #
90
+ # @example
91
+ # filesystem = SandboxFilesystemConfig.new(
92
+ # allow_write: ["/tmp/*"],
93
+ # deny_write: ["/etc/*"],
94
+ # deny_read: ["/secrets/*"]
95
+ # )
96
+ #
97
+ SandboxFilesystemConfig = Data.define(:allow_write, :deny_write, :deny_read) do
98
+ def initialize(allow_write: [], deny_write: [], deny_read: [])
99
+ super
100
+ end
101
+
102
+ def to_h
103
+ result = {}
104
+ result[:allowWrite] = allow_write unless allow_write.empty?
105
+ result[:denyWrite] = deny_write unless deny_write.empty?
106
+ result[:denyRead] = deny_read unless deny_read.empty?
107
+ result
108
+ end
109
+ end
110
+
88
111
  # Sandbox configuration for command execution (TypeScript SDK parity)
89
112
  #
90
113
  # @example Basic sandbox
@@ -112,7 +135,8 @@ module ClaudeAgent
112
135
  :network,
113
136
  :ignore_violations,
114
137
  :enable_weaker_nested_sandbox,
115
- :ripgrep
138
+ :ripgrep,
139
+ :filesystem
116
140
  ) do
117
141
  def initialize(
118
142
  enabled: false,
@@ -122,7 +146,8 @@ module ClaudeAgent
122
146
  network: nil,
123
147
  ignore_violations: nil,
124
148
  enable_weaker_nested_sandbox: false,
125
- ripgrep: nil
149
+ ripgrep: nil,
150
+ filesystem: nil
126
151
  )
127
152
  super
128
153
  end
@@ -136,6 +161,7 @@ module ClaudeAgent
136
161
  result[:ignoreViolations] = ignore_violations.to_h if ignore_violations && !ignore_violations.to_h.empty?
137
162
  result[:enableWeakerNestedSandbox] = enable_weaker_nested_sandbox if enable_weaker_nested_sandbox
138
163
  result[:ripgrep] = ripgrep.to_h if ripgrep
164
+ result[:filesystem] = filesystem.to_h if filesystem && !filesystem.to_h.empty?
139
165
  result
140
166
  end
141
167
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ClaudeAgent
4
- VERSION = "0.7.5"
4
+ VERSION = "0.7.7"
5
5
  end
data/sig/claude_agent.rbs CHANGED
@@ -231,6 +231,15 @@ module ClaudeAgent
231
231
  def to_h: () -> Hash[Symbol, untyped]
232
232
  end
233
233
 
234
+ class SandboxFilesystemConfig
235
+ attr_reader allow_write: Array[String]
236
+ attr_reader deny_write: Array[String]
237
+ attr_reader deny_read: Array[String]
238
+
239
+ def initialize: (?allow_write: Array[String], ?deny_write: Array[String], ?deny_read: Array[String]) -> void
240
+ def to_h: () -> Hash[Symbol, untyped]
241
+ end
242
+
234
243
  class SandboxSettings
235
244
  attr_reader enabled: bool
236
245
  attr_reader auto_allow_bash_if_sandboxed: bool
@@ -240,8 +249,9 @@ module ClaudeAgent
240
249
  attr_reader ignore_violations: SandboxIgnoreViolations?
241
250
  attr_reader enable_weaker_nested_sandbox: bool
242
251
  attr_reader ripgrep: SandboxRipgrepConfig?
252
+ attr_reader filesystem: SandboxFilesystemConfig?
243
253
 
244
- def initialize: (?enabled: bool, ?auto_allow_bash_if_sandboxed: bool, ?excluded_commands: Array[String], ?allow_unsandboxed_commands: bool, ?network: SandboxNetworkConfig?, ?ignore_violations: SandboxIgnoreViolations?, ?enable_weaker_nested_sandbox: bool, ?ripgrep: SandboxRipgrepConfig?) -> void
254
+ def initialize: (?enabled: bool, ?auto_allow_bash_if_sandboxed: bool, ?excluded_commands: Array[String], ?allow_unsandboxed_commands: bool, ?network: SandboxNetworkConfig?, ?ignore_violations: SandboxIgnoreViolations?, ?enable_weaker_nested_sandbox: bool, ?ripgrep: SandboxRipgrepConfig?, ?filesystem: SandboxFilesystemConfig?) -> void
245
255
  def to_h: () -> Hash[Symbol, untyped]
246
256
  end
247
257
 
@@ -332,6 +342,9 @@ module ClaudeAgent
332
342
  attr_accessor output_format: Hash[String, untyped]?
333
343
  attr_accessor enable_file_checkpointing: bool
334
344
 
345
+ # Prompt suggestions
346
+ attr_accessor prompt_suggestions: bool
347
+
335
348
  # Beta features
336
349
  attr_accessor betas: Array[String]
337
350
 
@@ -436,7 +449,7 @@ module ClaudeAgent
436
449
  CONTENT_BLOCK_TYPES: Array[Class]
437
450
 
438
451
  # Message types
439
- type message = UserMessage | UserMessageReplay | AssistantMessage | SystemMessage | ResultMessage | StreamEvent | CompactBoundaryMessage | StatusMessage | ToolProgressMessage | HookResponseMessage | AuthStatusMessage | TaskNotificationMessage | HookStartedMessage | HookProgressMessage | ToolUseSummaryMessage | FilesPersistedEvent
452
+ type message = UserMessage | UserMessageReplay | AssistantMessage | SystemMessage | ResultMessage | StreamEvent | CompactBoundaryMessage | StatusMessage | ToolProgressMessage | HookResponseMessage | AuthStatusMessage | TaskNotificationMessage | HookStartedMessage | HookProgressMessage | ToolUseSummaryMessage | FilesPersistedEvent | TaskStartedMessage | RateLimitEvent | PromptSuggestionMessage
440
453
 
441
454
  MESSAGE_TYPES: Array[Class]
442
455
 
@@ -673,6 +686,40 @@ module ClaudeAgent
673
686
  def type: () -> :files_persisted
674
687
  end
675
688
 
689
+ # Task started message (TypeScript SDK v0.2.45 parity)
690
+ class TaskStartedMessage
691
+ attr_reader uuid: String
692
+ attr_reader session_id: String
693
+ attr_reader task_id: String
694
+ attr_reader tool_use_id: String?
695
+ attr_reader description: String?
696
+ attr_reader task_type: String?
697
+
698
+ def initialize: (uuid: String, session_id: String, task_id: String, ?tool_use_id: String?, ?description: String?, ?task_type: String?) -> void
699
+ def type: () -> :task_started
700
+ end
701
+
702
+ # Rate limit event (TypeScript SDK v0.2.45 parity)
703
+ class RateLimitEvent
704
+ attr_reader rate_limit_info: Hash[String, untyped]
705
+ attr_reader uuid: String?
706
+ attr_reader session_id: String?
707
+
708
+ def initialize: (rate_limit_info: Hash[String, untyped], ?uuid: String?, ?session_id: String?) -> void
709
+ def type: () -> :rate_limit_event
710
+ def status: () -> String?
711
+ end
712
+
713
+ # Prompt suggestion message (TypeScript SDK v0.2.47 parity)
714
+ class PromptSuggestionMessage
715
+ attr_reader uuid: String?
716
+ attr_reader session_id: String?
717
+ attr_reader suggestion: String
718
+
719
+ def initialize: (?uuid: String?, ?session_id: String?, suggestion: String) -> void
720
+ def type: () -> :prompt_suggestion
721
+ end
722
+
676
723
  # Message parser
677
724
  class MessageParser
678
725
  def initialize: (?logger: Logger?) -> void
@@ -823,6 +870,15 @@ module ClaudeAgent
823
870
  def initialize: (task_id: String, task_subject: String, ?task_description: String?, ?teammate_name: String?, ?team_name: String?, **untyped) -> void
824
871
  end
825
872
 
873
+ class ConfigChangeInput < BaseHookInput
874
+ attr_reader source: String
875
+ attr_reader file_path: String?
876
+
877
+ SOURCES: Array[String]
878
+
879
+ def initialize: (source: String, ?file_path: String?, **untyped) -> void
880
+ end
881
+
826
882
  # Permission types
827
883
  type permission_result = PermissionResultAllow | PermissionResultDeny
828
884
 
@@ -910,6 +966,7 @@ module ClaudeAgent
910
966
  def set_mcp_servers: (Hash[String, untyped] servers) -> McpSetServersResult
911
967
  def mcp_reconnect: (String server_name) -> Hash[String, untyped]
912
968
  def mcp_toggle: (String server_name, enabled: bool) -> Hash[String, untyped]
969
+ def stop_task: (String task_id) -> Hash[String, untyped]
913
970
  def supported_commands: () -> Array[SlashCommand]
914
971
  def supported_models: () -> Array[ModelInfo]
915
972
  def mcp_server_status: () -> Array[McpServerStatus]
@@ -946,6 +1003,7 @@ module ClaudeAgent
946
1003
  def set_mcp_servers: (Hash[String, untyped] servers) -> McpSetServersResult
947
1004
  def mcp_reconnect: (String server_name) -> Hash[String, untyped]
948
1005
  def mcp_toggle: (String server_name, enabled: bool) -> Hash[String, untyped]
1006
+ def stop_task: (String task_id) -> Hash[String, untyped]
949
1007
  def supported_commands: () -> Array[SlashCommand]
950
1008
  def supported_models: () -> Array[ModelInfo]
951
1009
  def mcp_server_status: () -> Array[McpServerStatus]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: claude_agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.5
4
+ version: 0.7.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Carr
@@ -43,6 +43,7 @@ files:
43
43
  - ".claude/skills/spec/SKILL.md"
44
44
  - ".claude/skills/spec/commands/complete.md"
45
45
  - ".claude/skills/spec/commands/update.md"
46
+ - ".worktreeinclude"
46
47
  - CHANGELOG.md
47
48
  - CLAUDE.md
48
49
  - LICENSE.txt