handinger 0.0.2 → 0.2.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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +35 -0
  3. data/README.md +18 -18
  4. data/lib/handinger/client.rb +21 -1
  5. data/lib/handinger/internal/transport/base_client.rb +1 -3
  6. data/lib/handinger/internal/type/base_model.rb +3 -3
  7. data/lib/handinger/models/create_task.rb +28 -0
  8. data/lib/handinger/models/create_worker.rb +59 -19
  9. data/lib/handinger/models/task.rb +119 -0
  10. data/lib/handinger/models/task_create_params.rb +14 -0
  11. data/lib/handinger/models/{worker_continue_params.rb → task_retrieve_params.rb} +6 -6
  12. data/lib/handinger/models/task_with_turns.rb +113 -0
  13. data/lib/handinger/models/worker.rb +15 -84
  14. data/lib/handinger/models/worker_create_response.rb +84 -0
  15. data/lib/handinger/models/worker_retrieve_email_response.rb +10 -1
  16. data/lib/handinger/models/worker_retrieve_params.rb +22 -4
  17. data/lib/handinger/models.rb +10 -6
  18. data/lib/handinger/resources/tasks.rb +76 -0
  19. data/lib/handinger/resources/workers.rb +31 -92
  20. data/lib/handinger/version.rb +1 -1
  21. data/lib/handinger.rb +7 -6
  22. data/rbi/handinger/client.rbi +5 -0
  23. data/rbi/handinger/internal/transport/base_client.rbi +2 -18
  24. data/rbi/handinger/models/create_task.rbi +40 -0
  25. data/rbi/handinger/models/create_worker.rbi +84 -26
  26. data/rbi/handinger/models/task.rbi +160 -0
  27. data/rbi/handinger/models/task_create_params.rbi +27 -0
  28. data/rbi/handinger/models/{worker_continue_params.rbi → task_retrieve_params.rbi} +6 -6
  29. data/rbi/handinger/models/task_with_turns.rbi +149 -0
  30. data/rbi/handinger/models/worker.rbi +16 -117
  31. data/rbi/handinger/models/worker_create_response.rbi +129 -0
  32. data/rbi/handinger/models/worker_retrieve_email_response.rbi +20 -1
  33. data/rbi/handinger/models/worker_retrieve_params.rbi +40 -6
  34. data/rbi/handinger/models.rbi +10 -6
  35. data/rbi/handinger/resources/tasks.rbi +70 -0
  36. data/rbi/handinger/resources/workers.rbi +37 -62
  37. data/sig/handinger/client.rbs +2 -0
  38. data/sig/handinger/models/create_task.rbs +19 -0
  39. data/sig/handinger/models/create_worker.rbs +44 -23
  40. data/sig/handinger/models/task.rbs +114 -0
  41. data/sig/handinger/models/task_create_params.rbs +15 -0
  42. data/sig/handinger/models/{worker_stream_updates_params.rbs → task_retrieve_params.rbs} +6 -6
  43. data/sig/handinger/models/task_with_turns.rbs +104 -0
  44. data/sig/handinger/models/worker.rbs +11 -86
  45. data/sig/handinger/models/worker_create_response.rbs +76 -0
  46. data/sig/handinger/models/worker_retrieve_email_response.rbs +9 -1
  47. data/sig/handinger/models/worker_retrieve_params.rbs +21 -5
  48. data/sig/handinger/models.rbs +10 -6
  49. data/sig/handinger/resources/tasks.rbs +24 -0
  50. data/sig/handinger/resources/workers.rbs +9 -25
  51. metadata +23 -20
  52. data/lib/handinger/internal/stream.rb +0 -29
  53. data/lib/handinger/internal/type/base_stream.rb +0 -83
  54. data/lib/handinger/models/worker_retrieve_file_params.rb +0 -26
  55. data/lib/handinger/models/worker_stream_updates_params.rb +0 -20
  56. data/lib/handinger/models/worker_stream_updates_response.rb +0 -7
  57. data/rbi/handinger/internal/stream.rbi +0 -20
  58. data/rbi/handinger/internal/type/base_stream.rbi +0 -75
  59. data/rbi/handinger/models/worker_retrieve_file_params.rbi +0 -46
  60. data/rbi/handinger/models/worker_stream_updates_params.rbi +0 -38
  61. data/rbi/handinger/models/worker_stream_updates_response.rbi +0 -7
  62. data/sig/handinger/internal/stream.rbs +0 -9
  63. data/sig/handinger/internal/type/base_stream.rbs +0 -38
  64. data/sig/handinger/models/worker_continue_params.rbs +0 -25
  65. data/sig/handinger/models/worker_retrieve_file_params.rbs +0 -28
  66. data/sig/handinger/models/worker_stream_updates_response.rbs +0 -5
