pinecall 0.0.1

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 (56) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +167 -0
  3. data/LICENSE +202 -0
  4. data/README.md +140 -0
  5. data/lib/pinecall/agent/author.rb +31 -0
  6. data/lib/pinecall/agent/config.rb +124 -0
  7. data/lib/pinecall/agent/doc.rb +73 -0
  8. data/lib/pinecall/agent/knowledge.rb +18 -0
  9. data/lib/pinecall/agent/searching.rb +33 -0
  10. data/lib/pinecall/agent/spec.rb +133 -0
  11. data/lib/pinecall/agent/state.rb +185 -0
  12. data/lib/pinecall/agent/tools.rb +119 -0
  13. data/lib/pinecall/agent.rb +160 -0
  14. data/lib/pinecall/blocks.rb +152 -0
  15. data/lib/pinecall/bridge.rb +239 -0
  16. data/lib/pinecall/call_world/answers.rb +61 -0
  17. data/lib/pinecall/call_world/room.rb +25 -0
  18. data/lib/pinecall/call_world.rb +175 -0
  19. data/lib/pinecall/client/agent.rb +179 -0
  20. data/lib/pinecall/client/call.rb +140 -0
  21. data/lib/pinecall/client/connection.rb +190 -0
  22. data/lib/pinecall/client/endpoints.rb +30 -0
  23. data/lib/pinecall/client/listeners.rb +42 -0
  24. data/lib/pinecall/client/observe.rb +109 -0
  25. data/lib/pinecall/client/rest.rb +61 -0
  26. data/lib/pinecall/client.rb +212 -0
  27. data/lib/pinecall/errors.rb +53 -0
  28. data/lib/pinecall/panel.rb +138 -0
  29. data/lib/pinecall/reading.rb +37 -0
  30. data/lib/pinecall/rules.rb +38 -0
  31. data/lib/pinecall/serve/held.rb +40 -0
  32. data/lib/pinecall/serve/loading.rb +102 -0
  33. data/lib/pinecall/serve/viewing.rb +40 -0
  34. data/lib/pinecall/serve.rb +169 -0
  35. data/lib/pinecall/testing.rb +190 -0
  36. data/lib/pinecall/version.rb +6 -0
  37. data/lib/pinecall/view.rb +70 -0
  38. data/lib/pinecall/wire/codec.rb +75 -0
  39. data/lib/pinecall/wire/enums.rb +104 -0
  40. data/lib/pinecall/wire/errors.rb +12 -0
  41. data/lib/pinecall/wire/reduce.rb +249 -0
  42. data/lib/pinecall/wire/registry.rb +168 -0
  43. data/lib/pinecall/wire/shapes.rb +33 -0
  44. data/lib/pinecall/wire/shapes_call_events.rb +137 -0
  45. data/lib/pinecall/wire/shapes_commands.rb +114 -0
  46. data/lib/pinecall/wire/shapes_config.rb +70 -0
  47. data/lib/pinecall/wire/shapes_doors.rb +96 -0
  48. data/lib/pinecall/wire/shapes_events.rb +358 -0
  49. data/lib/pinecall/wire/shapes_metrics.rb +109 -0
  50. data/lib/pinecall/wire/shapes_parts.rb +340 -0
  51. data/lib/pinecall/wire/state.rb +56 -0
  52. data/lib/pinecall/wire/validate.rb +154 -0
  53. data/lib/pinecall/wire.rb +43 -0
  54. data/lib/pinecall.rb +45 -0
  55. data/sig/pinecall.rbs +453 -0
  56. metadata +119 -0
