@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,301 @@
1
+ /** Read a class's JSDoc and parameter types from its source at runtime, with oxc's parser. */
2
+ import { parseSync } from "oxc-parser";
3
+ const registered = new WeakMap();
4
+ const scraped = new WeakMap();
5
+ /** Schema for a type whose shape is not visible in this file. */
6
+ const ANY_OBJECT = { type: "object", additionalProperties: true };
7
+ /** Flatten a JSDoc's description into one line, dropping tags. */
8
+ function oneLine(value) {
9
+ const lines = [];
10
+ for (const raw of value.split("\n")) {
11
+ let line = raw.trim();
12
+ while (line.startsWith("*"))
13
+ line = line.slice(1).trim();
14
+ // The first tag line ends the description.
15
+ if (line.startsWith("@"))
16
+ break;
17
+ if (line.length > 0)
18
+ lines.push(line);
19
+ }
20
+ const flat = lines.join(" ");
21
+ return flat.length > 0 ? flat : undefined;
22
+ }
23
+ /**
24
+ * The JSDoc block ending right above `start`, separated only by whitespace. Method decorators are
25
+ * inside the node's span, so decorated methods still match.
26
+ */
27
+ function docAt(start, source) {
28
+ let found;
29
+ for (const comment of source.jsdoc) {
30
+ if (comment.end > start)
31
+ break;
32
+ if (source.text.slice(comment.end, start).trim().length === 0)
33
+ found = comment;
34
+ }
35
+ return found ? oneLine(found.value) : undefined;
36
+ }
37
+ /** The type's source text. */
38
+ function textOf(node, source) {
39
+ return source.text.slice(node.start, node.end);
40
+ }
41
+ /** The declaration inside an `export`, or the statement itself. */
42
+ function declarationOf(statement) {
43
+ if (statement.type === "ExportNamedDeclaration" && statement.declaration)
44
+ return statement.declaration;
45
+ if (statement.type === "ExportDefaultDeclaration")
46
+ return statement.declaration;
47
+ return statement;
48
+ }
49
+ /** Top-level interfaces and type aliases. */
50
+ function declaredTypes(body) {
51
+ const types = new Map();
52
+ for (const statement of body) {
53
+ const declared = declarationOf(statement);
54
+ if (declared.type === "TSInterfaceDeclaration" || declared.type === "TSTypeAliasDeclaration") {
55
+ types.set(declared.id.name, declared);
56
+ }
57
+ }
58
+ return types;
59
+ }
60
+ /** The default-exported class, else the first class, with the position its docstring must end at. */
61
+ function theClass(body) {
62
+ let first;
63
+ for (const statement of body) {
64
+ const declared = declarationOf(statement);
65
+ if (declared.type !== "ClassDeclaration" && declared.type !== "ClassExpression")
66
+ continue;
67
+ const found = { node: declared, start: docstringEnd(declared, statement.start) };
68
+ if (statement.type === "ExportDefaultDeclaration")
69
+ return found;
70
+ first ??= found;
71
+ }
72
+ return first;
73
+ }
74
+ // A decorated class's docstring sits above its first decorator, which precedes the statement start.
75
+ function docstringEnd(declared, start) {
76
+ const decorators = declared.decorators ?? [];
77
+ return decorators.reduce((earliest, decorator) => Math.min(earliest, decorator.start), start);
78
+ }
79
+ /** `undefined` or `null` in a union: makes the parameter optional. */
80
+ function isNothing(node) {
81
+ return node.type === "TSUndefinedKeyword" || node.type === "TSNullKeyword";
82
+ }
83
+ /** JSON Schema for a type, following aliases declared in the same file. */
84
+ function jsonOf(node, types, seen) {
85
+ if (node.type === "TSStringKeyword")
86
+ return { type: "string" };
87
+ if (node.type === "TSNumberKeyword")
88
+ return { type: "number" };
89
+ if (node.type === "TSBooleanKeyword")
90
+ return { type: "boolean" };
91
+ // The model never supplies a callback.
92
+ if (node.type === "TSFunctionType")
93
+ return { description: "callback" };
94
+ if (node.type === "TSArrayType")
95
+ return { type: "array", items: jsonOf(node.elementType, types, seen) };
96
+ if (node.type === "TSParenthesizedType")
97
+ return jsonOf(node.typeAnnotation, types, seen);
98
+ if (node.type === "TSTypeLiteral")
99
+ return objectOf(node.members, types, seen);
100
+ if (node.type === "TSUnionType")
101
+ return unionOf(node.types, types, seen);
102
+ if (node.type === "TSLiteralType")
103
+ return literalOf(node);
104
+ if (node.type === "TSTypeReference" && node.typeName.type === "Identifier") {
105
+ return referenceOf(node.typeName.name, types, seen);
106
+ }
107
+ return { ...ANY_OBJECT };
108
+ }
109
+ /** Expand a type name declared in this file; other names become a described object. */
110
+ function referenceOf(name, types, seen) {
111
+ // Stop on recursive types.
112
+ const declared = seen.has(name) ? undefined : types.get(name);
113
+ if (!declared)
114
+ return { type: "object", description: name };
115
+ const deeper = new Set(seen).add(name);
116
+ if (declared.type === "TSInterfaceDeclaration")
117
+ return objectOf(declared.body.body, types, deeper);
118
+ return jsonOf(declared.typeAnnotation, types, deeper);
119
+ }
120
+ /** Object schema for interface or type-literal members. */
121
+ function objectOf(members, types, seen) {
122
+ const properties = {};
123
+ const required = [];
124
+ for (const member of members) {
125
+ if (member.type !== "TSPropertySignature" || member.key.type !== "Identifier")
126
+ continue;
127
+ const type = member.typeAnnotation?.typeAnnotation;
128
+ properties[member.key.name] = type ? jsonOf(type, types, seen) : { ...ANY_OBJECT };
129
+ if (!member.optional)
130
+ required.push(member.key.name);
131
+ }
132
+ return { type: "object", properties, required, additionalProperties: false };
133
+ }
134
+ /** A literal type's value, or undefined for templates and expressions. */
135
+ function valueOf(node) {
136
+ if (node.type !== "TSLiteralType")
137
+ return undefined;
138
+ return "value" in node.literal ? node.literal.value : undefined;
139
+ }
140
+ /** A union of string literals becomes an enum; anything else an open object. */
141
+ function unionOf(members, types, seen) {
142
+ const real = members.filter((one) => !isNothing(one));
143
+ if (real.length === 1 && real[0])
144
+ return jsonOf(real[0], types, seen);
145
+ const values = real.map(valueOf).filter((value) => typeof value === "string");
146
+ if (values.length === real.length && real.length > 0)
147
+ return { type: "string", enum: values };
148
+ return { ...ANY_OBJECT };
149
+ }
150
+ /** Schema for a literal type. */
151
+ function literalOf(node) {
152
+ const value = valueOf(node);
153
+ if (typeof value === "string")
154
+ return { type: "string", enum: [value] };
155
+ if (typeof value === "number")
156
+ return { type: "number" };
157
+ if (typeof value === "boolean")
158
+ return { type: "boolean" };
159
+ return { ...ANY_OBJECT };
160
+ }
161
+ /** Types the registry maps from text alone, so no schema is attached. */
162
+ function plainType(node) {
163
+ if (node.type === "TSStringKeyword")
164
+ return true;
165
+ if (node.type === "TSNumberKeyword")
166
+ return true;
167
+ if (node.type === "TSBooleanKeyword")
168
+ return true;
169
+ if (node.type === "TSFunctionType")
170
+ return true;
171
+ return node.type === "TSArrayType" && plainType(node.elementType);
172
+ }
173
+ /** One parameter's name, type text and optionality. */
174
+ function paramOf(node, source, types) {
175
+ const defaulted = node.type === "AssignmentPattern";
176
+ const binding = (defaulted ? node.left : node);
177
+ // Destructured parameters have no name to offer the model.
178
+ if (binding.type !== "Identifier")
179
+ return undefined;
180
+ let type = binding.typeAnnotation?.typeAnnotation;
181
+ let optional = defaulted || Boolean(binding.optional);
182
+ if (type?.type === "TSUnionType") {
183
+ const real = type.types.filter((one) => !isNothing(one));
184
+ if (real.length < type.types.length)
185
+ optional = true;
186
+ if (real.length === 1 && real[0])
187
+ type = real[0];
188
+ }
189
+ const param = { name: binding.name, optional };
190
+ if (type)
191
+ param.type = textOf(type, source);
192
+ if (type && !plainType(type))
193
+ param.schema = jsonOf(type, types, new Set());
194
+ return param;
195
+ }
196
+ /** Parameters of a method, or of a function-valued field. */
197
+ function paramsOf(member, source, types) {
198
+ const holder = member.type === "MethodDefinition"
199
+ ? member.value
200
+ : member.type === "PropertyDefinition" &&
201
+ (member.value?.type === "ArrowFunctionExpression" || member.value?.type === "FunctionExpression")
202
+ ? member.value
203
+ : undefined;
204
+ if (!holder || holder.type === "TSEmptyBodyFunctionExpression")
205
+ return [];
206
+ return holder.params.map((param) => paramOf(param, source, types)).filter((param) => param !== undefined);
207
+ }
208
+ /**
209
+ * Read a class's JSDoc and method signatures from source text: a full file, or `Ctor.toString()`.
210
+ * `file`'s extension selects the dialect: JSX fails as .ts, and `<T>x` casts fail as .tsx.
211
+ */
212
+ export function parseClassSource(text, file = "agent.tsx") {
213
+ const docs = { methods: new Map() };
214
+ const parsed = parseSync(file, text, { sourceType: "module" });
215
+ const source = {
216
+ text,
217
+ jsdoc: parsed.comments.filter((one) => one.type === "Block" && one.value.startsWith("*")),
218
+ };
219
+ const body = parsed.program.body;
220
+ const found = theClass(body);
221
+ if (!found)
222
+ return docs;
223
+ const doc = docAt(found.start, source);
224
+ if (doc)
225
+ docs.doc = doc;
226
+ const types = declaredTypes(body);
227
+ for (const member of found.node.body.body) {
228
+ const method = member.type === "MethodDefinition" && (member.kind === "method" || member.kind === "get");
229
+ if (!method && member.type !== "PropertyDefinition")
230
+ continue;
231
+ if (member.key.type !== "Identifier")
232
+ continue;
233
+ const name = member.key.name;
234
+ if (docs.methods.has(name))
235
+ continue;
236
+ const entry = { params: paramsOf(member, source, types) };
237
+ const memberDoc = docAt(member.start, source);
238
+ if (memberDoc)
239
+ entry.doc = memberDoc;
240
+ docs.methods.set(name, entry);
241
+ }
242
+ return docs;
243
+ }
244
+ // Bumped by describe() so caches built from scraped bodies know they are stale.
245
+ let version = 0;
246
+ /** Counter bumped by each describe(); used to invalidate caches. */
247
+ export function docsVersion() {
248
+ return version;
249
+ }
250
+ /** Register a class's source so its docstrings and parameter types are available at runtime. */
251
+ export function describe(ctor, source, file) {
252
+ const docs = parseClassSource(source, file);
253
+ registered.set(ctor, docs);
254
+ version++;
255
+ return docs;
256
+ }
257
+ /** The class's docs, from describe() if called, else parsed from `ctor.toString()`. */
258
+ export function docsOf(ctor) {
259
+ const given = registered.get(ctor);
260
+ if (given)
261
+ return given;
262
+ let own = scraped.get(ctor);
263
+ if (!own) {
264
+ own = parseClassSource(ctor.toString());
265
+ scraped.set(ctor, own);
266
+ }
267
+ return own;
268
+ }
269
+ /** The class docstring, read from its source or from an explicit `static doc`. */
270
+ export function classDoc(ctor) {
271
+ return docsOf(ctor).doc ?? ctor.doc;
272
+ }
273
+ /** The class and its ancestors, most derived first, excluding Function.prototype. */
274
+ function chain(ctor) {
275
+ const classes = [];
276
+ for (let current = ctor; typeof current === "function"; current = Object.getPrototypeOf(current)) {
277
+ if (current === Function.prototype)
278
+ break;
279
+ classes.push(current);
280
+ }
281
+ return classes;
282
+ }
283
+ /** The docstring of one method, looked up along the prototype chain. */
284
+ export function methodDoc(ctor, name) {
285
+ for (const current of chain(ctor)) {
286
+ const doc = docsOf(current).methods.get(name)?.doc;
287
+ if (doc)
288
+ return doc;
289
+ }
290
+ return undefined;
291
+ }
292
+ /** The parameters of one method, looked up along the prototype chain. */
293
+ export function methodParams(ctor, name) {
294
+ for (const current of chain(ctor)) {
295
+ const found = docsOf(current).methods.get(name);
296
+ if (found)
297
+ return found.params;
298
+ }
299
+ return [];
300
+ }
301
+ //# sourceMappingURL=docstrings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docstrings.js","sourceRoot":"","sources":["../../src/agent/docstrings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /** The `this.knowledge` interface: search the knowledge bases attached to the agent. */
2
+ import type { Found } from "../call/call.js";
3
+ /** Search the attached knowledge bases and return the top `k` chunks for `query`. */
4
+ export interface Knowledge {
5
+ search(query: string, options?: {
6
+ k?: number;
7
+ }): Promise<Found[]>;
8
+ }
9
+ //# sourceMappingURL=knowledge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../src/agent/knowledge.ts"],"names":[],"mappings":"AAAA,wFAAwF;AAExF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,qFAAqF;AAErF,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;CACnE"}
@@ -0,0 +1,3 @@
1
+ /** The `this.knowledge` interface: search the knowledge bases attached to the agent. */
2
+ export {};
3
+ //# sourceMappingURL=knowledge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/agent/knowledge.ts"],"names":[],"mappings":"AAAA,wFAAwF"}
@@ -0,0 +1,29 @@
1
+ /** Lifecycle hooks: call start, call end, memory writes and external events. */
2
+ import { type Medium } from "../wire/defs.js";
3
+ import type { EventMeta } from "./accepts.js";
4
+ /** The call passed to lifecycle hooks. */
5
+ export interface Call {
6
+ id: string;
7
+ contact: string;
8
+ from?: string;
9
+ channel?: string;
10
+ /** Spoken or written, when the gateway says. */
11
+ medium?: Medium;
12
+ }
13
+ /** A memory write: remember or forget a key about the contact. */
14
+ export interface MemoryOp {
15
+ op: "remember" | "forget";
16
+ key: string;
17
+ value?: unknown;
18
+ }
19
+ /** Hooks an agent may override; all default to no-ops. */
20
+ export interface Lifecycle {
21
+ onCall(call: Call): unknown;
22
+ onEnd(call: Call): unknown;
23
+ onMemory(ops: MemoryOp[], call: Call): unknown;
24
+ onEvent(name: string, data: Record<string, unknown>, meta: EventMeta): unknown;
25
+ }
26
+ export type HookName = keyof Lifecycle;
27
+ /** Run a hook with its state writes authored as `hook:<name>`; hooks and tools are the only writers. */
28
+ export declare function runHook<K extends HookName>(agent: Lifecycle, hook: K, ...args: Parameters<Lifecycle[K]>): Promise<unknown>;
29
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/agent/lifecycle.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAG9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,0CAA0C;AAC1C,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,kEAAkE;AAClE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,0DAA0D;AAC1D,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;IAC5B,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;IAC/C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;CAChF;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC;AAEvC,wGAAwG;AAExG,wBAAgB,OAAO,CAAC,CAAC,SAAS,QAAQ,EACxC,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,CAAC,EACP,GAAG,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAChC,OAAO,CAAC,OAAO,CAAC,CAGlB"}
@@ -0,0 +1,9 @@
1
+ /** Lifecycle hooks: call start, call end, memory writes and external events. */
2
+ import {} from "../wire/defs.js";
3
+ import { withAuthorAsync } from "./authors.js";
4
+ /** Run a hook with its state writes authored as `hook:<name>`; hooks and tools are the only writers. */
5
+ export function runHook(agent, hook, ...args) {
6
+ const method = agent[hook];
7
+ return withAuthorAsync(`hook:${hook}`, () => method.apply(agent, args));
8
+ }
9
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/agent/lifecycle.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,OAAO,EAAe,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AA8B/C,wGAAwG;AAExG,MAAM,UAAU,OAAO,CACrB,KAAgB,EAChB,IAAO,EACP,GAAG,IAA8B;IAEjC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAoC,CAAC;IAC9D,OAAO,eAAe,CAAC,QAAQ,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,7 @@
1
+ /** Detect whether a class's source uses `this.knowledge`, with oxc's parser. */
2
+ /**
3
+ * Whether the source reads `this.knowledge`. Sent at registration as `uses_knowledge`, so the
4
+ * gateway can refuse a world with no knowledge base attached at boot instead of mid-call.
5
+ */
6
+ export declare function searchesKnowledge(source: string, file?: string): boolean;
7
+ //# sourceMappingURL=searching.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searching.d.ts","sourceRoot":"","sources":["../../src/agent/searching.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAchF;;;GAGG;AAEH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,SAAc,GAAG,OAAO,CAG7E"}
@@ -0,0 +1,35 @@
1
+ /** Detect whether a class's source uses `this.knowledge`, with oxc's parser. */
2
+ import { parseSync } from "oxc-parser";
3
+ // An AST walk, not a regex, so `this.knowledge` in strings or comments does not count. Any
4
+ // method in the file counts, not only tools.
5
+ const THE_WORD = "knowledge";
6
+ /**
7
+ * Whether the source reads `this.knowledge`. Sent at registration as `uses_knowledge`, so the
8
+ * gateway can refuse a world with no knowledge base attached at boot instead of mid-call.
9
+ */
10
+ export function searchesKnowledge(source, file = "agent.tsx") {
11
+ const parsed = parseSync(file, source, { sourceType: "module" });
12
+ return reaches(parsed.program);
13
+ }
14
+ function reaches(node) {
15
+ if (node.type === "MemberExpression") {
16
+ const object = node["object"];
17
+ const property = node["property"];
18
+ if (object.type === "ThisExpression" && property.type === "Identifier" && property["name"] === THE_WORD)
19
+ return true;
20
+ }
21
+ for (const child of Object.values(node)) {
22
+ if (Array.isArray(child)) {
23
+ if (child.some((one) => isNode(one) && reaches(one)))
24
+ return true;
25
+ }
26
+ else if (isNode(child) && reaches(child)) {
27
+ return true;
28
+ }
29
+ }
30
+ return false;
31
+ }
32
+ function isNode(value) {
33
+ return typeof value === "object" && value !== null && typeof value.type === "string";
34
+ }
35
+ //# sourceMappingURL=searching.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searching.js","sourceRoot":"","sources":["../../src/agent/searching.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,2FAA2F;AAC3F,6CAA6C;AAC7C,MAAM,QAAQ,GAAG,WAAW,CAAC;AAQ7B;;;GAGG;AAEH,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,IAAI,GAAG,WAAW;IAClE,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjE,OAAO,OAAO,CAAC,MAAM,CAAC,OAA0B,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,OAAO,CAAC,IAAU;IACzB,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAS,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAS,CAAC;QAC1C,IAAI,MAAM,CAAC,IAAI,KAAK,gBAAgB,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;IACvH,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;QACpE,CAAC;aAAM,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAQ,KAAc,CAAC,IAAI,KAAK,QAAQ,CAAC;AACjG,CAAC"}
@@ -0,0 +1,23 @@
1
+ /** `stage`: shorthand for a tool visible only in certain stages of the agent. */
2
+ import type { ToolOptions } from "./tools.js";
3
+ /**
4
+ * Type for an agent's `stage` field: `stage: Stages<"identify" | "book"> = "identify"`.
5
+ * It is an ordinary state field; `@tool({ stage })` is typed against it.
6
+ */
7
+ export type Stages<Named extends string> = Named;
8
+ /**
9
+ * The union declared by a class's `stage` field, or `never` if it has none, so a misspelled or
10
+ * undeclared stage in `@tool({ stage })` is a compile error.
11
+ */
12
+ export type StageOf<T> = T extends {
13
+ stage: infer Named extends string;
14
+ } ? Named : never;
15
+ /** A declaration's `stage` option normalized to a list. */
16
+ export declare function stagesOf(options: {
17
+ stage?: unknown;
18
+ }): string[] | undefined;
19
+ /** The agent's current stage, or undefined if it has no string `stage` field. */
20
+ export declare function stageOf(agent: object): string | undefined;
21
+ /** Convert `stage` into a `when` predicate, AND-ed with any `when` already given. */
22
+ export declare function lowerStage<T extends object>(options: ToolOptions<T>): ToolOptions<T>;
23
+ //# sourceMappingURL=stages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stages.d.ts","sourceRoot":"","sources":["../../src/agent/stages.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAGjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;GAGG;AACH,MAAM,MAAM,MAAM,CAAC,KAAK,SAAS,MAAM,IAAI,KAAK,CAAC;AAEjD;;;GAGG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,KAAK,EAAE,MAAM,KAAK,SAAS,MAAM,CAAA;CAAE,GAAG,KAAK,GAAG,KAAK,CAAC;AAEzF,2DAA2D;AAC3D,wBAAgB,QAAQ,CAAC,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,EAAE,GAAG,SAAS,CAI3E;AAED,iFAAiF;AACjF,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGzD;AAED,qFAAqF;AAErF,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAYpF"}
@@ -0,0 +1,29 @@
1
+ /** `stage`: shorthand for a tool visible only in certain stages of the agent. */
2
+ /** A declaration's `stage` option normalized to a list. */
3
+ export function stagesOf(options) {
4
+ const declared = options.stage;
5
+ if (declared === undefined)
6
+ return undefined;
7
+ return Array.isArray(declared) ? declared.map(String) : [String(declared)];
8
+ }
9
+ /** The agent's current stage, or undefined if it has no string `stage` field. */
10
+ export function stageOf(agent) {
11
+ const named = agent.stage;
12
+ return typeof named === "string" ? named : undefined;
13
+ }
14
+ /** Convert `stage` into a `when` predicate, AND-ed with any `when` already given. */
15
+ export function lowerStage(options) {
16
+ const stages = stagesOf(options);
17
+ if (stages === undefined)
18
+ return options;
19
+ const also = options.when;
20
+ const inOneOfThem = (state) => {
21
+ const named = state.stage;
22
+ return typeof named === "string" && stages.includes(named);
23
+ };
24
+ return {
25
+ ...options,
26
+ when: also === undefined ? inOneOfThem : (state) => inOneOfThem(state) && also(state),
27
+ };
28
+ }
29
+ //# sourceMappingURL=stages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stages.js","sourceRoot":"","sources":["../../src/agent/stages.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAiBjF,2DAA2D;AAC3D,MAAM,UAAU,QAAQ,CAAC,OAA4B;IACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;IAC/B,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC7C,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,MAAM,KAAK,GAAI,KAA6B,CAAC,KAAK,CAAC;IACnD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,qFAAqF;AAErF,MAAM,UAAU,UAAU,CAAmB,OAAuB;IAClE,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IACzC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAM,WAAW,GAAG,CAAC,KAAkB,EAAW,EAAE;QAClD,MAAM,KAAK,GAAI,KAA6B,CAAC,KAAK,CAAC;QACnD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC,CAAC;IACF,OAAO;QACL,GAAG,OAAO;QACV,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC;KACtF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,36 @@
1
+ /** Agent state as a plain object: snapshot, diff, restore and collapse. */
2
+ import { CONFIG_FIELDS, changes } from "./agent.js";
3
+ type ConfigName = (typeof CONFIG_FIELDS)[number];
4
+ type StateOf<T> = {
5
+ [K in keyof T as T[K] extends Function ? never : K extends ConfigName ? never : K]: T[K];
6
+ };
7
+ /**
8
+ * The agent's state as a plain object: no methods, no config fields. `Snapshot<T>` is typed for
9
+ * class `T`; bare `Snapshot` is an untyped record.
10
+ */
11
+ export type Snapshot<T = unknown> = unknown extends T ? Record<string, unknown> : StateOf<T>;
12
+ /** One field that differs between two snapshots. */
13
+ export interface FieldDiff {
14
+ field: string;
15
+ prev: unknown;
16
+ next: unknown;
17
+ }
18
+ /** A copy of the agent's current state, including getters. */
19
+ export declare function snapshot(agent: object): Snapshot;
20
+ /** Fields that differ between two snapshots. */
21
+ export declare function diff(before: Snapshot, after: Snapshot): FieldDiff[];
22
+ /** Replace the agent's state with a snapshot, authored by the current author or `restore`. */
23
+ export declare function restore(agent: object, state: Snapshot): void;
24
+ /** A change log collapsed into one summary entry. */
25
+ export interface Collapsed {
26
+ summary: string;
27
+ seq: number;
28
+ at: number;
29
+ }
30
+ /** Replace the change log with a single summary entry; the state is unchanged. */
31
+ export declare function collapse(agent: object, summary: string): Collapsed;
32
+ /** Loads the snapshot a contact's last call left, if any. */
33
+ export type LastCall = (contact: string) => Promise<Snapshot | null>;
34
+ /** Re-exported for callers reading state and change log together. */
35
+ export { changes };
36
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/agent/state.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAE3E,OAAO,EAAS,aAAa,EAAE,OAAO,EAA8B,MAAM,YAAY,CAAC;AAIvF,KAAK,UAAU,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAGjD,KAAK,OAAO,CAAC,CAAC,IAAI;KACf,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,KAAK,GAAG,CAAC,SAAS,UAAU,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACzF,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAE7F,oDAAoD;AACpD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AA6BD,8DAA8D;AAC9D,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAYhD;AAED,gDAAgD;AAChD,wBAAgB,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,SAAS,EAAE,CASnE;AAED,8FAA8F;AAC9F,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CAiB5D;AAED,qDAAqD;AACrD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAalE;AAED,6DAA6D;AAC7D,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;AAErE,qEAAqE;AAErE,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1,93 @@
1
+ /** Agent state as a plain object: snapshot, diff, restore and collapse. */
2
+ import { Agent, CONFIG_FIELDS, changes, internalsOf, isConfigField } from "./agent.js";
3
+ import { currentAuthor, withAuthor } from "./authors.js";
4
+ import { declaredStateOf } from "./visibility.js";
5
+ // Own non-function, non-config fields; restricted to `@state` fields when the class declares any.
6
+ function isStateField(key, value, declared) {
7
+ if (isConfigField(key) || typeof value === "function")
8
+ return false;
9
+ return declared === null || declared.has(key);
10
+ }
11
+ /** The class's `@state` fields, or null when it declares none. */
12
+ function stateOf(agent) {
13
+ return declaredStateOf(internalsOf(agent).target.constructor);
14
+ }
15
+ // Getters are state too (`when` predicates read them). Stop at Agent so framework accessors are excluded.
16
+ function gettersOf(agent) {
17
+ const names = [];
18
+ for (let prototype = Object.getPrototypeOf(agent); prototype && prototype !== Object.prototype; prototype = Object.getPrototypeOf(prototype)) {
19
+ if (prototype.constructor === Agent)
20
+ break;
21
+ for (const [name, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(prototype))) {
22
+ if (typeof descriptor.get === "function" && !names.includes(name))
23
+ names.push(name);
24
+ }
25
+ }
26
+ return names;
27
+ }
28
+ /** A copy of the agent's current state, including getters. */
29
+ export function snapshot(agent) {
30
+ const own = internalsOf(agent);
31
+ const readable = agent;
32
+ const declared = stateOf(agent);
33
+ const state = {};
34
+ for (const key of Object.keys(own.target)) {
35
+ const value = own.target[key];
36
+ if (isStateField(key, value, declared))
37
+ state[key] = value;
38
+ }
39
+ // Getters read through the proxy, since they are written against `this`.
40
+ for (const name of gettersOf(agent))
41
+ state[name] = readable[name];
42
+ return state;
43
+ }
44
+ /** Fields that differ between two snapshots. */
45
+ export function diff(before, after) {
46
+ const fields = new Set([...Object.keys(before), ...Object.keys(after)]);
47
+ const changed = [];
48
+ for (const field of fields) {
49
+ if (!Object.is(before[field], after[field])) {
50
+ changed.push({ field, prev: before[field], next: after[field] });
51
+ }
52
+ }
53
+ return changed;
54
+ }
55
+ /** Replace the agent's state with a snapshot, authored by the current author or `restore`. */
56
+ export function restore(agent, state) {
57
+ const author = currentAuthor() ?? "restore";
58
+ const derived = new Set(gettersOf(agent));
59
+ const declared = stateOf(agent);
60
+ const target = internalsOf(agent).target;
61
+ withAuthor(author, () => {
62
+ const writable = agent;
63
+ const fields = new Set(Object.keys(target));
64
+ // State fields missing from the snapshot are cleared; non-state fields are left alone.
65
+ for (const key of fields) {
66
+ if (isStateField(key, target[key], declared) && !(key in state))
67
+ writable[key] = undefined;
68
+ }
69
+ // Skip getters: they derive from the restored fields.
70
+ for (const [key, value] of Object.entries(state)) {
71
+ if (fields.has(key) || !derived.has(key))
72
+ writable[key] = value;
73
+ }
74
+ });
75
+ }
76
+ /** Replace the change log with a single summary entry; the state is unchanged. */
77
+ export function collapse(agent, summary) {
78
+ const own = internalsOf(agent);
79
+ const collapsed = { summary, seq: ++own.seq, at: Date.now() };
80
+ own.changes.length = 0;
81
+ own.changes.push({
82
+ seq: collapsed.seq,
83
+ field: "@summary",
84
+ prev: undefined,
85
+ next: summary,
86
+ author: "collapse",
87
+ at: collapsed.at,
88
+ });
89
+ return collapsed;
90
+ }
91
+ /** Re-exported for callers reading state and change log together. */
92
+ export { changes };
93
+ //# sourceMappingURL=state.js.map