@@ -0,0 +1,40 @@
1
+ # typed: strong
2
+
3
+ module Handinger
4
+ module Models
5
+ class CreateTask < Handinger::Models::CreateWorker
6
+ OrHash =
7
+ T.type_alias do
8
+ T.any(Handinger::CreateTask, Handinger::Internal::AnyHash)
9
+ end
10
+
11
+ # Worker id the task belongs to.
12
+ sig { returns(String) }
13
+ attr_accessor :worker_id
14
+
15
+ # Optional client-provided task id. Reuse this id to add turns to an existing
16
+ # task.
17
+ sig { returns(T.nilable(String)) }
18
+ attr_reader :task_id
19
+
20
+ sig { params(task_id: String).void }
21
+ attr_writer :task_id
22
+
23
+ sig do
24
+ params(worker_id: String, task_id: String).returns(T.attached_class)
25
+ end
26
+ def self.new(
27
+ # Worker id the task belongs to.
28
+ worker_id:,
29
+ # Optional client-provided task id. Reuse this id to add turns to an existing
30
+ # task.
31
+ task_id: nil
32
+ )
33
+ end
34
+
35
+ sig { override.returns({ worker_id: String, task_id: String }) }
36
+ def to_hash
37
+ end
38
+ end
39
+ end
40
+ end
@@ -8,60 +8,118 @@ module Handinger
8
8
  T.any(Handinger::CreateWorker, Handinger::Internal::AnyHash)
9
9
  end
10
10
 
11
- sig { returns(String) }
12
- attr_accessor :input
11
+ # Persistent system prompt the worker uses for every task it runs.
12
+ sig { returns(T.nilable(String)) }
13
+ attr_reader :instructions
13
14
 
14
- sig { returns(T.nilable(Handinger::CreateWorker::Budget::OrSymbol)) }
15
- attr_reader :budget
15
+ sig { params(instructions: String).void }
16
+ attr_writer :instructions
16
17
 
17
- sig { params(budget: Handinger::CreateWorker::Budget::OrSymbol).void }
18
- attr_writer :budget
18
+ # Optional JSON Schema (Draft-07) describing the structured object the worker must
19
+ # produce. When set, every task response is validated against the schema and
20
+ # exposed as `structuredOutput`.
21
+ sig { returns(T.nilable(T::Hash[Symbol, T.anything])) }
22
+ attr_reader :output_schema
19
23
 
20
- sig { returns(T.nilable(T::Boolean)) }
21
- attr_reader :stream
24
+ sig { params(output_schema: T::Hash[Symbol, T.anything]).void }
25
+ attr_writer :output_schema
22
26
 
23
- sig { params(stream: T::Boolean).void }
24
- attr_writer :stream
27
+ # Natural-language description of the worker to use for AI-generated instructions
28
+ # when `instructions` is omitted.
29
+ sig { returns(T.nilable(String)) }
30
+ attr_reader :prompt
31
+
32
+ sig { params(prompt: String).void }
33
+ attr_writer :prompt
34
+
35
+ # Short one-line description of the worker's purpose. Auto-generated when omitted
36
+ # and a `prompt` is provided.
37
+ sig { returns(T.nilable(String)) }
38
+ attr_reader :summary
39
+
40
+ sig { params(summary: String).void }
41
+ attr_writer :summary
42
+
43
+ # Optional display name. When omitted, Handinger assigns a random dog-themed name.
44
+ sig { returns(T.nilable(String)) }
45
+ attr_reader :title
46
+
47
+ sig { params(title: String).void }
48
+ attr_writer :title
49
+
50
+ # `public` (default) is visible to all org members. `private` is only visible to
51
+ # invited members.
52
+ sig { returns(T.nilable(Handinger::CreateWorker::Visibility::OrSymbol)) }
53
+ attr_reader :visibility
54
+
55
+ sig do
56
+ params(visibility: Handinger::CreateWorker::Visibility::OrSymbol).void
57
+ end
58
+ attr_writer :visibility
25
59
 
