pinecall 0.1.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 (431) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +134 -0
  3. package/dist/agent/accepts.d.ts +32 -0
  4. package/dist/agent/accepts.d.ts.map +1 -0
  5. package/dist/agent/accepts.js +28 -0
  6. package/dist/agent/accepts.js.map +1 -0
  7. package/dist/agent/agent.d.ts +189 -0
  8. package/dist/agent/agent.d.ts.map +1 -0
  9. package/dist/agent/agent.js +262 -0
  10. package/dist/agent/agent.js.map +1 -0
  11. package/dist/agent/authors.d.ts +12 -0
  12. package/dist/agent/authors.d.ts.map +1 -0
  13. package/dist/agent/authors.js +28 -0
  14. package/dist/agent/authors.js.map +1 -0
  15. package/dist/agent/decorators.d.ts +22 -0
  16. package/dist/agent/decorators.d.ts.map +1 -0
  17. package/dist/agent/decorators.js +49 -0
  18. package/dist/agent/decorators.js.map +1 -0
  19. package/dist/agent/docstrings.d.ts +43 -0
  20. package/dist/agent/docstrings.d.ts.map +1 -0
  21. package/dist/agent/docstrings.js +311 -0
  22. package/dist/agent/docstrings.js.map +1 -0
  23. package/dist/agent/lifecycle.d.ts +29 -0
  24. package/dist/agent/lifecycle.d.ts.map +1 -0
  25. package/dist/agent/lifecycle.js +11 -0
  26. package/dist/agent/lifecycle.js.map +1 -0
  27. package/dist/agent/stages.d.ts +28 -0
  28. package/dist/agent/stages.d.ts.map +1 -0
  29. package/dist/agent/stages.js +32 -0
  30. package/dist/agent/stages.js.map +1 -0
  31. package/dist/agent/state.d.ts +43 -0
  32. package/dist/agent/state.d.ts.map +1 -0
  33. package/dist/agent/state.js +104 -0
  34. package/dist/agent/state.js.map +1 -0
  35. package/dist/agent/tools.d.ts +66 -0
  36. package/dist/agent/tools.d.ts.map +1 -0
  37. package/dist/agent/tools.js +148 -0
  38. package/dist/agent/tools.js.map +1 -0
  39. package/dist/agent/visibility.d.ts +40 -0
  40. package/dist/agent/visibility.d.ts.map +1 -0
  41. package/dist/agent/visibility.js +89 -0
  42. package/dist/agent/visibility.js.map +1 -0
  43. package/dist/call/call.d.ts +55 -0
  44. package/dist/call/call.d.ts.map +1 -0
  45. package/dist/call/call.js +108 -0
  46. package/dist/call/call.js.map +1 -0
  47. package/dist/call/history.d.ts +34 -0
  48. package/dist/call/history.d.ts.map +1 -0
  49. package/dist/call/history.js +38 -0
  50. package/dist/call/history.js.map +1 -0
  51. package/dist/call/room.d.ts +58 -0
  52. package/dist/call/room.d.ts.map +1 -0
  53. package/dist/call/room.js +68 -0
  54. package/dist/call/room.js.map +1 -0
  55. package/dist/cli/browser.d.ts +8 -0
  56. package/dist/cli/browser.d.ts.map +1 -0
  57. package/dist/cli/browser.js +27 -0
  58. package/dist/cli/browser.js.map +1 -0
  59. package/dist/cli/callbacks.d.ts +26 -0
  60. package/dist/cli/callbacks.d.ts.map +1 -0
  61. package/dist/cli/callbacks.js +68 -0
  62. package/dist/cli/callbacks.js.map +1 -0
  63. package/dist/cli/chat.d.ts +21 -0
  64. package/dist/cli/chat.d.ts.map +1 -0
  65. package/dist/cli/chat.js +214 -0
  66. package/dist/cli/chat.js.map +1 -0
  67. package/dist/cli/config.d.ts +16 -0
  68. package/dist/cli/config.d.ts.map +1 -0
  69. package/dist/cli/config.js +94 -0
  70. package/dist/cli/config.js.map +1 -0
  71. package/dist/cli/connected.d.ts +30 -0
  72. package/dist/cli/connected.d.ts.map +1 -0
  73. package/dist/cli/connected.js +32 -0
  74. package/dist/cli/connected.js.map +1 -0
  75. package/dist/cli/credentials.d.ts +41 -0
  76. package/dist/cli/credentials.d.ts.map +1 -0
  77. package/dist/cli/credentials.js +98 -0
  78. package/dist/cli/credentials.js.map +1 -0
  79. package/dist/cli/ear.d.ts +3 -0
  80. package/dist/cli/ear.d.ts.map +1 -0
  81. package/dist/cli/ear.js +59 -0
  82. package/dist/cli/ear.js.map +1 -0
  83. package/dist/cli/env.d.ts +40 -0
  84. package/dist/cli/env.d.ts.map +1 -0
  85. package/dist/cli/env.js +45 -0
  86. package/dist/cli/env.js.map +1 -0
  87. package/dist/cli/eval.d.ts +37 -0
  88. package/dist/cli/eval.d.ts.map +1 -0
  89. package/dist/cli/eval.js +83 -0
  90. package/dist/cli/eval.js.map +1 -0
  91. package/dist/cli/groups.d.ts +17 -0
  92. package/dist/cli/groups.d.ts.map +1 -0
  93. package/dist/cli/groups.js +38 -0
  94. package/dist/cli/groups.js.map +1 -0
  95. package/dist/cli/index.d.ts +16 -0
  96. package/dist/cli/index.d.ts.map +1 -0
  97. package/dist/cli/index.js +169 -0
  98. package/dist/cli/index.js.map +1 -0
  99. package/dist/cli/keys.d.ts +28 -0
  100. package/dist/cli/keys.d.ts.map +1 -0
  101. package/dist/cli/keys.js +137 -0
  102. package/dist/cli/keys.js.map +1 -0
  103. package/dist/cli/knowledge.d.ts +35 -0
  104. package/dist/cli/knowledge.d.ts.map +1 -0
  105. package/dist/cli/knowledge.js +174 -0
  106. package/dist/cli/knowledge.js.map +1 -0
  107. package/dist/cli/line.d.ts +33 -0
  108. package/dist/cli/line.d.ts.map +1 -0
  109. package/dist/cli/line.js +134 -0
  110. package/dist/cli/line.js.map +1 -0
  111. package/dist/cli/listening.d.ts +38 -0
  112. package/dist/cli/listening.d.ts.map +1 -0
  113. package/dist/cli/listening.js +124 -0
  114. package/dist/cli/listening.js.map +1 -0
  115. package/dist/cli/load.d.ts +38 -0
  116. package/dist/cli/load.d.ts.map +1 -0
  117. package/dist/cli/load.js +99 -0
  118. package/dist/cli/load.js.map +1 -0
  119. package/dist/cli/login.d.ts +30 -0
  120. package/dist/cli/login.d.ts.map +1 -0
  121. package/dist/cli/login.js +158 -0
  122. package/dist/cli/login.js.map +1 -0
  123. package/dist/cli/machine.d.ts +8 -0
  124. package/dist/cli/machine.d.ts.map +1 -0
  125. package/dist/cli/machine.js +41 -0
  126. package/dist/cli/machine.js.map +1 -0
  127. package/dist/cli/memory.d.ts +26 -0
  128. package/dist/cli/memory.d.ts.map +1 -0
  129. package/dist/cli/memory.js +148 -0
  130. package/dist/cli/memory.js.map +1 -0
  131. package/dist/cli/numbers.d.ts +25 -0
  132. package/dist/cli/numbers.d.ts.map +1 -0
  133. package/dist/cli/numbers.js +132 -0
  134. package/dist/cli/numbers.js.map +1 -0
  135. package/dist/cli/personas.d.ts +5 -0
  136. package/dist/cli/personas.d.ts.map +1 -0
  137. package/dist/cli/personas.js +94 -0
  138. package/dist/cli/personas.js.map +1 -0
  139. package/dist/cli/pipeline.d.ts +52 -0
  140. package/dist/cli/pipeline.d.ts.map +1 -0
  141. package/dist/cli/pipeline.js +184 -0
  142. package/dist/cli/pipeline.js.map +1 -0
  143. package/dist/cli/profiles.d.ts +70 -0
  144. package/dist/cli/profiles.d.ts.map +1 -0
  145. package/dist/cli/profiles.js +210 -0
  146. package/dist/cli/profiles.js.map +1 -0
  147. package/dist/cli/prompt.d.ts +20 -0
  148. package/dist/cli/prompt.d.ts.map +1 -0
  149. package/dist/cli/prompt.js +58 -0
  150. package/dist/cli/prompt.js.map +1 -0
  151. package/dist/cli/providers.d.ts +14 -0
  152. package/dist/cli/providers.d.ts.map +1 -0
  153. package/dist/cli/providers.js +116 -0
  154. package/dist/cli/providers.js.map +1 -0
  155. package/dist/cli/remember.d.ts +29 -0
  156. package/dist/cli/remember.d.ts.map +1 -0
  157. package/dist/cli/remember.js +112 -0
  158. package/dist/cli/remember.js.map +1 -0
  159. package/dist/cli/run.d.ts +20 -0
  160. package/dist/cli/run.d.ts.map +1 -0
  161. package/dist/cli/run.js +347 -0
  162. package/dist/cli/run.js.map +1 -0
  163. package/dist/cli/runs/candidate.d.ts +51 -0
  164. package/dist/cli/runs/candidate.d.ts.map +1 -0
  165. package/dist/cli/runs/candidate.js +127 -0
  166. package/dist/cli/runs/candidate.js.map +1 -0
  167. package/dist/cli/runs/drift.d.ts +75 -0
  168. package/dist/cli/runs/drift.d.ts.map +1 -0
  169. package/dist/cli/runs/drift.js +151 -0
  170. package/dist/cli/runs/drift.js.map +1 -0
  171. package/dist/cli/runs/index.d.ts +5 -0
  172. package/dist/cli/runs/index.d.ts.map +1 -0
  173. package/dist/cli/runs/index.js +99 -0
  174. package/dist/cli/runs/index.js.map +1 -0
  175. package/dist/cli/runs/suites.d.ts +16 -0
  176. package/dist/cli/runs/suites.d.ts.map +1 -0
  177. package/dist/cli/runs/suites.js +63 -0
  178. package/dist/cli/runs/suites.js.map +1 -0
  179. package/dist/cli/secret.d.ts +18 -0
  180. package/dist/cli/secret.d.ts.map +1 -0
  181. package/dist/cli/secret.js +41 -0
  182. package/dist/cli/secret.js.map +1 -0
  183. package/dist/cli/sessions.d.ts +21 -0
  184. package/dist/cli/sessions.d.ts.map +1 -0
  185. package/dist/cli/sessions.js +174 -0
  186. package/dist/cli/sessions.js.map +1 -0
  187. package/dist/cli/signup.d.ts +25 -0
  188. package/dist/cli/signup.d.ts.map +1 -0
  189. package/dist/cli/signup.js +122 -0
  190. package/dist/cli/signup.js.map +1 -0
  191. package/dist/cli/simulate.d.ts +45 -0
  192. package/dist/cli/simulate.d.ts.map +1 -0
  193. package/dist/cli/simulate.js +320 -0
  194. package/dist/cli/simulate.js.map +1 -0
  195. package/dist/cli/supervise.d.ts +18 -0
  196. package/dist/cli/supervise.d.ts.map +1 -0
  197. package/dist/cli/supervise.js +134 -0
  198. package/dist/cli/supervise.js.map +1 -0
  199. package/dist/cli/test.d.ts +12 -0
  200. package/dist/cli/test.d.ts.map +1 -0
  201. package/dist/cli/test.js +128 -0
  202. package/dist/cli/test.js.map +1 -0
  203. package/dist/cli/testing/caller.d.ts +28 -0
  204. package/dist/cli/testing/caller.d.ts.map +1 -0
  205. package/dist/cli/testing/caller.js +30 -0
  206. package/dist/cli/testing/caller.js.map +1 -0
  207. package/dist/cli/testing/gateway.d.ts +172 -0
  208. package/dist/cli/testing/gateway.d.ts.map +1 -0
  209. package/dist/cli/testing/gateway.js +96 -0
  210. package/dist/cli/testing/gateway.js.map +1 -0
  211. package/dist/cli/testing/goldens.d.ts +61 -0
  212. package/dist/cli/testing/goldens.d.ts.map +1 -0
  213. package/dist/cli/testing/goldens.js +54 -0
  214. package/dist/cli/testing/goldens.js.map +1 -0
  215. package/dist/cli/testing/latency.d.ts +15 -0
  216. package/dist/cli/testing/latency.d.ts.map +1 -0
  217. package/dist/cli/testing/latency.js +44 -0
  218. package/dist/cli/testing/latency.js.map +1 -0
  219. package/dist/cli/testing/matrix.d.ts +12 -0
  220. package/dist/cli/testing/matrix.d.ts.map +1 -0
  221. package/dist/cli/testing/matrix.js +103 -0
  222. package/dist/cli/testing/matrix.js.map +1 -0
  223. package/dist/cli/testing/progress.d.ts +26 -0
  224. package/dist/cli/testing/progress.d.ts.map +1 -0
  225. package/dist/cli/testing/progress.js +185 -0
  226. package/dist/cli/testing/progress.js.map +1 -0
  227. package/dist/cli/testing/reproduction.d.ts +19 -0
  228. package/dist/cli/testing/reproduction.d.ts.map +1 -0
  229. package/dist/cli/testing/reproduction.js +65 -0
  230. package/dist/cli/testing/reproduction.js.map +1 -0
  231. package/dist/cli/testing/score.d.ts +11 -0
  232. package/dist/cli/testing/score.d.ts.map +1 -0
  233. package/dist/cli/testing/score.js +54 -0
  234. package/dist/cli/testing/score.js.map +1 -0
  235. package/dist/cli/testing/seeding.d.ts +32 -0
  236. package/dist/cli/testing/seeding.d.ts.map +1 -0
  237. package/dist/cli/testing/seeding.js +44 -0
  238. package/dist/cli/testing/seeding.js.map +1 -0
  239. package/dist/cli/testing/suite.d.ts +40 -0
  240. package/dist/cli/testing/suite.d.ts.map +1 -0
  241. package/dist/cli/testing/suite.js +103 -0
  242. package/dist/cli/testing/suite.js.map +1 -0
  243. package/dist/cli/testing/voice.d.ts +37 -0
  244. package/dist/cli/testing/voice.d.ts.map +1 -0
  245. package/dist/cli/testing/voice.js +53 -0
  246. package/dist/cli/testing/voice.js.map +1 -0
  247. package/dist/cli/ui/admin/assets/index-C3WMXdfL.css +1 -0
  248. package/dist/cli/ui/admin/assets/index-DR1mxoAh.js +58 -0
  249. package/dist/cli/ui/admin/index.html +20 -0
  250. package/dist/cli/ui/asked.d.ts +16 -0
  251. package/dist/cli/ui/asked.d.ts.map +1 -0
  252. package/dist/cli/ui/asked.js +53 -0
  253. package/dist/cli/ui/asked.js.map +1 -0
  254. package/dist/cli/ui/browser.d.ts +10 -0
  255. package/dist/cli/ui/browser.d.ts.map +1 -0
  256. package/dist/cli/ui/browser.js +30 -0
  257. package/dist/cli/ui/browser.js.map +1 -0
  258. package/dist/cli/ui/chatting.d.ts +62 -0
  259. package/dist/cli/ui/chatting.d.ts.map +1 -0
  260. package/dist/cli/ui/chatting.js +171 -0
  261. package/dist/cli/ui/chatting.js.map +1 -0
  262. package/dist/cli/ui/console/assets/index-DCTnou52.css +1 -0
  263. package/dist/cli/ui/console/assets/index-dOcE4usU.js +99 -0
  264. package/dist/cli/ui/console/index.html +20 -0
  265. package/dist/cli/ui/console/logo-mark.png +0 -0
  266. package/dist/cli/ui/doors.d.ts +37 -0
  267. package/dist/cli/ui/doors.d.ts.map +1 -0
  268. package/dist/cli/ui/doors.js +70 -0
  269. package/dist/cli/ui/doors.js.map +1 -0
  270. package/dist/cli/ui/drifting.d.ts +23 -0
  271. package/dist/cli/ui/drifting.d.ts.map +1 -0
  272. package/dist/cli/ui/drifting.js +33 -0
  273. package/dist/cli/ui/drifting.js.map +1 -0
  274. package/dist/cli/ui/index.d.ts +15 -0
  275. package/dist/cli/ui/index.d.ts.map +1 -0
  276. package/dist/cli/ui/index.js +117 -0
  277. package/dist/cli/ui/index.js.map +1 -0
  278. package/dist/cli/ui/knowing.d.ts +36 -0
  279. package/dist/cli/ui/knowing.d.ts.map +1 -0
  280. package/dist/cli/ui/knowing.js +86 -0
  281. package/dist/cli/ui/knowing.js.map +1 -0
  282. package/dist/cli/ui/promoting.d.ts +26 -0
  283. package/dist/cli/ui/promoting.d.ts.map +1 -0
  284. package/dist/cli/ui/promoting.js +44 -0
  285. package/dist/cli/ui/promoting.js.map +1 -0
  286. package/dist/cli/ui/refusal.d.ts +18 -0
  287. package/dist/cli/ui/refusal.d.ts.map +1 -0
  288. package/dist/cli/ui/refusal.js +26 -0
  289. package/dist/cli/ui/refusal.js.map +1 -0
  290. package/dist/cli/ui/refused.d.ts +8 -0
  291. package/dist/cli/ui/refused.d.ts.map +1 -0
  292. package/dist/cli/ui/refused.js +11 -0
  293. package/dist/cli/ui/refused.js.map +1 -0
  294. package/dist/cli/ui/remembering.d.ts +38 -0
  295. package/dist/cli/ui/remembering.d.ts.map +1 -0
  296. package/dist/cli/ui/remembering.js +87 -0
  297. package/dist/cli/ui/remembering.js.map +1 -0
  298. package/dist/cli/ui/reproducing.d.ts +23 -0
  299. package/dist/cli/ui/reproducing.d.ts.map +1 -0
  300. package/dist/cli/ui/reproducing.js +52 -0
  301. package/dist/cli/ui/reproducing.js.map +1 -0
  302. package/dist/cli/ui/server.d.ts +22 -0
  303. package/dist/cli/ui/server.d.ts.map +1 -0
  304. package/dist/cli/ui/server.js +211 -0
  305. package/dist/cli/ui/server.js.map +1 -0
  306. package/dist/cli/ui/simulating.d.ts +47 -0
  307. package/dist/cli/ui/simulating.d.ts.map +1 -0
  308. package/dist/cli/ui/simulating.js +86 -0
  309. package/dist/cli/ui/simulating.js.map +1 -0
  310. package/dist/cli/ui/testing.d.ts +49 -0
  311. package/dist/cli/ui/testing.d.ts.map +1 -0
  312. package/dist/cli/ui/testing.js +104 -0
  313. package/dist/cli/ui/testing.js.map +1 -0
  314. package/dist/cli/view.d.ts +43 -0
  315. package/dist/cli/view.d.ts.map +1 -0
  316. package/dist/cli/view.js +137 -0
  317. package/dist/cli/view.js.map +1 -0
  318. package/dist/cli/whoami.d.ts +37 -0
  319. package/dist/cli/whoami.d.ts.map +1 -0
  320. package/dist/cli/whoami.js +78 -0
  321. package/dist/cli/whoami.js.map +1 -0
  322. package/dist/cli/world.d.ts +33 -0
  323. package/dist/cli/world.d.ts.map +1 -0
  324. package/dist/cli/world.js +48 -0
  325. package/dist/cli/world.js.map +1 -0
  326. package/dist/client/agent.d.ts +87 -0
  327. package/dist/client/agent.d.ts.map +1 -0
  328. package/dist/client/agent.js +209 -0
  329. package/dist/client/agent.js.map +1 -0
  330. package/dist/client/calls.d.ts +77 -0
  331. package/dist/client/calls.d.ts.map +1 -0
  332. package/dist/client/calls.js +153 -0
  333. package/dist/client/calls.js.map +1 -0
  334. package/dist/client/client.d.ts +58 -0
  335. package/dist/client/client.d.ts.map +1 -0
  336. package/dist/client/client.js +146 -0
  337. package/dist/client/client.js.map +1 -0
  338. package/dist/client/connection.d.ts +47 -0
  339. package/dist/client/connection.d.ts.map +1 -0
  340. package/dist/client/connection.js +141 -0
  341. package/dist/client/connection.js.map +1 -0
  342. package/dist/client/endpoints.d.ts +7 -0
  343. package/dist/client/endpoints.d.ts.map +1 -0
  344. package/dist/client/endpoints.js +21 -0
  345. package/dist/client/endpoints.js.map +1 -0
  346. package/dist/client/frames.d.ts +24 -0
  347. package/dist/client/frames.d.ts.map +1 -0
  348. package/dist/client/frames.js +49 -0
  349. package/dist/client/frames.js.map +1 -0
  350. package/dist/client/index.d.ts +15 -0
  351. package/dist/client/index.d.ts.map +1 -0
  352. package/dist/client/index.js +14 -0
  353. package/dist/client/index.js.map +1 -0
  354. package/dist/client/listeners.d.ts +36 -0
  355. package/dist/client/listeners.d.ts.map +1 -0
  356. package/dist/client/listeners.js +61 -0
  357. package/dist/client/listeners.js.map +1 -0
  358. package/dist/client/observe.d.ts +44 -0
  359. package/dist/client/observe.d.ts.map +1 -0
  360. package/dist/client/observe.js +122 -0
  361. package/dist/client/observe.js.map +1 -0
  362. package/dist/client/testing/gateway.d.ts +39 -0
  363. package/dist/client/testing/gateway.d.ts.map +1 -0
  364. package/dist/client/testing/gateway.js +129 -0
  365. package/dist/client/testing/gateway.js.map +1 -0
  366. package/dist/client/testing/index.d.ts +4 -0
  367. package/dist/client/testing/index.d.ts.map +1 -0
  368. package/dist/client/testing/index.js +4 -0
  369. package/dist/client/testing/index.js.map +1 -0
  370. package/dist/client/testing/log.d.ts +26 -0
  371. package/dist/client/testing/log.d.ts.map +1 -0
  372. package/dist/client/testing/log.js +111 -0
  373. package/dist/client/testing/log.js.map +1 -0
  374. package/dist/client/testing/loopback.d.ts +3 -0
  375. package/dist/client/testing/loopback.d.ts.map +1 -0
  376. package/dist/client/testing/loopback.js +3 -0
  377. package/dist/client/testing/loopback.js.map +1 -0
  378. package/dist/index.d.ts +22 -0
  379. package/dist/index.d.ts.map +1 -0
  380. package/dist/index.js +35 -0
  381. package/dist/index.js.map +1 -0
  382. package/dist/runtime/channels.d.ts +16 -0
  383. package/dist/runtime/channels.d.ts.map +1 -0
  384. package/dist/runtime/channels.js +30 -0
  385. package/dist/runtime/channels.js.map +1 -0
  386. package/dist/runtime/connect.d.ts +51 -0
  387. package/dist/runtime/connect.d.ts.map +1 -0
  388. package/dist/runtime/connect.js +284 -0
  389. package/dist/runtime/connect.js.map +1 -0
  390. package/dist/runtime/dispatch.d.ts +37 -0
  391. package/dist/runtime/dispatch.d.ts.map +1 -0
  392. package/dist/runtime/dispatch.js +52 -0
  393. package/dist/runtime/dispatch.js.map +1 -0
  394. package/dist/runtime/grounding.d.ts +15 -0
  395. package/dist/runtime/grounding.d.ts.map +1 -0
  396. package/dist/runtime/grounding.js +72 -0
  397. package/dist/runtime/grounding.js.map +1 -0
  398. package/dist/runtime/recall.d.ts +10 -0
  399. package/dist/runtime/recall.d.ts.map +1 -0
  400. package/dist/runtime/recall.js +13 -0
  401. package/dist/runtime/recall.js.map +1 -0
  402. package/dist/runtime/run-tool.d.ts +26 -0
  403. package/dist/runtime/run-tool.d.ts.map +1 -0
  404. package/dist/runtime/run-tool.js +82 -0
  405. package/dist/runtime/run-tool.js.map +1 -0
  406. package/dist/views/components.d.ts +17 -0
  407. package/dist/views/components.d.ts.map +1 -0
  408. package/dist/views/components.js +33 -0
  409. package/dist/views/components.js.map +1 -0
  410. package/dist/views/jsx-dev-runtime.d.ts +3 -0
  411. package/dist/views/jsx-dev-runtime.d.ts.map +1 -0
  412. package/dist/views/jsx-dev-runtime.js +5 -0
  413. package/dist/views/jsx-dev-runtime.js.map +1 -0
  414. package/dist/views/jsx-runtime.d.ts +49 -0
  415. package/dist/views/jsx-runtime.d.ts.map +1 -0
  416. package/dist/views/jsx-runtime.js +67 -0
  417. package/dist/views/jsx-runtime.js.map +1 -0
  418. package/dist/views/lang.d.ts +17 -0
  419. package/dist/views/lang.d.ts.map +1 -0
  420. package/dist/views/lang.js +46 -0
  421. package/dist/views/lang.js.map +1 -0
  422. package/dist/views/layout.d.ts +19 -0
  423. package/dist/views/layout.d.ts.map +1 -0
  424. package/dist/views/layout.js +62 -0
  425. package/dist/views/layout.js.map +1 -0
  426. package/dist/views/render.d.ts +19 -0
  427. package/dist/views/render.d.ts.map +1 -0
  428. package/dist/views/render.js +26 -0
  429. package/dist/views/render.js.map +1 -0
  430. package/package.json +76 -0
  431. package/tsconfig.tenant.json +24 -0
