durable-actors 0.2.4

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 (377) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +206 -0
  3. package/dist/actor/actor.d.ts +66 -0
  4. package/dist/actor/actor.d.ts.map +1 -0
  5. package/dist/actor/actor.js +144 -0
  6. package/dist/actor/actor.js.map +1 -0
  7. package/dist/actor/decorators.d.ts +6 -0
  8. package/dist/actor/decorators.d.ts.map +1 -0
  9. package/dist/actor/decorators.js +24 -0
  10. package/dist/actor/decorators.js.map +1 -0
  11. package/dist/actor/identity.d.ts +16 -0
  12. package/dist/actor/identity.d.ts.map +1 -0
  13. package/dist/actor/identity.js +29 -0
  14. package/dist/actor/identity.js.map +1 -0
  15. package/dist/actor/invocationContext.d.ts +4 -0
  16. package/dist/actor/invocationContext.d.ts.map +1 -0
  17. package/dist/actor/invocationContext.js +10 -0
  18. package/dist/actor/invocationContext.js.map +1 -0
  19. package/dist/actor/schema.d.ts +22 -0
  20. package/dist/actor/schema.d.ts.map +1 -0
  21. package/dist/actor/schema.js +8 -0
  22. package/dist/actor/schema.js.map +1 -0
  23. package/dist/actor/socket.d.ts +88 -0
  24. package/dist/actor/socket.d.ts.map +1 -0
  25. package/dist/actor/socket.js +216 -0
  26. package/dist/actor/socket.js.map +1 -0
  27. package/dist/actor/socketProtocol.d.ts +85 -0
  28. package/dist/actor/socketProtocol.d.ts.map +1 -0
  29. package/dist/actor/socketProtocol.js +95 -0
  30. package/dist/actor/socketProtocol.js.map +1 -0
  31. package/dist/actor/socketValidation.d.ts +29 -0
  32. package/dist/actor/socketValidation.d.ts.map +1 -0
  33. package/dist/actor/socketValidation.js +73 -0
  34. package/dist/actor/socketValidation.js.map +1 -0
  35. package/dist/backend.d.ts +13 -0
  36. package/dist/backend.d.ts.map +1 -0
  37. package/dist/backend.js +45 -0
  38. package/dist/backend.js.map +1 -0
  39. package/dist/cli/actor-source-watcher.d.ts +11 -0
  40. package/dist/cli/actor-source-watcher.d.ts.map +1 -0
  41. package/dist/cli/actor-source-watcher.js +55 -0
  42. package/dist/cli/actor-source-watcher.js.map +1 -0
  43. package/dist/cli/connection.d.ts +14 -0
  44. package/dist/cli/connection.d.ts.map +1 -0
  45. package/dist/cli/connection.js +16 -0
  46. package/dist/cli/connection.js.map +1 -0
  47. package/dist/cli/control-plane.d.ts +34 -0
  48. package/dist/cli/control-plane.d.ts.map +1 -0
  49. package/dist/cli/control-plane.js +99 -0
  50. package/dist/cli/control-plane.js.map +1 -0
  51. package/dist/cli/deploy.d.ts +4 -0
  52. package/dist/cli/deploy.d.ts.map +1 -0
  53. package/dist/cli/deploy.js +39 -0
  54. package/dist/cli/deploy.js.map +1 -0
  55. package/dist/cli/dev.d.ts +4 -0
  56. package/dist/cli/dev.d.ts.map +1 -0
  57. package/dist/cli/dev.js +121 -0
  58. package/dist/cli/dev.js.map +1 -0
  59. package/dist/cli/generate.d.ts +4 -0
  60. package/dist/cli/generate.d.ts.map +1 -0
  61. package/dist/cli/generate.js +59 -0
  62. package/dist/cli/generate.js.map +1 -0
  63. package/dist/cli/objects.d.ts +4 -0
  64. package/dist/cli/objects.d.ts.map +1 -0
  65. package/dist/cli/objects.js +68 -0
  66. package/dist/cli/objects.js.map +1 -0
  67. package/dist/cli/observe.d.ts +23 -0
  68. package/dist/cli/observe.d.ts.map +1 -0
  69. package/dist/cli/observe.js +245 -0
  70. package/dist/cli/observe.js.map +1 -0
  71. package/dist/cli/rust-runtime.d.ts +10 -0
  72. package/dist/cli/rust-runtime.d.ts.map +1 -0
  73. package/dist/cli/rust-runtime.js +62 -0
  74. package/dist/cli/rust-runtime.js.map +1 -0
  75. package/dist/cli.d.ts +3 -0
  76. package/dist/cli.d.ts.map +1 -0
  77. package/dist/cli.js +131 -0
  78. package/dist/cli.js.map +1 -0
  79. package/dist/client/actorHostGrpc.d.ts +50 -0
  80. package/dist/client/actorHostGrpc.d.ts.map +1 -0
  81. package/dist/client/actorHostGrpc.js +111 -0
  82. package/dist/client/actorHostGrpc.js.map +1 -0
  83. package/dist/client/client.d.ts +12 -0
  84. package/dist/client/client.d.ts.map +1 -0
  85. package/dist/client/client.js +20 -0
  86. package/dist/client/client.js.map +1 -0
  87. package/dist/client/clientSettings.d.ts +8 -0
  88. package/dist/client/clientSettings.d.ts.map +1 -0
  89. package/dist/client/clientSettings.js +45 -0
  90. package/dist/client/clientSettings.js.map +1 -0
  91. package/dist/client/remoteClient.d.ts +49 -0
  92. package/dist/client/remoteClient.d.ts.map +1 -0
  93. package/dist/client/remoteClient.js +286 -0
  94. package/dist/client/remoteClient.js.map +1 -0
  95. package/dist/client/socketConnection.d.ts +18 -0
  96. package/dist/client/socketConnection.d.ts.map +1 -0
  97. package/dist/client/socketConnection.js +48 -0
  98. package/dist/client/socketConnection.js.map +1 -0
  99. package/dist/client/telemetry.d.ts +14 -0
  100. package/dist/client/telemetry.d.ts.map +1 -0
  101. package/dist/client/telemetry.js +23 -0
  102. package/dist/client/telemetry.js.map +1 -0
  103. package/dist/compiler/actor-build.d.ts +4 -0
  104. package/dist/compiler/actor-build.d.ts.map +1 -0
  105. package/dist/compiler/actor-build.js +36 -0
  106. package/dist/compiler/actor-build.js.map +1 -0
  107. package/dist/compiler/actor-compiler.d.ts +30 -0
  108. package/dist/compiler/actor-compiler.d.ts.map +1 -0
  109. package/dist/compiler/actor-compiler.js +300 -0
  110. package/dist/compiler/actor-compiler.js.map +1 -0
  111. package/dist/compiler/deployment-build.d.ts +2 -0
  112. package/dist/compiler/deployment-build.d.ts.map +1 -0
  113. package/dist/compiler/deployment-build.js +23 -0
  114. package/dist/compiler/deployment-build.js.map +1 -0
  115. package/dist/compiler/features/persistence.d.ts +11 -0
  116. package/dist/compiler/features/persistence.d.ts.map +1 -0
  117. package/dist/compiler/features/persistence.js +102 -0
  118. package/dist/compiler/features/persistence.js.map +1 -0
  119. package/dist/compiler/features/reentrancy.d.ts +9 -0
  120. package/dist/compiler/features/reentrancy.d.ts.map +1 -0
  121. package/dist/compiler/features/reentrancy.js +44 -0
  122. package/dist/compiler/features/reentrancy.js.map +1 -0
  123. package/dist/compiler/generators/backend-generator.d.ts +5 -0
  124. package/dist/compiler/generators/backend-generator.d.ts.map +1 -0
  125. package/dist/compiler/generators/backend-generator.js +181 -0
  126. package/dist/compiler/generators/backend-generator.js.map +1 -0
  127. package/dist/compiler/generators/client-generator.d.ts +5 -0
  128. package/dist/compiler/generators/client-generator.d.ts.map +1 -0
  129. package/dist/compiler/generators/client-generator.js +28 -0
  130. package/dist/compiler/generators/client-generator.js.map +1 -0
  131. package/dist/compiler/generators/typescript-generator.d.ts +8 -0
  132. package/dist/compiler/generators/typescript-generator.d.ts.map +1 -0
  133. package/dist/compiler/generators/typescript-generator.js +154 -0
  134. package/dist/compiler/generators/typescript-generator.js.map +1 -0
  135. package/dist/compiler/generators/usage-comment.d.ts +3 -0
  136. package/dist/compiler/generators/usage-comment.d.ts.map +1 -0
  137. package/dist/compiler/generators/usage-comment.js +6 -0
  138. package/dist/compiler/generators/usage-comment.js.map +1 -0
  139. package/dist/compiler/json-schema.d.ts +7 -0
  140. package/dist/compiler/json-schema.d.ts.map +1 -0
  141. package/dist/compiler/json-schema.js +122 -0
  142. package/dist/compiler/json-schema.js.map +1 -0
  143. package/dist/compiler/public-schema.d.ts +4 -0
  144. package/dist/compiler/public-schema.d.ts.map +1 -0
  145. package/dist/compiler/public-schema.js +46 -0
  146. package/dist/compiler/public-schema.js.map +1 -0
  147. package/dist/compiler/rpc-contract.d.ts +5 -0
  148. package/dist/compiler/rpc-contract.d.ts.map +1 -0
  149. package/dist/compiler/rpc-contract.js +95 -0
  150. package/dist/compiler/rpc-contract.js.map +1 -0
  151. package/dist/compiler/socket-contract.d.ts +6 -0
  152. package/dist/compiler/socket-contract.d.ts.map +1 -0
  153. package/dist/compiler/socket-contract.js +36 -0
  154. package/dist/compiler/socket-contract.js.map +1 -0
  155. package/dist/compiler/types.d.ts +51 -0
  156. package/dist/compiler/types.d.ts.map +1 -0
  157. package/dist/compiler/types.js +9 -0
  158. package/dist/compiler/types.js.map +1 -0
  159. package/dist/compiler/validate-public-contract.d.ts +4 -0
  160. package/dist/compiler/validate-public-contract.d.ts.map +1 -0
  161. package/dist/compiler/validate-public-contract.js +155 -0
  162. package/dist/compiler/validate-public-contract.js.map +1 -0
  163. package/dist/environment.d.ts +2 -0
  164. package/dist/environment.d.ts.map +1 -0
  165. package/dist/environment.js +18 -0
  166. package/dist/environment.js.map +1 -0
  167. package/dist/errors.d.ts +27 -0
  168. package/dist/errors.d.ts.map +1 -0
  169. package/dist/errors.js +52 -0
  170. package/dist/errors.js.map +1 -0
  171. package/dist/generated/durable_object/v1/ActivateActorReply.d.ts +8 -0
  172. package/dist/generated/durable_object/v1/ActivateActorReply.d.ts.map +1 -0
  173. package/dist/generated/durable_object/v1/ActivateActorReply.js +3 -0
  174. package/dist/generated/durable_object/v1/ActivateActorReply.js.map +1 -0
  175. package/dist/generated/durable_object/v1/ActivateActorRequest.d.ts +8 -0
  176. package/dist/generated/durable_object/v1/ActivateActorRequest.d.ts.map +1 -0
  177. package/dist/generated/durable_object/v1/ActivateActorRequest.js +3 -0
  178. package/dist/generated/durable_object/v1/ActivateActorRequest.js.map +1 -0
  179. package/dist/generated/durable_object/v1/ActorCompleted.d.ts +9 -0
  180. package/dist/generated/durable_object/v1/ActorCompleted.d.ts.map +1 -0
  181. package/dist/generated/durable_object/v1/ActorCompleted.js +3 -0
  182. package/dist/generated/durable_object/v1/ActorCompleted.js.map +1 -0
  183. package/dist/generated/durable_object/v1/ActorControlPlaneService.d.ts +21 -0
  184. package/dist/generated/durable_object/v1/ActorControlPlaneService.d.ts.map +1 -0
  185. package/dist/generated/durable_object/v1/ActorControlPlaneService.js +3 -0
  186. package/dist/generated/durable_object/v1/ActorControlPlaneService.js.map +1 -0
  187. package/dist/generated/durable_object/v1/ActorFailed.d.ts +9 -0
  188. package/dist/generated/durable_object/v1/ActorFailed.d.ts.map +1 -0
  189. package/dist/generated/durable_object/v1/ActorFailed.js +3 -0
  190. package/dist/generated/durable_object/v1/ActorFailed.js.map +1 -0
  191. package/dist/generated/durable_object/v1/ActorHostService.d.ts +56 -0
  192. package/dist/generated/durable_object/v1/ActorHostService.d.ts.map +1 -0
  193. package/dist/generated/durable_object/v1/ActorHostService.js +3 -0
  194. package/dist/generated/durable_object/v1/ActorHostService.js.map +1 -0
  195. package/dist/generated/durable_object/v1/ActorKey.d.ts +11 -0
  196. package/dist/generated/durable_object/v1/ActorKey.d.ts.map +1 -0
  197. package/dist/generated/durable_object/v1/ActorKey.js +3 -0
  198. package/dist/generated/durable_object/v1/ActorKey.js.map +1 -0
  199. package/dist/generated/durable_object/v1/ControlPlaneReply.d.ts +7 -0
  200. package/dist/generated/durable_object/v1/ControlPlaneReply.d.ts.map +1 -0
  201. package/dist/generated/durable_object/v1/ControlPlaneReply.js +3 -0
  202. package/dist/generated/durable_object/v1/ControlPlaneReply.js.map +1 -0
  203. package/dist/generated/durable_object/v1/ControlPlaneRequest.d.ts +7 -0
  204. package/dist/generated/durable_object/v1/ControlPlaneRequest.d.ts.map +1 -0
  205. package/dist/generated/durable_object/v1/ControlPlaneRequest.js +3 -0
  206. package/dist/generated/durable_object/v1/ControlPlaneRequest.js.map +1 -0
  207. package/dist/generated/durable_object/v1/Empty.d.ts +5 -0
  208. package/dist/generated/durable_object/v1/Empty.d.ts.map +1 -0
  209. package/dist/generated/durable_object/v1/Empty.js +3 -0
  210. package/dist/generated/durable_object/v1/Empty.js.map +1 -0
  211. package/dist/generated/durable_object/v1/HostInvokeActorRequest.d.ts +11 -0
  212. package/dist/generated/durable_object/v1/HostInvokeActorRequest.d.ts.map +1 -0
  213. package/dist/generated/durable_object/v1/HostInvokeActorRequest.js +3 -0
  214. package/dist/generated/durable_object/v1/HostInvokeActorRequest.js.map +1 -0
  215. package/dist/generated/durable_object/v1/HostSocketEventRequest.d.ts +17 -0
  216. package/dist/generated/durable_object/v1/HostSocketEventRequest.d.ts.map +1 -0
  217. package/dist/generated/durable_object/v1/HostSocketEventRequest.js +3 -0
  218. package/dist/generated/durable_object/v1/HostSocketEventRequest.js.map +1 -0
  219. package/dist/generated/durable_object/v1/InvokeActorReply.d.ts +16 -0
  220. package/dist/generated/durable_object/v1/InvokeActorReply.d.ts.map +1 -0
  221. package/dist/generated/durable_object/v1/InvokeActorReply.js +3 -0
  222. package/dist/generated/durable_object/v1/InvokeActorReply.js.map +1 -0
  223. package/dist/generated/durable_object/v1/InvokeActorRequest.d.ts +14 -0
  224. package/dist/generated/durable_object/v1/InvokeActorRequest.d.ts.map +1 -0
  225. package/dist/generated/durable_object/v1/InvokeActorRequest.js +3 -0
  226. package/dist/generated/durable_object/v1/InvokeActorRequest.js.map +1 -0
  227. package/dist/generated/durable_object/v1/PublishSocketEffectsRequest.d.ts +13 -0
  228. package/dist/generated/durable_object/v1/PublishSocketEffectsRequest.d.ts.map +1 -0
  229. package/dist/generated/durable_object/v1/PublishSocketEffectsRequest.js +3 -0
  230. package/dist/generated/durable_object/v1/PublishSocketEffectsRequest.js.map +1 -0
  231. package/dist/generated/durable_object/v1/ReplicaService.d.ts +42 -0
  232. package/dist/generated/durable_object/v1/ReplicaService.d.ts.map +1 -0
  233. package/dist/generated/durable_object/v1/ReplicaService.js +3 -0
  234. package/dist/generated/durable_object/v1/ReplicaService.js.map +1 -0
  235. package/dist/generated/durable_object/v1/ReplicaSessionHead.d.ts +14 -0
  236. package/dist/generated/durable_object/v1/ReplicaSessionHead.d.ts.map +1 -0
  237. package/dist/generated/durable_object/v1/ReplicaSessionHead.js +3 -0
  238. package/dist/generated/durable_object/v1/ReplicaSessionHead.js.map +1 -0
  239. package/dist/generated/durable_object/v1/ReplicaSnapshotRef.d.ts +14 -0
  240. package/dist/generated/durable_object/v1/ReplicaSnapshotRef.d.ts.map +1 -0
  241. package/dist/generated/durable_object/v1/ReplicaSnapshotRef.js +3 -0
  242. package/dist/generated/durable_object/v1/ReplicaSnapshotRef.js.map +1 -0
  243. package/dist/generated/durable_object/v1/ReplicaStreamHead.d.ts +11 -0
  244. package/dist/generated/durable_object/v1/ReplicaStreamHead.d.ts.map +1 -0
  245. package/dist/generated/durable_object/v1/ReplicaStreamHead.js +3 -0
  246. package/dist/generated/durable_object/v1/ReplicaStreamHead.js.map +1 -0
  247. package/dist/generated/durable_object/v1/ReplicaStreamIdentity.d.ts +14 -0
  248. package/dist/generated/durable_object/v1/ReplicaStreamIdentity.d.ts.map +1 -0
  249. package/dist/generated/durable_object/v1/ReplicaStreamIdentity.js +3 -0
  250. package/dist/generated/durable_object/v1/ReplicaStreamIdentity.js.map +1 -0
  251. package/dist/generated/durable_object/v1/Reroute.d.ts +5 -0
  252. package/dist/generated/durable_object/v1/Reroute.d.ts.map +1 -0
  253. package/dist/generated/durable_object/v1/Reroute.js +3 -0
  254. package/dist/generated/durable_object/v1/Reroute.js.map +1 -0
  255. package/dist/generated/durable_object/v1/SnapshotData.d.ts +7 -0
  256. package/dist/generated/durable_object/v1/SnapshotData.d.ts.map +1 -0
  257. package/dist/generated/durable_object/v1/SnapshotData.js +3 -0
  258. package/dist/generated/durable_object/v1/SnapshotData.js.map +1 -0
  259. package/dist/generated/durable_object/v1/SnapshotService.d.ts +32 -0
  260. package/dist/generated/durable_object/v1/SnapshotService.d.ts.map +1 -0
  261. package/dist/generated/durable_object/v1/SnapshotService.js +3 -0
  262. package/dist/generated/durable_object/v1/SnapshotService.js.map +1 -0
  263. package/dist/generated/durable_object/v1/SnapshotWriteReply.d.ts +7 -0
  264. package/dist/generated/durable_object/v1/SnapshotWriteReply.d.ts.map +1 -0
  265. package/dist/generated/durable_object/v1/SnapshotWriteReply.js +3 -0
  266. package/dist/generated/durable_object/v1/SnapshotWriteReply.js.map +1 -0
  267. package/dist/generated/durable_object.d.ts +69 -0
  268. package/dist/generated/durable_object.d.ts.map +1 -0
  269. package/dist/generated/durable_object.js +2 -0
  270. package/dist/generated/durable_object.js.map +1 -0
  271. package/dist/generated/durable_object.proto +117 -0
  272. package/dist/generated.browser.d.ts +6 -0
  273. package/dist/generated.browser.d.ts.map +1 -0
  274. package/dist/generated.browser.js +10 -0
  275. package/dist/generated.browser.js.map +1 -0
  276. package/dist/generated.d.ts +3 -0
  277. package/dist/generated.d.ts.map +1 -0
  278. package/dist/generated.js +3 -0
  279. package/dist/generated.js.map +1 -0
  280. package/dist/host/actor-host.d.ts +22 -0
  281. package/dist/host/actor-host.d.ts.map +1 -0
  282. package/dist/host/actor-host.js +392 -0
  283. package/dist/host/actor-host.js.map +1 -0
  284. package/dist/host/actor-runtime.d.ts +34 -0
  285. package/dist/host/actor-runtime.d.ts.map +1 -0
  286. package/dist/host/actor-runtime.js +279 -0
  287. package/dist/host/actor-runtime.js.map +1 -0
  288. package/dist/host/actor-worker.d.ts +2 -0
  289. package/dist/host/actor-worker.d.ts.map +1 -0
  290. package/dist/host/actor-worker.js +154 -0
  291. package/dist/host/actor-worker.js.map +1 -0
  292. package/dist/host/generic-host.d.ts +3 -0
  293. package/dist/host/generic-host.d.ts.map +1 -0
  294. package/dist/host/generic-host.js +87 -0
  295. package/dist/host/generic-host.js.map +1 -0
  296. package/dist/host/protocol.d.ts +347 -0
  297. package/dist/host/protocol.d.ts.map +1 -0
  298. package/dist/host/protocol.js +76 -0
  299. package/dist/host/protocol.js.map +1 -0
  300. package/dist/host/types.d.ts +42 -0
  301. package/dist/host/types.d.ts.map +1 -0
  302. package/dist/host/types.js +2 -0
  303. package/dist/host/types.js.map +1 -0
  304. package/dist/host/worker-supervisor.d.ts +85 -0
  305. package/dist/host/worker-supervisor.d.ts.map +1 -0
  306. package/dist/host/worker-supervisor.js +423 -0
  307. package/dist/host/worker-supervisor.js.map +1 -0
  308. package/dist/host.d.ts +3 -0
  309. package/dist/host.d.ts.map +1 -0
  310. package/dist/host.js +3 -0
  311. package/dist/host.js.map +1 -0
  312. package/dist/index.d.ts +7 -0
  313. package/dist/index.d.ts.map +1 -0
  314. package/dist/index.js +4 -0
  315. package/dist/index.js.map +1 -0
  316. package/dist/json.d.ts +13 -0
  317. package/dist/json.d.ts.map +1 -0
  318. package/dist/json.js +34 -0
  319. package/dist/json.js.map +1 -0
  320. package/dist/localRuntime.d.ts +27 -0
  321. package/dist/localRuntime.d.ts.map +1 -0
  322. package/dist/localRuntime.js +112 -0
  323. package/dist/localRuntime.js.map +1 -0
  324. package/dist/proxy.d.ts +43 -0
  325. package/dist/proxy.d.ts.map +1 -0
  326. package/dist/proxy.js +76 -0
  327. package/dist/proxy.js.map +1 -0
  328. package/dist/runtimeInstaller.d.ts +16 -0
  329. package/dist/runtimeInstaller.d.ts.map +1 -0
  330. package/dist/runtimeInstaller.js +95 -0
  331. package/dist/runtimeInstaller.js.map +1 -0
  332. package/dist/templates/actor/LICENSE.md +9 -0
  333. package/dist/templates/actor/README.md +33 -0
  334. package/dist/templates/actor/gitignore +7 -0
  335. package/dist/templates/actor/package.json +20 -0
  336. package/dist/templates/actor/src/durable-objects.ts +13 -0
  337. package/dist/templates/actor/tsconfig.json +11 -0
  338. package/dist/templates/ai-chat/.env.example +1 -0
  339. package/dist/templates/ai-chat/LICENSE.md +9 -0
  340. package/dist/templates/ai-chat/README.md +41 -0
  341. package/dist/templates/ai-chat/gitignore +8 -0
  342. package/dist/templates/ai-chat/index.html +12 -0
  343. package/dist/templates/ai-chat/package.json +30 -0
  344. package/dist/templates/ai-chat/src/Chat.tsx +37 -0
  345. package/dist/templates/ai-chat/src/backend.ts +41 -0
  346. package/dist/templates/ai-chat/src/durable-objects.ts +15 -0
  347. package/dist/templates/ai-chat/tsconfig.json +13 -0
  348. package/dist/templates/chat/LICENSE.md +9 -0
  349. package/dist/templates/chat/README.md +29 -0
  350. package/dist/templates/chat/gitignore +8 -0
  351. package/dist/templates/chat/index.html +12 -0
  352. package/dist/templates/chat/package.json +27 -0
  353. package/dist/templates/chat/src/Chat.tsx +63 -0
  354. package/dist/templates/chat/src/backend.ts +20 -0
  355. package/dist/templates/chat/src/durable-objects.ts +18 -0
  356. package/dist/templates/chat/tsconfig.json +13 -0
  357. package/dist/templates/documents/LICENSE.md +9 -0
  358. package/dist/templates/documents/README.md +38 -0
  359. package/dist/templates/documents/gitignore +8 -0
  360. package/dist/templates/documents/index.html +12 -0
  361. package/dist/templates/documents/package.json +35 -0
  362. package/dist/templates/documents/src/App.tsx +81 -0
  363. package/dist/templates/documents/src/Editor.tsx +69 -0
  364. package/dist/templates/documents/src/backend.ts +18 -0
  365. package/dist/templates/documents/src/collaboration.ts +46 -0
  366. package/dist/templates/documents/src/durable-objects.ts +48 -0
  367. package/dist/templates/documents/src/style.css +145 -0
  368. package/dist/templates/documents/tsconfig.json +13 -0
  369. package/dist/wire/contract.d.ts +9 -0
  370. package/dist/wire/contract.d.ts.map +1 -0
  371. package/dist/wire/contract.js +2 -0
  372. package/dist/wire/contract.js.map +1 -0
  373. package/dist/wire/public-contract.d.ts +36 -0
  374. package/dist/wire/public-contract.d.ts.map +1 -0
  375. package/dist/wire/public-contract.js +2 -0
  376. package/dist/wire/public-contract.js.map +1 -0
  377. package/package.json +111 -0