26
60
  sig do
27
61
  params(
28
- input: String,
29
- budget: Handinger::CreateWorker::Budget::OrSymbol,
30
- stream: T::Boolean
62
+ instructions: String,
63
+ output_schema: T::Hash[Symbol, T.anything],
64
+ prompt: String,
65
+ summary: String,
66
+ title: String,
67
+ visibility: Handinger::CreateWorker::Visibility::OrSymbol
31
68
  ).returns(T.attached_class)
32
69
  end
33
- def self.new(input:, budget: nil, stream: nil)
70
+ def self.new(
71
+ # Persistent system prompt the worker uses for every task it runs.
72
+ instructions: nil,
73
+ # Optional JSON Schema (Draft-07) describing the structured object the worker must
74
+ # produce. When set, every task response is validated against the schema and
75
+ # exposed as `structuredOutput`.
76
+ output_schema: nil,
77
+ # Natural-language description of the worker to use for AI-generated instructions
78
+ # when `instructions` is omitted.
79
+ prompt: nil,
80
+ # Short one-line description of the worker's purpose. Auto-generated when omitted
81
+ # and a `prompt` is provided.
82
+ summary: nil,
83
+ # Optional display name. When omitted, Handinger assigns a random dog-themed name.
84
+ title: nil,
85
+ # `public` (default) is visible to all org members. `private` is only visible to
86
+ # invited members.
87
+ visibility: nil
88
+ )
34
89
  end
35
90
 
36
91
  sig do
37
92
  override.returns(
38
93
  {
39
- input: String,
40
- budget: Handinger::CreateWorker::Budget::OrSymbol,
41
- stream: T::Boolean
94
+ instructions: String,
95
+ output_schema: T::Hash[Symbol, T.anything],
96
+ prompt: String,
97
+ summary: String,
98
+ title: String,
99
+ visibility: Handinger::CreateWorker::Visibility::OrSymbol
42
100
  }
43
101
  )
44
102
  end
45
103
  def to_hash
46
104
  end
47
105
 
48
- module Budget
106
+ # `public` (default) is visible to all org members. `private` is only visible to
107
+ # invited members.
108
+ module Visibility
49
109
  extend Handinger::Internal::Type::Enum
50
110
 
51
111
  TaggedSymbol =
52
- T.type_alias { T.all(Symbol, Handinger::CreateWorker::Budget) }
112
+ T.type_alias { T.all(Symbol, Handinger::CreateWorker::Visibility) }
53
113
  OrSymbol = T.type_alias { T.any(Symbol, String) }
54
114
 
55
- LOW = T.let(:low, Handinger::CreateWorker::Budget::TaggedSymbol)
56
- STANDARD =
57
- T.let(:standard, Handinger::CreateWorker::Budget::TaggedSymbol)
58
- HIGH = T.let(:high, Handinger::CreateWorker::Budget::TaggedSymbol)
59
- UNLIMITED =
60
- T.let(:unlimited, Handinger::CreateWorker::Budget::TaggedSymbol)
115
+ PUBLIC =
116
+ T.let(:public, Handinger::CreateWorker::Visibility::TaggedSymbol)
117
+ PRIVATE =
118
+ T.let(:private, Handinger::CreateWorker::Visibility::TaggedSymbol)
61
119
 
62
120
  sig do
63
121
  override.returns(
64
- T::Array[Handinger::CreateWorker::Budget::TaggedSymbol]
122
+ T::Array[Handinger::CreateWorker::Visibility::TaggedSymbol]
65
123
  )
66
124
  end
67
125
  def self.values