@@ -0,0 +1,48 @@
1
+ /** Which world a verb works in. The KEY decides it; `--env` is how a person says they know which. */
2
+ import { refusal, whoIs } from "./whoami.js";
3
+ /** The world a laptop is in: what is being written, held per person, nobody's customers calling. */
4
+ export const SANDBOX = "sandbox";
5
+ /** The world a deployment is in: the org's own, held by a key issued for a machine. */
6
+ export const PRODUCTION = "production";
7
+ const WORLDS = [PRODUCTION, SANDBOX];
8
+ /**
9
+ * The `--env` every registering verb takes, declared once so the flag is spelled in one place.
10
+ *
11
+ * It selects NOTHING. A key opens one world and that is a property of the key, so a flag that
12
+ * chose would be a flag that lies: what this one does is say out loud which world you believe you
13
+ * are in, and refuse when the key disagrees. Sandbox is what a verb assumes when nothing is said,
14
+ * because a laptop is where things are written and a deployment is the deliberate act.
15
+ */
16
+ export const ENV_FLAG = { env: { type: "string" } };
17
+ /** What the gateway says this key is: asked once, and used for both the check and the line. */
18
+ export async function standing(door) {
19
+ return await whoIs(door);
20
+ }
21
+ /**
22
+ * Why this verb will not run with the key in hand, or undefined when it will.
23
+ *
24
+ * The whole reason this exists: `pinecall run` used to register wherever the key it happened to
25
+ * find pointed, and the line it printed read the same either way — so an agent landed in
26
+ * production, in somebody else's org, and nothing said so until a customer called it.
27
+ */
28
+ export function notThisWorld(verb, who, said) {
29
+ if (said !== undefined && !WORLDS.includes(said)) {
30
+ return `--env takes ${WORLDS.join(" or ")}, not ${JSON.stringify(said)}`;
31
+ }
32
+ const wanted = said ?? SANDBOX;
33
+ if (who.env === wanted)
34
+ return undefined;
35
+ if (said !== undefined) {
36
+ return (`--env ${said} asks for ${said}, and this key opens ${who.env}: a key opens one world and`
37
+ + " no flag changes that.\n"
38
+ + ` \`pinecall use <profile>\` for a key that opens ${said} — \`pinecall config\` lists them.`);
39
+ }
40
+ return (`this key opens ${who.env}, and \`pinecall ${verb}\` answers in the ${SANDBOX} unless you say so.\n`
41
+ + ` \`pinecall ${verb} --env ${who.env}\` if that is what you meant: it is what a deployment types.\n`
42
+ + " `pinecall use <profile>` to work on a key of your own — `pinecall config` lists them.");
43
+ }
44
+ /** When the gateway will not say which world the key opens: guessing is the bug this replaces. */
45
+ export function cannotTell(verb, failed) {
46
+ return `\`pinecall ${verb}\` will not guess which world this key opens: ${refusal(failed)}`;
47
+ }
48
+ //# sourceMappingURL=world.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world.js","sourceRoot":"","sources":["../../src/cli/world.ts"],"names":[],"mappings":"AAAA,qGAAqG;AAGrG,OAAO,EAAE,OAAO,EAAE,KAAK,EAAY,MAAM,aAAa,CAAC;AAEvD,oGAAoG;AACpG,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC;AAEjC,uFAAuF;AACvF,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC;AAEvC,MAAM,MAAM,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAErC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,EAAE,CAAC;AAE7D,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAU;IACvC,OAAO,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,GAAQ,EAAE,IAAwB;IAC3E,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,OAAO,eAAe,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;IAC3E,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,IAAI,OAAO,CAAC;IAC/B,IAAI,GAAG,CAAC,GAAG,KAAK,MAAM;QAAE,OAAO,SAAS,CAAC;IACzC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CACL,SAAS,IAAI,aAAa,IAAI,wBAAwB,GAAG,CAAC,GAAG,6BAA6B;cACxF,0BAA0B;cAC1B,qDAAqD,IAAI,oCAAoC,CAChG,CAAC;IACJ,CAAC;IACD,OAAO,CACL,kBAAkB,GAAG,CAAC,GAAG,oBAAoB,IAAI,qBAAqB,OAAO,uBAAuB;UAClG,gBAAgB,IAAI,UAAU,GAAG,CAAC,GAAG,gEAAgE;UACrG,yFAAyF,CAC5F,CAAC;AACJ,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,MAAe;IACtD,OAAO,cAAc,IAAI,iDAAiD,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;AAC9F,CAAC"}
@@ -0,0 +1,87 @@
1
+ import { type AgentConfig, type Camel, type CommandData, type CommandType, type DevVerb, type Entry, type EventType, type Route, type ToolSpec } from "@pinecall/protocol";
2
+ import { Call, CallBook, type CallGateway } from "./calls.js";
3
+ import { type AnyListener, type CamelEvent, type Listener, type Payload } from "./listeners.js";
4
+ /** A door the agent answers. `number` is null for a channel that has none, which is what web is. */
5
+ export interface RouteInput {
6
+ channel: Route["channel"];
7
+ number?: string | null;
8
+ label?: string;
9
+ }
10
+ /** One tool: the contract the model sees, and the function this process runs when it is called. */
11
+ export interface Tool extends Camel<ToolSpec> {
12
+ run: (args: Record<string, unknown>, call: Call) => unknown;
13
+ }
14
+ /** Everything an app declares about an agent, plus the tools' own code. */
15
+ export interface AgentOptions extends Omit<Camel<AgentConfig>, "tools"> {
16
+ routes?: RouteInput[];
17
+ tools?: Tool[];
18
+ /**
19
+ * Whether the gateway may hand this socket a call that named no app — every phone call, and every
20
+ * web call that did not ask for one. A console (`pinecall chat`) opens its own call and names
21
+ * this socket, so it passes false and a real caller is never answered here.
22
+ */
23
+ takesUnclaimed?: boolean;
24
+ }
25
+ /** What an agent sends its frames through: the client that holds the socket. */
26
+ export interface AgentGateway {
27
+ send<K extends CommandType>(type: K, agent: string, call: string | null, data: Camel<CommandData<K>>, id: string): void;
28
+ seen(event: CamelEvent, call: Call | null): void;
29
+ onError(error: Error): void;
30
+ readonly sdk: string;
31
+ }
32
+ /**
33
+ * What answers a console's ask of this process: the verb, and the body the console sent as the
34
+ * verb's own shape. It resolves with the verb's answer, or throws a `DevRefused` to refuse with a
35
+ * status and a sentence; anything else thrown reaches the console as a 500 with its message.
36
+ */
37
+ export type DevHandler = (verb: DevVerb, data: Record<string, unknown>) => Promise<Record<string, unknown>>;
38
+ /**
39
+ * An agent, from the app's side.
40
+ *
41
+ * The declaration is sent again on every reconnect, because the gateway's registry is memory: it
42
+ * knows which sockets are open right now and nothing else. Many sockets may hold one agent at
43
+ * once and a call nobody claimed takes the newest of those that take unclaimed calls, so a rolling
44
+ * deploy's new process serves from the moment it registers and never waits for the old one to let
45
+ * go — and a console holding the same agent is never handed a call it did not open.
46
+ */
47
+ export declare class Agent implements CallGateway {
48
+ #private;
49
+ readonly slug: string;
50
+ private readonly gateway;
51
+ readonly calls: CallBook;
52
+ constructor(slug: string, options: AgentOptions, gateway: AgentGateway);
53
+ /** What this agent tells the gateway it is, as the wire's own shape. */
54
+ get config(): Camel<AgentConfig>;
55
+ /**
56
+ * The socket this app is holding the agent on, as the gateway minted it, or undefined before
57
+ * the first register. A caller that names it — `WS /v1/chat?app=<id>`, an `app` in a worker's
58
+ * `POST /v1/calls` — is served by THIS process, which is what makes `pinecall chat` a console:
59
+ * the tool runs where the person typed the command and not in whichever server registered last.
60
+ */
61
+ get app(): string | undefined;
62
+ /** Listen for one event type across every call of this agent. `null` for the agent's own log. */
63
+ on<K extends EventType>(type: K, listener: Listener<K, Call | null>): () => void;
64
+ /** Listen for every event of this agent. The returned function stops listening. */
65
+ onAny(listener: AnyListener<Call | null>): () => void;
66
+ /**
67
+ * Answer a console's asks of this process — `dev.request`, relayed by the gateway. Only the
68
+ * process standing in the agent's directory has one: `pinecall run` registers it, a plain app
69
+ * never does, and a console asking a plain app is told so.
70
+ */
71
+ onDev(handler: DevHandler): void;
72
+ /** Replace the tools and their code. The next `configure` carries the new declaration. */
73
+ declare(tools: Tool[]): void;
74
+ /** Change what the agent is. Only the fields sent change; live calls keep their session. */
75
+ configure(changes?: Partial<Camel<AgentConfig>>): Promise<Payload<"agent.configured">>;
76
+ /** Claim the slug and its doors, then send the declaration. Run again on every reconnect. */
77
+ open(): Promise<void>;
78
+ /** One entry of this agent's, folded into the call it belongs to and handed to the listeners. */
79
+ take(entry: Entry): void;
80
+ /** One command out, on this agent's behalf. */
81
+ command<K extends CommandType>(type: K, call: string | null, data: Camel<CommandData<K>>): void;
82
+ /** A listener of this agent's threw, where nobody was waiting for the answer. */
83
+ onError(error: Error): void;
84
+ /** Prove the socket is alive: `ping` is agent-scoped like every command, and lands as `pong`. */
85
+ ping(): void;
86
+ }
87
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/client/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,209 @@
1
+ // One agent an app speaks for: what it declares, what it does with a tool call, who listens.
2
+ import { eventOf } from "@pinecall/protocol";
3
+ import { Call, CallBook } from "./calls.js";
4
+ import { DevRefused, PinecallError, Refused } from "./frames.js";
5
+ import { Listeners, asError, camelEvent } from "./listeners.js";
6
+ const ANSWER_MS = 10_000;
7
+ // A process that registered no handler is a plain app, and a console asking it is told so.
8
+ const NO_DEV_HANDLER = "this process answers no dev verbs: it is not a `pinecall run` in the agent's directory";
9
+ /**
10
+ * An agent, from the app's side.
11
+ *
12
+ * The declaration is sent again on every reconnect, because the gateway's registry is memory: it
13
+ * knows which sockets are open right now and nothing else. Many sockets may hold one agent at
14
+ * once and a call nobody claimed takes the newest of those that take unclaimed calls, so a rolling
15
+ * deploy's new process serves from the moment it registers and never waits for the old one to let
16
+ * go — and a console holding the same agent is never handed a call it did not open.
17
+ */
18
+ export class Agent {
19
+ slug;
20
+ gateway;
21
+ calls;
22
+ #listeners;
23
+ #tools = new Map();
24
+ #waiters = [];
25
+ #routes;
26
+ #config;
27
+ #takesUnclaimed;
28
+ #app;
29
+ #dev;
30
+ constructor(slug, options, gateway) {
31
+ this.slug = slug;
32
+ this.gateway = gateway;
33
+ const { routes = [], tools = [], takesUnclaimed = true, ...config } = options;
34
+ this.#routes = routes;
35
+ this.#config = config;
36
+ this.#takesUnclaimed = takesUnclaimed;
37
+ this.declare(tools);
38
+ this.calls = new CallBook(this);
39
+ this.#listeners = new Listeners((error) => gateway.onError(error));
40
+ }
41
+ /** What this agent tells the gateway it is, as the wire's own shape. */
42
+ get config() {
43
+ return this.#config;
44
+ }
45
+ /**
46
+ * The socket this app is holding the agent on, as the gateway minted it, or undefined before
47
+ * the first register. A caller that names it — `WS /v1/chat?app=<id>`, an `app` in a worker's
48
+ * `POST /v1/calls` — is served by THIS process, which is what makes `pinecall chat` a console:
49
+ * the tool runs where the person typed the command and not in whichever server registered last.
50
+ */
51
+ get app() {
52
+ return this.#app;
53
+ }
54
+ /** Listen for one event type across every call of this agent. `null` for the agent's own log. */
55
+ on(type, listener) {
56
+ return this.#listeners.on(type, listener);
57
+ }
58
+ /** Listen for every event of this agent. The returned function stops listening. */
59
+ onAny(listener) {
60
+ return this.#listeners.onAny(listener);
61
+ }
62
+ /**
63
+ * Answer a console's asks of this process — `dev.request`, relayed by the gateway. Only the
64
+ * process standing in the agent's directory has one: `pinecall run` registers it, a plain app
65
+ * never does, and a console asking a plain app is told so.
66
+ */
67
+ onDev(handler) {
68
+ this.#dev = handler;
69
+ }
70
+ /** Replace the tools and their code. The next `configure` carries the new declaration. */
71
+ declare(tools) {
72
+ this.#tools.clear();
73
+ for (const tool of tools) {
74
+ this.#tools.set(tool.name, tool);
75
+ }
76
+ this.#config = { ...this.#config, tools: tools.map(({ run: _run, ...spec }) => spec) };
77
+ }
78
+ /** Change what the agent is. Only the fields sent change; live calls keep their session. */
79
+ async configure(changes = {}) {
80
+ this.#config = { ...this.#config, ...changes };
81
+ return this.#ask("agent.configure", "agent.configured", { config: this.#config });
82
+ }
83
+ /** Claim the slug and its doors, then send the declaration. Run again on every reconnect. */
84
+ async open() {
85
+ const registered = await this.#ask("agent.register", "agent.registered", {
86
+ routes: this.#routes.map((route) => ({ channel: route.channel, number: route.number ?? null, ...(route.label === undefined ? {} : { label: route.label }) })),
87
+ sdk: this.gateway.sdk,
88
+ takesUnclaimed: this.#takesUnclaimed,
89
+ });
90
+ // A reconnect mints a new socket and so a new id: the one kept is always this socket's own.
91
+ this.#app = registered.app;
92
+ await this.configure();
93
+ }
94
+ // ── the socket's side ───────────────────────────────────────────────────────
95
+ /** One entry of this agent's, folded into the call it belongs to and handed to the listeners. */
96
+ take(entry) {
97
+ const event = camelEvent(eventOf(entry));
98
+ const call = entry.call === null ? null : this.calls.of(entry.call, entry.ts);
99
+ this.#settle(event);
100
+ call?.take(event);
101
+ this.#listeners.emit(event, call);
102
+ this.gateway.seen(event, call);
103
+ if (event.type === "dev.request") {
104
+ this.#onDevRequest(event.data);
105
+ return;
106
+ }
107
+ if (call !== null) {
108
+ this.#onToolCall(event, call);
109
+ this.calls.forget(call);
110
+ }
111
+ }
112
+ /** One command out, on this agent's behalf. */
113
+ command(type, call, data) {
114
+ this.gateway.send(type, this.slug, call, data, `${this.slug}:${type}`);
115
+ }
116
+ /** A listener of this agent's threw, where nobody was waiting for the answer. */
117
+ onError(error) {
118
+ this.gateway.onError(error);
119
+ }
120
+ /** Prove the socket is alive: `ping` is agent-scoped like every command, and lands as `pong`. */
121
+ ping() {
122
+ this.command("ping", null, {});
123
+ }
124
+ // ── tools ───────────────────────────────────────────────────────────────────
125
+ // The model called a tool; the code is here, not in the platform. Whatever it answers — a value,
126
+ // a rejection, nothing at all — becomes one tool.result against the model's own call_id, because
127
+ // a turn that never gets one waits forever.
128
+ #onToolCall(event, call) {
129
+ if (event.type !== "tool.call") {
130
+ return;
131
+ }
132
+ const { callId, name, arguments: args } = event.data;
133
+ const tool = this.#tools.get(name);
134
+ if (tool === undefined) {
135
+ call.toolResult({ callId, name, error: `this app declares no tool called ${name}` });
136
+ return;
137
+ }
138
+ const started = Date.now();
139
+ void (async () => {
140
+ try {
141
+ const output = await tool.run(args, call);
142
+ call.toolResult({ callId, name, output, durationS: (Date.now() - started) / 1000 });
143
+ }
144
+ catch (failed) {
145
+ // A rejection is the tool's answer, not an unhandled failure: the model is waiting for it
146
+ // and reads it as `error`, and the log keeps the same tool.result for a person to read
147
+ // afterwards. Printing it as well would report a refusal the app made on purpose twice.
148
+ const error = asError(failed);
149
+ call.toolResult({ callId, name, error: error.message, durationS: (Date.now() - started) / 1000 });
150
+ }
151
+ })();
152
+ }
153
+ // ── a console's ask ─────────────────────────────────────────────────────────
154
+ // The gateway relayed a console's ask down this socket. Whatever the handler does — an answer,
155
+ // a refusal, a throw — becomes one dev.answer against the gateway's own id, because a door
156
+ // that never gets one waits two minutes and says so to a person.
157
+ #onDevRequest(asked) {
158
+ const { id, verb, data } = asked;
159
+ void (async () => {
160
+ try {
161
+ if (this.#dev === undefined)
162
+ throw new DevRefused(501, NO_DEV_HANDLER);
163
+ const result = await this.#dev(verb, data);
164
+ this.command("dev.answer", null, { id, result });
165
+ }
166
+ catch (failed) {
167
+ const refused = failed instanceof DevRefused
168
+ ? { status: failed.status, detail: failed.detail }
169
+ : { status: 500, detail: asError(failed).message };
170
+ this.command("dev.answer", null, { id, refused });
171
+ }
172
+ })();
173
+ }
174
+ // ── waiting for an answer ───────────────────────────────────────────────────
175
+ // A command is answered by the event it lands as, or by an `error` naming the id we sent. Only
176
+ // the two declarations are awaited: everything else on this wire is fire and read the log.
177
+ async #ask(type, lands, data) {
178
+ const id = `${this.slug}:${type}`;
179
+ const answer = new Promise((resolve, reject) => {
180
+ const waiter = { type: lands, id, settle: (payload) => resolve(payload), refuse: reject };
181
+ this.#waiters.push(waiter);
182
+ setTimeout(() => {
183
+ this.#drop(waiter);
184
+ reject(new PinecallError(`${type}: the gateway did not answer in ${ANSWER_MS}ms`));
185
+ }, ANSWER_MS).unref();
186
+ });
187
+ this.gateway.send(type, this.slug, null, data, id);
188
+ return answer;
189
+ }
190
+ #settle(event) {
191
+ for (const waiter of [...this.#waiters]) {
192
+ if (event.type === waiter.type) {
193
+ this.#drop(waiter);
194
+ waiter.settle(event.data);
195
+ }
196
+ else if (event.type === "error" && event.data.id === waiter.id) {
197
+ this.#drop(waiter);
198
+ waiter.refuse(new Refused(event.data));
199
+ }
200
+ }
201
+ }
202
+ #drop(waiter) {
203
+ const at = this.#waiters.indexOf(waiter);
204
+ if (at !== -1) {
205
+ this.#waiters.splice(at, 1);
206
+ }
207
+ }
208
+ }
209
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/client/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import type { Camel, Channel, CommandData, CommandType, Contact, EventType, ToolResult, ToolSpec } from "@pinecall/protocol";
2
+ import type { AnyListener, CamelEvent, Listener } from "./listeners.js";
3
+ /** What a call sends its commands through: the agent that owns it. */
4
+ export interface CallGateway {
5
+ readonly slug: string;
6
+ command<K extends CommandType>(type: K, call: string | null, data: Camel<CommandData<K>>): void;
7
+ onError(error: Error): void;
8
+ }
9
+ /** Where the call is in its life, as the log has said so far. */
10
+ export type CallStatus = "ringing" | "dialing" | "active" | "ended";
11
+ /**
12
+ * A call the app is serving.
13
+ *
14
+ * Everything on it was read off the log — the SDK never invents a field the wire does not carry —
15
+ * and every method is one command, sent and not awaited: the gateway answers with the events the
16
+ * command lands as, and those arrive as entries like everything else.
17
+ */
18
+ export declare class Call {
19
+ #private;
20
+ readonly id: string;
21
+ private readonly gateway;
22
+ status: CallStatus;
23
+ channel: Channel | null;
24
+ from: string | null;
25
+ to: string | null;
26
+ contact: Camel<Contact> | null;
27
+ /** The eval run that opened this call, or null for a person: a run's call starts mid-conversation. */
28
+ run: string | null;
29
+ /** The app's state as this client last set it, and as `state.changed` last reported it. */
30
+ state: Record<string, unknown>;
31
+ /** The day the call opened, `YYYY-MM-DD` in this process's timezone: what a prompt means by today. */
32
+ readonly today: string;
33
+ constructor(id: string, gateway: CallGateway, openedAt: number);
34
+ /** The agent serving this call. */
35
+ get agent(): string;
36
+ /** Listen for one event type on this call alone. The returned function stops listening. */
37
+ on<K extends EventType>(type: K, listener: Listener<K, Call>): () => void;
38
+ /** Listen for every event on this call. The returned function stops listening. */
39
+ onAny(listener: AnyListener<Call>): () => void;
40
+ /** Say this, verbatim, now. Lands as `turn.agent`. */
41
+ say(text: string, options?: {
42
+ allowInterruptions?: boolean;
43
+ }): void;
44
+ /** Make the model speak now, guided by an instruction the caller never hears. Lands as `turn.agent`. */
45
+ reply(instructions: string, options?: {
46
+ allowInterruptions?: boolean;
47
+ }): void;
48
+ /** Rewrite one block of the prompt, whole, by name: one of the framework's four, or one the agent declared. */
49
+ setPrompt(name: string, text: string): void;
50
+ /** The tools the model may see now: the subset of the declaration this state allows. */
51
+ setTools(tools: Camel<ToolSpec>[]): void;
52
+ /** The app's state changed and this is all of it. Lands as `state.changed`. */
53
+ setState(state: Record<string, unknown>, changed?: string[]): void;
54
+ /** What came back from running a tool in this process, against the `call_id` the model gave. */
55
+ toolResult(result: Camel<ToolResult>): void;
56
+ /** A fact from the tenant's backend. The agent must have declared the name, or this is refused. */
57
+ event(name: string, data: Record<string, unknown>): void;
58
+ /** End the call from the app's side. `call.ended` follows with reason agent_hung_up. */
59
+ hangup(reason?: string): void;
60
+ /** Write a line of the app's own into the call's log. Lands as `custom`, with a seq like anything. */
61
+ log(name: string, data?: Record<string, unknown>): void;
62
+ /** Fold one event into what the call knows, then hand it to this call's listeners. */
63
+ take(event: CamelEvent): void;
64
+ }
65
+ /** Every call this agent is serving right now, by id. A call is forgotten when its log ends. */
66
+ export declare class CallBook {
67
+ #private;
68
+ private readonly gateway;
69
+ constructor(gateway: CallGateway);
70
+ /** The calls in progress, in the order they opened. */
71
+ get live(): Call[];
72
+ /** The call this entry belongs to, opened on the first entry that named it. */
73
+ of(id: string, at: number): Call;
74
+ /** Forget a call whose log has ended. Listeners for `call.ended` have already run. */
75
+ forget(call: Call): void;
76
+ }
77
+ //# sourceMappingURL=calls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calls.d.ts","sourceRoot":"","sources":["../../src/client/calls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,153 @@
1
+ // One live call, as the app holds it: what is known about the line, and every command it can send.
2
+ import { Listeners } from "./listeners.js";
3
+ /**
4
+ * A call the app is serving.
5
+ *
6
+ * Everything on it was read off the log — the SDK never invents a field the wire does not carry —
7
+ * and every method is one command, sent and not awaited: the gateway answers with the events the
8
+ * command lands as, and those arrive as entries like everything else.
9
+ */
10
+ export class Call {
11
+ id;
12
+ gateway;
13
+ status = "ringing";
14
+ channel = null;
15
+ from = null;
16
+ to = null;
17
+ contact = null;
18
+ /** The eval run that opened this call, or null for a person: a run's call starts mid-conversation. */
19
+ run = null;
20
+ /** The app's state as this client last set it, and as `state.changed` last reported it. */
21
+ state = {};
22
+ /** The day the call opened, `YYYY-MM-DD` in this process's timezone: what a prompt means by today. */
23
+ today;
24
+ #listeners;
25
+ constructor(id, gateway, openedAt) {
26
+ this.id = id;
27
+ this.gateway = gateway;
28
+ this.today = dayOf(openedAt);
29
+ this.#listeners = new Listeners((error) => gateway.onError(error));
30
+ }
31
+ /** The agent serving this call. */
32
+ get agent() {
33
+ return this.gateway.slug;
34
+ }
35
+ /** Listen for one event type on this call alone. The returned function stops listening. */
36
+ on(type, listener) {
37
+ return this.#listeners.on(type, listener);
38
+ }
39
+ /** Listen for every event on this call. The returned function stops listening. */
40
+ onAny(listener) {
41
+ return this.#listeners.onAny(listener);
42
+ }
43
+ // ── the commands ────────────────────────────────────────────────────────────
44
+ /** Say this, verbatim, now. Lands as `turn.agent`. */
45
+ say(text, options = {}) {
46
+ this.gateway.command("agent.say", this.id, { text, ...options });
47
+ }
48
+ /** Make the model speak now, guided by an instruction the caller never hears. Lands as `turn.agent`. */
49
+ reply(instructions, options = {}) {
50
+ this.gateway.command("agent.reply", this.id, { instructions, ...options });
51
+ }
52
+ /** Rewrite one block of the prompt, whole, by name: one of the framework's four, or one the agent declared. */
53
+ setPrompt(name, text) {
54
+ this.gateway.command("prompt.set", this.id, { name, text });
55
+ }
56
+ /** The tools the model may see now: the subset of the declaration this state allows. */
57
+ setTools(tools) {
58
+ this.gateway.command("tools.set", this.id, { tools });
59
+ }
60
+ /** The app's state changed and this is all of it. Lands as `state.changed`. */
61
+ setState(state, changed) {
62
+ this.state = { ...state };
63
+ this.gateway.command("state.set", this.id, changed === undefined ? { state } : { state, changed });
64
+ }
65
+ /** What came back from running a tool in this process, against the `call_id` the model gave. */
66
+ toolResult(result) {
67
+ this.gateway.command("tool.result", this.id, result);
68
+ }
69
+ /** A fact from the tenant's backend. The agent must have declared the name, or this is refused. */
70
+ event(name, data) {
71
+ this.gateway.command("call.event", this.id, { name, data });
72
+ }
73
+ /** End the call from the app's side. `call.ended` follows with reason agent_hung_up. */
74
+ hangup(reason) {
75
+ this.gateway.command("call.hangup", this.id, reason === undefined ? {} : { reason });
76
+ }
77
+ /** Write a line of the app's own into the call's log. Lands as `custom`, with a seq like anything. */
78
+ log(name, data = {}) {
79
+ this.gateway.command("call.log", this.id, { name, data });
80
+ }
81
+ // ── what the log teaches it ─────────────────────────────────────────────────
82
+ /** Fold one event into what the call knows, then hand it to this call's listeners. */
83
+ take(event) {
84
+ this.#learn(event);
85
+ this.#listeners.emit(event, this);
86
+ }
87
+ #learn(event) {
88
+ switch (event.type) {
89
+ case "call.ringing":
90
+ this.status = "ringing";
91
+ this.#line(event.data);
92
+ return;
93
+ case "call.dialing":
94
+ this.status = "dialing";
95
+ this.#line(event.data);
96
+ return;
97
+ case "call.started":
98
+ this.status = "active";
99
+ this.#line(event.data);
100
+ return;
101
+ case "call.ended":
102
+ this.status = "ended";
103
+ return;
104
+ case "state.changed":
105
+ this.state = { ...event.data.state };
106
+ return;
107
+ default:
108
+ return;
109
+ }
110
+ }
111
+ #line(line) {
112
+ this.channel = line.channel;
113
+ this.from = line.from;
114
+ this.to = line.to;
115
+ this.contact = line.caller;
116
+ this.run = line.run ?? null;
117
+ }
118
+ }
119
+ /** Every call this agent is serving right now, by id. A call is forgotten when its log ends. */
120
+ export class CallBook {
121
+ gateway;
122
+ #live = new Map();
123
+ constructor(gateway) {
124
+ this.gateway = gateway;
125
+ }
126
+ /** The calls in progress, in the order they opened. */
127
+ get live() {
128
+ return [...this.#live.values()];
129
+ }
130
+ /** The call this entry belongs to, opened on the first entry that named it. */
131
+ of(id, at) {
132
+ const known = this.#live.get(id);
133
+ if (known !== undefined) {
134
+ return known;
135
+ }
136
+ const call = new Call(id, this.gateway, at);
137
+ this.#live.set(id, call);
138
+ return call;
139
+ }
140
+ /** Forget a call whose log has ended. Listeners for `call.ended` have already run. */
141
+ forget(call) {
142
+ if (call.status === "ended") {
143
+ this.#live.delete(call.id);
144
+ }
145
+ }
146
+ }
147
+ /** The day of a unix timestamp, `YYYY-MM-DD`, in this process's timezone. */
148
+ function dayOf(ts) {
149
+ const at = new Date(ts * 1000);
150
+ const pad = (n) => String(n).padStart(2, "0");
151
+ return `${at.getFullYear()}-${pad(at.getMonth() + 1)}-${pad(at.getDate())}`;
152
+ }
153
+ //# sourceMappingURL=calls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calls.js","sourceRoot":"","sources":["../../src/client/calls.ts"],"names":[],"mappings":"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"}