@pinecall/agents 0.9.20

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 (292) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +121 -0
  3. package/dist/agent/accepts.d.ts +31 -0
  4. package/dist/agent/accepts.d.ts.map +1 -0
  5. package/dist/agent/accepts.js +27 -0
  6. package/dist/agent/accepts.js.map +1 -0
  7. package/dist/agent/agent.d.ts +151 -0
  8. package/dist/agent/agent.d.ts.map +1 -0
  9. package/dist/agent/agent.js +240 -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 +26 -0
  14. package/dist/agent/authors.js.map +1 -0
  15. package/dist/agent/decorators.d.ts +16 -0
  16. package/dist/agent/decorators.d.ts.map +1 -0
  17. package/dist/agent/decorators.js +43 -0
  18. package/dist/agent/decorators.js.map +1 -0
  19. package/dist/agent/docstrings.d.ts +35 -0
  20. package/dist/agent/docstrings.d.ts.map +1 -0
  21. package/dist/agent/docstrings.js +301 -0
  22. package/dist/agent/docstrings.js.map +1 -0
  23. package/dist/agent/knowledge.d.ts +9 -0
  24. package/dist/agent/knowledge.d.ts.map +1 -0
  25. package/dist/agent/knowledge.js +3 -0
  26. package/dist/agent/knowledge.js.map +1 -0
  27. package/dist/agent/lifecycle.d.ts +29 -0
  28. package/dist/agent/lifecycle.d.ts.map +1 -0
  29. package/dist/agent/lifecycle.js +9 -0
  30. package/dist/agent/lifecycle.js.map +1 -0
  31. package/dist/agent/searching.d.ts +7 -0
  32. package/dist/agent/searching.d.ts.map +1 -0
  33. package/dist/agent/searching.js +35 -0
  34. package/dist/agent/searching.js.map +1 -0
  35. package/dist/agent/stages.d.ts +23 -0
  36. package/dist/agent/stages.d.ts.map +1 -0
  37. package/dist/agent/stages.js +29 -0
  38. package/dist/agent/stages.js.map +1 -0
  39. package/dist/agent/state.d.ts +36 -0
  40. package/dist/agent/state.d.ts.map +1 -0
  41. package/dist/agent/state.js +93 -0
  42. package/dist/agent/state.js.map +1 -0
  43. package/dist/agent/tools.d.ts +61 -0
  44. package/dist/agent/tools.d.ts.map +1 -0
  45. package/dist/agent/tools.js +145 -0
  46. package/dist/agent/tools.js.map +1 -0
  47. package/dist/agent/view.d.ts +29 -0
  48. package/dist/agent/view.d.ts.map +1 -0
  49. package/dist/agent/view.js +29 -0
  50. package/dist/agent/view.js.map +1 -0
  51. package/dist/agent/visibility.d.ts +32 -0
  52. package/dist/agent/visibility.d.ts.map +1 -0
  53. package/dist/agent/visibility.js +77 -0
  54. package/dist/agent/visibility.js.map +1 -0
  55. package/dist/call/call.d.ts +137 -0
  56. package/dist/call/call.d.ts.map +1 -0
  57. package/dist/call/call.js +228 -0
  58. package/dist/call/call.js.map +1 -0
  59. package/dist/call/history.d.ts +28 -0
  60. package/dist/call/history.d.ts.map +1 -0
  61. package/dist/call/history.js +32 -0
  62. package/dist/call/history.js.map +1 -0
  63. package/dist/call/room.d.ts +56 -0
  64. package/dist/call/room.d.ts.map +1 -0
  65. package/dist/call/room.js +66 -0
  66. package/dist/call/room.js.map +1 -0
  67. package/dist/client/agent.d.ts +93 -0
  68. package/dist/client/agent.d.ts.map +1 -0
  69. package/dist/client/agent.js +230 -0
  70. package/dist/client/agent.js.map +1 -0
  71. package/dist/client/calls.d.ts +87 -0
  72. package/dist/client/calls.d.ts.map +1 -0
  73. package/dist/client/calls.js +180 -0
  74. package/dist/client/calls.js.map +1 -0
  75. package/dist/client/client.d.ts +112 -0
  76. package/dist/client/client.d.ts.map +1 -0
  77. package/dist/client/client.js +284 -0
  78. package/dist/client/client.js.map +1 -0
  79. package/dist/client/connection.d.ts +52 -0
  80. package/dist/client/connection.d.ts.map +1 -0
  81. package/dist/client/connection.js +157 -0
  82. package/dist/client/connection.js.map +1 -0
  83. package/dist/client/endpoints.d.ts +9 -0
  84. package/dist/client/endpoints.d.ts.map +1 -0
  85. package/dist/client/endpoints.js +25 -0
  86. package/dist/client/endpoints.js.map +1 -0
  87. package/dist/client/frames.d.ts +29 -0
  88. package/dist/client/frames.d.ts.map +1 -0
  89. package/dist/client/frames.js +51 -0
  90. package/dist/client/frames.js.map +1 -0
  91. package/dist/client/index.d.ts +18 -0
  92. package/dist/client/index.d.ts.map +1 -0
  93. package/dist/client/index.js +13 -0
  94. package/dist/client/index.js.map +1 -0
  95. package/dist/client/listeners.d.ts +35 -0
  96. package/dist/client/listeners.d.ts.map +1 -0
  97. package/dist/client/listeners.js +60 -0
  98. package/dist/client/listeners.js.map +1 -0
  99. package/dist/client/lost.d.ts +4 -0
  100. package/dist/client/lost.d.ts.map +1 -0
  101. package/dist/client/lost.js +8 -0
  102. package/dist/client/lost.js.map +1 -0
  103. package/dist/client/observe.d.ts +50 -0
  104. package/dist/client/observe.d.ts.map +1 -0
  105. package/dist/client/observe.js +125 -0
  106. package/dist/client/observe.js.map +1 -0
  107. package/dist/client/signed.d.ts +14 -0
  108. package/dist/client/signed.d.ts.map +1 -0
  109. package/dist/client/signed.js +18 -0
  110. package/dist/client/signed.js.map +1 -0
  111. package/dist/client/testing/gateway.d.ts +58 -0
  112. package/dist/client/testing/gateway.d.ts.map +1 -0
  113. package/dist/client/testing/gateway.js +175 -0
  114. package/dist/client/testing/gateway.js.map +1 -0
  115. package/dist/client/testing/index.d.ts +4 -0
  116. package/dist/client/testing/index.d.ts.map +1 -0
  117. package/dist/client/testing/index.js +4 -0
  118. package/dist/client/testing/index.js.map +1 -0
  119. package/dist/client/testing/log.d.ts +24 -0
  120. package/dist/client/testing/log.d.ts.map +1 -0
  121. package/dist/client/testing/log.js +106 -0
  122. package/dist/client/testing/log.js.map +1 -0
  123. package/dist/client/testing/loopback.d.ts +3 -0
  124. package/dist/client/testing/loopback.d.ts.map +1 -0
  125. package/dist/client/testing/loopback.js +3 -0
  126. package/dist/client/testing/loopback.js.map +1 -0
  127. package/dist/index.d.ts +23 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +27 -0
  130. package/dist/index.js.map +1 -0
  131. package/dist/runtime/connect.d.ts +42 -0
  132. package/dist/runtime/connect.d.ts.map +1 -0
  133. package/dist/runtime/connect.js +234 -0
  134. package/dist/runtime/connect.js.map +1 -0
  135. package/dist/runtime/dispatch.d.ts +32 -0
  136. package/dist/runtime/dispatch.d.ts.map +1 -0
  137. package/dist/runtime/dispatch.js +46 -0
  138. package/dist/runtime/dispatch.js.map +1 -0
  139. package/dist/runtime/environment.d.ts +7 -0
  140. package/dist/runtime/environment.d.ts.map +1 -0
  141. package/dist/runtime/environment.js +30 -0
  142. package/dist/runtime/environment.js.map +1 -0
  143. package/dist/runtime/recall.d.ts +9 -0
  144. package/dist/runtime/recall.d.ts.map +1 -0
  145. package/dist/runtime/recall.js +13 -0
  146. package/dist/runtime/recall.js.map +1 -0
  147. package/dist/runtime/run-tool.d.ts +18 -0
  148. package/dist/runtime/run-tool.d.ts.map +1 -0
  149. package/dist/runtime/run-tool.js +70 -0
  150. package/dist/runtime/run-tool.js.map +1 -0
  151. package/dist/serve/index.d.ts +5 -0
  152. package/dist/serve/index.d.ts.map +1 -0
  153. package/dist/serve/index.js +50 -0
  154. package/dist/serve/index.js.map +1 -0
  155. package/dist/serve/io.d.ts +14 -0
  156. package/dist/serve/io.d.ts.map +1 -0
  157. package/dist/serve/io.js +6 -0
  158. package/dist/serve/io.js.map +1 -0
  159. package/dist/serve/leaving.d.ts +12 -0
  160. package/dist/serve/leaving.d.ts.map +1 -0
  161. package/dist/serve/leaving.js +61 -0
  162. package/dist/serve/leaving.js.map +1 -0
  163. package/dist/serve/lines.d.ts +7 -0
  164. package/dist/serve/lines.d.ts.map +1 -0
  165. package/dist/serve/lines.js +25 -0
  166. package/dist/serve/lines.js.map +1 -0
  167. package/dist/serve/load.d.ts +26 -0
  168. package/dist/serve/load.d.ts.map +1 -0
  169. package/dist/serve/load.js +61 -0
  170. package/dist/serve/load.js.map +1 -0
  171. package/dist/serve/machine.d.ts +4 -0
  172. package/dist/serve/machine.d.ts.map +1 -0
  173. package/dist/serve/machine.js +33 -0
  174. package/dist/serve/machine.js.map +1 -0
  175. package/dist/serve/prompt.d.ts +7 -0
  176. package/dist/serve/prompt.d.ts.map +1 -0
  177. package/dist/serve/prompt.js +51 -0
  178. package/dist/serve/prompt.js.map +1 -0
  179. package/dist/serve/start.d.ts +7 -0
  180. package/dist/serve/start.d.ts.map +1 -0
  181. package/dist/serve/start.js +95 -0
  182. package/dist/serve/start.js.map +1 -0
  183. package/dist/serve/viewing.d.ts +17 -0
  184. package/dist/serve/viewing.d.ts.map +1 -0
  185. package/dist/serve/viewing.js +42 -0
  186. package/dist/serve/viewing.js.map +1 -0
  187. package/dist/views/built-in-rules.d.ts +9 -0
  188. package/dist/views/built-in-rules.d.ts.map +1 -0
  189. package/dist/views/built-in-rules.js +28 -0
  190. package/dist/views/built-in-rules.js.map +1 -0
  191. package/dist/views/components.d.ts +17 -0
  192. package/dist/views/components.d.ts.map +1 -0
  193. package/dist/views/components.js +33 -0
  194. package/dist/views/components.js.map +1 -0
  195. package/dist/views/jsx-dev-runtime.d.ts +3 -0
  196. package/dist/views/jsx-dev-runtime.d.ts.map +1 -0
  197. package/dist/views/jsx-dev-runtime.js +4 -0
  198. package/dist/views/jsx-dev-runtime.js.map +1 -0
  199. package/dist/views/jsx-runtime.d.ts +46 -0
  200. package/dist/views/jsx-runtime.d.ts.map +1 -0
  201. package/dist/views/jsx-runtime.js +63 -0
  202. package/dist/views/jsx-runtime.js.map +1 -0
  203. package/dist/views/layout.d.ts +19 -0
  204. package/dist/views/layout.d.ts.map +1 -0
  205. package/dist/views/layout.js +58 -0
  206. package/dist/views/layout.js.map +1 -0
  207. package/dist/views/nodes.d.ts +48 -0
  208. package/dist/views/nodes.d.ts.map +1 -0
  209. package/dist/views/nodes.js +45 -0
  210. package/dist/views/nodes.js.map +1 -0
  211. package/dist/views/panels.d.ts +17 -0
  212. package/dist/views/panels.d.ts.map +1 -0
  213. package/dist/views/panels.js +62 -0
  214. package/dist/views/panels.js.map +1 -0
  215. package/dist/views/render.d.ts +11 -0
  216. package/dist/views/render.d.ts.map +1 -0
  217. package/dist/views/render.js +19 -0
  218. package/dist/views/render.js.map +1 -0
  219. package/dist/wire/agent-config.d.ts +213 -0
  220. package/dist/wire/agent-config.d.ts.map +1 -0
  221. package/dist/wire/agent-config.js +126 -0
  222. package/dist/wire/agent-config.js.map +1 -0
  223. package/dist/wire/codec.d.ts +43 -0
  224. package/dist/wire/codec.d.ts.map +1 -0
  225. package/dist/wire/codec.js +51 -0
  226. package/dist/wire/codec.js.map +1 -0
  227. package/dist/wire/commands.d.ts +443 -0
  228. package/dist/wire/commands.d.ts.map +1 -0
  229. package/dist/wire/commands.js +203 -0
  230. package/dist/wire/commands.js.map +1 -0
  231. package/dist/wire/defs.d.ts +373 -0
  232. package/dist/wire/defs.d.ts.map +1 -0
  233. package/dist/wire/defs.js +212 -0
  234. package/dist/wire/defs.js.map +1 -0
  235. package/dist/wire/envelope.d.ts +29 -0
  236. package/dist/wire/envelope.d.ts.map +1 -0
  237. package/dist/wire/envelope.js +27 -0
  238. package/dist/wire/envelope.js.map +1 -0
  239. package/dist/wire/events-call.d.ts +446 -0
  240. package/dist/wire/events-call.d.ts.map +1 -0
  241. package/dist/wire/events-call.js +196 -0
  242. package/dist/wire/events-call.js.map +1 -0
  243. package/dist/wire/events.d.ts +946 -0
  244. package/dist/wire/events.d.ts.map +1 -0
  245. package/dist/wire/events.js +309 -0
  246. package/dist/wire/events.js.map +1 -0
  247. package/dist/wire/index.d.ts +19 -0
  248. package/dist/wire/index.d.ts.map +1 -0
  249. package/dist/wire/index.js +19 -0
  250. package/dist/wire/index.js.map +1 -0
  251. package/dist/wire/metrics.d.ts +366 -0
  252. package/dist/wire/metrics.d.ts.map +1 -0
  253. package/dist/wire/metrics.js +269 -0
  254. package/dist/wire/metrics.js.map +1 -0
  255. package/dist/wire/reduce.d.ts +10 -0
  256. package/dist/wire/reduce.d.ts.map +1 -0
  257. package/dist/wire/reduce.js +367 -0
  258. package/dist/wire/reduce.js.map +1 -0
  259. package/dist/wire/registry.d.ts +1789 -0
  260. package/dist/wire/registry.d.ts.map +1 -0
  261. package/dist/wire/registry.js +118 -0
  262. package/dist/wire/registry.js.map +1 -0
  263. package/dist/wire/rest-data.d.ts +170 -0
  264. package/dist/wire/rest-data.d.ts.map +1 -0
  265. package/dist/wire/rest-data.js +78 -0
  266. package/dist/wire/rest-data.js.map +1 -0
  267. package/dist/wire/rest-hosting.d.ts +74 -0
  268. package/dist/wire/rest-hosting.d.ts.map +1 -0
  269. package/dist/wire/rest-hosting.js +38 -0
  270. package/dist/wire/rest-hosting.js.map +1 -0
  271. package/dist/wire/rest-retrieval.d.ts +214 -0
  272. package/dist/wire/rest-retrieval.d.ts.map +1 -0
  273. package/dist/wire/rest-retrieval.js +161 -0
  274. package/dist/wire/rest-retrieval.js.map +1 -0
  275. package/dist/wire/rest.d.ts +786 -0
  276. package/dist/wire/rest.d.ts.map +1 -0
  277. package/dist/wire/rest.js +238 -0
  278. package/dist/wire/rest.js.map +1 -0
  279. package/dist/wire/room.d.ts +106 -0
  280. package/dist/wire/room.d.ts.map +1 -0
  281. package/dist/wire/room.js +73 -0
  282. package/dist/wire/room.js.map +1 -0
  283. package/dist/wire/state.d.ts +915 -0
  284. package/dist/wire/state.d.ts.map +1 -0
  285. package/dist/wire/state.js +189 -0
  286. package/dist/wire/state.js.map +1 -0
  287. package/dist/wire/verbs.d.ts +73 -0
  288. package/dist/wire/verbs.d.ts.map +1 -0
  289. package/dist/wire/verbs.js +50 -0
  290. package/dist/wire/verbs.js.map +1 -0
  291. package/package.json +74 -0
  292. package/tsconfig.tenant.json +24 -0