@@ -0,0 +1,160 @@
1
+ # typed: strong
2
+
3
+ module Handinger
4
+ module Models
5
+ class Task < Handinger::Internal::Type::BaseModel
6
+ OrHash =
7
+ T.type_alias { T.any(Handinger::Task, Handinger::Internal::AnyHash) }
8
+
9
+ sig { returns(String) }
10
+ attr_accessor :id
11
+
12
+ sig { returns(T.nilable(String)) }
13
+ attr_accessor :completed_at
14
+
15
+ sig { returns(String) }
16
+ attr_accessor :created_at
17
+
18
+ sig { returns(T.nilable(String)) }
19
+ attr_accessor :created_by_user_id
20
+
21
+ sig { returns(String) }
22
+ attr_accessor :organization_id
23
+
24
+ sig { returns(Handinger::Task::Status::TaggedSymbol) }
25
+ attr_accessor :status
26
+
27
+ sig { returns(String) }
28
+ attr_accessor :title
29
+
30
+ sig { returns(Handinger::Task::Totals) }
31
+ attr_reader :totals
32
+
33
+ sig { params(totals: Handinger::Task::Totals::OrHash).void }
34
+ attr_writer :totals
35
+
36
+ sig { returns(Handinger::Task::TriggeredBy::TaggedSymbol) }
37
+ attr_accessor :triggered_by
38
+
39
+ sig { returns(String) }
40
+ attr_accessor :worker_id
41
+
42
+ sig do
43
+ params(
44
+ id: String,
45
+ completed_at: T.nilable(String),
46
+ created_at: String,
47
+ created_by_user_id: T.nilable(String),
48
+ organization_id: String,
49
+ status: Handinger::Task::Status::OrSymbol,
50
+ title: String,
51
+ totals: Handinger::Task::Totals::OrHash,
52
+ triggered_by: Handinger::Task::TriggeredBy::OrSymbol,
53
+ worker_id: String
54
+ ).returns(T.attached_class)
55
+ end
56
+ def self.new(
57
+ id:,
58
+ completed_at:,
59
+ created_at:,
60
+ created_by_user_id:,
61
+ organization_id:,
62
+ status:,
63
+ title:,
64
+ totals:,
65
+ triggered_by:,
66
+ worker_id:
67
+ )
68
+ end
69
+
70
+ sig do
71
+ override.returns(
72
+ {
73
+ id: String,
74
+ completed_at: T.nilable(String),
75
+ created_at: String,
76
+ created_by_user_id: T.nilable(String),
77
+ organization_id: String,
78
+ status: Handinger::Task::Status::TaggedSymbol,
79
+ title: String,
80
+ totals: Handinger::Task::Totals,
81
+ triggered_by: Handinger::Task::TriggeredBy::TaggedSymbol,
82
+ worker_id: String
83
+ }
84
+ )
85
+ end
86
+ def to_hash
87
+ end
88
+
89
+ module Status
90
+ extend Handinger::Internal::Type::Enum
91
+
92
+ TaggedSymbol = T.type_alias { T.all(Symbol, Handinger::Task::Status) }
93
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
94
+
95
+ PENDING = T.let(:pending, Handinger::Task::Status::TaggedSymbol)
96
+ RUNNING = T.let(:running, Handinger::Task::Status::TaggedSymbol)
97
+ COMPLETED = T.let(:completed, Handinger::Task::Status::TaggedSymbol)
98
+ ERROR = T.let(:error, Handinger::Task::Status::TaggedSymbol)
99
+ ABORTED = T.let(:aborted, Handinger::Task::Status::TaggedSymbol)
100
+
101
+ sig do
102
+ override.returns(T::Array[Handinger::Task::Status::TaggedSymbol])
103
+ end
104
+ def self.values
105
+ end
106
+ end
107
+
108
+ class Totals < Handinger::Internal::Type::BaseModel
109
+ OrHash =
110
+ T.type_alias do
111
+ T.any(Handinger::Task::Totals, Handinger::Internal::AnyHash)
112
+ end
113
+
114
+ sig { returns(Float) }
115
+ attr_accessor :credits
116
+
117
+ sig { returns(Float) }
118
+ attr_accessor :duration_ms
119
+
120
+ sig { returns(Float) }
121
+ attr_accessor :turn_count
122
+
123
+ sig do
124
+ params(credits: Float, duration_ms: Float, turn_count: Float).returns(
125
+ T.attached_class
126
+ )
127
+ end
128
+ def self.new(credits:, duration_ms:, turn_count:)
129
+ end
130
+
131
+ sig do
132
+ override.returns(
133
+ { credits: Float, duration_ms: Float, turn_count: Float }
134
+ )
135
+ end
136
+ def to_hash
137
+ end
138
+ end
139
+
140
+ module TriggeredBy
141
+ extend Handinger::Internal::Type::Enum
142
+
143
+ TaggedSymbol =
144
+ T.type_alias { T.all(Symbol, Handinger::Task::TriggeredBy) }
145
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
146
+
147
+ API = T.let(:api, Handinger::Task::TriggeredBy::TaggedSymbol)
148
+ EMAIL = T.let(:email, Handinger::Task::TriggeredBy::TaggedSymbol)
149
+ SCHEDULE = T.let(:schedule, Handinger::Task::TriggeredBy::TaggedSymbol)
150
+ UI = T.let(:ui, Handinger::Task::TriggeredBy::TaggedSymbol)
151
+
152
+ sig do
153
+ override.returns(T::Array[Handinger::Task::TriggeredBy::TaggedSymbol])
154
+ end
155
+ def self.values
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,27 @@
1
+ # typed: strong
2
+
3
+ module Handinger
4
+ module Models
5
+ class TaskCreateParams < Handinger::Models::CreateTask
6
+ extend Handinger::Internal::Type::RequestParameters::Converter
7
+ include Handinger::Internal::Type::RequestParameters
8
+
9
+ OrHash =
10
+ T.type_alias do
11
+ T.any(Handinger::TaskCreateParams, Handinger::Internal::AnyHash)
12
+ end
13
+
14
+ sig do
15
+ params(request_options: Handinger::RequestOptions::OrHash).returns(
16
+ T.attached_class
17
+ )
18
+ end
19
+ def self.new(request_options: {})
20
+ end
21
+
22
+ sig { override.returns({ request_options: Handinger::RequestOptions }) }
23
+ def to_hash
24
+ end
25
+ end
26
+ end
27
+ end
@@ -2,30 +2,30 @@
2
2
 