@@ -0,0 +1,112 @@
1
+ import { spawn } from "node:child_process";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { z } from "zod";
5
+ import { validateProjectId } from "./actor/identity.js";
6
+ import { actorEnvironment } from "./environment.js";
7
+ import { fetchRuntimeExecutablePath } from "./runtimeInstaller.js";
8
+ const connectionSchema = z.object({
9
+ projectId: z.string().min(1),
10
+ controlPlaneUrl: z.string().url(),
11
+ apiKey: z.string().min(1),
12
+ storageRegion: z.string().min(1),
13
+ pid: z.number().int().positive()
14
+ });
15
+ /** Resolves when the local server is ready; stopping it preserves its data directory. */
16
+ export async function startLocalActors(options) {
17
+ validateProjectId(options.projectId);
18
+ const child = launch(await fetchRuntimeExecutablePath(), options);
19
+ const { closed, stop } = lifecycle(child);
20
+ try {
21
+ const connection = await waitForConnection(child.stdio[3], closed, options.startupTimeoutMs ?? 120_000);
22
+ return { connection, closed, stop };
23
+ }
24
+ catch (error) {
25
+ await stop().catch(() => { });
26
+ throw error;
27
+ }
28
+ }
29
+ function launch(executable, options) {
30
+ const project = path.resolve(options.project ?? ".");
31
+ return spawn(executable, [
32
+ "dev",
33
+ "--project-id",
34
+ options.projectId,
35
+ ...(options.apiKey === undefined ? [] : ["--api-key", options.apiKey]),
36
+ "--project",
37
+ project,
38
+ "--entrypoint",
39
+ path.resolve(project, options.entrypoint),
40
+ "--data-dir",
41
+ path.resolve(project, options.dataDir ?? ".durable-actors"),
42
+ "--port",
43
+ String(options.port ?? 0),
44
+ "--ready-fd",
45
+ "3",
46
+ "--sdk-host",
47
+ fileURLToPath(new URL("./host.js", import.meta.url))
48
+ ], {
49
+ cwd: project,
50
+ env: {
51
+ ...actorEnvironment(process.env),
52
+ PATH: `${path.dirname(process.execPath)}${path.delimiter}${path.dirname(executable)}${path.delimiter}${process.env.PATH ?? ""}`,
53
+ DURABLE_OBJECT_PROCESS_ROLE: "control_plane",
54
+ DURABLE_OBJECT_PARENT_LIFETIME_STDIN: "1"
55
+ },
56
+ stdio: ["pipe", options.quiet ? "ignore" : "inherit", options.quiet ? "ignore" : "inherit", "pipe"]
57
+ });
58
+ }
59
+ function lifecycle(child) {
60
+ let stopping = false;
61
+ const closed = new Promise((resolve, reject) => {
62
+ child.once("error", reject);
63
+ child.once("exit", (code, signal) => {
64
+ if (code === 0 || stopping)
65
+ resolve();
66
+ else
67
+ reject(new Error(`Local actors exited (${signal ?? code})`));
68
+ });
69
+ });
70
+ void closed.catch(() => { });
71
+ let stopped;
72
+ const stop = () => (stopped ??= (async () => {
73
+ stopping = true;
74
+ child.stdin.end();
75
+ const timer = setTimeout(() => child.kill("SIGKILL"), 10_000);
76
+ try {
77
+ await closed;
78
+ }
79
+ finally {
80
+ clearTimeout(timer);
81
+ }
82
+ })());
83
+ return { closed, stop };
84
+ }
85
+ async function waitForConnection(readiness, closed, timeoutMs) {
86
+ let timer;
87
+ try {
88
+ const connection = await Promise.race([
89
+ readConnection(readiness),
90
+ closed.then(() => {
91
+ throw new Error("Local actors exited before readiness");
92
+ }),
93
+ new Promise((_, reject) => {
94
+ timer = setTimeout(() => reject(new Error("Local actors startup timed out")), timeoutMs);
95
+ })
96
+ ]);
97
+ return connection;
98
+ }
99
+ finally {
100
+ clearTimeout(timer);
101
+ readiness.destroy();
102
+ }
103
+ }
104
+ async function readConnection(stream) {
105
+ const chunks = [];
106
+ for await (const chunk of stream)
107
+ chunks.push(Buffer.from(chunk));
108
+ if (chunks.length === 0)
109
+ throw new Error("Local actors exited without readiness information");
110
+ return connectionSchema.parse(JSON.parse(Buffer.concat(chunks).toString("utf8")));
111
+ }
112
+ //# sourceMappingURL=localRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localRuntime.js","sourceRoot":"","sources":["../src/localRuntime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { z } from "zod";
2
+ interface SocketProxyOptions {
3
+ readonly projectId?: string;
4
+ readonly controlPlaneUrl?: string;
5
+ readonly apiKey?: string;
6
+ readonly setupTimeoutMs?: number;
7
+ }
8
+ interface SocketProxyDependencies {
9
+ readonly fetch?: typeof globalThis.fetch;
10
+ }
11
+ interface ProxyActor<Metadata = unknown> {
12
+ readonly types?: Metadata;
13
+ }
14
+ type SocketAuthorization<Actors extends Record<string, ProxyActor>> = {
15
+ [Name in keyof Actors & string]: {
16
+ readonly actorName: Name;
17
+ readonly actorId: string;
18
+ readonly metadata: Actors[Name] extends ProxyActor<infer Metadata> ? Metadata : never;
19
+ readonly homeRegion?: string;
20
+ readonly authorizationLifetimeMs?: number;
21
+ };
22
+ }[keyof Actors & string];
23
+ declare const socketGrantSchema: z.ZodObject<{
24
+ websocketUrl: z.ZodURL;
25
+ transport: z.ZodLiteral<"websocket">;
26
+ homeRegion: z.ZodString;
27
+ connectByMs: z.ZodNumber;
28
+ authorizedUntilMs: z.ZodNumber;
29
+ }, z.core.$strip>;
30
+ type SocketGrant = z.infer<typeof socketGrantSchema>;
31
+ declare class SocketProxy<Actors extends Record<string, ProxyActor>> {
32
+ private readonly actors;
33
+ private readonly projectId;
34
+ private readonly origin;
35
+ private readonly apiKey;
36
+ private readonly setupTimeoutMs;
37
+ private readonly fetchRequest;
38
+ constructor(actors: Actors, options?: SocketProxyOptions, dependencies?: SocketProxyDependencies);
39
+ handle(authorization: SocketAuthorization<Actors>): Promise<SocketGrant>;
40
+ }
41
+ export { SocketProxy };
42
+ export type { ProxyActor, SocketAuthorization, SocketGrant, SocketProxyDependencies, SocketProxyOptions };
43
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB,UAAU,kBAAkB;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACnC;AAED,UAAU,uBAAuB;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;CAC3C;AAED,UAAU,UAAU,CAAC,QAAQ,GAAG,OAAO;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAA;CAC5B;AAED,KAAK,mBAAmB,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI;KACjE,IAAI,IAAI,MAAM,MAAM,GAAG,MAAM,GAAG;QAC7B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;QACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,UAAU,CAAC,MAAM,QAAQ,CAAC,GAAG,QAAQ,GAAG,KAAK,CAAA;QACrF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;QAC5B,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAA;KAC5C;CACJ,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAA;AAExB,QAAA,MAAM,iBAAiB;;;;;;iBAMrB,CAAA;AAEF,KAAK,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAEpD,cAAM,WAAW,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC;IAQnD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAP3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyB;gBAGjC,MAAM,EAAE,MAAM,EAC/B,OAAO,GAAE,kBAAuB,EAChC,YAAY,GAAE,uBAA4B;IAwBxC,MAAM,CAAC,aAAa,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;CA4BjF;AAaD,OAAO,EAAE,WAAW,EAAE,CAAA;AACtB,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,CAAA"}
package/dist/proxy.js ADDED
@@ -0,0 +1,76 @@
1
+ import { z } from "zod";
2
+ import { projectActorPath, validateActorComponent, validateProjectId } from "./actor/identity.js";
3
+ import { socketMetadata } from "./actor/socketValidation.js";
4
+ import { actorEnvironment } from "./environment.js";
5
+ const socketGrantSchema = z.object({
6
+ websocketUrl: z.url().refine(url => ["ws:", "wss:"].includes(new URL(url).protocol)),
7
+ transport: z.literal("websocket"),
8
+ homeRegion: z.string().min(1),
9
+ connectByMs: z.number().int(),
10
+ authorizedUntilMs: z.number().int()
11
+ });
12
+ class SocketProxy {
13
+ actors;
14
+ projectId;
15
+ origin;
16
+ apiKey;
17
+ setupTimeoutMs;
18
+ fetchRequest;
19
+ constructor(actors, options = {}, dependencies = {}) {
20
+ this.actors = actors;
21
+ this.setupTimeoutMs = options.setupTimeoutMs ?? 180000;
22
+ if (!Number.isSafeInteger(this.setupTimeoutMs) || this.setupTimeoutMs < 1000 || this.setupTimeoutMs > 600000)
23
+ throw new Error("Socket setup timeout must be between one second and ten minutes");
24
+ const settings = proxySettings(options);
25
+ const url = new URL(settings.controlPlaneUrl);
26
+ if (!["https:", "http:"].includes(url.protocol) ||
27
+ url.pathname !== "/" ||
28
+ url.search ||
29
+ url.hash ||
30
+ url.username ||
31
+ url.password)
32
+ throw new Error("Control-plane URL must be an HTTP(S) origin");
33
+ this.origin = url.origin;
34
+ this.apiKey = settings.apiKey ?? "";
35
+ if (typeof this.apiKey !== "string" || !this.apiKey || this.apiKey.trim() !== this.apiKey)
36
+ throw new Error("A backend shared secret is required; set DURABLE_ACTORS_SECRET or pass apiKey");
37
+ this.projectId = validateProjectId(settings.projectId);
38
+ this.fetchRequest = dependencies.fetch ?? globalThis.fetch;
39
+ }
40
+ async handle(authorization) {
41
+ const actorName = validateActorComponent("actor name", authorization.actorName);
42
+ const actorId = validateActorComponent("actor ID", authorization.actorId);
43
+ if (!Object.hasOwn(this.actors, actorName))
44
+ throw new Error(`Unknown actor name: ${actorName}`);
45
+ const metadata = socketMetadata(authorization.metadata);
46
+ const authorizationLifetimeMs = authorization.authorizationLifetimeMs ?? 900000;
47
+ if (!Number.isSafeInteger(authorizationLifetimeMs) ||
48
+ authorizationLifetimeMs < 1000 ||
49
+ authorizationLifetimeMs > 86400000)
50
+ throw new Error("Socket authorization lifetime must be between one second and one day");
51
+ const homeRegion = authorization.homeRegion === undefined
52
+ ? undefined
53
+ : validateActorComponent("home region", authorization.homeRegion);
54
+ const response = await this.fetchRequest(`${this.origin}${projectActorPath(this.projectId, actorName, actorId)}/connect`, {
55
+ method: "POST",
56
+ headers: { authorization: `Bearer ${this.apiKey}`, "content-type": "application/json" },
57
+ body: JSON.stringify({ transport: "websocket", metadata, authorizationLifetimeMs, homeRegion }),
58
+ signal: AbortSignal.timeout(this.setupTimeoutMs)
59
+ });
60
+ if (!response.ok)
61
+ throw new Error(`WebSocket authorization could not be issued (HTTP ${response.status})`);
62
+ return socketGrantSchema.parse(await response.json());
63
+ }
64
+ }
65
+ function proxySettings(options) {
66
+ const environment = actorEnvironment(process.env);
67
+ const controlPlaneUrl = options.controlPlaneUrl ?? environment.DURABLE_ACTORS_CONTROL_PLANE_URL;
68
+ const apiKey = options.apiKey ?? environment.DURABLE_ACTORS_SECRET;
69
+ return {
70
+ projectId: options.projectId ?? environment.DURABLE_ACTORS_PROJECT_ID,
71
+ controlPlaneUrl: controlPlaneUrl ?? "http://127.0.0.1:7100",
72
+ apiKey
73
+ };
74
+ }
75
+ export { SocketProxy };
76
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare function fetchRuntimeExecutablePath(): Promise<string>;
2
+ interface RuntimeOptions {
3
+ version: string;
4
+ platform: string;
5
+ arch: string;
6
+ cacheDirectory: string;
7
+ }
8
+ export declare class RuntimeInstaller {
9
+ private readonly options;
10
+ private readonly download;
11
+ constructor(options: RuntimeOptions, download?: (url: string) => Promise<Buffer>);
12
+ install(): Promise<string>;
13
+ private unpack;
14
+ }
15
+ export {};
16
+ //# sourceMappingURL=runtimeInstaller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeInstaller.d.ts","sourceRoot":"","sources":["../src/runtimeInstaller.ts"],"names":[],"mappings":"AAWA,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,MAAM,CAAC,CAUlE;AAED,UAAU,cAAc;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,MAAM,CAAA;CACzB;AAED,qBAAa,gBAAgB;IAErB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBADR,OAAO,EAAE,cAAc,EACvB,QAAQ,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAmB;IAG3E,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;YAuBlB,MAAM;CAsBvB"}
@@ -0,0 +1,95 @@
1
+ import { createHash } from "node:crypto";
2
+ import { chmod, lstat, mkdir, mkdtemp, readFile, rename, rm, writeFile } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import path from "node:path";
5
+ import { x } from "tar";
6
+ import { actorEnvironment } from "./environment.js";
7
+ const executables = ["durable-actors", "durable-actors-modal-go"];
8
+ const maximumBytes = 200 * 1024 * 1024;
9
+ export async function fetchRuntimeExecutablePath() {
10
+ const environment = actorEnvironment(process.env);
11
+ if (environment.DURABLE_ACTORS_BINARY)
12
+ return path.resolve(environment.DURABLE_ACTORS_BINARY);
13
+ const { version } = JSON.parse(await readFile(new URL("../package.json", import.meta.url), "utf8"));
14
+ return new RuntimeInstaller({
15
+ version,
16
+ platform: process.platform,
17
+ arch: process.arch,
18
+ cacheDirectory: environment.DURABLE_ACTORS_CACHE_DIR ?? path.join(homedir(), ".cache/durable-actors")
19
+ }).install();
20
+ }
21
+ export class RuntimeInstaller {
22
+ options;
23
+ download;
24
+ constructor(options, download = downloadRelease) {
25
+ this.options = options;
26
+ this.download = download;
27
+ }
28
+ async install() {
29
+ const { version, platform, arch, cacheDirectory } = this.options;
30
+ if (!["darwin", "linux"].includes(platform) || !["arm64", "x64"].includes(arch)) {
31
+ throw new Error(`No prebuilt runtime for ${platform}/${arch}. On Windows, use WSL 2 with Ubuntu.`);
32
+ }
33
+ const destination = path.join(cacheDirectory, version, `${platform}-${arch}`);
34
+ const binary = path.join(destination, executables[0]);
35
+ if (await completeBundle(destination))
36
+ return binary;
37
+ await mkdir(path.dirname(destination), { recursive: true });
38
+ const staging = await mkdtemp(`${destination}-`);
39
+ try {
40
+ await this.unpack(staging);
41
+ try {
42
+ await rename(staging, destination);
43
+ }
44
+ catch (error) {
45
+ if (!(await completeBundle(destination)))
46
+ throw error;
47
+ }
48
+ return binary;
49
+ }
50
+ finally {
51
+ await rm(staging, { recursive: true, force: true });
52
+ }
53
+ }
54
+ async unpack(directory) {
55
+ const { version, platform, arch } = this.options;
56
+ const url = `https://github.com/TerseAI/durable-actors/releases/download/v${version}/durable-actors-${platform}-${arch}.tar.gz`;
57
+ const [archive, checksum] = await Promise.all([this.download(url), this.download(`${url}.sha256`)]);
58
+ const expected = checksum.toString("utf8").trim().split(/\s/u)[0];
59
+ if (!/^[a-f0-9]{64}$/u.test(expected) || createHash("sha256").update(archive).digest("hex") !== expected) {
60
+ throw new Error("Runtime archive checksum does not match; retry the download.");
61
+ }
62
+ const file = path.join(directory, "archive.tar.gz");
63
+ await writeFile(file, archive);
64
+ await x({
65
+ file,
66
+ cwd: directory,
67
+ strict: true,
68
+ filter: (name, entry) => executables.includes(name) && "type" in entry && entry.type === "File" && entry.size <= maximumBytes
69
+ });
70
+ await rm(file);
71
+ if (!(await completeBundle(directory)))
72
+ throw new Error("Runtime archive is missing its runtime or bundled Modal provider.");
73
+ await Promise.all(executables.map(name => chmod(path.join(directory, name), 0o755)));
74
+ }
75
+ }
76
+ async function completeBundle(directory) {
77
+ return Promise.all(executables.map(name => lstat(path.join(directory, name))
78
+ .then(stat => stat.isFile() && stat.size > 0)
79
+ .catch(() => false))).then(results => results.every(Boolean));
80
+ }
81
+ async function downloadRelease(url) {
82
+ const response = await fetch(url, { signal: AbortSignal.timeout(120_000) });
83
+ if (!response.ok || !response.body)
84
+ throw new Error(`Cannot download runtime (HTTP ${response.status}). Check your connection and that this package version has native release assets: ${url}`);
85
+ const chunks = [];
86
+ let size = 0;
87
+ for await (const chunk of response.body) {
88
+ size += chunk.byteLength;
89
+ if (size > maximumBytes)
90
+ throw new Error("Runtime download exceeds the size limit.");
91
+ chunks.push(chunk);
92
+ }
93
+ return Buffer.concat(chunks);
94
+ }
95
+ //# sourceMappingURL=runtimeInstaller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeInstaller.js","sourceRoot":"","sources":["../src/runtimeInstaller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Terse
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,33 @@
1
+ # Actors
2
+
3
+ Requires Node.js 22.19.0+, pnpm, and Bun 1.4.2+ on your PATH.
4
+
5
+ ```sh
6
+ pnpm install
7
+ pnpm exec durable-actors dev
8
+ ```
9
+
10
+ Define your actors in `src/durable-objects.ts`. The starter contains a counter with persisted state and `read()` and `increment()` methods. Each counter ID has its own saved value.
11
+
12
+ `durable-actors dev` watches your actor source and stores local state in `.durable-actors/`. It defaults to project ID `local`; choose another with `pnpm exec durable-actors dev --project-id my-project`. If the CLI is installed globally, you can run `durable-actors dev` directly.
13
+
14
+ ## Connect your application
15
+
16
+ In your separate application project's directory:
17
+
18
+ 1. Run `pnpm add durable-actors`.
19
+ 2. Copy the project ID, URL, and shared secret printed by the actor server into your application’s `.env` file.
20
+ 3. Run `durable-actors generate`; the CLI loads `.env` automatically.
21
+
22
+ Your application backend can then use the generated client:
23
+
24
+ ```ts
25
+ import { actors } from "./generated/index.js"
26
+
27
+ const counter = actors.Counter.get("example")
28
+ console.log(await counter.increment())
29
+ ```
30
+
31
+ Start your backend with that `.env` file loaded. Update its secret after restarting the actor server. If you change the actor server's URL or port, also set `DURABLE_ACTORS_CONTROL_PLANE_URL` in the backend environment. After changing actor method signatures, rerun the printed generate command in your application.
32
+
33
+ Use `pnpm check` to check types and `pnpm build` to create `dist/actors.mjs` for deployment.
@@ -0,0 +1,7 @@
1
+ node_modules/
2
+ dist/
3
+ generated/
4
+ .durable-actors/
5
+ .env
6
+ .env.*
7
+ !.env.example
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "my-actors",
3
+ "private": true,
4
+ "type": "module",
5
+ "engines": {
6
+ "node": ">=22.19.0"
7
+ },
8
+ "scripts": {
9
+ "dev": "durable-actors dev",
10
+ "build": "durable-actors build",
11
+ "check": "tsc --noEmit"
12
+ },
13
+ "dependencies": {
14
+ "durable-actors": "0.2.4"
15
+ },
16
+ "devDependencies": {
17
+ "@types/node": "^22.0.0",
18
+ "typescript": "~5.9.3"
19
+ }
20
+ }
@@ -0,0 +1,13 @@
1
+ import { Actor, Persisted } from "durable-actors"
2
+
3
+ export class Counter extends Actor {
4
+ @Persisted private value = 0
5
+
6
+ async read() {
7
+ return this.value
8
+ }
9
+
10
+ async increment() {
11
+ return ++this.value
12
+ }
13
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "NodeNext",
5
+ "strict": true,
6
+ "skipLibCheck": true,
7
+ "noEmit": true,
8
+ "types": ["node"]
9
+ },
10
+ "include": ["src"]
11
+ }
@@ -0,0 +1 @@
1
+ OPENAI_API_KEY=
@@ -0,0 +1,9 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Terse
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,41 @@
1
+ # AI chat with durable history
2
+
3
+ Requires Node.js 20+ and Bun 1.4.2+ on your PATH; Bun executes the actors.
4
+
5
+ Vercel AI SDK streams replies; a durable actor stores the conversation.
6
+
7
+ ## Run it
8
+
9
+ ```sh
10
+ npx durable-actors init ai-chat-example --template ai-chat
11
+ cd ai-chat-example
12
+ npm install
13
+ ```
14
+
15
+ Copy `.env.example` to `.env` and add your `OPENAI_API_KEY`, then start the actors:
16
+
17
+ ```sh
18
+ npx durable-actors dev
19
+ ```
20
+
21
+ Wait for `Local actors ready`. In another terminal, run the printed export command, then:
22
+
23
+ ```sh
24
+ npm run dev
25
+ ```
26
+
27
+ Open [the chat](http://127.0.0.1:3000), send a message, and reload after the reply finishes. Your history is restored from the actor, including after restarting the servers.
28
+
29
+ If you already have this directory, start at `npm install`. No client generation is needed for this example.
30
+
31
+ ## The code
32
+
33
+ - [src/durable-objects.ts](src/durable-objects.ts) stores AI SDK messages in a private `@Persisted` field. Each chat ID gets its own actor.
34
+ - [src/backend.ts](src/backend.ts) loads saved history, appends the new user message, streams a reply, and saves the completed assistant message.
35
+ - [src/Chat.tsx](src/Chat.tsx) loads the lobby history and uses `useChat` to send messages and render streaming replies.
36
+
37
+ For a remote actor server, use the [connection overrides](../../docs/reference/configuration.md) on the backend.
38
+
39
+ This sample has one shared lobby and no authentication. Authenticate both routes and check chat ownership before using it for private conversations. Reloads restore saved messages; in-progress streams are not resumed.
40
+
41
+ See Vercel’s [message persistence guide](https://ai-sdk.dev/docs/ai-sdk-ui/chatbot-message-persistence) for the AI SDK flow.
@@ -0,0 +1,8 @@
1
+ node_modules/
2
+ dist/
3
+ generated/
4
+ .durable-actors/
5
+ .little-actors/
6
+ .env
7
+ .env.*
8
+ !.env.example
@@ -0,0 +1,12 @@
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.0" />
6
+ <title>AI chat with durable history</title>
7
+ </head>
8
+ <body>
9
+ <div id="root"></div>
10
+ <script type="module" src="/src/Chat.tsx"></script>
11
+ </body>
12
+ </html>
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "durable-actors-example-ai-chat",
3
+ "private": true,
4
+ "type": "module",
5
+ "engines": {
6
+ "node": ">=22.19.0"
7
+ },
8
+ "scripts": {
9
+ "dev": "tsx --env-file=.env src/backend.ts",
10
+ "build": "tsc --noEmit && vite build"
11
+ },
12
+ "dependencies": {
13
+ "@ai-sdk/openai": "^4.0.65",
14
+ "@ai-sdk/react": "^4.0.100",
15
+ "ai": "^7.0.97",
16
+ "express": "^5.2.1",
17
+ "durable-actors": "0.2.4",
18
+ "react": "^19.3.0",
19
+ "react-dom": "^19.3.0"
20
+ },
21
+ "devDependencies": {
22
+ "@types/express": "^5.0.0",
23
+ "@types/node": "^22.0.0",
24
+ "@types/react": "^19.0.0",
25
+ "@types/react-dom": "^19.0.0",
26
+ "tsx": "^4.0.0",
27
+ "typescript": "~5.9.3",
28
+ "vite": "^8.3.0"
29
+ }
30
+ }
@@ -0,0 +1,37 @@
1
+ import { createRoot } from "react-dom/client"
2
+
3
+ import { useChat } from "@ai-sdk/react"
4
+ import type { UIMessage } from "ai"
5
+
6
+ const initialMessages: UIMessage[] = await fetch("/api/chat/lobby").then(response => response.json())
7
+
8
+ function Chat() {
9
+ const { messages, sendMessage, status, error } = useChat({ id: "lobby", messages: initialMessages })
10
+ const busy = status === "submitted" || status === "streaming"
11
+
12
+ return (
13
+ <main>
14
+ <h1>AI chat</h1>
15
+ <ul role="log" aria-label="Messages">
16
+ {messages.map(message => (
17
+ <li key={message.id}>
18
+ <strong>{message.role}:</strong> {message.parts.map(part => (part.type === "text" ? part.text : "")).join("")}
19
+ </li>
20
+ ))}
21
+ </ul>
22
+ <form
23
+ action={async form => {
24
+ await sendMessage({ text: String(form.get("message")) })
25
+ }}
26
+ >
27
+ <label>
28
+ Message <input name="message" required disabled={busy} />
29
+ </label>
30
+ <button disabled={busy}>{busy ? "Thinking…" : "Send"}</button>
31
+ </form>
32
+ {error && <p role="alert">{error.message}</p>}
33
+ </main>
34
+ )
35
+ }
36
+
37
+ createRoot(document.getElementById("root")!).render(<Chat />)