data/sig/pinecall.rbs ADDED
@@ -0,0 +1,453 @@
1
+ # The public surface, as types. Ruby's answer to the `.d.ts` the TypeScript package ships.
2
+ #
3
+ # The state a class declares is generated at load, so it cannot be typed here — that is what a
4
+ # tenant's own `sig/` is for, one line per `state`. Everything the framework itself offers is.
5
+
6
+ module Pinecall
7
+ VERSION: String
8
+
9
+ type state = Hash[Symbol, untyped]
10
+ type spec = Hash[Symbol, untyped]
11
+ type line = { channel: String, ?from: String?, ?claimed: String? }
12
+
13
+ class Error < StandardError
14
+ end
15
+
16
+ class Refused < Error
17
+ attr_reader refusal: Hash[Symbol, untyped]
18
+ def code: () -> String
19
+ end
20
+
21
+ class UnauthoredWrite < Error
22
+ end
23
+
24
+ class DeclarationRefused < Error
25
+ end
26
+
27
+ class DevRefused < Error
28
+ attr_reader status: Integer
29
+ attr_reader detail: String
30
+ def initialize: (Integer, String) -> void
31
+ end
32
+
33
+ class ToolFailed < Error
34
+ end
35
+
36
+ class NotConnected < Error
37
+ end
38
+
39
+ class Reading
40
+ def initialize: (state, ?Array[String]) -> void
41
+ def to_h: () -> state
42
+ def []: (String | Symbol) -> untyped
43
+ def key?: (String | Symbol) -> bool
44
+ def fetch: (String | Symbol, *untyped) -> untyped
45
+ def remembers?: (String) -> bool
46
+ end
47
+
48
+ type block_spec = { name: String, region: String }
49
+
50
+ class Block
51
+ attr_reader name: String
52
+ attr_reader region: String
53
+ attr_reader text: String
54
+ end
55
+
56
+ class Blocks
57
+ attr_reader blocks: Array[Block]
58
+ attr_reader history: String
59
+ def []: (String | Symbol) -> String?
60
+ def static: () -> Array[Block]
61
+ def dynamic: () -> Array[Block]
62
+ def instructions: () -> String
63
+ end
64
+
65
+ class View
66
+ def self.beside: (String, String) -> String
67
+ def self.file: (String) -> View
68
+ def self.inline: (String, ?String) -> View
69
+ attr_reader path: String
70
+ def render: (Reading) -> String
71
+ def tidy: (String) -> String
72
+ end
73
+
74
+ class Agent
75
+ def self.written: () -> Array[Class]
76
+
77
+ # config, declared on the class
78
+ def self.phone: (?String) -> untyped
79
+ def self.whatsapp: (?String) -> untyped
80
+ def self.web: (?bool) -> untyped
81
+ def self.channel_rules: (?bool) -> untyped
82
+
83
+ # the console's panel, drawn by `view.render`
84
+ def self.panel: (?String) { (Panel::Who) -> void } -> Panel::Declared
85
+ def self.declared_panel: () -> Panel::Declared?
86
+
87
+ # the world's, refused at load with the verb that sets each
88
+ def self.voice: (*untyped, **untyped) -> bot
89
+ def self.llm: (*untyped, **untyped) -> bot
90
+ def self.stt: (*untyped, **untyped) -> bot
91
+ def self.greeting: (*untyped, **untyped) -> bot
92
+ def self.hangup: (*untyped, **untyped) -> bot
93
+ def self.says: (*untyped, **untyped) -> bot
94
+ def self.hears: (*untyped, **untyped) -> bot
95
+ def self.memory: (*untyped, **untyped) -> bot
96
+ def self.record: (*untyped, **untyped) -> bot
97
+ def self.knowledge: (*untyped, **untyped) -> bot
98
+ def self.docs: (*untyped, **untyped) -> bot
99
+
100
+ def self.doc: (?String) -> String?
101
+ def self.slug: (?String) -> String
102
+ def self.declared_slug: () -> String?
103
+ def self.accepts: (String | Symbol, from: Array[String | Symbol]) -> untyped
104
+ def self.wire_config: (?tools: Array[spec]?) -> Hash[Symbol, untyped]
105
+
106
+ # the state and the verbs
107
+ def self.state: (Symbol, ?untyped, ?visibility: Symbol?) ?{ () -> untyped } -> Symbol
108
+ def self.stage: (*Symbol) -> Array[Symbol]
109
+ def self.stages: () -> Array[Symbol]?
110
+ def self.declared_state: () -> Hash[Symbol, untyped]
111
+ def self.derived_state: () -> Hash[Symbol, untyped]
112
+ def self.state_names: () -> Array[Symbol]
113
+ def self.tool: (**untyped) -> untyped
114
+ def self.declared_tools: () -> Hash[Symbol, untyped]
115
+ def self.tool_named: (String | Symbol) -> untyped
116
+ def self.view: (?String?, ?template: String?) -> View?
117
+ def self.beside_this_file: (String) -> String
118
+ def self.source_file: () -> String?
119
+
120
+ def doc: () -> String?
121
+ def tools: () -> Array[spec]
122
+ def visible_tools: () -> Array[spec]
123
+ def run_tool: (String | Symbol, ?Hash[Symbol, untyped]) -> untyped
124
+ def snapshot: () -> state
125
+ def restore: (state) -> Agent
126
+ def start_in: (state) -> Agent
127
+ def diff: (state, ?state) -> Array[Hash[Symbol, untyped]]
128
+ def collapse: (String) -> untyped
129
+ def changes: () -> Array[untyped]
130
+ def on_change: () { (untyped) -> void } -> ^() -> void
131
+ def on_log: () { (untyped) -> void } -> ^() -> void
132
+ def on_heard: () { (String, Hash[Symbol, untyped], Hash[Symbol, untyped]) -> void } -> ^() -> void
133
+ def seal: () -> Agent
134
+ def sealed?: () -> bool
135
+ def call: () -> CallWorld
136
+ def call?: () -> bool
137
+ def knowledge: () -> Agent::Knowledge
138
+ def say: (String, **untyped) -> bool
139
+ def reply: (String, **untyped) -> bool
140
+ def log: (String | Symbol, ?untyped) -> untyped
141
+ def logged: () -> Array[untyped]
142
+ def last: (String) -> state?
143
+ def on_call: (CallWorld) -> void
144
+ def on_end: (CallWorld) -> void
145
+ def on_event: (String, Hash[Symbol, untyped], Hash[Symbol, untyped]) -> void
146
+ def on_memory: (Array[untyped], CallWorld) -> void
147
+ def run_hook: (Symbol, *untyped) -> untyped
148
+ def serving: (CallWorld?) -> Agent
149
+ def reads_last_from: (^(String) -> state?) -> Agent
150
+ def notify_heard: (String, Hash[Symbol, untyped], Hash[Symbol, untyped]) -> void
151
+
152
+ module Author
153
+ KEY: Symbol
154
+ def self?.current: () -> String?
155
+ def self?.with: [T] (String) { () -> T } -> T
156
+ end
157
+
158
+ module Doc
159
+ def self.for_class: (Class) -> String?
160
+ def self.for_method: (Class, Symbol) -> String?
161
+ def self.above: (String, Integer) -> String?
162
+ def self.one_line: (Array[String]) -> String?
163
+ def self.forget: () -> untyped
164
+ end
165
+ end
166
+
167
+ class Agent
168
+ class Knowledge
169
+ def initialize: (Agent) -> void
170
+ def search: (String, ?k: Integer?) -> Array[CallWorld::Found]
171
+ end
172
+
173
+ module Searching
174
+ SEARCHES: Array[Array[String]]
175
+ def self.searches?: (Class) -> bool
176
+ def self.in_source?: (String) -> bool
177
+ end
178
+ end
179
+
180
+ class CallWorld
181
+ LANDS_WITHIN_S: Integer
182
+ TRANSFER_WITHIN_S: Integer
183
+ A_MOMENT_S: Integer
184
+ NO_ANSWER: String
185
+ THE_CALL_ENDED: String
186
+ NO_GATEWAY_TO_SEARCH: String
187
+
188
+ class Transferred
189
+ attr_reader to: String
190
+ attr_reader mode: String?
191
+ attr_reader ok: bool
192
+ attr_reader error: String?
193
+ def initialize: (to: String, mode: String?, ok: bool, error: String?) -> void
194
+ end
195
+
196
+ class Attended
197
+ attr_reader ok: bool
198
+ attr_reader by: Hash[Symbol, untyped]?
199
+ attr_reader error: String?
200
+ def initialize: (ok: bool, by: Hash[Symbol, untyped]?, error: String?) -> void
201
+ end
202
+
203
+ class Found
204
+ attr_reader path: String
205
+ attr_reader heading: String?
206
+ attr_reader text: String
207
+ def initialize: (path: String, heading: String?, text: String) -> void
208
+ end
209
+
210
+ class Waiting
211
+ def wait: [T] (Symbol, Numeric, T) { () -> void } -> T
212
+ def settle: (Symbol, untyped) -> void
213
+ def end_all: () -> void
214
+ end
215
+
216
+ attr_reader id: String
217
+ attr_reader contact: String?
218
+ attr_reader from: String?
219
+ attr_reader channel: String?
220
+ attr_reader medium: String
221
+ attr_reader today: String
222
+ attr_reader claimed: String?
223
+ attr_accessor cause: Hash[Symbol, untyped]?
224
+ def initialize: (id: String, ?contact: String?, ?from: String?, ?channel: String?, ?medium: String?, ?today: String, ?claimed: String?,
225
+ ?searching: (^(String, Integer?) -> Array[Hash[Symbol, untyped]])?) { (String, Hash[Symbol, untyped]) -> untyped } -> void
226
+ def numbered: () -> Integer
227
+ def say: (String, **untyped) -> bool
228
+ def reply: (String, **untyped) -> bool
229
+ def search: (String, ?k: Integer?) -> Array[Found]
230
+ def transfer: (String, ?mode: (String | Symbol)?) -> Transferred
231
+ def attention: (String, wait_s: Numeric) -> Attended
232
+ def hold: () -> untyped
233
+ def unhold: () -> untyped
234
+ def dtmf: (String) -> untyped
235
+ def claim: (String) -> untyped
236
+ def callback: (String, ?at: String?, ?note: String?) -> untyped
237
+ def send_to: (String, untyped, ?to: Array[String]?) -> untyped
238
+ def participant: (String) -> untyped
239
+ def invite: (String, ?kind: String?) -> untyped
240
+ def log: (String | Symbol, ?Hash[Symbol, untyped]) -> untyped
241
+ def opt_out: (?String?) -> untyped
242
+ def hangup: (?String?) -> untyped
243
+ def take: (String, Hash[Symbol, untyped], Float) -> untyped
244
+ def participants: () -> Array[untyped]
245
+ def caller_seat: () -> untyped
246
+ def last_turn: () -> untyped
247
+ end
248
+
249
+ class Client
250
+ attr_reader url: String
251
+ attr_reader api_key: String
252
+ STOPPED: String
253
+ TOOLS_FINISH_WITHIN_S: Integer
254
+
255
+ class Drained
256
+ attr_reader handed: Integer
257
+ attr_reader parked: Integer
258
+ attr_reader tools: Integer
259
+ attr_reader finished: Integer
260
+ def initialize: (handed: Integer, parked: Integer, tools: Integer, finished: Integer) -> void
261
+ end
262
+
263
+ attr_reader env: String?
264
+ def initialize: (url: String, api_key: String, ?env: String?, ?ping_every: Numeric, ?backoff: Hash[Symbol, Numeric]) -> void
265
+ def drain: (?answer_s: Numeric, ?tools_s: Numeric) -> Drained
266
+ def on_entries: () { (untyped) -> void } -> ^() -> void
267
+ def on_stopped: () { (String) -> void } -> ^() -> void
268
+ def sdk: () -> String
269
+ def agent: (String, **untyped) -> Client::Agent
270
+ def agents: () -> Hash[String, Client::Agent]
271
+ def connect: () -> Client
272
+ def close: () -> untyped
273
+ def connected?: () -> bool
274
+ def on: (String) { (Hash[Symbol, untyped], Client::Call?) -> void } -> ^() -> void
275
+ def on_any: () { (untyped, Client::Call?) -> void } -> ^() -> void
276
+ def on_errors: () { (StandardError) -> void } -> ^() -> void
277
+ def observe: (Hash[Symbol, String], **untyped) { (untyped) -> void } -> void
278
+ def history: (Hash[Symbol, String], **untyped) -> untyped
279
+ def search: (String, String, ?k: Integer?) -> Array[Hash[Symbol, untyped]]
280
+ def send_command: (type: String, agent: String, call: String?, data: Hash[Symbol, untyped], ?id: String?) -> untyped
281
+ def seen: (untyped, Client::Call?) -> void
282
+ def on_error: (StandardError) -> void
283
+ def on_connected: () { () -> void } -> ^() -> void
284
+
285
+ class Agent
286
+ NO_DEV_HANDLER: String
287
+ attr_reader slug: String
288
+ attr_reader calls: CallBook
289
+ attr_reader config: Hash[Symbol, untyped]
290
+ attr_reader app: String?
291
+ def on: (String) { (Hash[Symbol, untyped], Client::Call?) -> void } -> ^() -> void
292
+ def on_any: () { (untyped, Client::Call?) -> void } -> ^() -> void
293
+ def on_dev: () { (String, Hash[Symbol, untyped]) -> Hash[Symbol, untyped] } -> untyped
294
+ def declare: (Array[Hash[Symbol, untyped]]) -> void
295
+ def configure: (?Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
296
+ def open: () -> Agent
297
+ def take: (untyped) -> void
298
+ def command: (String, String?, Hash[Symbol, untyped]) -> untyped
299
+ def ping: () -> untyped
300
+ def drain: (?answer_s: Numeric) -> Hash[Symbol, untyped]
301
+ def in_flight: () -> Integer
302
+ def settled: (?within_s: Numeric?) -> nil
303
+ def on_error: (StandardError) -> void
304
+ end
305
+
306
+ class Call
307
+ attr_reader id: String
308
+ attr_reader claimed: String?
309
+ attr_reader run: String?
310
+ attr_reader medium: String?
311
+ attr_reader today: String
312
+ attr_accessor status: String
313
+ attr_accessor channel: String?
314
+ attr_accessor from: String?
315
+ attr_accessor to: String?
316
+ attr_accessor contact: Hash[Symbol, untyped]?
317
+ attr_accessor state: Hash[Symbol, untyped]
318
+ def say: (String, **untyped) -> untyped
319
+ def reply: (String, **untyped) -> untyped
320
+ def set_prompt: (String | Symbol, String) -> untyped
321
+ def set_tools: (Array[Hash[Symbol, untyped]]) -> untyped
322
+ def set_state: (Hash[Symbol, untyped], ?Array[Symbol | String]?) -> untyped
323
+ def tool_result: (Hash[Symbol, untyped]) -> untyped
324
+ def event: (String, Hash[Symbol, untyped]) -> untyped
325
+ def hangup: (?String?) -> untyped
326
+ def log: (String | Symbol, ?Hash[Symbol, untyped]) -> untyped
327
+ def command: (String, Hash[Symbol, untyped]) -> untyped
328
+ def take: (untyped) -> void
329
+ def on: (String) { (Hash[Symbol, untyped], Call) -> void } -> ^() -> void
330
+ def on_any: () { (untyped, Call) -> void } -> ^() -> void
331
+ end
332
+
333
+ class CallBook
334
+ def live: () -> Array[Call]
335
+ def of: (String, Float) -> Call
336
+ def forget: (Call) -> untyped
337
+ end
338
+
339
+ class Listeners
340
+ def on: (String | Symbol) { (untyped, untyped) -> void } -> ^() -> void
341
+ def on_any: () { (untyped, untyped) -> void } -> ^() -> void
342
+ def emit: (untyped, untyped) -> void
343
+ end
344
+
345
+ module Rest
346
+ def self?.get: (String, api_key: String) -> Hash[Symbol, untyped]?
347
+ def self?.put: (String, untyped, api_key: String) -> Hash[Symbol, untyped]?
348
+ def self?.post: (String, untyped, api_key: String) -> Hash[Symbol, untyped]?
349
+ def self?.delete: (String, api_key: String) -> Hash[Symbol, untyped]?
350
+ end
351
+ end
352
+
353
+ module Prompt
354
+ FRAMEWORK: Array[block_spec]
355
+ def self?.render: (Agent, ?resumed: bool, ?remembered: Array[String], ?line: line?) -> Blocks
356
+ def self?.identity: (Agent) -> String
357
+ def self?.tools: (Agent) -> String
358
+ def self?.history: (Agent) -> String
359
+ def self?.collapsed: (Integer) -> String
360
+ def self?.show: (Agent, **untyped) -> String
361
+ def self?.header_for: (Symbol | String, ?String?) -> String
362
+ end
363
+
364
+ module Serve
365
+ USAGE: String
366
+ NO_DOOR: String
367
+ WORLDS: Array[String]
368
+
369
+ class CannotServe < Error
370
+ end
371
+
372
+ class Served
373
+ attr_reader file: String
374
+ attr_reader slug: String
375
+ def initialize: (file: String, slug: String) -> void
376
+ end
377
+
378
+ class Held
379
+ attr_reader client: Client
380
+ attr_reader mounted: Array[Bridge::Mounted]
381
+ def initialize: (Client, Array[Bridge::Mounted]) -> void
382
+ def stop: () -> Client::Drained
383
+ def close: () -> untyped
384
+ def join: () -> untyped
385
+ end
386
+
387
+ module Viewing
388
+ ONLY_THE_VIEW: String
389
+ def self?.answer: (Class, String, String, untyped) -> Hash[Symbol, untyped]
390
+ def self?.a_conversation: (String, untyped) -> Panel::Who
391
+ end
392
+
393
+ def self?.main: (Array[String], ?out: IO, ?err: IO, ?env: Hash[String, String], ?input: IO, ?signals: Thread::Queue?) -> Integer
394
+ def self?.drain_line: (Client::Drained) -> String
395
+ end
396
+
397
+ module Bridge
398
+ def self?.mount: (Class, client: untyped, ?slug: String?, ?last: untyped, ?takes_unclaimed: bool) -> Mounted
399
+
400
+ class Mounted
401
+ attr_reader slug: String
402
+ attr_reader agent: Client::Agent
403
+ attr_reader options: Hash[Symbol, untyped]
404
+ def serving: (String) -> Agent?
405
+ end
406
+ end
407
+
408
+ module Panel
409
+ TONES: Array[String]
410
+
411
+ class Who
412
+ attr_reader agent: String
413
+ attr_reader contact: String
414
+ attr_reader call: String
415
+ def initialize: (agent: String, contact: String, call: String) -> void
416
+ end
417
+
418
+ class Declared
419
+ attr_reader name: String
420
+ attr_reader draw: Proc
421
+ def initialize: (name: String, draw: Proc) -> void
422
+ end
423
+
424
+ class Drawing
425
+ attr_reader nodes: Array[Hash[Symbol, untyped]]
426
+ def initialize: (Class) -> void
427
+ def panel: (?untyped) ?{ () -> void } -> nil
428
+ def rows: () ?{ () -> void } -> nil
429
+ def row: (untyped, ?untyped) -> nil
430
+ def stat: (untyped, untyped) -> nil
431
+ def table: (columns: Array[untyped], rows: Array[untyped]) -> nil
432
+ def badge: (untyped, ?tone: String | Symbol) -> nil
433
+ def text: (untyped) -> nil
434
+ end
435
+
436
+ def self.said: (untyped) -> String
437
+ def self.draw: (Class, Panel::Who) -> Hash[Symbol, untyped]
438
+ end
439
+
440
+ module Rules
441
+ RULES: String
442
+ PROTOCOLS: String
443
+ SPOKEN: String
444
+ ON_A_WEBSITE: String
445
+ ON_WHATSAPP: String
446
+ def self?.channel_rules_for: (String | Symbol, String | Symbol) -> String
447
+ end
448
+
449
+ def self.mount: (Class, client: untyped, **untyped) -> Bridge::Mounted
450
+ def self.render: (Agent, **untyped) -> Blocks
451
+ def self.show_prompt: (Agent, **untyped) -> String
452
+ def self.serve: (Class, ?client: Client?, ?url: String?, ?api_key: String?, ?env: String?, ?slug: String?, ?last: untyped) -> Serve::Held
453
+ end
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pinecall
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Pinecall
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-10-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: websocket-driver
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.7'
27
+ description: The application's side of Pinecall. A class whose declared fields are
28
+ the state, whose `tool` methods are the model's verbs, whose comments are the prompt,
29
+ and whose ERB view is the part of that prompt which changes. It speaks commands
30
+ and reads entries over one socket; it never imports the runtime and never sees audio.
31
+ email:
32
+ - hello@pinecall.io
33
+ executables: []
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - CHANGELOG.md
38
+ - LICENSE
39
+ - README.md
40
+ - lib/pinecall.rb
41
+ - lib/pinecall/agent.rb
42
+ - lib/pinecall/agent/author.rb
43
+ - lib/pinecall/agent/config.rb
44
+ - lib/pinecall/agent/doc.rb
45
+ - lib/pinecall/agent/knowledge.rb
46
+ - lib/pinecall/agent/searching.rb
47
+ - lib/pinecall/agent/spec.rb
48
+ - lib/pinecall/agent/state.rb
49
+ - lib/pinecall/agent/tools.rb
50
+ - lib/pinecall/blocks.rb
51
+ - lib/pinecall/bridge.rb
52
+ - lib/pinecall/call_world.rb
53
+ - lib/pinecall/call_world/answers.rb
54
+ - lib/pinecall/call_world/room.rb
55
+ - lib/pinecall/client.rb
56
+ - lib/pinecall/client/agent.rb
57
+ - lib/pinecall/client/call.rb
58
+ - lib/pinecall/client/connection.rb
59
+ - lib/pinecall/client/endpoints.rb
60
+ - lib/pinecall/client/listeners.rb
61
+ - lib/pinecall/client/observe.rb
62
+ - lib/pinecall/client/rest.rb
63
+ - lib/pinecall/errors.rb
64
+ - lib/pinecall/panel.rb
65
+ - lib/pinecall/reading.rb
66
+ - lib/pinecall/rules.rb
67
+ - lib/pinecall/serve.rb
68
+ - lib/pinecall/serve/held.rb
69
+ - lib/pinecall/serve/loading.rb
70
+ - lib/pinecall/serve/viewing.rb
71
+ - lib/pinecall/testing.rb
72
+ - lib/pinecall/version.rb
73
+ - lib/pinecall/view.rb
74
+ - lib/pinecall/wire.rb
75
+ - lib/pinecall/wire/codec.rb
76
+ - lib/pinecall/wire/enums.rb
77
+ - lib/pinecall/wire/errors.rb
78
+ - lib/pinecall/wire/reduce.rb
79
+ - lib/pinecall/wire/registry.rb
80
+ - lib/pinecall/wire/shapes.rb
81
+ - lib/pinecall/wire/shapes_call_events.rb
82
+ - lib/pinecall/wire/shapes_commands.rb
83
+ - lib/pinecall/wire/shapes_config.rb
84
+ - lib/pinecall/wire/shapes_doors.rb
85
+ - lib/pinecall/wire/shapes_events.rb
86
+ - lib/pinecall/wire/shapes_metrics.rb
87
+ - lib/pinecall/wire/shapes_parts.rb
88
+ - lib/pinecall/wire/state.rb
89
+ - lib/pinecall/wire/validate.rb
90
+ - sig/pinecall.rbs
91
+ homepage: https://github.com/pinecall/ruby
92
+ licenses:
93
+ - Apache-2.0
94
+ metadata:
95
+ homepage_uri: https://github.com/pinecall/ruby
96
+ source_code_uri: https://github.com/pinecall/ruby
97
+ changelog_uri: https://github.com/pinecall/ruby/blob/main/CHANGELOG.md
98
+ rubygems_mfa_required: 'true'
99
+ post_install_message:
100
+ rdoc_options: []
101
+ require_paths:
102
+ - lib
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: 3.2.0
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ requirements: []
114
+ rubygems_version: 3.4.19
115
+ signing_key:
116
+ specification_version: 4
117
+ summary: 'Write a voice agent as a Ruby class: fields are state, tools are verbs,
118
+ the view is the prompt'
119
+ test_files: []