3
3
  module Handinger
4
4
  module Models
5
- class WorkerContinueParams < Handinger::Models::CreateWorker
5
+ class TaskRetrieveParams < Handinger::Internal::Type::BaseModel
6
6
  extend Handinger::Internal::Type::RequestParameters::Converter
7
7
  include Handinger::Internal::Type::RequestParameters
8
8
 
9
9
  OrHash =
10
10
  T.type_alias do
11
- T.any(Handinger::WorkerContinueParams, Handinger::Internal::AnyHash)
11
+ T.any(Handinger::TaskRetrieveParams, Handinger::Internal::AnyHash)
12
12
  end
13
13
 
14
14
  sig { returns(String) }
15
- attr_accessor :worker_id
15
+ attr_accessor :task_id
16
16
 
17
17
  sig do
18
18
  params(
19
- worker_id: String,
19
+ task_id: String,
20
20
  request_options: Handinger::RequestOptions::OrHash
21
21
  ).returns(T.attached_class)
22
22
  end
23
- def self.new(worker_id:, request_options: {})
23
+ def self.new(task_id:, request_options: {})
24
24
  end
25
25
 
26
26
  sig do
27
27
  override.returns(
28
- { worker_id: String, request_options: Handinger::RequestOptions }
28
+ { task_id: String, request_options: Handinger::RequestOptions }
29
29
  )
30
30
  end
31
31
  def to_hash
