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,20 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Pinecall admin</title>
7
+ <link rel="icon" type="image/png" href="/logo-mark.png" />
8
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
10
+ <link
11
+ href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600&family=IBM+Plex+Mono:wght@400;500&display=swap"
12
+ rel="stylesheet"
13
+ />
14
+ <script type="module" crossorigin src="/admin/assets/index-DR1mxoAh.js"></script>
15
+ <link rel="stylesheet" crossorigin href="/admin/assets/index-C3WMXdfL.css">
16
+ </head>
17
+ <body>
18
+ <div id="root"></div>
19
+ </body>
20
+ </html>
@@ -0,0 +1,16 @@
1
+ /** What a body the page sent must be, read by hand: the CLI carries no schema library (test/the-imports.test.ts). */
2
+ /** The body as an object, or the refusal that says a door takes one. */
3
+ export declare function anObject(asked: unknown, what: string): Record<string, unknown>;
4
+ /** A field that must be there and must say something. */
5
+ export declare function aString(given: Record<string, unknown>, name: string): string;
6
+ /** A field that may be left out, and is words when it is there. */
7
+ export declare function someWords(given: Record<string, unknown>, name: string): string | undefined;
8
+ /** A flag: true, false, or left out, which is false. */
9
+ export declare function aFlag(given: Record<string, unknown>, name: string): boolean;
10
+ /** A number inside the range the door takes, said in the refusal so the page can be fixed. */
11
+ export declare function aNumber(given: Record<string, unknown>, name: string, least: number, most: number): number;
12
+ /** The same number, when the field may be left out entirely. */
13
+ export declare function maybeNumber(given: Record<string, unknown>, name: string, least: number, most: number): number | undefined;
14
+ /** A list of at least one name: which goldens to run, which bases to push. */
15
+ export declare function names(given: Record<string, unknown>, name: string): string[];
16
+ //# sourceMappingURL=asked.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asked.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/asked.ts"],"names":[],"mappings":"AAAA,qHAAqH;AAIrH,wEAAwE;AACxE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAK9E;AAED,yDAAyD;AACzD,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAI5E;AAED,mEAAmE;AACnE,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAK1F;AAED,wDAAwD;AACxD,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAI3E;AAED,8FAA8F;AAC9F,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMzG;AAED,gEAAgE;AAChE,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAEpB;AAED,8EAA8E;AAC9E,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAM5E"}
@@ -0,0 +1,53 @@
1
+ /** What a body the page sent must be, read by hand: the CLI carries no schema library (test/the-imports.test.ts). */
2
+ import { Refusal } from "./refusal.js";
3
+ /** The body as an object, or the refusal that says a door takes one. */
4
+ export function anObject(asked, what) {
5
+ if (typeof asked !== "object" || asked === null || Array.isArray(asked)) {
6
+ throw new Refusal(422, `${what} is asked for with a JSON object`);
7
+ }
8
+ return asked;
9
+ }
10
+ /** A field that must be there and must say something. */
11
+ export function aString(given, name) {
12
+ const value = given[name];
13
+ if (typeof value !== "string" || value === "")
14
+ throw new Refusal(422, `${name} is a name, and it was missing`);
15
+ return value;
16
+ }
17
+ /** A field that may be left out, and is words when it is there. */
18
+ export function someWords(given, name) {
19
+ const value = given[name];
20
+ if (value === undefined || value === "")
21
+ return undefined;
22
+ if (typeof value !== "string")
23
+ throw new Refusal(422, `${name} is words`);
24
+ return value;
25
+ }
26
+ /** A flag: true, false, or left out, which is false. */
27
+ export function aFlag(given, name) {
28
+ const value = given[name];
29
+ if (value !== undefined && typeof value !== "boolean")
30
+ throw new Refusal(422, `${name} is true or false`);
31
+ return value === true;
32
+ }
33
+ /** A number inside the range the door takes, said in the refusal so the page can be fixed. */
34
+ export function aNumber(given, name, least, most) {
35
+ const value = given[name];
36
+ if (typeof value !== "number" || !Number.isFinite(value) || value < least || value > most) {
37
+ throw new Refusal(422, `${name} is a number between ${least} and ${most}`);
38
+ }
39
+ return value;
40
+ }
41
+ /** The same number, when the field may be left out entirely. */
42
+ export function maybeNumber(given, name, least, most) {
43
+ return given[name] === undefined ? undefined : aNumber(given, name, least, most);
44
+ }
45
+ /** A list of at least one name: which goldens to run, which bases to push. */
46
+ export function names(given, name) {
47
+ const value = given[name];
48
+ if (!Array.isArray(value) || value.length === 0 || !value.every((one) => typeof one === "string")) {
49
+ throw new Refusal(422, `${name} is a list of at least one name`);
50
+ }
51
+ return value;
52
+ }
53
+ //# sourceMappingURL=asked.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asked.js","sourceRoot":"","sources":["../../../src/cli/ui/asked.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /** This machine's browser: whether it has one to speak of, and how a URL is handed to it. */
2
+ /**
3
+ * Why no page can open here, or null when one can. A talk page needs a microphone, and a
4
+ * microphone is a browser's on a screen: over ssh there is no screen on this end, and a Linux
5
+ * with no display has no browser to hand a URL to. Both are said before a token is minted.
6
+ */
7
+ export declare function headless(env?: NodeJS.ProcessEnv, platform?: string): string | null;
8
+ /** Hand this URL to the browser and never wait for it: the URL is on screen either way. */
9
+ export declare function openInBrowser(url: string, platform?: string): void;
10
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/browser.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAY7F;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,EAAE,QAAQ,GAAE,MAAyB,GAAG,MAAM,GAAG,IAAI,CAMjH;AAED,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAyB,GAAG,IAAI,CAKpF"}
@@ -0,0 +1,30 @@
1
+ /** This machine's browser: whether it has one to speak of, and how a URL is handed to it. */
2
+ import { spawn } from "node:child_process";
3
+ // One command per platform. Anything else is treated as a Linux with xdg-open, which is what a
4
+ // BSD or a container with a desktop most likely has.
5
+ const OPENERS = {
6
+ darwin: "open",
7
+ win32: "start",
8
+ linux: "xdg-open",
9
+ };
10
+ /**
11
+ * Why no page can open here, or null when one can. A talk page needs a microphone, and a
12
+ * microphone is a browser's on a screen: over ssh there is no screen on this end, and a Linux
13
+ * with no display has no browser to hand a URL to. Both are said before a token is minted.
14
+ */
15
+ export function headless(env = process.env, platform = process.platform) {
16
+ if (env["SSH_CONNECTION"] !== undefined)
17
+ return "this is an ssh session";
18
+ if (platform === "linux" && env["DISPLAY"] === undefined && env["WAYLAND_DISPLAY"] === undefined) {
19
+ return "no DISPLAY and no WAYLAND_DISPLAY";
20
+ }
21
+ return null;
22
+ }
23
+ /** Hand this URL to the browser and never wait for it: the URL is on screen either way. */
24
+ export function openInBrowser(url, platform = process.platform) {
25
+ const opener = OPENERS[platform] ?? OPENERS["linux"];
26
+ const opened = spawn(opener, [url], { stdio: "ignore", detached: true, shell: platform === "win32" });
27
+ opened.on("error", () => undefined);
28
+ opened.unref();
29
+ }
30
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/cli/ui/browser.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAE7F,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,+FAA+F;AAC/F,qDAAqD;AACrD,MAAM,OAAO,GAA2B;IACtC,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,UAAU;CAClB,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAW,OAAO,CAAC,QAAQ;IAChG,IAAI,GAAG,CAAC,gBAAgB,CAAC,KAAK,SAAS;QAAE,OAAO,wBAAwB,CAAC;IACzE,IAAI,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,iBAAiB,CAAC,KAAK,SAAS,EAAE,CAAC;QACjG,OAAO,mCAAmC,CAAC;IAC7C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,QAAQ,GAAW,OAAO,CAAC,QAAQ;IAC5E,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,OAAO,CAAE,CAAC;IACtD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC;IACtG,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,CAAC,KAAK,EAAE,CAAC;AACjB,CAAC"}
@@ -0,0 +1,62 @@
1
+ /** The console's own door to a written call: the class of this directory, talked to from the page. */
2
+ import type { Door } from "../testing/gateway.js";
3
+ import { type Golden } from "../testing/goldens.js";
4
+ /** What the page asks for when it opens one: which agent, who is calling, and where to open. */
5
+ export interface Wanted {
6
+ agent: string;
7
+ /** The contact the call is filed under, so an agent with memory can be made to remember. */
8
+ as?: string | undefined;
9
+ /** A golden of this directory whose state the call opens in — `pinecall chat --state`, by name. */
10
+ golden?: string | undefined;
11
+ }
12
+ /** What the door answers about itself: the class, and the states a conversation may open in. */
13
+ export interface Roster {
14
+ agent: string | null;
15
+ /** The goldens of this directory that declare a state, by name. Chat may open in any of them. */
16
+ states: string[];
17
+ }
18
+ /** What the server needs from the chat door, and nothing of how it holds a socket. */
19
+ export interface Chatting {
20
+ roster(): Promise<Roster>;
21
+ start(asked: unknown): Promise<{
22
+ call: string;
23
+ }>;
24
+ say(asked: unknown): Promise<{
25
+ call: string;
26
+ }>;
27
+ end(asked: unknown): Promise<{
28
+ call: string;
29
+ }>;
30
+ /** Every socket this console opened, closed with the command. */
31
+ close(): Promise<void>;
32
+ }
33
+ /** One written call open in this process: where it is, how to say the next thing, how to end it. */
34
+ export interface Line {
35
+ call: string;
36
+ say(text: string): void;
37
+ end(): void;
38
+ }
39
+ /** Where a line comes from: this process's own mount by default, a test's own in a test. */
40
+ export interface Lines {
41
+ /**
42
+ * One written call. With a state, the call opens in it — which needs a mount of its own, because
43
+ * the opening is applied where the class is held and the console's own mount serves every other
44
+ * conversation at once.
45
+ */
46
+ open(contact: string | undefined, opening?: Record<string, unknown> | undefined): Promise<Line>;
47
+ close(): Promise<void>;
48
+ }
49
+ /**
50
+ * One `Chatting` for the life of a `pinecall run`. The class is mounted here once, on the first
51
+ * call the page opens, exactly as `pinecall chat` mounts it — so a breakpoint in a @tool is
52
+ * reachable from the terminal that typed `ui` — and every turn typed in the browser goes down that
53
+ * same socket. The page reads the call off the log like any other; nothing here keeps a transcript.
54
+ */
55
+ export declare function chattingFrom(door: Door, agent: string | null, out: NodeJS.WritableStream, lines?: Lines, goldens?: () => Promise<Golden[]>): Chatting;
56
+ /**
57
+ * The class of this directory, mounted once and held for the life of the console, and one socket
58
+ * per call opened against it. `takesUnclaimed: false` is what keeps this a console and not a
59
+ * server: a real phone call must not ring in a browser tab because somebody left `ui` open.
60
+ */
61
+ export declare function linesFromThisProcess(door: Door, out: NodeJS.WritableStream): Lines;
62
+ //# sourceMappingURL=chatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatting.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/chatting.ts"],"names":[],"mappings":"AAAA,sGAAsG;AAUtG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAa,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAoB/D,gGAAgG;AAChG,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,4FAA4F;IAC5F,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,mGAAmG;IACnG,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED,gGAAgG;AAChG,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,iGAAiG;IACjG,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,sFAAsF;AACtF,MAAM,WAAW,QAAQ;IACvB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1B,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,iEAAiE;IACjE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,oGAAoG;AACpG,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,IAAI,IAAI,CAAC;CACb;AAED,4FAA4F;AAC5F,MAAM,WAAW,KAAK;IACpB;;;;OAIG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,GAAG,EAAE,MAAM,CAAC,cAAc,EAC1B,KAAK,GAAE,KAAuC,EAC9C,OAAO,GAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAuB,GACrD,QAAQ,CAwCV;AA8BD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,KAAK,CAmClF"}
@@ -0,0 +1,171 @@
1
+ /** The console's own door to a written call: the class of this directory, talked to from the page. */
2
+ import WebSocket from "ws";
3
+ import { Pinecall } from "../../client/index.js";
4
+ import { mount } from "../../runtime/connect.js";
5
+ import { chatUrl } from "../chat.js";
6
+ import { load, mountOptions } from "../load.js";
7
+ import { goldensIn } from "../testing/goldens.js";
8
+ import { lineFor } from "../view.js";
9
+ import { anObject, aString, someWords } from "./asked.js";
10
+ import { Refusal } from "./refusal.js";
11
+ // How long the gateway is given to answer the socket with the call's first entry. A chat opens on
12
+ // a class already mounted here, so this is the register and the first render, never a model.
13
+ const A_CALL_OPENS_WITHIN_MS = 20_000;
14
+ // The console may be opened on any agent the gateway holds, but a written call needs the CLASS —
15
+ // mounted in this process, as `pinecall chat` mounts it — and the class is the one in the
16
+ // directory `pinecall run` was typed in.
17
+ const NOT_THIS_DIRECTORY = (asked, here) => here === null
18
+ ? `no agent class in this directory: run \`pinecall run\` where ${asked}'s agent.tsx is`
19
+ : `this process runs in ${here}'s directory: to chat with ${asked}, run \`pinecall run\` there`;
20
+ const NO_CALL = "the gateway took the socket but wrote no entry: nothing to read";
21
+ const NOT_OPEN = (call) => `${call} is not a chat this console opened`;
22
+ /**
23
+ * One `Chatting` for the life of a `pinecall run`. The class is mounted here once, on the first
24
+ * call the page opens, exactly as `pinecall chat` mounts it — so a breakpoint in a @tool is
25
+ * reachable from the terminal that typed `ui` — and every turn typed in the browser goes down that
26
+ * same socket. The page reads the call off the log like any other; nothing here keeps a transcript.
27
+ */
28
+ export function chattingFrom(door, agent, out, lines = linesFromThisProcess(door, out), goldens = () => goldensIn([])) {
29
+ const open = new Map();
30
+ return {
31
+ async roster() {
32
+ return { agent, states: (await theStates(agent, goldens)).map((golden) => golden.name) };
33
+ },
34
+ async start(asked) {
35
+ const wanted = parsed(asked);
36
+ if (wanted.agent !== agent)
37
+ throw new Refusal(409, NOT_THIS_DIRECTORY(wanted.agent, agent));
38
+ const opening = wanted.golden === undefined ? undefined : await theStateOf(wanted.golden, agent, goldens);
39
+ const line = await lines.open(wanted.as, opening);
40
+ open.set(line.call, line);
41
+ return { call: line.call };
42
+ },
43
+ async say(asked) {
44
+ // The whole body is read before the call is looked up, so a turn with no words is refused
45
+ // as a body and not as a call nobody here holds: the page is told which of the two it is.
46
+ const given = anObject(asked, "a turn");
47
+ const call = aString(given, "call");
48
+ const text = aString(given, "text");
49
+ const line = held(open, call);
50
+ line.say(text);
51
+ return { call: line.call };
52
+ },
53
+ async end(asked) {
54
+ const line = held(open, aString(anObject(asked, "a hangup"), "call"));
55
+ line.end();
56
+ open.delete(line.call);
57
+ return { call: line.call };
58
+ },
59
+ async close() {
60
+ for (const line of open.values())
61
+ line.end();
62
+ open.clear();
63
+ await lines.close();
64
+ },
65
+ };
66
+ }
67
+ function held(open, call) {
68
+ const line = open.get(call);
69
+ if (line === undefined)
70
+ throw new Refusal(404, NOT_OPEN(call));
71
+ return line;
72
+ }
73
+ function parsed(asked) {
74
+ const given = anObject(asked, "a chat");
75
+ return { agent: aString(given, "agent"), as: someWords(given, "as"), golden: someWords(given, "golden") };
76
+ }
77
+ /** The goldens of this directory that declare a state: the only ones a conversation may open in. */
78
+ async function theStates(agent, goldens) {
79
+ if (agent === null)
80
+ return [];
81
+ return (await goldens()).filter((golden) => golden.state !== undefined);
82
+ }
83
+ /** The state one of them opens in, or the refusal that says which golden the page asked for. */
84
+ async function theStateOf(name, agent, goldens) {
85
+ const golden = (await theStates(agent, goldens)).find((one) => one.name === name);
86
+ if (golden === undefined)
87
+ throw new Refusal(404, `no golden called ${name} declares a state to open a call in`);
88
+ return golden.state ?? {};
89
+ }
90
+ /**
91
+ * The class of this directory, mounted once and held for the life of the console, and one socket
92
+ * per call opened against it. `takesUnclaimed: false` is what keeps this a console and not a
93
+ * server: a real phone call must not ring in a browser tab because somebody left `ui` open.
94
+ */
95
+ export function linesFromThisProcess(door, out) {
96
+ let mounting;
97
+ const mounted = async (opening) => {
98
+ const loaded = await load();
99
+ const pc = new Pinecall({ url: door.url, apiKey: door.apiKey });
100
+ const app = mount(loaded.ctor, {
101
+ ...mountOptions(loaded, pc),
102
+ takesUnclaimed: false,
103
+ ...(opening === undefined ? {} : { opening: () => opening }),
104
+ });
105
+ await pc.connect();
106
+ // The app's id exists only after the register the connect awaited, and naming it is what sends
107
+ // the call to THIS process rather than to whichever `pinecall run` registered last.
108
+ return { pc, url: chatUrl(door.url, app.slug, app.agent.app) };
109
+ };
110
+ return {
111
+ async open(contact, opening) {
112
+ // A conversation that opens in a state gets a MOUNT of its own: the opening is applied where
113
+ // the class is held, one instance per call, and the console's own mount is serving every
114
+ // other conversation at the same time — one slot shared between two would be a race.
115
+ const its = opening === undefined ? undefined : await mounted(opening);
116
+ const { url } = its ?? (await (mounting ??= mounted()));
117
+ const address = new URL(url);
118
+ if (contact !== undefined)
119
+ address.searchParams.set("contact", contact);
120
+ const line = await aLine(address.toString(), door.apiKey, out);
121
+ if (its === undefined)
122
+ return line;
123
+ const end = line.end;
124
+ return { ...line, end: () => { end(); its.pc.close(); } };
125
+ },
126
+ async close() {
127
+ const held = mounting;
128
+ mounting = undefined;
129
+ if (held !== undefined)
130
+ (await held).pc.close();
131
+ },
132
+ };
133
+ }
134
+ // One chat socket, answered as soon as the call has an id. Everything that comes back is printed
135
+ // in the terminal that typed `ui`, the way `pinecall chat` prints it, and read by the page off the
136
+ // log — so the two views of the call are one log and not two transcripts.
137
+ async function aLine(url, apiKey, out) {
138
+ const socket = new WebSocket(url, { headers: { authorization: `Bearer ${apiKey}` } });
139
+ const line = {
140
+ call: "",
141
+ say: (text) => socket.send(JSON.stringify({ text })),
142
+ end: () => socket.close(),
143
+ };
144
+ return await new Promise((answer, refuse) => {
145
+ const giveUp = setTimeout(() => refuse(new Refusal(502, NO_CALL)), A_CALL_OPENS_WITHIN_MS);
146
+ socket.on("message", (frame) => {
147
+ const entry = JSON.parse(frame.toString());
148
+ if (line.call === "" && typeof entry.call === "string") {
149
+ line.call = entry.call;
150
+ clearTimeout(giveUp);
151
+ answer(line);
152
+ }
153
+ const said = lineFor({ ...entry, data: entry.data ?? {} });
154
+ if (said !== null)
155
+ out.write(`${said.mark} ${said.text}\n`);
156
+ });
157
+ // A close that carries a reason is the gateway saying why it will not take this call — an
158
+ // agent nobody is serving, a key this org does not have — and the page is told that sentence.
159
+ socket.on("close", (_code, why) => {
160
+ clearTimeout(giveUp);
161
+ if (line.call === "")
162
+ refuse(new Refusal(502, why.toString() === "" ? NO_CALL : why.toString()));
163
+ });
164
+ socket.on("error", (failed) => {
165
+ clearTimeout(giveUp);
166
+ if (line.call === "")
167
+ refuse(new Refusal(502, failed.message));
168
+ });
169
+ });
170
+ }
171
+ //# sourceMappingURL=chatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatting.js","sourceRoot":"","sources":["../../../src/cli/ui/chatting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ .shell{flex-direction:column;height:100%;display:flex}.shell-head{background:var(--panel);border-bottom:1px solid var(--edge);min-height:var(--head);flex-wrap:wrap;flex:none;align-items:center;gap:18px;padding:0 16px;display:flex}.shell-body{grid-template-columns:minmax(0, var(--rail)) minmax(0, 1fr);flex:1;min-height:0;display:grid}.shell-rail{background:var(--panel-2);border-right:1px solid var(--edge);flex-direction:column;min-width:0;display:flex;overflow-y:auto}.shell-screen{flex-direction:column;min-width:0;display:flex;overflow:auto}.brand{flex:none;align-items:center;gap:9px;display:flex}.brand-mark{height:18px;display:block}.brand-name{letter-spacing:-.01em;font-size:12.5px}.brand-sep{color:var(--ink-faint)}.brand-kind{color:var(--ink-soft)}.head-crumbs{color:var(--ink-soft);align-items:center;gap:7px;min-width:0;display:flex}.head-crumbs b{color:var(--ink);font-weight:500}.head-sep{color:var(--ink-faint)}.head-right{flex-wrap:wrap;align-items:center;gap:14px;margin-left:auto;display:flex}.head-whose{color:var(--ink-soft);font-size:11.5px}.theme-toggle,.head-leave{border:1px solid var(--edge);color:var(--ink-soft);cursor:pointer;background:0 0;border-radius:6px;align-items:center;gap:7px;height:26px;padding:0 9px;font-size:11px;display:inline-flex}.theme-toggle:hover,.head-leave:hover{border-color:var(--ink);color:var(--ink)}.theme-dot{background:var(--ink);border-radius:50%;width:8px;height:8px;display:block}.rail-group{padding:14px 12px 6px}.rail-label{color:var(--ink-faint);letter-spacing:.06em;text-transform:uppercase;margin:0 0 8px;padding:0 9px;font-size:10.5px}.rail-links{flex-direction:column;gap:1px;display:flex}.rail-link{color:var(--ink-soft);border-left:2px solid #0000;border-radius:0 5px 5px 0;justify-content:space-between;align-items:center;gap:8px;padding:6px 9px;font-size:13.5px;display:flex}.rail-link:hover{background:var(--hover)}.rail-link-here{background:var(--selected);border-left-color:var(--accent);color:var(--ink)}.rail-hint{color:var(--ink-faint);font-size:10px}.rail-foot{border-top:1px solid var(--edge);color:var(--ink-soft);margin-top:auto;padding:14px 21px 16px;font-size:10.5px;line-height:1.8}.rail-foot-line{color:var(--ink-faint)}.nothing{color:var(--ink-faint);font-family:var(--face-fixed);text-wrap:pretty;max-width:64ch;margin:0;font-size:11.5px}.nothing .fixed{color:var(--ink-2);font-size:inherit}.agents{max-width:760px;padding:26px 28px}.agents-title{letter-spacing:-.01em;margin:0 0 6px;font-size:20px;font-weight:500}.agents-lede{color:var(--ink-soft);text-wrap:pretty;margin:0 0 20px;font-size:14px}.agents-table{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius-panel);overflow:hidden}.agents-head{border-bottom:1px solid var(--edge);color:var(--ink-faint);letter-spacing:.06em;grid-template-columns:minmax(0,1fr) auto;gap:16px;padding:9px 16px;font-size:10.5px;display:grid}.agents-one{border-bottom:1px solid var(--edge-soft);color:var(--ink);grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:16px;padding:13px 16px;display:grid}.agents-one .fixed{font-size:13.5px}.agents-one:last-child{border-bottom:none}.agents-one:hover{background:var(--hover)}.agents-one .agents-channels{color:var(--ink-soft);font-size:11.5px}.agents-corner{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius-control,6px);color:var(--ink-soft);cursor:pointer;font:inherit;padding:5px 10px;font-size:11.5px}.agents-corner-here{color:var(--ink);border-color:var(--ink-faint)}.agents-corners{gap:6px;margin:0 0 14px;display:flex}.agents-corner{background:var(--panel);border:1px solid var(--edge);color:var(--ink-soft);cursor:pointer;font:inherit;border-radius:6px;padding:5px 10px;font-size:11.5px}.agents-corner:hover{background:var(--hover)}.agents-corner-here{border-color:var(--ink-faint);color:var(--ink)}:is(.agents-head:has(>:nth-child(3)),.agents-one:has(>:nth-child(3))){grid-template-columns:minmax(0,1fr) auto auto}.agents-one .agents-whose{color:var(--ink-soft);font-size:11.5px}.live-desk{background:var(--panel);border-bottom:1px solid var(--edge);flex-wrap:wrap;align-items:center;gap:8px;padding:9px 16px;display:flex}.desk-move{border:1px solid var(--edge);border-radius:var(--radius-control);color:var(--ink-2);cursor:pointer;white-space:nowrap;background:0 0;align-items:center;gap:7px;height:28px;padding:0 10px;font-size:12.5px;display:inline-flex}.desk-move:hover:not(:disabled){border-color:var(--ink);color:var(--ink)}.desk-move:disabled{cursor:default;opacity:.5}.desk-move-armed{border-color:var(--accent-line);color:var(--accent)}.desk-move-on{background:var(--accent-soft);border-color:var(--accent-line);color:var(--accent)}.desk-dot{border-radius:50%;width:6px;height:6px;display:block}.desk-dot-off{background:var(--ink-faint)}.desk-dot-warm{background:var(--warn)}.desk-dot-on{background:var(--accent)}.desk-box{background:var(--sunk);border:1px solid var(--edge);border-radius:var(--radius-control);flex:320px;align-items:center;min-width:240px;height:28px;display:flex;overflow:hidden}.desk-mode{border:0;border-right:1px solid var(--edge);color:var(--ink-soft);cursor:pointer;background:0 0;height:100%;padding:0 10px;font-size:11px}.desk-mode-here{background:var(--selected);color:var(--ink)}.desk-text{color:var(--ink);background:0 0;border:0;flex:1;min-width:0;height:100%;padding:0 10px;font-size:12.5px}.desk-text::placeholder{color:var(--ink-faint)}.desk-text:focus{outline:none}.desk-to{background:var(--accent-soft);border:1px solid var(--accent-line);border-radius:var(--radius-control);color:var(--accent);align-items:center;height:28px;padding:0 10px;display:inline-flex}.desk-to-number{color:var(--accent);font:inherit;background:0 0;border:0;width:14ch;font-size:11.5px}.desk-to-number:focus{outline:none}.desk-to-number::placeholder{color:var(--accent);opacity:.6}.live-refused{background:var(--accent-soft);border-bottom:1px solid var(--accent-line);color:var(--ink-2);align-items:center;gap:9px;margin:0;padding:8px 16px;font-size:11.5px;display:flex}.live{flex-direction:column;flex:9999 440px;min-width:0;display:flex}.live+.live{border-left:1px solid var(--edge)}.live-head{background:var(--panel);border-bottom:1px solid var(--edge);color:var(--ink-soft);flex-wrap:wrap;flex:none;align-items:baseline;gap:8px 14px;padding:11px 16px;font-size:11.5px;line-height:1.5;display:flex}.live-head>span{white-space:nowrap}.live-head b{color:var(--ink-2);font-weight:400}.live-call{color:var(--ink);font-size:12.5px}.live-status{color:var(--accent)}.live-arrow{color:var(--ink-faint)}.live-connection{color:var(--ok)}.live-body{flex-wrap:wrap;flex:1;align-items:stretch;min-height:0;display:flex}.live-middle{border-right:1px solid var(--edge);flex-direction:column;flex:9999 360px;min-width:0;display:flex}.live-recording{border-bottom:1px solid var(--edge-soft);padding:9px 16px}.live-recording .player{width:100%;height:24px;display:block}.live-timeline{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.live-rows{flex:1;min-height:0;padding:4px 0 0;overflow:auto}.live-foot{background:var(--panel);border-top:1px solid var(--edge);flex-direction:column;gap:5px;padding:10px 16px;display:flex}.live-foot-line{color:var(--ink-soft);margin:0;font-size:13.5px}.live-foot-said{color:var(--ink-2)}.live-foot-caret{background:var(--ink-soft);vertical-align:middle;width:1px;height:12px;margin-left:3px;animation:1s step-end infinite blink;display:inline-block}.log-row{border-top:1px solid var(--edge-soft)}.log-row>.log-line,.log-row:not(details){grid-template-columns:34px 92px minmax(0,1fr);align-items:baseline;gap:12px;padding:9px 16px 9px 8px;display:grid}.log-line{cursor:pointer;list-style:none}.log-line::-webkit-details-marker{display:none}.log-seq{color:var(--ink-faint);text-align:right;font-size:11px}.log-kind{color:var(--ink-2);font-size:11px}.log-text{min-width:0}.log-said{color:var(--ink);overflow-wrap:anywhere;text-wrap:pretty;font-size:13.5px;display:block}.log-said .fixed{font-size:12.5px}.log-who{color:var(--ink-soft)}.log-meta{color:var(--ink-soft);flex-wrap:wrap;gap:5px 7px;padding:6px 0 0;font-size:10.5px;display:flex}.log-chip{border:1px solid var(--edge);border-radius:var(--radius);color:var(--ink-2);padding:1px 5px}.log-failed{color:var(--accent)}.log-row-state,.log-row-supervisor{background:var(--accent-soft);box-shadow:inset 2px 0 0 var(--accent)}.log-row-state .log-kind,.log-row-supervisor .log-kind{color:var(--accent)}.log-row-confirm .log-kind{color:var(--ok)}.log-row-quiet .log-kind,.log-row-quiet .log-said{color:var(--ink-faint)}.log-more{padding:0 16px 10px 158px}.log-data{color:var(--ink-2);margin:0;overflow-x:auto}.log-list{color:var(--ink-soft);margin:0;padding:0;list-style:none}.log-block-name{color:var(--ink-soft);margin:8px 0 4px;font-weight:400}.live-panels{background:var(--panel-2);flex:292px;min-width:250px;max-width:360px;overflow:auto}.live-panel{border-bottom:1px solid var(--edge);padding:12px 14px}.live-panel-name{color:var(--ink-faint);font-family:var(--face-fixed);letter-spacing:.06em;margin:0 0 9px;font-size:10.5px;font-weight:400}.live-panel-empty,.live-panel-line{color:var(--ink-soft);font-family:var(--face-fixed);margin:0 0 9px;font-size:11.5px;line-height:1.9}.live-panel-blocks-summary{color:var(--ink-faint);cursor:pointer;margin-top:8px;font-size:11px}.readings{flex-direction:column;gap:7px;margin:0;display:flex}.reading{justify-content:space-between;align-items:baseline;gap:10px;display:flex}.reading-field{color:var(--ink-soft);flex:none;font-size:11.5px}.reading-value{color:var(--ink-2);overflow-wrap:anywhere;text-align:right;white-space:pre-wrap;flex:1;min-width:0;margin:0;font-size:11.5px}.reading-unit{color:var(--ink-faint)}.state-fields{flex-direction:column;gap:7px;margin:0;display:flex}.state-field{justify-content:space-between;align-items:baseline;gap:10px;display:flex}.state-field-name{color:var(--ink-soft);flex:none;font-size:11.5px}.state-field-value{color:var(--ink-2);overflow-wrap:anywhere;text-align:right;min-width:0;margin:0;font-size:11.5px}.seen-by{color:var(--ink-faint)}.seen-by-pii{color:var(--accent)}.participants{flex-direction:column;gap:6px;margin:0;padding:0;list-style:none;display:flex}.participant-line{color:var(--ink-2);cursor:pointer;align-items:center;gap:7px;font-size:12.5px;list-style:none;display:flex}.participant-line::-webkit-details-marker{display:none}.participant-dot{border-radius:50%;flex:none;width:6px;height:6px;display:block}.participant-speaking{background:var(--accent)}.participant-quiet{background:var(--ink-faint)}.participant-kind{color:var(--ink-soft);font-size:10.5px}.participant-line+.log-data{margin:6px 0 0 13px}.live-meter{grid-template-columns:minmax(0,1fr) 52px 30px;align-items:center;gap:8px;font-size:11px;display:grid}.live-meter+.live-meter{margin-top:8px}.live-meter-name{color:var(--ink-soft);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.live-meter-track{background:var(--sunk);border-radius:2px;height:4px;display:block;position:relative}.live-meter-bar{background:var(--accent);border-radius:2px;display:block;position:absolute;top:0;bottom:0;left:0}.live-meter-value{color:var(--ink-2);text-align:right}.calls{flex-wrap:wrap;flex:1;align-items:stretch;min-height:0;display:flex}.calls-aside{border-bottom:1px solid var(--edge);border-right:1px solid var(--edge);flex-direction:column;flex:244px;min-width:220px;max-width:300px;display:flex}.sim{background:var(--panel);border-bottom:1px solid var(--edge);padding:12px 14px}.sim-toggle{border:1px solid var(--edge);color:var(--ink-2);cursor:pointer;text-align:left;background:0 0;border-radius:6px;justify-content:space-between;align-items:center;gap:8px;width:100%;padding:7px 10px;font-size:13px;display:flex}.sim-toggle:hover{border-color:var(--accent);color:var(--accent)}.sim-toggle-mark{color:var(--ink-soft);font-size:12px}.sim-fields{flex-direction:column;gap:9px;padding:11px 0 2px;display:flex}.sim-field{flex-direction:column;gap:4px;display:flex}.sim-label{color:var(--ink-soft);font-size:10.5px}.sim-pair{grid-template-columns:1fr 1fr;gap:8px;display:grid}.sim-goal,.sim-aside{color:var(--ink-soft);text-wrap:pretty;margin:0;font-size:12px}.sim-aside{padding:12px 14px}.sim-checks{color:var(--ink-2);flex-direction:column;gap:6px;font-size:12.5px;display:flex}.sim-check{cursor:pointer;align-items:center;gap:7px;display:flex}.sim-check-aside{color:var(--ink-faint);font-size:10.5px}.sim-switch{appearance:none;background:var(--sunk);border:1px solid var(--edge);cursor:pointer;border-radius:8px;flex:none;width:26px;height:15px;margin:0;position:relative}.sim-switch:after{background:var(--ink-faint);content:"";border-radius:50%;width:9px;height:9px;position:absolute;top:2px;left:2px}.sim-switch:checked{background:var(--accent-soft);border-color:var(--accent-line)}.sim-switch:checked:after{background:var(--accent);left:13px}.sim-call{width:100%;margin-top:2px}.call-list{flex-direction:column;flex:1;min-height:0;display:flex}.call-list-standing{border-bottom:1px solid var(--edge-soft);color:var(--ink-soft);justify-content:space-between;align-items:center;gap:8px;margin:0;padding:9px 14px;font-size:10.5px;display:flex}.call-list-live{align-items:center;gap:6px;display:flex}.call-list-dot{background:var(--accent);border-radius:50%;width:6px;height:6px;animation:1.6s ease-in-out infinite pulse;display:block}.call-list-asked{color:var(--ink-faint)}.call-list-nothing{padding:12px 14px}.call-groups{flex:1;min-height:0;overflow:auto}.call-group-name{color:var(--ink-faint);letter-spacing:.06em;text-transform:uppercase;margin:0;padding:11px 14px 6px;font-size:10.5px;font-weight:400}.call-group+.call-group .call-group-name{padding-top:16px}.call-line{border-left:2px solid #0000;border-top:1px solid var(--edge-soft);color:var(--ink-2);grid-template-columns:16px minmax(0,1fr) auto;align-items:center;gap:10px;padding:9px 14px 9px 12px;display:grid}.call-line:hover{background:var(--hover)}.call-line-here{background:var(--selected);border-left-color:var(--accent)}.call-line-glyph{color:var(--ink-soft)}.call-line-who{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;overflow:hidden}.call-group-live .call-line-who{color:var(--ink)}.call-line-when{color:var(--ink-faint);font-size:11.5px}.call-group-live .call-line-when{color:var(--accent)}.calls-watching{flex:9999 440px;min-width:0;display:flex;overflow-x:auto}.calls-watching .nothing{padding:26px 28px}.chat{flex-direction:column;flex:1;width:100%;max-width:660px;min-height:0;margin:0 auto;padding:26px 28px 0;display:flex}.chat-title{letter-spacing:-.015em;margin:0 0 7px;font-size:22px;font-weight:500}.chat-lede{color:var(--ink-soft);text-wrap:pretty;margin:0 0 22px;font-size:14.5px}.chat-open{flex-direction:column;gap:9px;display:flex}.chat-field{flex-direction:column;gap:4px;display:flex}.chat-label{color:var(--ink-soft);font-size:10.5px}.chat-start{align-self:flex-start;margin-top:4px}.chat-facts{color:var(--ink-soft);flex-wrap:wrap;justify-content:space-between;gap:8px 16px;font-size:11.5px;display:flex}.chat-facts b{color:var(--ink-2);font-weight:400}.chat-whole{color:var(--ink-soft)}.chat-whole:hover{color:var(--accent)}.chat-lines{border-top:1px solid var(--edge);flex-direction:column;flex:1;gap:22px;min-height:220px;margin-top:10px;padding:22px 0 26px;display:flex;overflow-y:auto}.chat-line{flex-direction:column;gap:6px;display:flex}.chat-line-user{align-items:flex-end}.chat-who{color:var(--ink-faint);letter-spacing:.07em;text-transform:uppercase;font-size:10px}.chat-bubble{background:var(--panel);border:1px solid var(--edge);color:var(--ink);overflow-wrap:anywhere;text-wrap:pretty;border-radius:8px 8px 8px 2px;max-width:84%;padding:10px 13px;font-size:15px;line-height:1.5}.chat-line-user .chat-bubble{background:var(--accent-soft);border-color:var(--accent-line);border-radius:8px 8px 2px}.chat-line-tool .chat-bubble{color:var(--ink-2);font-size:12px}.chat-composer{background:var(--ground);padding:0 0 20px;position:sticky;bottom:0}.chat-box{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius-panel);align-items:center;gap:10px;height:44px;padding:0 6px 0 14px;display:flex}.chat-say{color:var(--ink);background:0 0;border:0;flex:1;min-width:0;font-size:14.5px}.chat-say:focus{outline:none}.chat-say::placeholder{color:var(--ink-faint)}.chat-send{border-radius:6px;height:32px;padding:0 15px;font-size:13.5px}.chat-foot{color:var(--ink-faint);text-wrap:pretty;flex-wrap:wrap;align-items:baseline;gap:6px 10px;margin:10px 0 0;font-size:11px;display:flex}.chat-hangup{border:1px solid var(--accent-line);color:var(--accent);cursor:pointer;background:0 0;border-radius:6px;height:24px;padding:0 10px;font-size:11px}.chat-hangup:hover{border-color:var(--accent)}.ev-row{cursor:pointer}.ev-status-done,.ev-held,.ev-delta-up{color:var(--ok)}.ev-status-failed,.ev-status-running,.ev-bad,.ev-delta-down{color:var(--warn)}.ev-detail{gap:14px;display:grid}.ev-scores td{vertical-align:middle}.ev-score{justify-content:flex-end;align-items:center;gap:8px;display:inline-flex}.ev-score-value{font-family:var(--face-fixed);font-variant-numeric:tabular-nums;font-size:11.5px}.ev-track{background:var(--sunk);border-radius:2px;width:96px;height:4px}.ev-bar{background:var(--ok);border-radius:2px;height:100%;display:block}.ev-bar-bad{background:var(--warn)}.ev-reason{color:var(--ink-soft);max-width:48ch;margin:0;font-size:12.5px;line-height:1.55}.ev-said .panel-body{gap:10px;display:grid}.ev-quote{border-left:2px solid var(--edge);color:var(--ink);margin:0;padding-left:12px;font-size:13.5px;line-height:1.55}a.chip:hover .chip-val{color:var(--accent)}.suite-lede,.suite-aside{color:var(--ink-soft);text-wrap:pretty;max-width:68ch;margin:0 0 14px;font-size:13px}.suite{flex-direction:column;gap:14px;display:flex}.suite-head{flex-wrap:wrap;align-items:center;gap:14px;display:flex}.suite-check{color:var(--ink-2);align-items:center;gap:7px;font-size:12.5px;display:flex}.suite-field{color:var(--ink-soft);font-family:var(--face-fixed);align-items:center;gap:8px;font-size:10.5px;display:flex}.suite-input{width:6ch}.suite-list{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.suite-golden{border-top:1px solid var(--edge-soft);grid-template-columns:minmax(18ch,1fr) 2fr 2fr;align-items:baseline;gap:14px;padding:8px 0;font-size:13px;display:grid}.suite-says{color:var(--ink-2);text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;overflow:hidden}.suite-expects{color:var(--ink-soft);text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;overflow:hidden}.drift-windows{align-items:center;gap:14px;margin-bottom:14px;display:flex}.drift-field{color:var(--ink-soft);font-family:var(--face-fixed);align-items:center;gap:8px;font-size:10.5px;display:flex}.drift-field .input{width:5rem}.drift-broke{flex-direction:column;gap:8px;margin:14px 0 0;padding:0;list-style:none;display:flex}.drift-broke li{flex-wrap:wrap;gap:8px;display:flex}.ev-acts{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:14px;display:flex}.ev-repro{flex-direction:column;gap:8px;margin-top:22px;display:flex}.ev-repro .chip{cursor:pointer}.ev-asked{background:var(--sunk);border:1px solid var(--edge);border-radius:var(--radius-control);color:var(--ink-2);white-space:pre-wrap;word-break:break-word;max-height:26rem;margin:0;padding:10px 12px;font-size:11px;overflow:auto}.suite-models{width:22rem}.floor{max-width:940px;padding:26px 28px}.floor-wide{max-width:1320px}.floor-head{flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:12px 24px;margin:0 0 18px;display:flex}.floor-title{letter-spacing:-.01em;margin:0 0 6px;font-size:20px;font-weight:500}.floor-lede{color:var(--ink-soft);margin:0;font-size:14px}.floor-standing{color:var(--ink-soft);align-items:center;gap:6px;font-size:10.5px;display:flex}.floor-dot{background:var(--ink-faint);border-radius:50%;width:6px;height:6px;display:block}.floor-dot-live{background:var(--accent);animation:1.6s ease-in-out infinite floor-pulse}@keyframes floor-pulse{0%,to{opacity:.35}50%{opacity:1}}.floor-empty{color:var(--ink-faint);max-width:64ch;font-size:11.5px}.floor-panel{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius-panel);overflow:hidden}.floor-row{border-bottom:1px solid var(--edge-soft);color:var(--ink);grid-template-columns:16px 150px minmax(0,1fr) 84px 150px;align-items:center;gap:12px;padding:11px 16px;display:grid}.floor-row:last-child{border-bottom:none}.floor-row-head{border-bottom-color:var(--edge);color:var(--ink-faint);letter-spacing:.06em;padding:9px 16px;font-size:10.5px}.floor-row-live:hover{background:var(--hover)}.floor-glyph{color:var(--ink-soft)}.floor-who{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;overflow:hidden}.floor-status{color:var(--accent)}.floor-id{color:var(--ink-faint)}.sessions-head{flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:12px 24px;display:flex}.by-hand{background:var(--sunk);border:1px solid var(--edge);border-radius:var(--radius-control);align-items:center;height:30px;display:flex;overflow:hidden}.by-hand-id{color:var(--ink);background:0 0;border:0;width:22ch;height:100%;padding:0 10px;font-size:13px}.by-hand-id::placeholder{color:var(--ink-faint)}.by-hand-id:focus{outline:none}.by-hand-open{border:0;border-left:1px solid var(--edge);color:var(--ink-2);cursor:pointer;background:0 0;height:100%;padding:0 11px;font-size:12.5px}.by-hand-open:hover{color:var(--ink)}.medium{color:var(--ink-soft);font-size:12.5px}.outcome{color:var(--ink);white-space:nowrap;font-size:13px}.outcome-error,.outcome-timeout{color:var(--warn)}.facts{background:var(--edge);border:1px solid var(--edge);border-radius:var(--radius-panel);grid-template-columns:repeat(auto-fit,minmax(132px,1fr));gap:1px;display:grid;overflow:hidden}.fact{background:var(--panel);padding:11px 13px}.fact-key{color:var(--ink-faint);font-family:var(--face-fixed);letter-spacing:.06em;text-transform:uppercase;font-size:10px}.fact-val{color:var(--ink);font-family:var(--face-fixed);font-variant-numeric:tabular-nums;overflow-wrap:anywhere;margin-top:4px;font-size:13.5px}.fact-accent .fact-val{color:var(--accent)}.strip{background:var(--edge);border:1px solid var(--edge);border-radius:var(--radius-panel);grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:1px;display:grid;overflow:hidden}.strip-cell{background:var(--panel);padding:14px 16px}.strip-leg{color:var(--ink-faint);font-family:var(--face-fixed);letter-spacing:.06em;text-transform:uppercase;font-size:10.5px}.strip-median{font-family:var(--face-fixed);font-variant-numeric:tabular-nums;letter-spacing:-.02em;margin-top:6px;font-size:22px}.strip-foot{color:var(--ink-soft);font-family:var(--face-fixed);font-variant-numeric:tabular-nums;justify-content:space-between;gap:12px;margin-top:6px;font-size:11px;display:flex}.strip-max{color:var(--ink-2)}.consent{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius-panel);box-shadow:inset 2px 0 0 var(--accent);padding:12px 16px}.consent+.consent{margin-top:10px}.consent-join{color:var(--accent);margin:0;font-size:11.5px}.consent-said{color:var(--ink);text-wrap:pretty;max-width:72ch;margin:6px 0 0;font-size:13.5px;line-height:1.55}.consent-problem{color:var(--warn);margin:6px 0 0;font-size:12.5px}.consent-problem:before{content:"! "}.score-list{margin:0;padding:0;list-style:none;display:grid}.score-row{grid-template-columns:16px 120px 90px minmax(0,1fr) auto;align-items:baseline;gap:12px;padding:10px 0;display:grid}.score-row+.score-row{border-top:1px solid var(--edge-soft)}.score-row-mark{font-family:var(--face-fixed)}.score-row-pass .score-row-mark{color:var(--ok)}.score-row-fail .score-row-mark{color:var(--warn)}.score-row-na{color:var(--ink-faint)}.score-row-kind{color:var(--ink-faint);font-family:var(--face-fixed);letter-spacing:.06em;text-transform:uppercase;font-size:10.5px}.score-row-reason{color:var(--ink-soft);font-size:12.5px;line-height:1.55}.score-row-said{color:var(--ink)}.score-row-seqs{flex-wrap:wrap;gap:5px 7px;display:flex}.player{width:100%}.timeline{border-collapse:collapse;table-layout:auto;width:100%;font-size:12.5px}.timeline td{border-bottom:1px solid var(--edge-soft);vertical-align:top;padding:6px 10px}.timeline tbody tr:last-child td{border-bottom:none}.timeline .row-opens{cursor:pointer}.timeline .row-opens:hover td{background:var(--hover)}.timeline .row-cited td{background:var(--accent-soft);box-shadow:inset 2px 0 var(--accent)}.timeline .mark{color:var(--accent);width:1.5em}.timeline .seq{color:var(--ink-faint);width:4em}.timeline .type{color:var(--ink-2);white-space:nowrap}.timeline .payload{color:var(--ink);overflow-wrap:anywhere}.timeline .field td{border-bottom:none;padding-top:0;padding-bottom:0}.timeline .field-name{color:var(--ink-faint);white-space:nowrap}.timeline .field-value{color:var(--ink-soft);overflow-wrap:anywhere}.timeline .chips{margin-left:8px;display:inline-flex}.timeline .number{text-align:right}.timeline .soft{color:var(--ink-soft)}.keys-issue{margin-top:22px}.keys-form{grid-template-columns:minmax(0,1fr) 150px auto;align-items:center;gap:10px;padding:14px 14px 6px;display:grid}.keys-issue .note{margin:0;padding:0 14px 12px}.keys-minted{margin-top:16px;padding:14px 16px 12px}.keys-clear{overflow-wrap:anywhere;-webkit-user-select:all;user-select:all;padding:10px 0 2px;display:block}.keys-list{margin:22px 0 0;padding:0;list-style:none}.keys-one{border-bottom:1px solid var(--edge-soft);grid-template-columns:minmax(0,1fr) 100px 130px minmax(0,1fr) auto;align-items:center;gap:16px;padding:11px 16px;display:grid}.keys-one:last-child{border-bottom:none}.keys-one:hover{background:var(--hover)}.keys-gone{opacity:.55}.keys-scopes,.keys-env,.keys-standing{color:var(--ink-soft);font-size:12px}.keys-nothing{margin-top:22px}@media (width<=720px){.keys-form,.keys-one{grid-template-columns:minmax(0,1fr)}}.providers-bring{margin-top:22px}.providers-add{grid-template-columns:220px minmax(0,1fr) auto;align-items:center;gap:10px;padding:14px 14px 12px;display:grid}.providers-filters{gap:8px;margin:26px 0 0;display:flex}.providers-filter{border:1px solid var(--edge);color:var(--ink-soft);cursor:pointer;letter-spacing:.02em;background:0 0;border-radius:999px;padding:5px 13px;font-family:inherit;font-size:11.5px}.providers-filter:hover{border-color:var(--accent-line);color:var(--ink)}.providers-filter-on{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}.providers-list{margin:14px 0 0;padding:0;list-style:none}.providers-one{border-bottom:1px solid var(--edge-soft);grid-template-columns:minmax(0,1fr) 92px 78px 74px;align-items:baseline;gap:16px;padding:11px 16px;display:grid}.providers-one:last-child{border-bottom:none}.providers-one:hover{background:var(--hover)}.providers-who{flex-wrap:wrap;align-items:baseline;gap:10px;min-width:0;display:flex}.providers-one .providers-vendor{color:var(--ink);font-size:13.5px}.providers-said{color:var(--ink-soft);text-wrap:pretty;font-size:11.5px}.providers-aliases{color:var(--ink-faint);font-size:10.5px}.providers-does,.providers-boxes{color:var(--ink-faint);font-size:11px}.providers-state{color:var(--ink-soft);font-size:11px}.providers-state-on{color:var(--accent)}@media (width<=700px){.providers-add{grid-template-columns:minmax(0,1fr)}.providers-one{grid-template-columns:minmax(0,1fr) auto}.providers-does{display:none}}.kb-here .panel-head{justify-content:space-between;align-items:center}.kb-field{align-items:center;gap:var(--step);display:flex}.kb-actions{align-items:center;gap:calc(var(--step) * 2);flex-wrap:wrap;display:flex}.kb-misses{gap:var(--step);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.kb-misses li{gap:var(--step);flex-wrap:wrap;justify-content:space-between;display:flex}.mem-ask{align-items:center;gap:var(--step);margin-bottom:calc(var(--step) * 2);display:flex}.mem-contact{width:22rem}.mem-facts{gap:var(--step);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.mem-facts li{gap:var(--step);flex-wrap:wrap;justify-content:space-between;display:flex}.mem-gone{opacity:.55}.mem-goldens{gap:calc(var(--step) * 2);grid-template-columns:repeat(auto-fit,minmax(22rem,1fr));display:grid}.mem-run{align-items:flex-start;gap:var(--step);flex-direction:column;display:flex}.mem-run p{margin:0}.numbers{max-width:940px;padding:26px 28px}.numbers-title{letter-spacing:-.01em;margin:0 0 6px;font-size:20px;font-weight:500}.numbers-lede{color:var(--ink-soft);margin:0 0 22px;font-size:14px}.numbers-carrier,.numbers-doors,.numbers-adding{border-top:1px solid var(--edge);padding:18px 0 22px}.numbers-form-head{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;margin-bottom:14px;display:flex}.numbers-form-title{font-size:13px;font-weight:500}.numbers-carrier-standing{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius-panel);flex-wrap:wrap;align-items:center;gap:14px;padding:12px 16px;font-size:12.5px;display:flex}.numbers-kind{background:var(--accent-soft);color:var(--accent);letter-spacing:.06em;text-transform:uppercase;border-radius:4px;padding:2px 7px;font-size:10.5px}.numbers-carrier-moves{gap:14px;margin-left:auto;display:flex}.numbers-form{flex-direction:column;gap:12px;display:flex}.numbers-fields{grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;display:grid}.numbers-field{flex-direction:column;gap:4px;display:flex}.numbers-field>span{color:var(--ink-soft);font-family:var(--face-fixed);font-size:10.5px}.numbers-field>span>em{color:var(--ink-faint);margin-left:6px;font-style:normal}.numbers-field>.input{height:30px}.numbers-form-foot{flex-wrap:wrap;align-items:center;gap:14px;display:flex}.numbers-form-foot>.numbers-note{flex:260px;margin:0}.numbers-plan{background:var(--sunk);border:1px solid var(--accent-line);border-radius:var(--radius-panel);margin-top:14px;padding:14px 16px}.numbers-done{border-color:var(--edge)}.numbers-plan-title{text-wrap:pretty;margin:0 0 10px;font-size:13px}.numbers-steps{flex-direction:column;gap:5px;margin:0 0 12px;padding:0;font-size:12px;list-style:none;display:flex}.numbers-steps>li{grid-template-columns:64px minmax(0,1fr);gap:12px;display:grid}.numbers-step-kind{color:var(--accent)}.numbers-panel{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius-panel);overflow:auto}.numbers-row{border-bottom:1px solid var(--edge-soft);grid-template-columns:190px 92px minmax(0,1fr) 110px 84px 60px;align-items:center;gap:12px;min-width:700px;padding:11px 16px;display:grid}.numbers-row:last-child{border-bottom:none}.numbers-row-head{border-bottom-color:var(--edge);color:var(--ink-faint);letter-spacing:.06em;padding:9px 16px;font-size:10.5px}.numbers-row-moves{text-align:right}.numbers-managed{background:var(--panel-2);border:1px solid var(--edge);color:var(--ink-soft);letter-spacing:.05em;text-transform:uppercase;border-radius:3px;margin-left:8px;padding:1px 5px;font-size:9.5px}.numbers-channel{color:var(--ink-soft);font-size:12.5px}.numbers-dim{color:var(--ink-soft)}.numbers-operator{color:var(--accent)}.numbers-note{color:var(--ink-faint);text-wrap:pretty;margin:12px 0 0;font-size:11px}.numbers-refused{color:var(--accent);margin:0 0 14px}.leg-model{border-bottom:1px solid var(--edge);color:var(--ink);padding-bottom:10px;font-size:13.5px}.leg-rows{margin:0}.leg-row{padding:10px 0}.leg-row+.leg-row{border-top:1px solid var(--edge-soft)}.leg-k{color:var(--ink-faint);font-family:var(--face-fixed);letter-spacing:.06em;text-transform:uppercase;font-size:10.5px}.leg-v{color:var(--ink);overflow-wrap:anywhere;margin:4px 0 0;font-size:13px}.leg-note{color:var(--ink-soft);text-wrap:pretty;margin:4px 0 0;font-size:12px;line-height:1.5}.leg-refused{border-top:1px solid var(--edge);margin-top:12px;padding-top:10px}.leg-refused-title{color:var(--warn);font-family:var(--face-fixed);letter-spacing:.06em;text-transform:uppercase;font-size:10.5px}.leg-refused-row{color:var(--ink-soft);margin:8px 0 0;font-size:11.5px;line-height:1.55}.wf{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius-panel);padding:14px 16px}.wf-row{grid-template-columns:140px 1fr 90px;align-items:center;gap:12px;padding:9px 0;display:grid}.wf-row+.wf-row{border-top:1px solid var(--edge-soft)}.wf-row-total{border-top:1px solid var(--edge);margin-top:6px}.wf-label{color:var(--ink-soft);font-family:var(--face-fixed);font-size:11.5px}.wf-row-total .wf-label{color:var(--ink)}.wf-track{background:var(--sunk);border-radius:2px;height:9px;position:relative}.wf-bar{background:var(--ink-faint);border-radius:2px;position:absolute;top:0;bottom:0}.wf-row-total .wf-bar{background:var(--accent)}.wf-unmeasured{color:var(--ink-faint);font-family:var(--face-fixed);font-size:10.5px;position:absolute;top:-3px;left:8px}.wf-value{color:var(--ink-2);font-family:var(--face-fixed);font-variant-numeric:tabular-nums;text-align:right;font-size:11.5px}.wf-row-total .wf-value{color:var(--accent)}.wf-note{color:var(--ink-soft);grid-column:2/4;margin:4px 0 0;font-size:12px;line-height:1.5}.wf-caption{border-top:1px solid var(--edge);color:var(--ink-faint);font-family:var(--face-fixed);text-wrap:pretty;max-width:78ch;margin:12px 0 0;padding-top:10px;font-size:11px;line-height:1.6}.ctl{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius-panel);grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px 22px;padding:14px 16px;display:grid}.ctl-field{grid-template-columns:86px minmax(0,1fr);align-items:baseline;gap:4px 12px;display:grid}.ctl-field-wide{grid-column:1/-1}.ctl-stage{grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);gap:8px;min-width:0;display:grid}@media (width<=760px){.ctl-stage{grid-template-columns:minmax(0,1fr)}}.ctl-label{color:var(--ink-soft);font-family:var(--face-fixed);font-size:10.5px}.ctl-input{background:var(--sunk);border:1px solid var(--edge);border-radius:var(--radius-control);color:var(--ink-2);width:100%;padding:5px 8px;font-family:inherit;font-size:12.5px}.ctl-input:focus{color:var(--ink)}.ctl-textarea{resize:vertical;line-height:1.55}.ctl-note{color:var(--ink-faint);text-wrap:pretty;grid-column:2;margin:0;font-size:12px;line-height:1.5}.ctl-foot{flex-wrap:wrap;grid-column:1/-1;align-items:center;gap:14px;display:flex}.ctl-save{background:var(--accent);border-radius:var(--radius-control);color:var(--on-accent);cursor:pointer;border:0;height:30px;padding:0 14px;font-size:13px;font-weight:500}.ctl-save:disabled{cursor:default;opacity:.5}.ctl-banner{color:var(--ink-faint);font-family:var(--face-fixed);font-size:11px}.ctl-error{background:var(--accent-soft);border:1px solid var(--accent-line);border-radius:var(--radius-control);color:var(--ink-2);font-family:var(--face-fixed);grid-column:1/-1;margin:0;padding:8px 12px;font-size:11.5px;line-height:1.6}.ctl-ok{color:var(--ink-faint);font-family:var(--face-fixed);grid-column:1/-1;margin:0;font-size:11px}.ctl+.table-wrap,.ctl+.note{margin-top:14px}.talk{flex-direction:row;flex:1;min-height:0;display:flex}.talk-column{flex-direction:column;flex:0 0 clamp(360px,36%,620px);min-height:0;padding:44px 28px 34px;display:flex;overflow-y:auto}.talk-title{letter-spacing:-.015em;margin:0 0 7px;font-size:22px;font-weight:500}.talk-lede{color:var(--ink-soft);text-wrap:pretty;margin:0 0 34px;font-size:14.5px}.talk-door-row{align-items:center;gap:18px;padding:0 0 30px;display:flex}.door{border:1px solid var(--accent-line);color:var(--accent);cursor:pointer;letter-spacing:-.005em;background:0 0;border-radius:50%;flex:none;width:68px;height:68px;font-size:13px;font-weight:500}.door:hover:not(:disabled){border-color:var(--accent)}.door-on{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}.door:disabled{cursor:default;opacity:.5}.talk-standing{flex-direction:column;gap:7px;min-width:0;display:flex}.talk-phase{color:var(--ink);font-size:15px}.talk-signal{align-items:center;gap:9px;display:flex}.talk-bars{align-items:flex-end;gap:2px;height:13px;display:flex}.talk-bars span{background:var(--ink-faint);width:2px;display:block}.talk-bars span:first-child{height:5px}.talk-bars span:nth-child(2){height:11px}.talk-bars span:nth-child(3){height:7px}.talk-bars-on span{background:var(--accent);animation:1.1s ease-in-out infinite pulse}.talk-bars-on span:nth-child(2){animation-delay:.12s}.talk-bars-on span:nth-child(3){animation-delay:.24s}.talk-call{color:var(--ink-soft);font-size:11.5px}.talk-error{color:var(--accent);margin:10px 0 0;font-size:11.5px}.talk-whole{border-left:1px solid var(--edge);flex:1;min-width:0;min-height:0;display:flex}.stream{border-top:1px solid var(--edge);flex-direction:column;flex:1;gap:18px;min-height:160px;padding:22px 0 8px;display:flex;overflow-y:auto}.stream-empty{justify-content:center;align-items:center}.stream-hint{color:var(--ink-faint);text-wrap:pretty;margin:0;font-size:11.5px}.said{grid-template-columns:58px minmax(0,1fr);gap:12px;display:grid}.said-who{color:var(--ink-faint);letter-spacing:.07em;text-transform:uppercase;padding-top:5px;font-size:10.5px}.said-user .said-who{color:var(--accent)}.said-text{color:var(--ink);overflow-wrap:anywhere;text-wrap:pretty;margin:0;font-size:15.5px;line-height:1.5}.said-user.said-interim .said-text{color:var(--ink-soft)}.said-word{animation:.22s ease-out both word-in}@keyframes word-in{0%{opacity:0}to{opacity:1}}.said-cursor{background:var(--ink-soft);vertical-align:middle;width:1px;height:14px;margin-left:3px;animation:1s step-end infinite blink;display:inline-block}.said-mark{color:var(--ink-faint);overflow-wrap:anywhere;margin:0 0 0 70px;font-size:11.5px}.said-mark-error,.said-mark-supervisor{color:var(--accent)}@media (width<=1000px){.talk{flex-direction:column}.talk-column{flex:none;width:100%;max-width:600px;margin:0 auto;overflow-y:visible}.talk-whole{border-left:none;border-top:1px solid var(--edge);min-height:320px}.stream{flex:none;max-height:44vh}}.terminal{justify-content:center;padding:48px 20px;display:flex}.terminal-card{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius-panel);width:100%;max-width:27rem;padding:26px 26px 24px}.terminal-title{color:var(--ink);letter-spacing:-.015em;margin:0 0 8px;font-size:19px;font-weight:500}.terminal-lede{color:var(--ink-soft);text-wrap:pretty;margin:0;font-size:13.5px;line-height:1.55}.terminal-go{background:var(--ink);border:1px solid var(--ink);border-radius:var(--radius-control);color:var(--ground);cursor:pointer;font-family:var(--face);justify-content:center;align-items:center;width:100%;height:38px;margin-top:20px;font-size:14px;font-weight:500;display:inline-flex}.terminal-go:hover:not(:disabled){opacity:.9}.terminal-go:disabled{cursor:not-allowed;opacity:.4}.terminal-refused{border-left:2px solid var(--accent);color:var(--ink-2);text-wrap:pretty;margin:16px 0 0;padding-left:10px;font-size:13px;line-height:1.5}.team{max-width:1080px;padding:26px 28px}.team-title{letter-spacing:-.01em;margin:0 0 6px;font-size:20px;font-weight:500}.team-lede{color:var(--ink-soft);margin:0 0 20px;font-size:14px}.team-panel,.team-invite{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius-panel);overflow:hidden}.team-invite{margin:0 0 22px;padding:0 0 14px}.team-panel-label{border-bottom:1px solid var(--edge);color:var(--ink-faint);letter-spacing:.06em;margin:0;padding:10px 14px;font-size:10.5px}.team-invite-fields{grid-template-columns:minmax(0,1.4fr) minmax(0,1fr) 130px minmax(0,1.2fr) auto;align-items:center;gap:10px;padding:14px 14px 10px;display:grid}.team-input{background:var(--sunk);border:1px solid var(--edge);color:var(--ink-soft);border-radius:5px;min-width:0;padding:6px 9px;font-size:12.5px}.team-input:focus{color:var(--ink)}.team-inline{padding:4px 7px}.team-button{background:var(--accent);color:var(--on-accent);cursor:pointer;border:0;border-radius:5px;height:32px;padding:0 14px;font-size:13px;font-weight:500}.team-button:disabled{opacity:.5}.team-note{color:var(--ink-faint);text-wrap:pretty;margin:0;padding:0 14px;font-size:11px}.team-refused{color:var(--accent);margin:0 0 14px;padding:0}.team-cmd{color:var(--ink-soft)}.team-token{background:var(--accent-soft);border:1px solid var(--accent-line);border-radius:var(--radius-panel);margin:0 0 22px;padding:14px}.team-token-title{color:var(--ink);margin:0 0 10px;font-size:13px}.team-token-code{background:var(--sunk);border:1px solid var(--edge);color:var(--ink);-webkit-user-select:all;user-select:all;border-radius:5px;margin:0 0 10px;padding:8px 10px;display:block;overflow-x:auto}.team-row{border-bottom:1px solid var(--edge-soft);grid-template-columns:minmax(0,1fr) minmax(0,1.4fr) 130px minmax(0,1.2fr) 84px 150px;align-items:center;gap:12px;padding:10px 14px;display:grid}.team-row:last-child{border-bottom:none}.team-row-head{border-bottom-color:var(--edge);color:var(--ink-faint);letter-spacing:.06em;padding:9px 14px;font-size:10.5px}.team-name{font-size:13.5px}.team-dim{color:var(--ink-soft)}.team-status-active{color:var(--ok)}.team-status-invited{color:var(--warn)}.team-status-disabled{color:var(--ink-faint)}.team-moves{text-align:right}.team-link{color:var(--ink-soft);cursor:pointer;background:0 0;border:none;padding:0}.team-link:hover{color:var(--accent)}.usage{max-width:1120px;padding:26px 28px}.usage-title{letter-spacing:-.01em;margin:0 0 6px;font-size:20px;font-weight:500}.usage-lede{color:var(--ink-soft);margin:0 0 20px;font-size:14px}.usage-totals{background:var(--edge);border:1px solid var(--edge);border-radius:var(--radius-panel);grid-template-columns:repeat(auto-fit,minmax(132px,1fr));gap:1px;margin:0 0 22px;display:grid;overflow:hidden}.usage-total{background:var(--panel);flex-direction:column;gap:4px;padding:11px 13px;display:flex}.usage-total-name{color:var(--ink-faint);letter-spacing:.06em;font-size:10px}.usage-total-value{font-size:13.5px}.usage-panel{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius-panel);overflow:auto}.usage-row{border-bottom:1px solid var(--edge-soft);grid-template-columns:110px 130px minmax(0,1fr) 100px 56px 70px 70px 56px 84px;align-items:center;gap:12px;min-width:820px;padding:10px 14px;font-size:11.5px;display:grid}.usage-row:last-child{border-bottom:none}.usage-row-head{border-bottom-color:var(--edge);color:var(--ink-faint);letter-spacing:.06em;padding:9px 14px;font-size:10.5px}.usage-num{font-variant-numeric:tabular-nums;text-align:right}.usage-dim{color:var(--ink-soft)}.usage-link{color:var(--accent);text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.usage-note{color:var(--ink-faint);text-wrap:pretty;margin:14px 0 0;font-size:11px}.usage-refused{color:var(--accent)}.agent-select{color:var(--ink-faint);align-items:center;gap:8px;display:flex}.agent-select-label{letter-spacing:.06em;font-size:10.5px}.agent-select-control{border:1px solid var(--edge);color:var(--ink-soft);cursor:pointer;background:0 0;border-radius:6px;height:26px;padding:0 9px;font-size:11px}.agent-select-control:hover{border-color:var(--ink);color:var(--ink)}.world{align-items:center;gap:8px;display:flex}.world-switch{background:var(--sunk);border:1px solid var(--edge);border-radius:6px;height:26px;display:inline-flex;overflow:hidden}.world-option{color:var(--ink-soft);cursor:pointer;background:0 0;border:none;height:100%;padding:0 9px;font-size:11px}.world-option+.world-option{border-left:1px solid var(--edge)}.world-option:hover:not(:disabled){color:var(--ink)}.world-option-here{background:var(--selected);color:var(--ink)}.world-refused{color:var(--accent);max-width:32ch;font-size:11px}:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--ground:#0d0d0f;--panel:#101013;--panel-2:#16161a;--panel-3:#202028;--edge:#24242a;--edge-strong:#24242a;--edge-soft:#1c1c22;--ink:#ececec;--ink-2:#c9c9d0;--ink-soft:#8b8b93;--ink-faint:#5c5c66;--accent:#f0569a;--accent-soft:#1a1217;--accent-line:#3a2130;--on-accent:#fff;--ok:#7fae86;--warn:#cfae7e;--face:"IBM Plex Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;--face-fixed:"IBM Plex Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace;--sunk:#0a0a0c;--hover:#1a1a20;--selected:#202028;--step:8px;--rail:204px;--head:50px;--radius:4px;--radius-control:5px;--radius-panel:8px}:root[data-theme=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--ground:#f6f6f4;--panel:#fff;--panel-2:#fbfbf9;--panel-3:#eaeae6;--edge:#e3e3de;--edge-strong:#e3e3de;--edge-soft:#ededea;--ink:#17171a;--ink-2:#3e3e45;--ink-soft:#74747c;--ink-faint:#a4a4ac;--accent:#c92572;--accent-soft:#fdf1f6;--accent-line:#f0cfdf;--ok:#3d7a4c;--warn:#8a6a2c;--sunk:#f1f1ee;--hover:#f1f1ee;--selected:#eaeae6}.page{min-width:0;max-width:1040px;padding:26px 28px 34px}.page-wide{max-width:1320px}.page-eyebrow{color:var(--ink-faint);font-family:var(--face-fixed);letter-spacing:.06em;text-transform:uppercase;font-size:10.5px}.page-title{letter-spacing:-.01em;margin:4px 0 0;font-size:20px;font-weight:500}.page-title-fixed{font-family:var(--face-fixed);letter-spacing:0}.page-lede{color:var(--ink-soft);text-wrap:pretty;max-width:68ch;margin:6px 0 0;font-size:14px}.section{margin-top:22px}.section-title{color:var(--ink-faint);font-family:var(--face-fixed);letter-spacing:.06em;text-transform:uppercase;margin:0 0 10px;font-size:10.5px;font-weight:400}.note{color:var(--ink-faint);font-family:var(--face-fixed);text-wrap:pretty;margin:14px 0 0;font-size:11px}.note+.panel{margin-top:14px}.note-warn{color:var(--accent)}.panel{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius-panel);overflow:hidden}.panel-head{border-bottom:1px solid var(--edge);justify-content:space-between;align-items:baseline;gap:12px;padding:10px 14px;display:flex}.panel-title{color:var(--ink-faint);font-family:var(--face-fixed);letter-spacing:.06em;text-transform:uppercase;margin:0;font-size:10.5px;font-weight:400}.panel-body{padding:12px 14px;font-size:13px}.grid{gap:14px;display:grid}.grid-3{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}.badge{color:var(--ink-faint);font-family:var(--face-fixed);letter-spacing:.06em;text-transform:uppercase;white-space:nowrap;font-size:10.5px}.badge-live{background:var(--accent-soft);border:1px solid var(--accent-line);border-radius:var(--radius);color:var(--accent);padding:1px 6px}.mono{font-family:var(--face-fixed);font-size:.92em}.dim{color:var(--ink-soft)}.faint{color:var(--ink-faint)}.accent{color:var(--accent)}.table-wrap{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius-panel);overflow-x:auto}.table{border-collapse:collapse;width:100%;font-size:13px}.table th{border-bottom:1px solid var(--edge);color:var(--ink-faint);font-family:var(--face-fixed);letter-spacing:.06em;text-align:left;text-transform:uppercase;white-space:nowrap;padding:9px 16px;font-size:10.5px;font-weight:400}.table td{border-bottom:1px solid var(--edge-soft);vertical-align:baseline;padding:11px 16px}.table tbody tr:last-child td{border-bottom:none}.table tbody tr:hover td{background:var(--hover)}.table td.num,.table th.num{font-family:var(--face-fixed);font-variant-numeric:tabular-nums;text-align:right;font-size:11.5px}.table td.id{font-family:var(--face-fixed);font-size:12px}.table td.id .link{color:var(--accent);font-size:12px}tr.is-open td{background:var(--selected)}.kv{border-collapse:collapse;width:100%}.kv td{font-family:var(--face-fixed);padding:4px 0;font-size:11.5px}.kv-key{color:var(--ink-soft)}.kv-val{color:var(--ink-2);font-variant-numeric:tabular-nums;text-align:right}.chips{flex-wrap:wrap;gap:5px 7px;display:flex}.chip{border:1px solid var(--edge);border-radius:var(--radius);color:var(--ink-2);font-family:var(--face-fixed);align-items:baseline;gap:4px;padding:1px 5px;font-size:10.5px;display:inline-flex}.chip-key{color:var(--ink-soft)}.chip-val{color:var(--ink-2);font-variant-numeric:tabular-nums}.tabs{background:var(--sunk);border:1px solid var(--edge);border-radius:var(--radius-control);height:28px;margin-top:22px;display:inline-flex;overflow:hidden}.tab{border:none;border-right:1px solid var(--edge);color:var(--ink-soft);cursor:pointer;font-family:var(--face-fixed);background:0 0;height:100%;padding:0 10px;font-size:11.5px}.tab:last-child{border-right:none}.tab:hover{color:var(--ink)}.tab:focus-visible{outline-offset:-2px}.tab.is-active{background:var(--selected);color:var(--ink)}.button{border:1px solid var(--edge);border-radius:var(--radius-control);color:var(--ink-2);cursor:pointer;white-space:nowrap;background:0 0;align-items:center;gap:7px;height:28px;padding:0 10px;font-size:12.5px;display:inline-flex}.button:hover:not(:disabled){border-color:var(--ink);color:var(--ink)}.button:disabled{cursor:default;opacity:.4}.button-accent{background:var(--accent);border-color:var(--accent);color:var(--on-accent);height:30px;padding:0 14px;font-weight:500}.button-accent:hover:not(:disabled){border-color:var(--accent);color:var(--on-accent)}.input{background:var(--sunk);border:1px solid var(--edge);border-radius:var(--radius-control);color:var(--ink-2);min-width:0;padding:5px 8px;font-size:12.5px}.input:focus{color:var(--ink)}.input::placeholder{color:var(--ink-faint)}.link{color:var(--ink-soft);cursor:pointer;font-family:var(--face-fixed);background:0 0;border:none;padding:0;font-size:11.5px}.link:hover{color:var(--accent)}.empty{max-width:72ch;padding-top:8px}.empty-title{margin:0;font-size:15px;font-weight:500}.empty-body{color:var(--ink-soft);text-wrap:pretty;margin:8px 0 0;font-size:13.5px;line-height:1.6}.way{background:var(--ground);justify-content:center;align-items:center;min-height:100%;padding:32px 20px;display:flex}.way-card{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius-panel);flex-direction:column;width:100%;max-width:25rem;padding:28px 28px 24px;display:flex}.way-mark{color:var(--ink-faint);font-family:var(--face-fixed);letter-spacing:.02em;align-items:baseline;gap:6px;margin-bottom:20px;font-size:11.5px;display:flex}.way-mark b{color:var(--ink);font-weight:500}.way-title{color:var(--ink);letter-spacing:-.015em;margin:0 0 6px;font-size:20px;font-weight:500}.way-lede{color:var(--ink-soft);text-wrap:pretty;margin:0 0 22px;font-size:13.5px;line-height:1.55}.way-fields{flex-direction:column;gap:14px;display:flex}.way-field{flex-direction:column;gap:6px;display:flex}.way-label{color:var(--ink-2);font-size:12px;font-weight:500}.way-label span{color:var(--ink-faint);font-family:var(--face-fixed);margin-left:6px;font-size:11px;font-weight:400}.way-input{background:var(--sunk);border:1px solid var(--ink-faint);border-radius:var(--radius-control);color:var(--ink);font-family:var(--face);width:100%;height:38px;padding:0 11px;font-size:14px}.way-input:focus{border-color:var(--accent);outline:none}.way-input::placeholder{color:var(--ink-faint)}.way-go{background:var(--ink);border:1px solid var(--ink);border-radius:var(--radius-control);color:var(--ground);cursor:pointer;font-family:var(--face);justify-content:center;align-items:center;width:100%;height:38px;margin-top:22px;font-size:14px;font-weight:500;display:inline-flex}.way-go:hover:not(:disabled){opacity:.9}.way-go:disabled{cursor:not-allowed;opacity:.4}.way-refused{border-left:2px solid var(--accent);color:var(--ink-2);text-wrap:pretty;margin:18px 0 0;padding-left:10px;font-size:13px;line-height:1.5}.way-else{border-top:1px solid var(--edge-soft);color:var(--ink-soft);text-wrap:pretty;flex-direction:column;gap:8px;margin-top:24px;padding-top:18px;font-size:12.5px;line-height:1.5;display:flex}.way-else p{margin:0}.way-else code{color:var(--ink-2);font-family:var(--face-fixed);font-size:12px}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--ground);color:var(--ink);font-family:var(--face);-webkit-font-smoothing:antialiased;font-size:15px;font-weight:400;line-height:1.55}a{color:inherit;text-decoration:none}button,input,select,textarea{font:inherit}:focus-visible{outline:1px solid var(--accent);outline-offset:2px}::selection{background:var(--accent-line)}.fixed{font-family:var(--face-fixed);font-size:12px}@keyframes pulse{0%,to{opacity:.35}50%{opacity:1}}@keyframes blink{0%,49%{opacity:1}50%,to{opacity:0}}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--panel-3);border:3px solid var(--ground);border-radius:6px}::-webkit-scrollbar-thumb:hover{background:var(--ink-faint)}