@@ -0,0 +1,230 @@
1
+ // One agent an app serves: its declaration, its tool handlers and its listeners.
2
+ import {} from "../wire/agent-config.js";
3
+ import { eventOf } from "../wire/codec.js";
4
+ import {} from "../wire/defs.js";
5
+ import {} from "../wire/envelope.js";
6
+ import {} from "../wire/registry.js";
7
+ import { Call, CallBook } from "./calls.js";
8
+ import { DevRefused, PinecallError, Refused } from "./frames.js";
9
+ import { Listeners, asError, camelEvent } from "./listeners.js";
10
+ const ANSWER_MS = 10_000;
11
+ const NO_DEV_HANDLER = "this process answers no dev verbs: it is not a `pinecall start` in the agent's directory";
12
+ /**
13
+ * An agent, from the app's side.
14
+ *
15
+ * The gateway's registry is in memory, so the declaration is re-sent on every reconnect. Several
16
+ * sockets may hold one agent; unclaimed calls go to the newest one that takes them, so a rolling
17
+ * deploy serves as soon as the new process registers. Call `drain()` before exiting to hand live
18
+ * calls over instead of cutting them.
19
+ */
20
+ export class Agent {
21
+ slug;
22
+ gateway;
23
+ calls;
24
+ #listeners;
25
+ #tools = new Map();
26
+ #waiters = [];
27
+ // Tool runs whose tool.result is not yet sent; a drain waits for these.
28
+ #running = new Set();
29
+ #config;
30
+ #takesUnclaimed;
31
+ #answersDev;
32
+ #app;
33
+ #dev;
34
+ constructor(slug, options, gateway) {
35
+ this.slug = slug;
36
+ this.gateway = gateway;
37
+ const { tools = [], takesUnclaimed = true, answersDev = false, ...config } = options;
38
+ this.#config = config;
39
+ this.#takesUnclaimed = takesUnclaimed;
40
+ this.#answersDev = answersDev;
41
+ this.declare(tools);
42
+ this.calls = new CallBook(this);
43
+ this.#listeners = new Listeners((error) => gateway.onError(error));
44
+ }
45
+ /** The agent's current declaration, in wire shape. */
46
+ get config() {
47
+ return this.#config;
48
+ }
49
+ /**
50
+ * This socket's app id as minted by the gateway, or undefined before the first register. A call
51
+ * that names it (`WS /v1/chat?app=<id>`, `app` in `POST /v1/calls`) is served by this process.
52
+ */
53
+ get app() {
54
+ return this.#app;
55
+ }
56
+ /** Listen for one event type across every call of this agent. `null` for the agent's own log. */
57
+ on(type, listener) {
58
+ return this.#listeners.on(type, listener);
59
+ }
60
+ /** Listen for every event of this agent. The returned function stops listening. */
61
+ onAny(listener) {
62
+ return this.#listeners.onAny(listener);
63
+ }
64
+ /**
65
+ * Handle `dev.request` asks relayed from a console. `pinecall start` registers one; without it
66
+ * every ask is refused with 501.
67
+ */
68
+ onDev(handler) {
69
+ this.#dev = handler;
70
+ }
71
+ /** Replace the tools. The next `configure` sends the new declaration. */
72
+ declare(tools) {
73
+ this.#tools.clear();
74
+ for (const tool of tools) {
75
+ this.#tools.set(tool.name, tool);
76
+ }
77
+ this.#config = { ...this.#config, tools: tools.map(({ run: _run, ...spec }) => spec) };
78
+ }
79
+ /** Update the declaration. Only the given fields change; live calls keep their session. */
80
+ async configure(changes = {}) {
81
+ this.#config = { ...this.#config, ...changes };
82
+ return this.#ask("agent.configure", "agent.configured", { config: this.#config });
83
+ }
84
+ /** Register the slug, then send the declaration. Runs again on every reconnect. */
85
+ async open() {
86
+ // Routes are org rows now; the empty field stays for older gateways.
87
+ const registered = await this.#ask("agent.register", "agent.registered", {
88
+ routes: [],
89
+ sdk: this.gateway.sdk,
90
+ host: this.gateway.host,
91
+ takesUnclaimed: this.#takesUnclaimed,
92
+ ...(this.#answersDev ? { answersDev: true } : {}),
93
+ });
94
+ // Each reconnect mints a new app id.
95
+ this.#app = registered.app;
96
+ // A registration inherits the newest holder's declaration; one sent from here would replace it.
97
+ if (!this.#answersDev)
98
+ await this.configure();
99
+ }
100
+ // ── the socket's side ───────────────────────────────────────────────────────
101
+ /** Fold one entry into its call and dispatch it to listeners. */
102
+ take(entry) {
103
+ const event = camelEvent(eventOf(entry));
104
+ const call = entry.call === null ? null : this.calls.of(entry.call, entry.ts);
105
+ this.#settle(event);
106
+ call?.take(event);
107
+ this.#listeners.emit(event, call);
108
+ this.gateway.seen(event, call);
109
+ if (event.type === "dev.request") {
110
+ this.#onDevRequest(event.data);
111
+ return;
112
+ }
113
+ if (call !== null) {
114
+ this.#onToolCall(event, call);
115
+ this.calls.forget(call);
116
+ }
117
+ }
118
+ /** Send one command on this agent's behalf. */
119
+ command(type, call, data) {
120
+ this.gateway.send(type, this.slug, call, data, `${this.slug}:${type}`);
121
+ }
122
+ /** Report an error no caller is waiting on. */
123
+ onError(error) {
124
+ this.gateway.onError(error);
125
+ }
126
+ /**
127
+ * Stop receiving new calls and hand live ones to another holder (or park them for the next).
128
+ * Running tools still answer. Resolves with where the calls went.
129
+ */
130
+ async drain(answerMs = ANSWER_MS) {
131
+ return this.#ask("agent.drain", "agent.draining", {}, answerMs);
132
+ }
133
+ /** Number of tool runs in progress. */
134
+ get inFlight() {
135
+ return this.#running.size;
136
+ }
137
+ /** Resolve once every running tool has sent its tool.result. */
138
+ async settled() {
139
+ await Promise.all([...this.#running]);
140
+ }
141
+ /** Send `ping`; the gateway answers with `pong`. */
142
+ ping() {
143
+ this.command("ping", null, {});
144
+ }
145
+ // ── tools ───────────────────────────────────────────────────────────────────
146
+ // Every outcome must produce exactly one tool.result: a turn without one waits forever.
147
+ #onToolCall(event, call) {
148
+ if (event.type !== "tool.call") {
149
+ return;
150
+ }
151
+ const { callId, name, arguments: args } = event.data;
152
+ const tool = this.#tools.get(name);
153
+ if (tool === undefined) {
154
+ call.toolResult({ callId, name, error: `this app declares no tool called ${name}` });
155
+ return;
156
+ }
157
+ const started = Date.now();
158
+ const running = (async () => {
159
+ try {
160
+ const output = await tool.run(args, call);
161
+ call.toolResult({ callId, name, output, durationS: (Date.now() - started) / 1000 });
162
+ }
163
+ catch (failed) {
164
+ // A rejection is the tool's answer (sent as `error`), not an app failure; don't report it.
165
+ const error = asError(failed);
166
+ try {
167
+ call.toolResult({ callId, name, error: error.message, durationS: (Date.now() - started) / 1000 });
168
+ }
169
+ catch (unsent) {
170
+ this.onError(asError(unsent));
171
+ }
172
+ }
173
+ })();
174
+ this.#running.add(running);
175
+ void running.finally(() => this.#running.delete(running));
176
+ }
177
+ // ── a console's ask ─────────────────────────────────────────────────────────
178
+ // Every outcome must produce one dev.answer, or the console's request hangs until timeout.
179
+ #onDevRequest(asked) {
180
+ const { id, verb, data } = asked;
181
+ void (async () => {
182
+ try {
183
+ if (this.#dev === undefined)
184
+ throw new DevRefused(501, NO_DEV_HANDLER);
185
+ const result = await this.#dev(verb, data);
186
+ this.command("dev.answer", null, { id, result });
187
+ }
188
+ catch (failed) {
189
+ const refused = failed instanceof DevRefused
190
+ ? { status: failed.status, detail: failed.detail }
191
+ : { status: 500, detail: asError(failed).message };
192
+ this.command("dev.answer", null, { id, refused });
193
+ }
194
+ })();
195
+ }
196
+ // ── waiting for an answer ───────────────────────────────────────────────────
197
+ // Resolved by the event the command lands as, or rejected by an `error` carrying our id.
198
+ async #ask(type, lands, data, withinMs = ANSWER_MS) {
199
+ const id = `${this.slug}:${type}`;
200
+ const answer = new Promise((resolve, reject) => {
201
+ const waiter = { type: lands, id, settle: (payload) => resolve(payload), refuse: reject };
202
+ this.#waiters.push(waiter);
203
+ setTimeout(() => {
204
+ this.#drop(waiter);
205
+ reject(new PinecallError(`${type}: the gateway did not answer in ${withinMs}ms`));
206
+ }, withinMs).unref();
207
+ });
208
+ this.gateway.send(type, this.slug, null, data, id);
209
+ return answer;
210
+ }
211
+ #settle(event) {
212
+ for (const waiter of [...this.#waiters]) {
213
+ if (event.type === waiter.type) {
214
+ this.#drop(waiter);
215
+ waiter.settle(event.data);
216
+ }
217
+ else if (event.type === "error" && event.data.id === waiter.id) {
218
+ this.#drop(waiter);
219
+ waiter.refuse(new Refused(event.data));
220
+ }
221
+ }
222
+ }
223
+ #drop(waiter) {
224
+ const at = this.#waiters.indexOf(waiter);
225
+ if (at !== -1) {
226
+ this.#waiters.splice(at, 1);
227
+ }
228
+ }
229
+ }
230
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/client/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import { type Camel, type CommandData } from "../wire/codec.js";
2
+ import { type Channel, type Contact, type Medium, type ToolResult, type ToolSpec } from "../wire/defs.js";
3
+ import { type CommandType, type EventType } from "../wire/registry.js";
4
+ import type { AnyListener, CamelEvent, Listener } from "./listeners.js";
5
+ /** The agent a call sends its commands through. */
6
+ export interface CallGateway {
7
+ readonly slug: string;
8
+ command<K extends CommandType>(type: K, call: string | null, data: Camel<CommandData<K>>): void;
9
+ onError(error: Error): void;
10
+ }
11
+ /** The call's lifecycle status, as reported by the log so far. */
12
+ export type CallStatus = "ringing" | "dialing" | "active" | "ended";
13
+ /**
14
+ * A call the app is serving.
15
+ *
16
+ * Fields come only from log entries. Each method sends one command without awaiting it; the result
17
+ * arrives later as log events.
18
+ */
19
+ export declare class Call {
20
+ #private;
21
+ readonly id: string;
22
+ private readonly gateway;
23
+ status: CallStatus;
24
+ channel: Channel | null;
25
+ /** Spoken or written, as `call.started` says; null before it, and from a gateway that does not say. */
26
+ medium: Medium | null;
27
+ from: string | null;
28
+ to: string | null;
29
+ contact: Camel<Contact> | null;
30
+ /** The eval run that opened this call, or null for a real caller. */
31
+ run: string | null;
32
+ /** The page code this call claimed, or null. */
33
+ claimed: string | null;
34
+ /** The app state as last set here or reported by `state.changed`. */
35
+ state: Record<string, unknown>;
36
+ /**
37
+ * The day the call opened, `YYYY-MM-DD` in this process's timezone. On `call.attached` it is the
38
+ * original start day, not the handover day.
39
+ */
40
+ today: string;
41
+ constructor(id: string, gateway: CallGateway, openedAt: number);
42
+ /** The agent serving this call. */
43
+ get agent(): string;
44
+ /** Listen for one event type on this call. The returned function stops listening. */
45
+ on<K extends EventType>(type: K, listener: Listener<K, Call>): () => void;
46
+ /** Listen for every event on this call. The returned function stops listening. */
47
+ onAny(listener: AnyListener<Call>): () => void;
48
+ /** Say this, verbatim, now. Lands as `turn.agent`. */
49
+ say(text: string, options?: {
50
+ allowInterruptions?: boolean;
51
+ }): void;
52
+ /** Make the model speak now, following instructions the caller does not hear. Lands as `turn.agent`. */
53
+ reply(instructions: string, options?: {
54
+ allowInterruptions?: boolean;
55
+ }): void;
56
+ /** Replace one named prompt block: a built-in one or one the agent declared. */
57
+ setPrompt(name: string, text: string): void;
58
+ /** Set which declared tools the model may see now. */
59
+ setTools(tools: Camel<ToolSpec>[]): void;
60
+ /** Send the full app state. Lands as `state.changed`. */
61
+ setState(state: Record<string, unknown>, changed?: string[]): void;
62
+ /** Send a tool's result for the model's `call_id`. */
63
+ toolResult(result: Camel<ToolResult>): void;
64
+ /** Send an event from the tenant's backend. Refused unless the agent declared the name. */
65
+ event(name: string, data: Record<string, unknown>): void;
66
+ /** End the call from the app's side. `call.ended` follows with reason agent_hung_up. */
67
+ hangup(reason?: string): void;
68
+ /** Bind this call to a page code. Lands as `call.claimed`, or is refused with `no_code`. */
69
+ claim(code: string): void;
70
+ /** Write an app-defined entry to the call's log. Lands as `custom`. */
71
+ log(name: string, data?: Record<string, unknown>): void;
72
+ /** Apply one event to the call's fields, then emit it to this call's listeners. */
73
+ take(event: CamelEvent): void;
74
+ }
75
+ /** The calls an agent is serving, by id. A call is dropped once it ends. */
76
+ export declare class CallBook {
77
+ #private;
78
+ private readonly gateway;
79
+ constructor(gateway: CallGateway);
80
+ /** The calls in progress, in the order they opened. */
81
+ get live(): Call[];
82
+ /** Return the call with this id, creating it on first sight. */
83
+ of(id: string, at: number): Call;
84
+ /** Drop the call if it has ended. Runs after `call.ended` listeners. */
85
+ forget(call: Call): void;
86
+ }
87
+ //# sourceMappingURL=calls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calls.d.ts","sourceRoot":"","sources":["../../src/client/calls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,180 @@
1
+ // A live call as the app holds it: its known fields and the commands it can send.
2
+ import {} from "../wire/codec.js";
3
+ import {} from "../wire/defs.js";
4
+ import {} from "../wire/registry.js";
5
+ import { Listeners } from "./listeners.js";
6
+ /**
7
+ * A call the app is serving.
8
+ *
9
+ * Fields come only from log entries. Each method sends one command without awaiting it; the result
10
+ * arrives later as log events.
11
+ */
12
+ export class Call {
13
+ id;
14
+ gateway;
15
+ status = "ringing";
16
+ channel = null;
17
+ /** Spoken or written, as `call.started` says; null before it, and from a gateway that does not say. */
18
+ medium = null;
19
+ from = null;
20
+ to = null;
21
+ contact = null;
22
+ /** The eval run that opened this call, or null for a real caller. */
23
+ run = null;
24
+ /** The page code this call claimed, or null. */
25
+ claimed = null;
26
+ /** The app state as last set here or reported by `state.changed`. */
27
+ state = {};
28
+ /**
29
+ * The day the call opened, `YYYY-MM-DD` in this process's timezone. On `call.attached` it is the
30
+ * original start day, not the handover day.
31
+ */
32
+ today;
33
+ #listeners;
34
+ constructor(id, gateway, openedAt) {
35
+ this.id = id;
36
+ this.gateway = gateway;
37
+ this.today = dayOf(openedAt);
38
+ this.#listeners = new Listeners((error) => gateway.onError(error));
39
+ }
40
+ /** The agent serving this call. */
41
+ get agent() {
42
+ return this.gateway.slug;
43
+ }
44
+ /** Listen for one event type on this call. The returned function stops listening. */
45
+ on(type, listener) {
46
+ return this.#listeners.on(type, listener);
47
+ }
48
+ /** Listen for every event on this call. The returned function stops listening. */
49
+ onAny(listener) {
50
+ return this.#listeners.onAny(listener);
51
+ }
52
+ // ── the commands ────────────────────────────────────────────────────────────
53
+ /** Say this, verbatim, now. Lands as `turn.agent`. */
54
+ say(text, options = {}) {
55
+ this.gateway.command("agent.say", this.id, { text, ...options });
56
+ }
57
+ /** Make the model speak now, following instructions the caller does not hear. Lands as `turn.agent`. */
58
+ reply(instructions, options = {}) {
59
+ this.gateway.command("agent.reply", this.id, { instructions, ...options });
60
+ }
61
+ /** Replace one named prompt block: a built-in one or one the agent declared. */
62
+ setPrompt(name, text) {
63
+ this.gateway.command("prompt.set", this.id, { name, text });
64
+ }
65
+ /** Set which declared tools the model may see now. */
66
+ setTools(tools) {
67
+ this.gateway.command("tools.set", this.id, { tools });
68
+ }
69
+ /** Send the full app state. Lands as `state.changed`. */
70
+ setState(state, changed) {
71
+ this.state = { ...state };
72
+ this.gateway.command("state.set", this.id, changed === undefined ? { state } : { state, changed });
73
+ }
74
+ /** Send a tool's result for the model's `call_id`. */
75
+ toolResult(result) {
76
+ this.gateway.command("tool.result", this.id, result);
77
+ }
78
+ /** Send an event from the tenant's backend. Refused unless the agent declared the name. */
79
+ event(name, data) {
80
+ this.gateway.command("call.event", this.id, { name, data });
81
+ }
82
+ /** End the call from the app's side. `call.ended` follows with reason agent_hung_up. */
83
+ hangup(reason) {
84
+ this.gateway.command("call.hangup", this.id, reason === undefined ? {} : { reason });
85
+ }
86
+ /** Bind this call to a page code. Lands as `call.claimed`, or is refused with `no_code`. */
87
+ claim(code) {
88
+ this.gateway.command("call.claim", this.id, { code });
89
+ }
90
+ /** Write an app-defined entry to the call's log. Lands as `custom`. */
91
+ log(name, data = {}) {
92
+ this.gateway.command("call.log", this.id, { name, data });
93
+ }
94
+ // ── what the log teaches it ─────────────────────────────────────────────────
95
+ /** Apply one event to the call's fields, then emit it to this call's listeners. */
96
+ take(event) {
97
+ this.#learn(event);
98
+ this.#listeners.emit(event, this);
99
+ }
100
+ #learn(event) {
101
+ switch (event.type) {
102
+ case "call.ringing":
103
+ this.status = "ringing";
104
+ this.#line(event.data);
105
+ return;
106
+ case "call.dialing":
107
+ this.status = "dialing";
108
+ this.#line(event.data);
109
+ return;
110
+ case "call.started":
111
+ this.status = "active";
112
+ this.#line(event.data);
113
+ this.medium = event.data.medium ?? null;
114
+ return;
115
+ case "call.ended":
116
+ this.status = "ended";
117
+ return;
118
+ // Handed over mid-conversation: carries the original start and current state.
119
+ case "call.attached":
120
+ this.status = "active";
121
+ this.#line(event.data.started);
122
+ this.medium = event.data.started.medium ?? null;
123
+ this.state = { ...event.data.state };
124
+ this.today = dayOf(event.data.started.startedAt);
125
+ // `claimed` is absent from gateways before protocol 0.6.11.
126
+ this.claimed = event.data.claimed ?? null;
127
+ return;
128
+ case "state.changed":
129
+ this.state = { ...event.data.state };
130
+ return;
131
+ case "call.claimed":
132
+ this.claimed = event.data.code;
133
+ return;
134
+ default:
135
+ return;
136
+ }
137
+ }
138
+ #line(line) {
139
+ this.channel = line.channel;
140
+ this.from = line.from;
141
+ this.to = line.to;
142
+ this.contact = line.caller;
143
+ this.run = line.run ?? null;
144
+ }
145
+ }
146
+ /** The calls an agent is serving, by id. A call is dropped once it ends. */
147
+ export class CallBook {
148
+ gateway;
149
+ #live = new Map();
150
+ constructor(gateway) {
151
+ this.gateway = gateway;
152
+ }
153
+ /** The calls in progress, in the order they opened. */
154
+ get live() {
155
+ return [...this.#live.values()];
156
+ }
157
+ /** Return the call with this id, creating it on first sight. */
158
+ of(id, at) {
159
+ const known = this.#live.get(id);
160
+ if (known !== undefined) {
161
+ return known;
162
+ }
163
+ const call = new Call(id, this.gateway, at);
164
+ this.#live.set(id, call);
165
+ return call;
166
+ }
167
+ /** Drop the call if it has ended. Runs after `call.ended` listeners. */
168
+ forget(call) {
169
+ if (call.status === "ended") {
170
+ this.#live.delete(call.id);
171
+ }
172
+ }
173
+ }
174
+ /** `YYYY-MM-DD` of a unix timestamp, in local time. */
175
+ function dayOf(ts) {
176
+ const at = new Date(ts * 1000);
177
+ const pad = (n) => String(n).padStart(2, "0");
178
+ return `${at.getFullYear()}-${pad(at.getMonth() + 1)}-${pad(at.getDate())}`;
179
+ }
180
+ //# sourceMappingURL=calls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calls.js","sourceRoot":"","sources":["../../src/client/calls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ import { type Camel, type CommandData } from "../wire/codec.js";
2
+ import { type Entry } from "../wire/envelope.js";
3
+ import { type CommandType, type EventType } from "../wire/registry.js";
4
+ import { Agent, type AgentGateway, type AgentOptions } from "./agent.js";
5
+ import type { Call } from "./calls.js";
6
+ import { type Backoff } from "./connection.js";
7
+ import { type AnyListener, type CamelEvent, type Listener } from "./listeners.js";
8
+ import { type LogTarget, type Observation, type Page, type ReadOptions } from "./observe.js";
9
+ import { type World } from "./signed.js";
10
+ /** A search result chunk: its source path, heading and text. */
11
+ export interface Found {
12
+ path: string;
13
+ heading: string | null;
14
+ text: string;
15
+ }
16
+ /** Timeouts for `drain()`: the gateway's answer per agent, and running tools. */
17
+ export interface DrainOptions {
18
+ answerMs?: number;
19
+ toolsMs?: number;
20
+ }
21
+ /** Result of `drain()`: calls handed over, calls parked, tools running and tools that finished. */
22
+ export interface Drained {
23
+ handed: number;
24
+ parked: number;
25
+ tools: number;
26
+ finished: number;
27
+ }
28
+ /** Options for `new Pinecall()`. `url` and `apiKey` are required. */
29
+ export interface PinecallOptions {
30
+ url?: string;
31
+ apiKey?: string;
32
+ /**
33
+ * The world this client expects, sent on every request; a gateway of the other world refuses
34
+ * it. Required for a person's key on production; not needed for a server token.
35
+ */
36
+ env?: World;
37
+ /** How this app names itself in the org's list of processes; `pinecall/<version>` otherwise. */
38
+ sdk?: string;
39
+ pingMs?: number;
40
+ backoff?: Partial<Backoff>;
41
+ }
42
+ /**
43
+ * One app's connection to Pinecall.
44
+ *
45
+ * `url` and `apiKey` must be passed explicitly; nothing is read from the environment, so a stale
46
+ * `PINECALL_API_KEY` (also used by the v1 SDK) can never select the wrong org.
47
+ */
48
+ export declare class Pinecall implements AgentGateway {
49
+ #private;
50
+ readonly sdk: string;
51
+ /** This machine's hostname, shown by the gateway next to the app. */
52
+ readonly host: string;
53
+ /** The gateway this client talks to. */
54
+ readonly url: string;
55
+ /** The API key. Sent in a header, never in a URL. */
56
+ readonly apiKey: string;
57
+ /** The requested world, or undefined to use the key's own. */
58
+ readonly env: World | undefined;
59
+ constructor(options?: PinecallOptions);
60
+ /** Declare an agent this app serves. Nothing is sent until `connect`. */
61
+ agent(slug: string, options?: AgentOptions): Agent;
62
+ /** Open the socket, register every agent and send its declaration. */
63
+ connect(): Promise<void>;
64
+ /**
65
+ * Shut down without cutting calls: each agent drains (live calls move to another holder or are
66
+ * parked) and running tools get up to `toolsMs` to finish. Does not close the socket; call
67
+ * `close()` afterwards.
68
+ */
69
+ drain({ answerMs, toolsMs }?: DrainOptions): Promise<Drained>;
70
+ /** Close the socket without reconnecting. Every agent's slug is released. */
71
+ close(): void;
72
+ /** True while the socket is up. */
73
+ get connected(): boolean;
74
+ /** Listen for one event type across every agent on this client. */
75
+ on<K extends EventType>(type: K, listener: Listener<K, Call | null>): () => void;
76
+ /** Listen for every event across every agent. */
77
+ onAny(listener: AnyListener<Call | null>): () => void;
78
+ /**
79
+ * Called after each (re)connect once every agent is declared. Use it to re-send state the
80
+ * gateway keeps only for a live socket.
81
+ */
82
+ onConnected(listener: () => void): () => void;
83
+ /**
84
+ * Called when an org member stops this app. The socket is closed for good; the app decides what
85
+ * to do next (usually exit).
86
+ */
87
+ onStopped(listener: (why: string) => void): () => void;
88
+ /**
89
+ * Every entry the socket receives, as the gateway wrote it (snake_case), before any agent takes
90
+ * it — other agents' entries and the client's own errors included.
91
+ */
92
+ onEntries(listener: (entry: Entry) => void): () => void;
93
+ /** Receive errors no caller awaits (bad frames, listener throws, socket loss). Defaults to `console.error`. */
94
+ onErrors(listener: (error: Error) => void): () => void;
95
+ /** Stream a log live, folded by the protocol's reducer. */
96
+ observe(target: LogTarget, options?: Partial<ReadOptions>): AsyncGenerator<Observation>;
97
+ /** Read one page of a log and its folded state. */
98
+ history(target: LogTarget, options?: Partial<ReadOptions>): Promise<Page>;
99
+ /**
100
+ * Search the agent's knowledge bases on behalf of a call this client serves. The gateway runs
101
+ * the search and logs it.
102
+ * @param k Number of chunks; defaults to the base's setting.
103
+ */
104
+ search(call: string, query: string, k?: number): Promise<Found[]>;
105
+ /** Send one command frame, validated against its schema. */
106
+ send<K extends CommandType>(type: K, agent: string, call: string | null, data: Camel<CommandData<K>>, id: string): void;
107
+ /** Emit an event an agent has handled to the client-wide listeners. */
108
+ seen(event: CamelEvent, call: Call | null): void;
109
+ /** Report an error no caller awaits. */
110
+ onError(error: Error): void;
111
+ }
112
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"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"}