@@ -0,0 +1,149 @@
1
+ # typed: strong
2
+
3
+ module Handinger
4
+ module Models
5
+ class TaskWithTurns < Handinger::Internal::Type::BaseModel
6
+ OrHash =
7
+ T.type_alias do
8
+ T.any(Handinger::TaskWithTurns, Handinger::Internal::AnyHash)
9
+ end
10
+
11
+ sig { returns(Handinger::Task) }
12
+ attr_reader :task
13
+
14
+ sig { params(task: Handinger::Task::OrHash).void }
15
+ attr_writer :task
16
+
17
+ sig { returns(T::Array[Handinger::TaskWithTurns::Turn]) }
18
+ attr_accessor :turns
19
+
20
+ sig do
21
+ params(
22
+ task: Handinger::Task::OrHash,
23
+ turns: T::Array[Handinger::TaskWithTurns::Turn::OrHash]
24
+ ).returns(T.attached_class)
25
+ end
26
+ def self.new(task:, turns:)
27
+ end
28
+
29
+ sig do
30
+ override.returns(
31
+ {
32
+ task: Handinger::Task,
33
+ turns: T::Array[Handinger::TaskWithTurns::Turn]
34
+ }
35
+ )
36
+ end
37
+ def to_hash
38
+ end
39
+
40
+ class Turn < Handinger::Internal::Type::BaseModel
41
+ OrHash =
42
+ T.type_alias do
43
+ T.any(Handinger::TaskWithTurns::Turn, Handinger::Internal::AnyHash)
44
+ end
45
+
46
+ sig { returns(String) }
47
+ attr_accessor :id
48
+
49
+ sig { returns(T.nilable(String)) }
50
+ attr_accessor :completed_at
51
+
52
+ sig { returns(Float) }
53
+ attr_accessor :credits
54
+
55
+ sig { returns(Integer) }
56
+ attr_accessor :duration_ms
57
+
58
+ sig { returns(String) }
59
+ attr_accessor :input
60
+
61
+ sig { returns(Integer) }
62
+ attr_accessor :input_tokens
63
+
64
+ sig { returns(String) }
65
+ attr_accessor :output_text
66
+
67
+ sig { returns(Integer) }
68
+ attr_accessor :output_tokens
69
+
70
+ sig { returns(String) }
71
+ attr_accessor :role
72
+
73
+ sig { returns(Integer) }
74
+ attr_accessor :seq
75
+
76
+ sig { returns(String) }
77
+ attr_accessor :started_at
78
+
79
+ sig { returns(String) }
80
+ attr_accessor :status
81
+
82
+ sig { returns(T.nilable(T::Hash[Symbol, T.anything])) }
83
+ attr_accessor :structured_output
84
+
85
+ sig { returns(String) }
86
+ attr_accessor :task_id
87
+
88
+ sig do
89
+ params(
90
+ id: String,
91
+ completed_at: T.nilable(String),
92
+ credits: Float,
93
+ duration_ms: Integer,
94
+ input: String,
95
+ input_tokens: Integer,
96
+ output_text: String,
97
+ output_tokens: Integer,
98
+ role: String,
99
+ seq: Integer,
100
+ started_at: String,
101
+ status: String,
102
+ structured_output: T.nilable(T::Hash[Symbol, T.anything]),
103
+ task_id: String
104
+ ).returns(T.attached_class)
105
+ end
106
+ def self.new(
107
+ id:,
108
+ completed_at:,
109
+ credits:,
110
+ duration_ms:,
111
+ input:,
112
+ input_tokens:,
113
+ output_text:,
114
+ output_tokens:,
115
+ role:,
116
+ seq:,
117
+ started_at:,
118
+ status:,
119
+ structured_output:,
120
+ task_id:
121
+ )
122
+ end
123
+
124
+ sig do
125
+ override.returns(
126
+ {
127
+ id: String,
128
+ completed_at: T.nilable(String),
129
+ credits: Float,
130
+ duration_ms: Integer,
131
+ input: String,
132
+ input_tokens: Integer,
133
+ output_text: String,
134
+ output_tokens: Integer,
135
+ role: String,
136
+ seq: Integer,
137
+ started_at: String,
138
+ status: String,
139
+ structured_output: T.nilable(T::Hash[Symbol, T.anything]),
140
+ task_id: String
141
+ }
142
+ )
143
+ end
144
+ def to_hash
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end