@zergai/ztc 0.4.0-beta.1 → 0.5.0-beta.1

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 (718) hide show
  1. package/README.md +398 -45
  2. package/RUST_THIRD_PARTY_LICENSES.txt +1080 -822
  3. package/THIRD_PARTY_NOTICES.md +273 -12
  4. package/bin/zmux-darwin-arm64 +0 -0
  5. package/bin/ztc-audio-darwin-arm64 +0 -0
  6. package/bin/ztc-capture-darwin-arm64 +0 -0
  7. package/bin/ztc-computer-darwin-arm64 +0 -0
  8. package/bin/ztc-llm-darwin-arm64 +0 -0
  9. package/bin/ztc-tts-darwin-arm64 +0 -0
  10. package/bin/ztc-tui-darwin-arm64 +0 -0
  11. package/bin/ztc-zlicky-overlay-darwin-arm64 +0 -0
  12. package/bin/zterm-darwin-arm64 +0 -0
  13. package/dist/App.js +1206 -209
  14. package/dist/agent/agent.d.ts +74 -8
  15. package/dist/agent/agent.js +1073 -184
  16. package/dist/agent/backends/account_rotation.d.ts +4 -0
  17. package/dist/agent/backends/account_rotation.js +8 -2
  18. package/dist/agent/backends/anthropic.d.ts +13 -0
  19. package/dist/agent/backends/anthropic.js +169 -28
  20. package/dist/agent/backends/claude_cli.js +18 -8
  21. package/dist/agent/backends/codex_app_server.d.ts +1 -0
  22. package/dist/agent/backends/codex_app_server.js +55 -3
  23. package/dist/agent/backends/codex_auth.d.ts +1 -0
  24. package/dist/agent/backends/codex_auth.js +67 -13
  25. package/dist/agent/backends/codex_buffered_recovery.d.ts +27 -0
  26. package/dist/agent/backends/codex_buffered_recovery.js +293 -0
  27. package/dist/agent/backends/gemini.js +3 -1
  28. package/dist/agent/backends/http_error.d.ts +26 -0
  29. package/dist/agent/backends/http_error.js +221 -0
  30. package/dist/agent/backends/index.d.ts +9 -2
  31. package/dist/agent/backends/index.js +22 -2
  32. package/dist/agent/backends/openai.d.ts +0 -6
  33. package/dist/agent/backends/openai.js +5 -2
  34. package/dist/agent/backends/openai_compatible.d.ts +5 -4
  35. package/dist/agent/backends/openai_compatible.js +26 -19
  36. package/dist/agent/backends/openai_responses.d.ts +8 -3
  37. package/dist/agent/backends/openai_responses.js +77 -33
  38. package/dist/agent/backends/provider_ids.d.ts +1 -0
  39. package/dist/agent/backends/provider_ids.js +4 -0
  40. package/dist/agent/backends/request_metrics.js +12 -2
  41. package/dist/agent/backends/types.d.ts +109 -6
  42. package/dist/agent/backends/types.js +5 -1
  43. package/dist/agent/backends/zrouter_stream.d.ts +6 -1
  44. package/dist/agent/backends/zrouter_stream.js +160 -42
  45. package/dist/agent/background_registry.d.ts +2 -0
  46. package/dist/agent/background_registry.js +1 -0
  47. package/dist/agent/claim_observation.d.ts +6 -0
  48. package/dist/agent/claim_observation.js +54 -0
  49. package/dist/agent/commands/accounts.js +46 -177
  50. package/dist/agent/commands/attention.d.ts +2 -0
  51. package/dist/agent/commands/attention.js +67 -0
  52. package/dist/agent/commands/auth.js +18 -2
  53. package/dist/agent/commands/board.d.ts +2 -0
  54. package/dist/agent/commands/board.js +169 -0
  55. package/dist/agent/commands/clipboard.js +50 -1
  56. package/dist/agent/commands/compact.js +21 -13
  57. package/dist/agent/commands/config.js +4 -1
  58. package/dist/agent/commands/context.js +6 -1
  59. package/dist/agent/commands/desktop.d.ts +2 -0
  60. package/dist/agent/commands/desktop.js +29 -0
  61. package/dist/agent/commands/effort.js +14 -6
  62. package/dist/agent/commands/environment.d.ts +3 -0
  63. package/dist/agent/commands/environment.js +109 -0
  64. package/dist/agent/commands/evidence.d.ts +2 -0
  65. package/dist/agent/commands/evidence.js +9 -0
  66. package/dist/agent/commands/fork.js +4 -3
  67. package/dist/agent/commands/goal.d.ts +33 -1
  68. package/dist/agent/commands/goal.js +174 -14
  69. package/dist/agent/commands/goal_exit.d.ts +36 -0
  70. package/dist/agent/commands/goal_exit.js +120 -0
  71. package/dist/agent/commands/help.js +3 -1
  72. package/dist/agent/commands/history.js +3 -1
  73. package/dist/agent/commands/inbox.d.ts +2 -0
  74. package/dist/agent/commands/inbox.js +148 -0
  75. package/dist/agent/commands/index.js +16 -1
  76. package/dist/agent/commands/input_mode.js +8 -6
  77. package/dist/agent/commands/job.d.ts +2 -0
  78. package/dist/agent/commands/job.js +93 -0
  79. package/dist/agent/commands/keybindings.js +4 -1
  80. package/dist/agent/commands/label.d.ts +2 -0
  81. package/dist/agent/commands/label.js +77 -0
  82. package/dist/agent/commands/layout.d.ts +2 -0
  83. package/dist/agent/commands/layout.js +20 -0
  84. package/dist/agent/commands/mirror.js +16 -1
  85. package/dist/agent/commands/model.js +12 -2
  86. package/dist/agent/commands/permissions.d.ts +3 -1
  87. package/dist/agent/commands/permissions.js +79 -89
  88. package/dist/agent/commands/plan.js +5 -15
  89. package/dist/agent/commands/profile.js +21 -2
  90. package/dist/agent/commands/provider_selection.js +20 -1
  91. package/dist/agent/commands/rename.js +1 -1
  92. package/dist/agent/commands/resources.d.ts +2 -0
  93. package/dist/agent/commands/resources.js +67 -0
  94. package/dist/agent/commands/rewind.d.ts +3 -0
  95. package/dist/agent/commands/rewind.js +16 -0
  96. package/dist/agent/commands/runbooks.d.ts +2 -0
  97. package/dist/agent/commands/runbooks.js +73 -0
  98. package/dist/agent/commands/runbooks_lazy.d.ts +2 -0
  99. package/dist/agent/commands/runbooks_lazy.js +8 -0
  100. package/dist/agent/commands/sessions.d.ts +1 -1
  101. package/dist/agent/commands/sessions.js +33 -5
  102. package/dist/agent/commands/settings.js +185 -39
  103. package/dist/agent/commands/setup.d.ts +2 -0
  104. package/dist/agent/commands/setup.js +78 -0
  105. package/dist/agent/commands/share.d.ts +2 -0
  106. package/dist/agent/commands/share.js +64 -0
  107. package/dist/agent/commands/status.js +14 -2
  108. package/dist/agent/commands/types.d.ts +99 -6
  109. package/dist/agent/commands/update.js +8 -0
  110. package/dist/agent/commands/usage.d.ts +2 -0
  111. package/dist/agent/commands/usage.js +8 -0
  112. package/dist/agent/factory.d.ts +11 -0
  113. package/dist/agent/factory.js +113 -88
  114. package/dist/agent/loop_policy.d.ts +6 -3
  115. package/dist/agent/loop_policy.js +12 -3
  116. package/dist/agent/measurement_guidance.d.ts +2 -0
  117. package/dist/agent/measurement_guidance.js +5 -0
  118. package/dist/agent/request_encoder.d.ts +8 -1
  119. package/dist/agent/request_encoder.js +95 -23
  120. package/dist/agent/runtime/benchmark_comparison.d.ts +30 -0
  121. package/dist/agent/runtime/benchmark_comparison.js +94 -0
  122. package/dist/agent/runtime/benchmark_contract.d.ts +48 -0
  123. package/dist/agent/runtime/benchmark_contract.js +90 -0
  124. package/dist/agent/runtime/checked_commands.d.ts +32 -0
  125. package/dist/agent/runtime/checked_commands.js +119 -0
  126. package/dist/agent/runtime/command_execution_policy.d.ts +26 -0
  127. package/dist/agent/runtime/command_execution_policy.js +91 -0
  128. package/dist/agent/runtime/command_jobs.d.ts +36 -18
  129. package/dist/agent/runtime/command_jobs.js +151 -13
  130. package/dist/agent/runtime/command_panes.d.ts +59 -0
  131. package/dist/agent/runtime/command_panes.js +398 -0
  132. package/dist/agent/runtime/command_wait.d.ts +19 -0
  133. package/dist/agent/runtime/command_wait.js +167 -0
  134. package/dist/agent/runtime/cpu_benchmark.d.ts +30 -0
  135. package/dist/agent/runtime/cpu_benchmark.js +126 -0
  136. package/dist/agent/runtime/delegated_evidence.d.ts +26 -0
  137. package/dist/agent/runtime/delegated_evidence.js +80 -0
  138. package/dist/agent/runtime/evidence.d.ts +127 -0
  139. package/dist/agent/runtime/evidence.js +468 -0
  140. package/dist/agent/runtime/execution_context.d.ts +7 -0
  141. package/dist/agent/runtime/execution_context.js +39 -3
  142. package/dist/agent/runtime/json_verifier_recipe.d.ts +8 -0
  143. package/dist/agent/runtime/json_verifier_recipe.js +66 -0
  144. package/dist/agent/runtime/measurements.d.ts +110 -0
  145. package/dist/agent/runtime/measurements.js +317 -0
  146. package/dist/agent/runtime/policy.d.ts +4 -0
  147. package/dist/agent/runtime/policy.js +31 -20
  148. package/dist/agent/runtime/provider_native_evidence.d.ts +20 -0
  149. package/dist/agent/runtime/provider_native_evidence.js +86 -0
  150. package/dist/agent/runtime/recovery.d.ts +2 -0
  151. package/dist/agent/runtime/recovery.js +45 -2
  152. package/dist/agent/runtime/remote_broker_transport.d.ts +10 -0
  153. package/dist/agent/runtime/remote_broker_transport.js +84 -0
  154. package/dist/agent/runtime/remote_deletion_receipts.d.ts +3 -0
  155. package/dist/agent/runtime/remote_deletion_receipts.js +43 -0
  156. package/dist/agent/runtime/remote_journal_replay.d.ts +13 -0
  157. package/dist/agent/runtime/remote_journal_replay.js +233 -0
  158. package/dist/agent/runtime/remote_mutation_journal.d.ts +25 -0
  159. package/dist/agent/runtime/remote_mutation_journal.js +208 -0
  160. package/dist/agent/runtime/remote_resource_endpoint.d.ts +7 -0
  161. package/dist/agent/runtime/remote_resource_endpoint.js +6 -0
  162. package/dist/agent/runtime/remote_resource_errors.d.ts +5 -0
  163. package/dist/agent/runtime/remote_resource_errors.js +9 -0
  164. package/dist/agent/runtime/remote_resource_script.d.ts +2 -0
  165. package/dist/agent/runtime/remote_resource_script.js +1009 -0
  166. package/dist/agent/runtime/remote_resources.d.ts +29 -0
  167. package/dist/agent/runtime/remote_resources.js +160 -0
  168. package/dist/agent/runtime/source_verification.d.ts +12 -0
  169. package/dist/agent/runtime/source_verification.js +210 -0
  170. package/dist/agent/runtime/source_verification_contract.d.ts +75 -0
  171. package/dist/agent/runtime/source_verification_contract.js +203 -0
  172. package/dist/agent/runtime/tool_checkpoints.d.ts +11 -0
  173. package/dist/agent/runtime/tool_checkpoints.js +26 -0
  174. package/dist/agent/runtime/tool_effects.d.ts +5 -0
  175. package/dist/agent/runtime/tool_progress.d.ts +12 -0
  176. package/dist/agent/runtime/tool_progress.js +76 -0
  177. package/dist/agent/runtime/tool_runtime.d.ts +16 -1
  178. package/dist/agent/runtime/tool_runtime.js +204 -10
  179. package/dist/agent/runtime/tracing.d.ts +1 -1
  180. package/dist/agent/runtime/verifier_capture.d.ts +9 -0
  181. package/dist/agent/runtime/verifier_capture.js +100 -0
  182. package/dist/agent/runtime/verifier_contract.d.ts +24 -0
  183. package/dist/agent/runtime/verifier_contract.js +41 -0
  184. package/dist/agent/subagent.d.ts +20 -10
  185. package/dist/agent/subagent.js +266 -29
  186. package/dist/agent/tool_response_directory.d.ts +24 -0
  187. package/dist/agent/tool_response_directory.js +61 -0
  188. package/dist/agent/tool_response_source.d.ts +8 -0
  189. package/dist/agent/tool_response_source.js +49 -0
  190. package/dist/agent/tool_response_store.d.ts +75 -4
  191. package/dist/agent/tool_response_store.js +583 -64
  192. package/dist/agent/tools/ask_user.d.ts +3 -1
  193. package/dist/agent/tools/ask_user.js +30 -11
  194. package/dist/agent/tools/background.js +1 -0
  195. package/dist/agent/tools/benchmark_cpu.d.ts +2 -0
  196. package/dist/agent/tools/benchmark_cpu.js +102 -0
  197. package/dist/agent/tools/compare_benchmarks.d.ts +2 -0
  198. package/dist/agent/tools/compare_benchmarks.js +53 -0
  199. package/dist/agent/tools/deferred.js +1 -0
  200. package/dist/agent/tools/delegate.js +18 -2
  201. package/dist/agent/tools/helper_requirements.d.ts +7 -0
  202. package/dist/agent/tools/helper_requirements.js +19 -0
  203. package/dist/agent/tools/index.d.ts +1 -0
  204. package/dist/agent/tools/index.js +3 -0
  205. package/dist/agent/tools/measurement_report.d.ts +22 -0
  206. package/dist/agent/tools/measurement_report.js +190 -0
  207. package/dist/agent/tools/pane.d.ts +0 -7
  208. package/dist/agent/tools/pane.js +5 -4
  209. package/dist/agent/tools/project_context.d.ts +3 -0
  210. package/dist/agent/tools/project_context.js +45 -0
  211. package/dist/agent/tools/recall_tool_response.d.ts +3 -5
  212. package/dist/agent/tools/recall_tool_response.js +19 -29
  213. package/dist/agent/tools/registry.d.ts +1 -0
  214. package/dist/agent/tools/registry.js +23 -0
  215. package/dist/agent/tools/related_sessions.d.ts +2 -0
  216. package/dist/agent/tools/related_sessions.js +156 -0
  217. package/dist/agent/tools/routine.js +13 -3
  218. package/dist/agent/tools/session_evidence.d.ts +3 -0
  219. package/dist/agent/tools/session_evidence.js +72 -0
  220. package/dist/agent/tools/shell.d.ts +4 -3
  221. package/dist/agent/tools/shell.js +174 -47
  222. package/dist/agent/tools/tool_search.js +3 -2
  223. package/dist/agent/tools/types.d.ts +28 -0
  224. package/dist/agent/tools/verify_artifact.d.ts +2 -0
  225. package/dist/agent/tools/verify_artifact.js +60 -0
  226. package/dist/agent/tools/workflow.js +1 -0
  227. package/dist/app/activity.d.ts +6 -1
  228. package/dist/app/activity.js +81 -12
  229. package/dist/app/agent_runner.d.ts +6 -1
  230. package/dist/app/agent_runner.js +34 -19
  231. package/dist/app/command_context.js +106 -10
  232. package/dist/app/controller.d.ts +15 -4
  233. package/dist/app/controller.js +29 -3
  234. package/dist/app/escape_stop.d.ts +11 -0
  235. package/dist/app/escape_stop.js +15 -0
  236. package/dist/app/liveness.d.ts +6 -4
  237. package/dist/app/liveness.js +13 -3
  238. package/dist/app/model_catalog_cache.d.ts +5 -0
  239. package/dist/app/model_catalog_cache.js +138 -0
  240. package/dist/app/ordered_transcript.js +43 -4
  241. package/dist/app/prompt_turn.d.ts +14 -0
  242. package/dist/app/prompt_turn.js +53 -0
  243. package/dist/app/recap.d.ts +3 -0
  244. package/dist/app/recap.js +9 -3
  245. package/dist/app/restart.d.ts +3 -2
  246. package/dist/app/restart.js +22 -7
  247. package/dist/app/rewind.d.ts +3 -3
  248. package/dist/app/rewind.js +3 -3
  249. package/dist/app/selection_completion.d.ts +17 -2
  250. package/dist/app/selection_completion.js +84 -9
  251. package/dist/app/session_manager.d.ts +38 -6
  252. package/dist/app/session_manager.js +263 -60
  253. package/dist/app/session_messages.d.ts +3 -0
  254. package/dist/app/session_messages.js +60 -0
  255. package/dist/app/task_scope_router.d.ts +20 -0
  256. package/dist/app/task_scope_router.js +173 -0
  257. package/dist/app/transcript_window.d.ts +2 -0
  258. package/dist/app/transcript_window.js +4 -0
  259. package/dist/app/workspace_admission_details.d.ts +3 -0
  260. package/dist/app/workspace_admission_details.js +26 -0
  261. package/dist/app/workspace_layout_controller.d.ts +11 -0
  262. package/dist/app/workspace_layout_controller.js +88 -0
  263. package/dist/app/workspace_monitor.d.ts +1 -0
  264. package/dist/app/workspace_monitor.js +216 -0
  265. package/dist/app/workspace_presets.d.ts +29 -0
  266. package/dist/app/workspace_presets.js +192 -0
  267. package/dist/attention/queue.d.ts +37 -0
  268. package/dist/attention/queue.js +183 -0
  269. package/dist/bench/rf_shared.d.ts +2 -0
  270. package/dist/board/binding.d.ts +42 -0
  271. package/dist/board/binding.js +38 -0
  272. package/dist/board/client.d.ts +42 -0
  273. package/dist/board/client.js +60 -0
  274. package/dist/cli.js +1 -1
  275. package/dist/cli_args.js +19 -17
  276. package/dist/cli_main.js +110 -13
  277. package/dist/cli_ratatui.d.ts +183 -16
  278. package/dist/cli_ratatui.js +3989 -1255
  279. package/dist/components/ActivityLine.d.ts +3 -2
  280. package/dist/components/ActivityLine.js +2 -2
  281. package/dist/components/InputArea.d.ts +19 -1
  282. package/dist/components/InputArea.js +264 -190
  283. package/dist/components/MessageList.d.ts +2 -0
  284. package/dist/components/MessageList.js +3 -1
  285. package/dist/components/SingleMessage.d.ts +2 -0
  286. package/dist/components/SingleMessage.js +4 -2
  287. package/dist/components/StatusBar.d.ts +4 -2
  288. package/dist/components/StatusBar.js +3 -1
  289. package/dist/conductor_branch.js +3 -0
  290. package/dist/config/api_retry.d.ts +6 -1
  291. package/dist/config/api_retry.js +19 -1
  292. package/dist/config/defaults.d.ts +2 -1
  293. package/dist/config/defaults.js +9 -2
  294. package/dist/config/message_display.d.ts +1 -0
  295. package/dist/config/message_display.js +17 -2
  296. package/dist/config/permissions.d.ts +21 -0
  297. package/dist/config/permissions.js +89 -0
  298. package/dist/config/resolved.d.ts +2 -2
  299. package/dist/config/types.d.ts +32 -5
  300. package/dist/config.d.ts +38 -4
  301. package/dist/config.js +290 -42
  302. package/dist/context/project_intelligence.d.ts +44 -0
  303. package/dist/context/project_intelligence.js +246 -0
  304. package/dist/desktop/cli_launch.d.ts +8 -0
  305. package/dist/desktop/cli_launch.js +6 -0
  306. package/dist/desktop/cli_shim.d.ts +8 -0
  307. package/dist/desktop/cli_shim.js +120 -0
  308. package/dist/desktop/runtime.d.ts +16 -0
  309. package/dist/desktop/runtime.js +161 -0
  310. package/dist/desktop/worker_launch.d.ts +7 -0
  311. package/dist/desktop/worker_launch.js +7 -0
  312. package/dist/diagnostics/cargo_mutants_selection.d.ts +27 -0
  313. package/dist/diagnostics/cargo_mutants_selection.js +48 -0
  314. package/dist/diagnostics/native_terminal_benchmark.d.ts +58 -0
  315. package/dist/diagnostics/native_terminal_benchmark.js +1247 -0
  316. package/dist/diagnostics/session_evidence_package.d.ts +40 -0
  317. package/dist/diagnostics/session_evidence_package.js +234 -0
  318. package/dist/diagnostics/session_export.d.ts +93 -0
  319. package/dist/diagnostics/session_export.js +634 -0
  320. package/dist/emulation/tool_adapters.js +48 -18
  321. package/dist/emulation/ztc_addendum.d.ts +1 -0
  322. package/dist/emulation/ztc_addendum.js +13 -12
  323. package/dist/environment/service_runner.d.ts +1 -0
  324. package/dist/environment/service_runner.js +68 -0
  325. package/dist/environment/store.d.ts +120 -0
  326. package/dist/environment/store.js +387 -0
  327. package/dist/events.d.ts +40 -1
  328. package/dist/events.js +10 -17
  329. package/dist/goal_contract.d.ts +25 -0
  330. package/dist/goal_contract.js +44 -0
  331. package/dist/headless.d.ts +31 -0
  332. package/dist/headless.js +578 -70
  333. package/dist/headless_cli.js +8 -0
  334. package/dist/headless_cli_args.d.ts +1 -0
  335. package/dist/headless_cli_args.js +1 -0
  336. package/dist/intake/cli.d.ts +1 -0
  337. package/dist/intake/cli.js +33 -0
  338. package/dist/intake/format.d.ts +2 -0
  339. package/dist/intake/format.js +14 -0
  340. package/dist/intake/notifications.d.ts +16 -0
  341. package/dist/intake/notifications.js +132 -0
  342. package/dist/intake/store.d.ts +56 -0
  343. package/dist/intake/store.js +238 -0
  344. package/dist/library.d.ts +8 -0
  345. package/dist/library.js +19 -10
  346. package/dist/mcp/client.d.ts +1 -0
  347. package/dist/mcp/client.js +20 -0
  348. package/dist/modes/builtin/plan.yaml +2 -2
  349. package/dist/modes/handlers.js +1 -1
  350. package/dist/onboarding/first_run.d.ts +3 -0
  351. package/dist/onboarding/first_run.js +33 -25
  352. package/dist/onboarding/setup.d.ts +32 -0
  353. package/dist/onboarding/setup.js +133 -0
  354. package/dist/onboarding/setup_agent_health.d.ts +17 -0
  355. package/dist/onboarding/setup_agent_health.js +79 -0
  356. package/dist/onboarding/setup_environment.d.ts +66 -0
  357. package/dist/onboarding/setup_environment.js +219 -0
  358. package/dist/onboarding/setup_workspace.d.ts +17 -0
  359. package/dist/onboarding/setup_workspace.js +129 -0
  360. package/dist/optimize/adapters/index.d.ts +4 -1
  361. package/dist/optimize/adapters/index.js +7 -0
  362. package/dist/optimize/adapters/kernelbench.js +14 -5
  363. package/dist/optimize/adapters/popcorn.js +3 -2
  364. package/dist/optimize/adapters/profile_benchmark.js +13 -7
  365. package/dist/optimize/adapters/rfbench.js +25 -14
  366. package/dist/optimize/adapters/types.d.ts +3 -0
  367. package/dist/optimize/adapters/zergpod.js +5 -2
  368. package/dist/optimize/baseline.js +10 -21
  369. package/dist/optimize/branch.js +9 -12
  370. package/dist/optimize/combine.js +2 -3
  371. package/dist/optimize/executor.js +34 -48
  372. package/dist/optimize/measurements.d.ts +55 -0
  373. package/dist/optimize/measurements.js +173 -0
  374. package/dist/optimize/results.d.ts +1 -0
  375. package/dist/optimize/results.js +11 -33
  376. package/dist/optimize/tge.js +2 -1
  377. package/dist/panes/initial_input.d.ts +19 -0
  378. package/dist/panes/initial_input.js +206 -0
  379. package/dist/panes/labels.d.ts +16 -0
  380. package/dist/panes/labels.js +42 -0
  381. package/dist/panes/model_catalog.d.ts +3 -3
  382. package/dist/panes/model_catalog.js +28 -4
  383. package/dist/panes/pane_registry.js +6 -2
  384. package/dist/panes/types.d.ts +3 -0
  385. package/dist/panes/ztc_launch.js +19 -0
  386. package/dist/plugin/optimization.d.ts +2 -0
  387. package/dist/plugin/optimization.js +1 -0
  388. package/dist/plugin/runtime.d.ts +2 -0
  389. package/dist/plugin/simulation.d.ts +6 -1
  390. package/dist/plugin/simulation_contract.d.ts +836 -1
  391. package/dist/plugin/simulation_documents.d.ts +22 -0
  392. package/dist/plugin/simulation_documents.js +1 -0
  393. package/dist/plugin/simulation_interventions.d.ts +103 -0
  394. package/dist/plugin/simulation_interventions.js +1 -0
  395. package/dist/plugin/simulation_living.d.ts +1 -0
  396. package/dist/plugin/simulation_living.js +3 -0
  397. package/dist/plugin/simulation_meetings.d.ts +121 -0
  398. package/dist/plugin/simulation_meetings.js +1 -0
  399. package/dist/plugin/simulation_story_review.d.ts +111 -0
  400. package/dist/plugin/simulation_story_review.js +1 -0
  401. package/dist/plugin/simulation_storyteller.d.ts +91 -0
  402. package/dist/plugin/simulation_storyteller.js +1 -0
  403. package/dist/plugin/simulation_structured.d.ts +2 -0
  404. package/dist/plugin/simulation_structured.js +2 -0
  405. package/dist/plugin/simulation_toolkit.d.ts +21 -0
  406. package/dist/plugin/simulation_toolkit.js +24 -0
  407. package/dist/prompts/tool_delegate_task.j2 +1 -1
  408. package/dist/remote-broker/Dockerfile +10 -0
  409. package/dist/remote-broker/archive.py +1227 -0
  410. package/dist/remote-broker/cutover.py +761 -0
  411. package/dist/remote-broker/requirements.txt +5 -0
  412. package/dist/remote-broker/resources.json +6 -0
  413. package/dist/remote-broker/resources.write-staging.example.json +18 -0
  414. package/dist/remote-broker/retained.py +686 -0
  415. package/dist/remote-broker/retained_cleanup.py +550 -0
  416. package/dist/remote-broker/server.py +648 -0
  417. package/dist/remote-broker/worker.py +1007 -0
  418. package/dist/router_auth.d.ts +31 -0
  419. package/dist/router_auth.js +155 -9
  420. package/dist/runbooks/catalog.d.ts +3 -0
  421. package/dist/runbooks/catalog.js +26 -0
  422. package/dist/runbooks/library.d.ts +11 -0
  423. package/dist/runbooks/library.js +95 -0
  424. package/dist/runbooks/package.d.ts +43 -0
  425. package/dist/runbooks/package.js +102 -0
  426. package/dist/session.d.ts +65 -13
  427. package/dist/session.js +548 -43
  428. package/dist/session_handoff.d.ts +25 -0
  429. package/dist/session_handoff.js +322 -0
  430. package/dist/session_handoff_contract.d.ts +89 -0
  431. package/dist/session_handoff_contract.js +179 -0
  432. package/dist/session_media.d.ts +41 -0
  433. package/dist/session_media.js +357 -0
  434. package/dist/session_ownership.d.ts +16 -0
  435. package/dist/session_ownership.js +221 -0
  436. package/dist/session_public.d.ts +10 -2
  437. package/dist/session_public.js +6 -1
  438. package/dist/simulation/dynamic_history.d.ts +42 -0
  439. package/dist/simulation/dynamic_history.js +173 -0
  440. package/dist/simulation/engines/swarm/pane_manager.js +7 -6
  441. package/dist/simulation/inference.d.ts +3 -1
  442. package/dist/simulation/inference.js +19 -1
  443. package/dist/simulation/intervention_generation.d.ts +27 -0
  444. package/dist/simulation/intervention_generation.js +246 -0
  445. package/dist/simulation/intervention_material.d.ts +4 -0
  446. package/dist/simulation/intervention_material.js +81 -0
  447. package/dist/simulation/living/context.d.ts +3130 -0
  448. package/dist/simulation/living/context.js +944 -0
  449. package/dist/simulation/living/definer.d.ts +12 -0
  450. package/dist/simulation/living/definer.js +223 -0
  451. package/dist/simulation/living/definition.d.ts +257 -0
  452. package/dist/simulation/living/definition.js +341 -0
  453. package/dist/simulation/living/frame.d.ts +259 -0
  454. package/dist/simulation/living/frame.js +223 -0
  455. package/dist/simulation/living/identifiers.d.ts +2 -0
  456. package/dist/simulation/living/identifiers.js +12 -0
  457. package/dist/simulation/living/index.d.ts +15 -0
  458. package/dist/simulation/living/index.js +15 -0
  459. package/dist/simulation/living/inference.d.ts +219 -0
  460. package/dist/simulation/living/inference.js +576 -0
  461. package/dist/simulation/living/mechanics.d.ts +54 -0
  462. package/dist/simulation/living/mechanics.js +588 -0
  463. package/dist/simulation/living/model-input.d.ts +25 -0
  464. package/dist/simulation/living/model-input.js +215 -0
  465. package/dist/simulation/living/open-world.d.ts +257 -0
  466. package/dist/simulation/living/open-world.js +102 -0
  467. package/dist/simulation/living/projection.d.ts +7 -0
  468. package/dist/simulation/living/projection.js +31 -0
  469. package/dist/simulation/living/recall.d.ts +17 -0
  470. package/dist/simulation/living/recall.js +25 -0
  471. package/dist/simulation/living/reduce.d.ts +15 -0
  472. package/dist/simulation/living/reduce.js +1853 -0
  473. package/dist/simulation/living/replay.d.ts +6 -0
  474. package/dist/simulation/living/replay.js +22 -0
  475. package/dist/simulation/living/runtime.d.ts +140 -0
  476. package/dist/simulation/living/runtime.js +3020 -0
  477. package/dist/simulation/living/shared-kinds.d.ts +24 -0
  478. package/dist/simulation/living/shared-kinds.js +96 -0
  479. package/dist/simulation/living/types.d.ts +2785 -0
  480. package/dist/simulation/living/types.js +669 -0
  481. package/dist/simulation/llm.d.ts +3 -1
  482. package/dist/simulation/llm.js +90 -30
  483. package/dist/simulation/memory/embedding.d.ts +1 -1
  484. package/dist/simulation/memory/embedding.js +9 -3
  485. package/dist/simulation/memory/filesystem.d.ts +2 -0
  486. package/dist/simulation/memory/filesystem.js +5 -1
  487. package/dist/simulation/memory/filesystem_file_tree.d.ts +4 -1
  488. package/dist/simulation/memory/filesystem_file_tree.js +41 -10
  489. package/dist/simulation/memory/filesystem_invariants.js +1 -2
  490. package/dist/simulation/memory/filesystem_types.d.ts +1 -0
  491. package/dist/simulation/memory/memory.d.ts +2 -0
  492. package/dist/simulation/memory/memory.js +5 -1
  493. package/dist/simulation/orchestration/intent.js +0 -2
  494. package/dist/simulation/orchestration/lifecycle.js +0 -2
  495. package/dist/simulation/plugin_host.d.ts +25 -1
  496. package/dist/simulation/plugin_host.js +334 -17
  497. package/dist/simulation/session_documents.d.ts +20 -0
  498. package/dist/simulation/session_documents.js +62 -0
  499. package/dist/simulation/session_input_validation.d.ts +43 -0
  500. package/dist/simulation/session_input_validation.js +364 -0
  501. package/dist/simulation/session_inputs.d.ts +32 -0
  502. package/dist/simulation/session_inputs.js +154 -0
  503. package/dist/simulation/telemetry.d.ts +11 -14
  504. package/dist/simulation/telemetry.js +177 -54
  505. package/dist/simulation/toolkit/bounded_turns.d.ts +13 -0
  506. package/dist/simulation/toolkit/bounded_turns.js +80 -0
  507. package/dist/simulation/toolkit/dynamic_agents.d.ts +25 -0
  508. package/dist/simulation/toolkit/dynamic_agents.js +218 -0
  509. package/dist/simulation/toolkit/dynamic_digest.d.ts +1 -0
  510. package/dist/simulation/toolkit/dynamic_digest.js +8 -0
  511. package/dist/simulation/toolkit/dynamic_documents.d.ts +7 -0
  512. package/dist/simulation/toolkit/dynamic_documents.js +71 -0
  513. package/dist/simulation/toolkit/dynamic_driver.d.ts +8 -0
  514. package/dist/simulation/toolkit/dynamic_driver.js +269 -0
  515. package/dist/simulation/toolkit/dynamic_game.d.ts +53 -0
  516. package/dist/simulation/toolkit/dynamic_game.js +805 -0
  517. package/dist/simulation/toolkit/dynamic_knowledge.d.ts +15 -0
  518. package/dist/simulation/toolkit/dynamic_knowledge.js +91 -0
  519. package/dist/simulation/toolkit/dynamic_mechanics.d.ts +22 -0
  520. package/dist/simulation/toolkit/dynamic_mechanics.js +910 -0
  521. package/dist/simulation/toolkit/dynamic_meetings.d.ts +239 -0
  522. package/dist/simulation/toolkit/dynamic_meetings.js +350 -0
  523. package/dist/simulation/toolkit/dynamic_progress.d.ts +131 -0
  524. package/dist/simulation/toolkit/dynamic_progress.js +214 -0
  525. package/dist/simulation/toolkit/dynamic_projection.d.ts +9 -0
  526. package/dist/simulation/toolkit/dynamic_projection.js +219 -0
  527. package/dist/simulation/toolkit/dynamic_runtime.d.ts +412 -0
  528. package/dist/simulation/toolkit/dynamic_runtime.js +6536 -0
  529. package/dist/simulation/toolkit/dynamic_state.d.ts +111 -0
  530. package/dist/simulation/toolkit/dynamic_state.js +1967 -0
  531. package/dist/simulation/toolkit/dynamic_story_review.d.ts +508 -0
  532. package/dist/simulation/toolkit/dynamic_story_review.js +333 -0
  533. package/dist/simulation/toolkit/dynamic_storyteller.d.ts +77 -0
  534. package/dist/simulation/toolkit/dynamic_storyteller.js +114 -0
  535. package/dist/simulation/toolkit/dynamic_storyteller_runtime.d.ts +26 -0
  536. package/dist/simulation/toolkit/dynamic_storyteller_runtime.js +126 -0
  537. package/dist/simulation/toolkit/dynamic_world.d.ts +22 -0
  538. package/dist/simulation/toolkit/dynamic_world.js +377 -0
  539. package/dist/simulation/toolkit/structured_output.d.ts +5 -0
  540. package/dist/simulation/toolkit/structured_output.js +321 -0
  541. package/dist/simulation/types/world.d.ts +2 -0
  542. package/dist/simulation/world/artifact_store.js +1 -1
  543. package/dist/simulation/world/memory_manager.d.ts +5 -0
  544. package/dist/simulation/world/memory_manager.js +17 -2
  545. package/dist/simulation/world/state.d.ts +3 -2
  546. package/dist/simulation/world/state.js +15 -5
  547. package/dist/skills/bundled/measurement-validation/SKILL.md +144 -0
  548. package/dist/terminal_attach.d.ts +1 -0
  549. package/dist/terminal_attach.js +113 -0
  550. package/dist/tool_progress.d.ts +3 -0
  551. package/dist/tool_progress.js +27 -0
  552. package/dist/types.d.ts +145 -10
  553. package/dist/types.js +3 -0
  554. package/dist/ui/core/input.d.ts +3 -0
  555. package/dist/ui/core/input_segments.d.ts +18 -1
  556. package/dist/ui/core/input_segments.js +131 -47
  557. package/dist/ui/core/input_state.d.ts +12 -0
  558. package/dist/ui/core/layout_yoga.d.ts +1 -1
  559. package/dist/ui/core/turn_metadata.d.ts +5 -0
  560. package/dist/ui/core/turn_metadata.js +22 -0
  561. package/dist/ui/ink/render.d.ts +2 -1
  562. package/dist/ui/ink/render.js +6 -5
  563. package/dist/ui/ratatui/headless_pane_manager.d.ts +14 -1
  564. package/dist/ui/ratatui/headless_pane_manager.js +293 -104
  565. package/dist/ui/ratatui/index.d.ts +1 -0
  566. package/dist/ui/ratatui/input.d.ts +4 -0
  567. package/dist/ui/ratatui/input.js +15 -0
  568. package/dist/ui/ratatui/ipc_path.d.ts +2 -0
  569. package/dist/ui/ratatui/ipc_path.js +29 -1
  570. package/dist/ui/ratatui/mux_persistence.d.ts +3 -1
  571. package/dist/ui/ratatui/mux_persistence.js +139 -1
  572. package/dist/ui/ratatui/pane_relay.d.ts +1 -1
  573. package/dist/ui/ratatui/pane_relay.js +55 -27
  574. package/dist/ui/ratatui/process.d.ts +17 -1
  575. package/dist/ui/ratatui/process.js +80 -7
  576. package/dist/ui/ratatui/protocol.d.ts +236 -1
  577. package/dist/ui/ratatui/protocol.js +90 -0
  578. package/dist/ui/scrollback.d.ts +2 -1
  579. package/dist/ui/scrollback.js +9 -4
  580. package/dist/ui/stream_typewriter.d.ts +8 -3
  581. package/dist/ui/stream_typewriter.js +30 -1
  582. package/dist/ui/streaming_scrollback.d.ts +1 -0
  583. package/dist/ui/streaming_scrollback.js +1 -1
  584. package/dist/ui/transcript_render_cache.js +10 -0
  585. package/dist/ui/views/activity_line.d.ts +5 -3
  586. package/dist/ui/views/activity_line.js +65 -7
  587. package/dist/ui/views/app.d.ts +6 -3
  588. package/dist/ui/views/app.js +17 -6
  589. package/dist/ui/views/completion_menu.js +10 -5
  590. package/dist/ui/views/input_area.d.ts +7 -3
  591. package/dist/ui/views/input_area.js +15 -9
  592. package/dist/ui/views/message_list.d.ts +4 -1
  593. package/dist/ui/views/message_list.js +89 -19
  594. package/dist/ui/views/queue_panel.d.ts +3 -1
  595. package/dist/ui/views/queue_panel.js +9 -2
  596. package/dist/ui/views/status_bar.d.ts +4 -2
  597. package/dist/ui/views/status_bar.js +28 -13
  598. package/dist/ui/views/theme.d.ts +2 -0
  599. package/dist/ui/views/theme.js +2 -0
  600. package/dist/ui/widgets/color_panel.js +18 -0
  601. package/dist/ui/widgets/form.js +8 -0
  602. package/dist/ui/widgets/log_view.js +7 -0
  603. package/dist/ui/widgets/navigator_panel.js +8 -0
  604. package/dist/ui/widgets/prompt_viewer.js +2 -0
  605. package/dist/ui/widgets/questionnaire.d.ts +2 -0
  606. package/dist/ui/widgets/questionnaire.js +79 -16
  607. package/dist/ui/widgets/resume_panel.d.ts +2 -0
  608. package/dist/ui/widgets/resume_panel.js +26 -15
  609. package/dist/ui/widgets/rewind_panel.d.ts +2 -2
  610. package/dist/ui/widgets/rewind_panel.js +4 -2
  611. package/dist/ui/widgets/select.js +16 -27
  612. package/dist/ui/widgets/settings_panel.js +16 -0
  613. package/dist/ui/widgets/status_line_panel.d.ts +1 -0
  614. package/dist/ui/widgets/status_line_panel.js +30 -4
  615. package/dist/ui/widgets/text_input.d.ts +2 -0
  616. package/dist/ui/widgets/text_input.js +15 -1
  617. package/dist/ui/widgets/types.d.ts +2 -0
  618. package/dist/usage_projection.d.ts +24 -0
  619. package/dist/usage_projection.js +130 -0
  620. package/dist/usage_snapshot.d.ts +36 -0
  621. package/dist/usage_snapshot.js +131 -0
  622. package/dist/utils/assistant_message.d.ts +2 -0
  623. package/dist/utils/assistant_message.js +5 -0
  624. package/dist/utils/atomic_write.d.ts +6 -2
  625. package/dist/utils/atomic_write.js +29 -4
  626. package/dist/utils/checked_shell.d.ts +25 -0
  627. package/dist/utils/checked_shell.js +107 -0
  628. package/dist/utils/compaction.d.ts +4 -1
  629. package/dist/utils/compaction.js +31 -7
  630. package/dist/utils/context.d.ts +4 -4
  631. package/dist/utils/context.js +14 -12
  632. package/dist/utils/deepseek.d.ts +2 -2
  633. package/dist/utils/deepseek.js +13 -5
  634. package/dist/utils/ephemeral.js +4 -0
  635. package/dist/utils/ephemeral_tools.d.ts +18 -0
  636. package/dist/utils/ephemeral_tools.js +97 -0
  637. package/dist/utils/jev_client.d.ts +4 -0
  638. package/dist/utils/jev_client.js +15 -0
  639. package/dist/utils/model_cache.d.ts +15 -0
  640. package/dist/utils/model_cache.js +143 -0
  641. package/dist/utils/models.d.ts +4 -2
  642. package/dist/utils/models.js +12 -16
  643. package/dist/utils/reasoning.d.ts +8 -1
  644. package/dist/utils/reasoning.js +31 -11
  645. package/dist/utils/router_catalog.d.ts +49 -0
  646. package/dist/utils/router_catalog.js +271 -0
  647. package/dist/utils/sandbox.d.ts +9 -0
  648. package/dist/utils/sandbox.js +118 -15
  649. package/dist/utils/shell.d.ts +7 -0
  650. package/dist/utils/shell.js +98 -34
  651. package/dist/utils/subprocess_env.d.ts +3 -0
  652. package/dist/utils/subprocess_env.js +27 -1
  653. package/dist/web/accounts_mirror.d.ts +3 -1
  654. package/dist/web/accounts_mirror.js +13 -9
  655. package/dist/web/child_publication.d.ts +17 -0
  656. package/dist/web/child_publication.js +45 -0
  657. package/dist/web/mirror_authenticator.d.ts +31 -11
  658. package/dist/web/mirror_authenticator.js +67 -17
  659. package/dist/web/mirror_client.d.ts +31 -4
  660. package/dist/web/mirror_client.js +189 -23
  661. package/dist/web/mirror_stream.d.ts +84 -22
  662. package/dist/web/mirror_stream.js +676 -95
  663. package/dist/web/observer_query_redaction.d.ts +6 -0
  664. package/dist/web/observer_query_redaction.js +58 -0
  665. package/dist/web/pane_registry.d.ts +2 -0
  666. package/dist/web/pane_registry.js +86 -22
  667. package/dist/web/tool_image.d.ts +6 -0
  668. package/dist/web/tool_image.js +17 -0
  669. package/dist/web/view_plugin.d.ts +14 -0
  670. package/dist/web/view_plugin.js +23 -1
  671. package/dist/worker/executor.js +31 -12
  672. package/dist/worker/index.d.ts +1 -0
  673. package/dist/worker/toolsets.js +3 -1
  674. package/dist/worker/types.d.ts +12 -1
  675. package/dist/workflows/registry.js +1 -0
  676. package/dist/workflows/registry_handle.d.ts +2 -0
  677. package/dist/workflows/runtime.d.ts +2 -0
  678. package/dist/workflows/runtime.js +1 -0
  679. package/dist/workspace_agent.d.ts +7 -0
  680. package/dist/workspace_agent.js +36 -0
  681. package/dist/workspace_collision.d.ts +76 -0
  682. package/dist/workspace_collision.js +688 -0
  683. package/dist/workspace_layout.d.ts +18 -0
  684. package/dist/workspace_layout.js +121 -0
  685. package/dist/workspace_runtime.d.ts +44 -0
  686. package/dist/workspace_runtime.js +82 -0
  687. package/dist/workspace_session_context.d.ts +62 -0
  688. package/dist/workspace_session_context.js +160 -0
  689. package/dist/zlm-embed.mjs +32518 -9615
  690. package/dist/zlm.js +1 -0
  691. package/node_modules/@zerg/model-contracts/LICENSE.md +375 -0
  692. package/node_modules/@zerg/model-contracts/README.md +90 -0
  693. package/node_modules/@zerg/model-contracts/index.d.ts +20 -0
  694. package/node_modules/@zerg/model-contracts/index.js +223 -0
  695. package/node_modules/@zerg/model-contracts/package.json +8 -0
  696. package/node_modules/glob/node_modules/brace-expansion/index.js +78 -22
  697. package/node_modules/glob/node_modules/brace-expansion/package.json +1 -1
  698. package/node_modules/readdir-glob/node_modules/brace-expansion/index.js +78 -22
  699. package/node_modules/readdir-glob/node_modules/brace-expansion/package.json +1 -1
  700. package/package.json +45 -24
  701. package/packages/model-contracts/LICENSE.md +375 -0
  702. package/packages/model-contracts/README.md +90 -0
  703. package/packages/model-contracts/index.d.ts +20 -0
  704. package/packages/model-contracts/index.js +223 -0
  705. package/packages/model-contracts/package.json +8 -0
  706. package/remote-broker/Dockerfile +10 -0
  707. package/remote-broker/README.md +308 -0
  708. package/remote-broker/archive.py +1227 -0
  709. package/remote-broker/cutover.py +761 -0
  710. package/remote-broker/requirements.txt +5 -0
  711. package/remote-broker/resources.example.json +6 -0
  712. package/remote-broker/resources.write-staging.example.json +18 -0
  713. package/remote-broker/retained.py +686 -0
  714. package/remote-broker/retained_cleanup.py +550 -0
  715. package/remote-broker/server.py +648 -0
  716. package/scripts/build-remote-broker.mjs +13 -0
  717. package/scripts/ensure-local-packages.mjs +6 -0
  718. package/scripts/node-pty-helpers.mjs +103 -0
@@ -0,0 +1,669 @@
1
+ import { z } from 'zod';
2
+ import { scheduleIntentSchema, changeSchema, entitySchema, kindDefinitionSchema, kindRequestSchema, propertyValueSchema } from './open-world.js';
3
+ // A living world is one place-graph, one cast, and an ordered list of accepted events.
4
+ // Everything the player or a character can know derives from this state and those events.
5
+ export const LIVING_SCHEMA_VERSION = 1;
6
+ // The engine version marks which reducer wrote a state. Replay is exact within one
7
+ // engine version; a state from an older engine still loads and replays, but its
8
+ // rebuilt state may differ.
9
+ export const LIVING_ENGINE_VERSION = 54;
10
+ export const BOUNDED_PERSON_RECORDS_ENGINE = 54;
11
+ export const MAX_WORKING_BELIEFS = 64;
12
+ export const MAX_CLOSED_COMMITMENTS = 64;
13
+ export const MAX_OPEN_COMMITMENTS = 128;
14
+ export const STABLE_CONVERSATION_ENGINE = 52;
15
+ export const FULL_SCHEDULE_INTENT_ENGINE = 52;
16
+ // From this engine a world's own data may say messages take time to arrive.
17
+ export const MESSAGE_TRAVEL_ENGINE = 39;
18
+ // From this engine a pause or a new speed keeps the clock where the player could see it.
19
+ export const SHOWN_CLOCK_ENGINE = 40;
20
+ // From this engine the world keeps a chronicle of what the player did and perceived, for the ending.
21
+ export const CHRONICLE_ENGINE = 40;
22
+ // From this engine walking off sets aside a long act at once; before, its end did.
23
+ export const WALK_OFF_ENGINE = 40;
24
+ // From this engine a thing made past a trigger's threshold joins a check of its kind pending at its place.
25
+ export const ONE_CHECK_ENGINE = 41;
26
+ // From this engine a memory keeps the things its event concerned, and recall reaches it through them.
27
+ export const THING_MEMORY_ENGINE = 42;
28
+ // From this engine going away sets aside a long act under way and no one away can be spoken to.
29
+ export const AWAY_APART_ENGINE = 42;
30
+ // From this engine someone brought in mid-story is a newcomer.
31
+ export const NEWCOMER_ENGINE = 42;
32
+ export const SELF_HOLD_ENGINE = 42;
33
+ // From this engine the player's sighting of someone keeps when the player found them gone from it.
34
+ export const GONE_AT_ENGINE = 42;
35
+ // From this engine the player reads of a problem what they last saw of it, and when.
36
+ export const PROBLEM_VIEW_ENGINE = 42;
37
+ export const REQUEST_TIME_ENGINE = 42;
38
+ // From this engine a person counts the lines they said to someone who has not answered.
39
+ export const SILENCE_ENGINE = 42;
40
+ // From this engine no two people in the story share a name, and only the player's own act moves the player.
41
+ export const IDENTITY_ENGINE = 42;
42
+ // From this engine writing on a paper adds to its words, marked with when and by whom.
43
+ export const WRITING_GROWS_ENGINE = 42;
44
+ // From this engine a world's own happenings carry the typed results its data names, and deadlines are counted down;
45
+ // a promise to be somewhere at a time is decided in time to get there.
46
+ export const DEADLINE_ENGINE = 42;
47
+ export const PROMISE_LEAD_MINUTES = 30;
48
+ // A decision about a promise weighs like one about a serious act: no routine plan puts it aside.
49
+ export const PROMISE_IMPORTANCE = 7;
50
+ // From this engine the open problem nobody has acted on longest goes back to the Game Master every two game hours.
51
+ export const STALL_ENGINE = 42;
52
+ export const STALL_MINUTES = 120;
53
+ // From this engine a thing's condition has named sides, such as damage or contents; a change to one keeps the rest.
54
+ export const CONDITION_SIDES_ENGINE = 43;
55
+ // From this engine a vote is a typed decision: each member casts their own ballot, and the count settles it.
56
+ export const VOTES_ENGINE = 43;
57
+ export const BALLOT_CHOICES = ['yes', 'no', 'abstain'];
58
+ // From this engine the player is never shown as seeing, in a room they look into, someone who has left the story.
59
+ export const LEFT_UNSEEN_ENGINE = 44;
60
+ // From this engine one act adds at most this many characters to words already written, so a paper never restates itself.
61
+ export const ADDED_LINE_ENGINE = 44;
62
+ export const MAX_ADDED_LINE = 400;
63
+ // From this engine a person knows the words of the papers they wrote, wherever the papers lie.
64
+ export const AUTHORS_ENGINE = 44;
65
+ // From this engine a thing that spreads or carries through places, such as a fire, a flood or a sound, is never held.
66
+ export const UNHELD_ENGINE = 44;
67
+ // From this engine coming back from rest is recorded, so people know how long they have been up.
68
+ export const REST_ENGINE = 44;
69
+ export const LONG_DAY_MINUTES = 16 * 60;
70
+ // From this engine an injury, an illness, a custody, a detention, an authority, a debt or a vote belongs to no hand.
71
+ export const BODILESS_ENGINE = 45;
72
+ // From this engine a write gives a paper its whole new text; a replacement that drops most of the words is refused.
73
+ export const WHOLE_TEXT_ENGINE = 45;
74
+ // From this engine a vote opened during play gives its members a turn at once, and a room holds one open vote at a time.
75
+ export const OPEN_NOW_ENGINE = 45;
76
+ // From this engine only the engine writes a vote's count and result on it.
77
+ export const COUNT_ONLY_ENGINE = 45;
78
+ // From this engine a problem the player did not see begin is named by the place where they saw it.
79
+ export const SEEN_WHERE_ENGINE = 45;
80
+ // From this engine an ask records when its asker last reminded; two hours with no answer allow a reminder.
81
+ export const REMINDER_ENGINE = 46;
82
+ export const REMINDER_MINUTES = 120;
83
+ // From this engine a thing's condition keeps whole sides; the oldest named side gives way, never a word.
84
+ export const WHOLE_SIDES_ENGINE = 46;
85
+ // From this engine the world keeps when the player last acted; two quiet game hours on, others see the
86
+ // player's person resting, or asleep at night.
87
+ export const PLAYER_REST_ENGINE = 47;
88
+ export const PLAYER_QUIET_MINUTES = 120;
89
+ // From this engine a thing keeps the order its condition sides were first set in a list a save keeps.
90
+ export const SIDE_ORDER_ENGINE = 48;
91
+ // From this engine a deadline averted because its problem was settled first is recorded as averted.
92
+ export const AVERTED_ENGINE = 48;
93
+ // From this engine a thing seen from the next room is named by its kind, such as "Fire can be seen at the quay".
94
+ export const SIGHT_NAMED_ENGINE = 49;
95
+ // From this engine people know what they could have seen: a world's own things from the start, what lies
96
+ // in a room they come to, and the words of what they read.
97
+ export const THINGS_SEEN_ENGINE = 49;
98
+ // From this engine someone at home by day answers messages; asleep at night, they answer once back.
99
+ export const AWAY_REPLY_ENGINE = 49;
100
+ // From this engine a vote called in play without a closing time closes two game hours after it opens.
101
+ export const VOTE_CLOSES_ENGINE = 50;
102
+ // From this engine what lies in the open is in view to whoever stands there, and people learn it where
103
+ // something happens with them present; only the player learns it on arrival, where the command loads.
104
+ export const SEEN_AT_EVENTS_ENGINE = 50;
105
+ export const VOTE_OPEN_MINUTES = 120;
106
+ // Night, for going home and for sleep: from 20:00 to 05:00.
107
+ export const NIGHT_FROM_HOUR = 20;
108
+ export const NIGHT_UNTIL_HOUR = 5;
109
+ export function isNight(clock) {
110
+ const hour = Math.floor((clock % 1440) / 60);
111
+ return hour >= NIGHT_FROM_HOUR || hour < NIGHT_UNTIL_HOUR;
112
+ }
113
+ export const DECISION_RESULTS = ['passed', 'failed', 'lapsed'];
114
+ // Two lines to someone silent for ten minutes or more are enough until they answer; a new day starts over.
115
+ export const UNANSWERED_LINES = 2;
116
+ export const UNANSWERED_MINUTES = 10;
117
+ export const UNANSWERED_RESET_MINUTES = 480;
118
+ // The most things whose last ruling the world keeps a note of.
119
+ export const MAX_THING_NOTES = 120;
120
+ export const THING_NOTE_TEXT = 300;
121
+ export const MAX_CHRONICLE = 80;
122
+ export const MAX_TEXT = 2000;
123
+ export function clockLabel(minutes) {
124
+ const day = Math.floor(minutes / 1440) + 1;
125
+ const hour = Math.floor((minutes % 1440) / 60);
126
+ const minute = minutes % 60;
127
+ return `Day ${day}, ${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}`;
128
+ }
129
+ export const MAX_CLOCK_RATE = 1440;
130
+ export const MAX_LINE = 600;
131
+ // One spoken line or act may run to a paragraph, so the model is never stopped mid-word.
132
+ export const MAX_SPOKEN = 1200;
133
+ // A newcomer's role: what anyone could call them in a few words.
134
+ export const MAX_ROLE = 48;
135
+ const id = z.string().regex(/^[a-z0-9][a-z0-9-]{0,63}$/u);
136
+ const short = z.string().min(1).max(200);
137
+ const line = z.string().min(1).max(MAX_LINE);
138
+ const text = z.string().min(1).max(MAX_TEXT);
139
+ const minutes = z.number().int().min(0).max(1_000_000_000);
140
+ export const placeKindSchema = z.enum(['room', 'outdoors', 'transit', 'private']);
141
+ export const placeSchema = z.object({
142
+ id,
143
+ name: short,
144
+ kind: placeKindSchema,
145
+ summary: text,
146
+ connections: z.array(id),
147
+ conditions: z.array(short),
148
+ conditionAspects: z.record(id, z.object({ text: short, changedSeq: z.number().int().min(0), index: z.number().int().min(0).optional() })).default({}),
149
+ introducedAt: z.number().int().min(0),
150
+ });
151
+ export const relationshipSchema = z.object({
152
+ trust: z.number().int().min(-100).max(100),
153
+ warmth: z.number().int().min(-100).max(100),
154
+ note: z.string().max(MAX_LINE),
155
+ // The event that last changed it, so an input can cite how the person came to feel this way.
156
+ changedSeq: z.number().int().min(0).optional(),
157
+ });
158
+ export const goalSchema = z.object({ id, text: line, status: z.enum(['active', 'done', 'dropped']) });
159
+ export const beliefSchema = z.object({
160
+ id,
161
+ subject: short,
162
+ claim: line,
163
+ source: z.object({ kind: z.enum(['initial', 'witnessed', 'told', 'discovered', 'inferred']), personId: id.nullable(), eventSeq: z.number().int().min(0) }),
164
+ at: minutes,
165
+ });
166
+ export const memorySchema = z.object({
167
+ id,
168
+ at: minutes,
169
+ eventSeq: z.number().int().min(0),
170
+ text: text,
171
+ importance: z.number().int().min(1).max(10),
172
+ participantIds: z.array(id),
173
+ placeId: id.nullable(),
174
+ // The things the remembered event concerned, when it named any.
175
+ thingIds: z.array(id).optional(),
176
+ evidence: z.object({ kind: z.enum(['observed', 'heard', 'told', 'inferred']), eventSeq: z.number().int().min(0), sourceId: id.nullable() }).optional(),
177
+ });
178
+ export const memorySummarySchema = z.object({
179
+ id,
180
+ personId: id,
181
+ at: minutes,
182
+ text,
183
+ sourceMemoryIds: z.array(id).min(1).max(4),
184
+ sourceEventSeqs: z.array(z.number().int().min(0)).min(1).max(4),
185
+ participantIds: z.array(id),
186
+ placeIds: z.array(id),
187
+ importance: z.number().int().min(1).max(10),
188
+ });
189
+ export const commitmentSchema = z.object({
190
+ id,
191
+ toId: id,
192
+ text: line,
193
+ dueAt: minutes.nullable(),
194
+ // Where the promise is to be kept, when it is a promise to be somewhere.
195
+ placeId: id.optional(),
196
+ status: z.enum(['open', 'kept', 'broken']),
197
+ madeAt: minutes,
198
+ // The event that made the promise, and who heard it made.
199
+ madeSeq: z.number().int().min(0).optional(),
200
+ knownTo: z.array(id).optional(),
201
+ });
202
+ // A plan is what a person is doing now and when it ends: its private intent, what anyone
203
+ // watching can see, and where and with whom. When it ends, they decide what comes next.
204
+ export const planSchema = z.object({
205
+ intent: line,
206
+ seen: short.optional(),
207
+ placeId: id.nullable(),
208
+ targetId: id.nullable(),
209
+ dueAt: minutes,
210
+ });
211
+ // Pronouns are authored per person so no prompt has to guess them.
212
+ const pronouns = z.string().min(1).max(40);
213
+ export const personSchema = z.object({
214
+ id,
215
+ name: short,
216
+ role: short,
217
+ roleId: id.nullable().optional(),
218
+ summary: text,
219
+ persona: text,
220
+ character: z.object({ voice: short, values: z.array(short), redLines: z.array(short), privateConcerns: z.array(short) }).optional(),
221
+ pronouns: pronouns.optional(),
222
+ isPlayer: z.boolean(),
223
+ placeId: id,
224
+ money: z.number().min(-1_000_000_000).max(1_000_000_000).nullable(),
225
+ mood: short,
226
+ // Physical state that others can see: bleeding, soaked, unconscious. Absent means unremarkable.
227
+ condition: short.optional(),
228
+ conditionChangedSeq: z.number().int().min(1).optional(),
229
+ // Someone with the means to enforce it is keeping this person where they are (detained, restrained, sedated).
230
+ held: z.object({ byId: id.nullable(), reason: line }).optional(),
231
+ goals: z.array(goalSchema),
232
+ relationships: z.record(id, relationshipSchema),
233
+ beliefs: z.array(beliefSchema),
234
+ memories: z.array(memorySchema),
235
+ summaries: z.array(memorySummarySchema).optional(),
236
+ memoryCount: z.number().int().min(0).optional(),
237
+ commitments: z.array(commitmentSchema),
238
+ plan: planSchema.nullable(),
239
+ // The last few activities this person took up and when, newest last; from engine 40.
240
+ planHistory: z.array(z.object({ at: minutes, intent: line })).max(6).optional(),
241
+ incapacitated: z.boolean(),
242
+ // The event at which this person last arrived where they are; absent until they first move.
243
+ arrivedSeq: z.number().int().min(1).optional(),
244
+ // When they last came back from rest, from engine 44; a person up sixteen hours is told since when.
245
+ restedAt: minutes.optional(),
246
+ // The typed entity whose gate stopped this person, when one did.
247
+ incapacitatedBy: id.optional(),
248
+ // A person who has left the world for good: gone home, quit, moved away or died.
249
+ departed: z.object({ at: minutes, reason: line }).optional(),
250
+ // Off in the world for a while: home, asleep, out on an errand; back at their place when it ends.
251
+ away: z.object({ at: minutes, until: minutes, reason: line }).optional(),
252
+ // Brought into the story mid-way, as a visitor: going home, they leave it. When they came, from engine 42.
253
+ newcomer: z.literal(true).optional(),
254
+ arrivedAt: minutes.optional(),
255
+ // Lines this person said to someone who has done nothing others could see since the first of them.
256
+ unanswered: z.record(id, z.object({ lines: z.number().int().min(1), firstAt: minutes })).optional(),
257
+ });
258
+ export const objectSchema = z.object({
259
+ id,
260
+ name: short,
261
+ summary: text,
262
+ placeId: id.nullable(),
263
+ holderId: id.nullable(),
264
+ ownerId: id.nullable(),
265
+ condition: short,
266
+ // Each named side of the condition, in the order first set; the condition line shows them all.
267
+ aspects: z.record(z.string().min(1).max(40), short).optional(),
268
+ // From engine 48, the order the sides were first set.
269
+ sideOrder: z.array(z.string().min(1).max(40)).max(5).optional(),
270
+ singlePersonMovable: z.boolean().default(true),
271
+ introducedAt: z.number().int().min(0),
272
+ custodyKnownTo: z.array(id).default([]),
273
+ conditionKnownTo: z.array(id).default([]),
274
+ // A thing the world's data hides, which only those who know where it is see.
275
+ hidden: z.literal(true).optional(),
276
+ });
277
+ export const conversationLineSchema = z.object({ seq: z.number().int().min(1), at: minutes, speakerId: id, text: text, toIds: z.array(id) });
278
+ export const conversationSchema = z.object({
279
+ id,
280
+ placeId: id,
281
+ participantIds: z.array(id).min(1),
282
+ startedAt: minutes,
283
+ endedAt: minutes.nullable(),
284
+ lines: z.array(conversationLineSchema),
285
+ });
286
+ export const messageSchema = z.object({
287
+ id,
288
+ seq: z.number().int().min(1),
289
+ // The event that carried this message; older saves lack it.
290
+ eventSeq: z.number().int().min(1).optional(),
291
+ at: minutes,
292
+ fromId: id,
293
+ toIds: z.array(id).min(1),
294
+ text: text,
295
+ sourcePersonId: id.nullable().optional(),
296
+ });
297
+ export const requestSchema = z.object({
298
+ id,
299
+ senderId: id,
300
+ receiverId: id,
301
+ topic: line,
302
+ status: z.enum(['open', 'answered', 'refused', 'done']),
303
+ openedSeq: z.number().int().min(1),
304
+ // When it was made, from engine 42, so the one who asked knows how long it has waited.
305
+ openedAt: minutes.optional(),
306
+ // When its asker last reminded the one asked, from engine 46.
307
+ remindedAt: minutes.optional(),
308
+ knownTo: z.array(id).default([]),
309
+ // The words that answered it, as the one who asked heard them.
310
+ answer: z.object({ text: z.string().min(1).max(MAX_TEXT), seq: z.number().int().min(1) }).optional(),
311
+ });
312
+ export const stanceSchema = z.object({
313
+ personId: id, actorId: id, status: z.enum(['undecided', 'cooperate', 'refuse', 'report', 'avoid', 'confront']),
314
+ sourceSeq: z.number().int().min(1), changedSeq: z.number().int().min(1),
315
+ });
316
+ export const tensionSchema = z.object({
317
+ id,
318
+ title: short,
319
+ summary: text,
320
+ participantIds: z.array(id),
321
+ status: z.enum(['open', 'settled']),
322
+ resolution: text.nullable(),
323
+ changedAt: minutes,
324
+ // The record of what opened the problem, so later rulings on it know what really happened.
325
+ openedBy: line.optional(),
326
+ // What the player knows of a problem: its label, what they learned of it and since when, and the latest development they saw and when.
327
+ playerView: z.object({ title: short, summary: text, status: z.enum(['open', 'settled']), resolution: text.nullable(), latest: text.nullable().optional(),
328
+ since: minutes.optional(), latestAt: minutes.optional() }).nullable().default(null),
329
+ });
330
+ // A scheduled item belongs to one person, or to the world itself (personId null):
331
+ // an arrival, a fire spreading, a storm, a delivery. An errand is a walk to tell
332
+ // someone something, carried out without a model. A delivery is a message on its way. A finish is
333
+ // the end of a long act, ruled when its time has passed.
334
+ // A count opens or closes a vote at its written time; the engine settles it with no model.
335
+ export const scheduledKindSchema = z.enum(['plan', 'reply', 'arrive', 'world', 'errand', 'deliver', 'finish', 'back', 'count']);
336
+ // A message on its way: who sent it, to whom, its words, whether its readers answer, and a request it opens on arrival.
337
+ export const deliverySchema = z.object({
338
+ fromId: id,
339
+ toIds: z.array(id).min(1).max(8),
340
+ text: z.string().min(1).max(MAX_TEXT),
341
+ replies: z.boolean(),
342
+ request: z.object({ requestId: id, topic: z.string().min(1).max(MAX_LINE) }).optional(),
343
+ });
344
+ export const messageTravelSchema = z.object({ minutes: z.number().int().min(1).max(10_080), how: z.string().min(1).max(120) });
345
+ // What a world's own happening changes when it falls due, whatever the Game Master rules, and when it
346
+ // does not happen at all; how far it carries and in what words; whether people count down to it.
347
+ export const beatRulesSchema = z.object({
348
+ unless: z.object({ settled: id }).optional(),
349
+ then: z.object({
350
+ facts: z.array(z.object({ aspect: id, text: line })).max(8).optional(),
351
+ tension: z.object({ id, summary: line.optional(), status: z.enum(['open', 'settled']).optional() }).optional(),
352
+ transfers: z.array(z.object({ fromId: id.nullable(), toId: id.nullable(), amount: z.number().positive().max(1_000_000_000) })).max(8).optional(),
353
+ }).optional(),
354
+ reach: z.enum(['nearby', 'everywhere']).optional(),
355
+ heard: line.optional(),
356
+ deadline: z.boolean().optional(),
357
+ });
358
+ export const scheduledSchema = z.object({
359
+ id,
360
+ at: minutes,
361
+ personId: id.nullable(),
362
+ kind: scheduledKindSchema,
363
+ intent: scheduleIntentSchema,
364
+ placeId: id.nullable(),
365
+ targetId: id.nullable(),
366
+ sourceSeq: z.number().int().min(0),
367
+ importance: z.number().int().min(1).max(10).default(3),
368
+ // A world happening that comes back this many minutes after it is due, such as visitors or a shift change,
369
+ // and the id its series keeps from one time to the next.
370
+ everyMinutes: z.number().int().min(1).max(100_000).optional(),
371
+ series: id.optional(),
372
+ // Engine 51 stores meter decoding separately from its bounded generated identity.
373
+ prediction: z.object({ propertyId: id, index: z.number().int().min(0) }).optional(),
374
+ replanned: z.literal(true).optional(),
375
+ // A world's own happening, from engine 42: what it changes and how it carries.
376
+ beat: beatRulesSchema.optional(),
377
+ delivery: deliverySchema.optional(),
378
+ // A vote that opens or is counted at this time, from engine 43.
379
+ count: z.object({ entityId: id, opens: z.boolean() }).optional(),
380
+ // A long act's ruling, held until its time has passed: the event it will be, checked again when it
381
+ // applies; how each person or thing it names stood when it began; and who may react to it. Engine 39
382
+ // kept no record.
383
+ held: z.object({ at: minutes, fields: z.record(z.string(), z.unknown()), record: z.string().max(MAX_TEXT).optional(), standing: z.record(id, z.string().max(MAX_LINE)), reactorIds: z.array(id) }).optional(),
384
+ });
385
+ // A sighting is where the player saw someone, or, when they saw them walk out, the room they walked into;
386
+ // and, once the player found them gone from it, when that was.
387
+ export const sightingSchema = z.object({ placeId: id, at: minutes, heading: z.literal(true).optional(), gone: z.literal(true).optional(), away: z.literal(true).optional(),
388
+ goneAt: minutes.optional() });
389
+ // Effects are the whole vocabulary of change. Every accepted event is a list of them.
390
+ export const effectSchema = z.discriminatedUnion('kind', [
391
+ z.object({ kind: z.literal('move'), personId: id, placeId: id }),
392
+ z.object({ kind: z.literal('say'), personId: id, text: text, toIds: z.array(id) }),
393
+ z.object({ kind: z.literal('message'), fromId: id, toIds: z.array(id).min(1), text: text, sourcePersonId: id.nullable().optional() }),
394
+ // A message handed to whatever carries messages in this world; it arrives after the world's travel time.
395
+ z.object({ kind: z.literal('dispatch'), dispatchId: id, ...deliverySchema.shape, sourcePersonId: id.nullable().optional() }),
396
+ z.object({ kind: z.literal('request.open'), requestId: id, senderId: id, receiverId: id, topic: line }),
397
+ z.object({ kind: z.literal('request.remind'), requestId: id }),
398
+ z.object({ kind: z.literal('request.update'), requestId: id, status: z.enum(['answered', 'refused', 'done']), answer: z.string().min(1).max(MAX_TEXT).optional() }),
399
+ z.object({ kind: z.literal('norm.violation'), normEntityId: id, actionKind: id, actorId: id }),
400
+ z.object({ kind: z.literal('stance'), personId: id, actorId: id, status: stanceSchema.shape.status, sourceSeq: z.number().int().min(1) }),
401
+ z.object({ kind: z.literal('object.update'), objectId: id, condition: short.nullable(), aspect: z.string().min(1).max(40).optional(), placeId: id.nullable(), holderId: id.nullable(), ownerId: id.nullable() }),
402
+ z.object({ kind: z.literal('object.create'), objectId: id, name: short, summary: text, placeId: id.nullable(), holderId: id.nullable(), ownerId: id.nullable(), condition: short }),
403
+ z.object({ kind: z.literal('place.condition'), placeId: id, add: short.nullable(), remove: short.nullable(), aspect: id.optional() }),
404
+ z.object({ kind: z.literal('place.create'), placeId: id, name: short, summary: text, connections: z.array(id).min(1) }),
405
+ z.object({ kind: z.literal('person.create'), personId: id, name: short, role: short, summary: text, persona: text, placeId: id, pronouns: pronouns.nullable().default(null),
406
+ // What brought them and what they want now: their first aim.
407
+ wants: line.optional() }),
408
+ z.object({ kind: z.literal('money'), personId: id, delta: z.number().int().min(-1_000_000_000).max(1_000_000_000) }),
409
+ // A world deadline has passed, with what came of it.
410
+ z.object({ kind: z.literal('deadline.passed'), what: line, outcome: line, averted: z.literal(true).optional() }),
411
+ // Money passes from a person or an account to another; null is outside the world, such as costs paid.
412
+ z.object({ kind: z.literal('transfer'), fromId: id.nullable(), toId: id.nullable(), amount: z.number().positive().max(1_000_000_000) }),
413
+ z.object({ kind: z.literal('relationship'), personId: id, targetId: id, trust: z.number().int().min(-40).max(40), warmth: z.number().int().min(-40).max(40), note: z.string().max(MAX_LINE) }),
414
+ z.object({ kind: z.literal('belief'), personId: id, subject: short, claim: line, sourcePersonId: id.nullable(),
415
+ evidence: z.object({ kind: z.enum(['observed', 'heard', 'told', 'inferred']), eventSeq: z.number().int().min(0), sourceId: id.nullable() }).optional() }),
416
+ z.object({ kind: z.literal('commitment'), commitmentId: id, personId: id, toId: id, text: line, dueInMinutes: z.number().int().min(0).max(100_000).nullable(), placeId: id.optional() }),
417
+ z.object({ kind: z.literal('commitment.update'), commitmentId: id, personId: id, status: z.enum(['kept', 'broken']) }),
418
+ z.object({ kind: z.literal('goal'), personId: id, add: line.nullable(), dropGoalId: id.nullable(), doneGoalId: id.nullable().optional() }),
419
+ z.object({ kind: z.literal('mood'), personId: id, mood: short }),
420
+ z.object({ kind: z.literal('person.condition'), personId: id, condition: short.nullable() }),
421
+ z.object({ kind: z.literal('hold'), personId: id, byId: id.nullable(), reason: line.nullable() }),
422
+ z.object({ kind: z.literal('role'), personId: id, role: short, roleId: id.nullable().default(null) }),
423
+ z.object({ kind: z.literal('schedule'), scheduledId: id, personId: id.nullable(), inMinutes: z.number().int().min(1).max(100_000), intent: scheduleIntentSchema, placeId: id.nullable(), targetId: id.nullable(), scheduleKind: scheduledKindSchema,
424
+ importance: z.number().int().min(1).max(10).optional(), everyMinutes: z.number().int().min(1).max(100_000).optional(), series: id.optional(), beat: beatRulesSchema.optional(), replanned: z.literal(true).optional(),
425
+ held: z.object({ fields: z.record(z.string(), z.unknown()), record: z.string().max(MAX_TEXT).optional(), standing: z.record(id, z.string().max(MAX_LINE)), reactorIds: z.array(id) }).optional() }),
426
+ // A long act set aside before its end names what it was and when it began, so its actor is told.
427
+ z.object({ kind: z.literal('unschedule'), scheduledId: id, leftOff: z.object({ intent: scheduleIntentSchema, begunAt: minutes }).optional() }),
428
+ z.object({ kind: z.literal('plan'), personId: id, plan: planSchema.nullable() }),
429
+ z.object({ kind: z.literal('fact'), add: line.nullable(), remove: line.nullable(), aspect: id.optional() }),
430
+ z.object({ kind: z.literal('tension.create'), tensionId: id, title: short, summary: text, participantIds: z.array(id), openedBy: line.optional() }),
431
+ z.object({ kind: z.literal('tension.update'), tensionId: id, status: z.enum(['open', 'settled']), note: text.nullable() }),
432
+ z.object({ kind: z.literal('memory'), personId: id, text: text, importance: z.number().int().min(1).max(10), participantIds: z.array(id) }),
433
+ z.object({ kind: z.literal('incapacitate'), personId: id, reason: line }),
434
+ z.object({ kind: z.literal('person.leave'), personId: id, reason: line }),
435
+ z.object({ kind: z.literal('person.away'), personId: id, minutes: z.number().int().min(1).max(2880), reason: line }),
436
+ z.object({ kind: z.literal('person.back'), personId: id }),
437
+ z.object({ kind: z.literal('conversation.end'), conversationId: id }),
438
+ z.object({ kind: z.literal('kind.define'), definition: kindDefinitionSchema }),
439
+ z.object({ kind: z.literal('kind.request'), request: kindRequestSchema }),
440
+ z.object({ kind: z.literal('entity.create'), entityId: id, kindId: id, name: short, placeId: id.nullable().default(null),
441
+ initialProperties: z.record(id, propertyValueSchema).optional(),
442
+ // A thing that is somewhere may be made as it now is, and in the hand of someone there.
443
+ condition: z.string().trim().min(1).max(200).optional(), holderId: id.optional(),
444
+ // A decision's members, who alone may vote on it, and the problem its result settles.
445
+ memberIds: z.array(id).min(1).max(12).optional(), settles: id.optional(),
446
+ // Who knows a world's own thing from the start, when its data says, and whether it is hidden; only
447
+ // the opening names them.
448
+ knownTo: z.array(id).max(64).optional(), hidden: z.literal(true).optional(),
449
+ // Money that moves when the decision passes, such as an investment wired once an agreement is signed.
450
+ transfers: z.array(z.object({ fromId: id.nullable(), toId: id.nullable(), amount: z.number().positive().max(1_000_000_000) })).max(4).optional() }),
451
+ // A member casts their own vote on an open decision; only they may, in their own act or answer.
452
+ z.object({ kind: z.literal('ballot'), entityId: id, personId: id, choice: z.enum(BALLOT_CHOICES) }),
453
+ // A decision whose time is up is counted: the result follows from the ballots, not from anyone's word.
454
+ z.object({ kind: z.literal('decision.close'), entityId: id, result: z.enum(DECISION_RESULTS) }),
455
+ z.object({ kind: z.literal('property.set'), entityId: id, propertyId: id, value: propertyValueSchema.nullable() }),
456
+ // A thing that is somewhere changes hands, or is set down where it is.
457
+ z.object({ kind: z.literal('entity.move'), entityId: id, holderId: id.nullable(), placeId: id.nullable() }),
458
+ // A thing that is somewhere is visibly changed, such as torn or burned.
459
+ z.object({ kind: z.literal('entity.condition'), entityId: id, condition: short, aspect: z.string().min(1).max(40).optional() }),
460
+ z.object({ kind: z.literal('relation.set'), entityId: id, relationId: id, targetId: id.nullable() }),
461
+ // The server clock: whether the world runs, and how many game minutes pass each real minute.
462
+ z.object({ kind: z.literal('clock'), paused: z.boolean(), rate: z.number().int().min(1).max(MAX_CLOCK_RATE) }),
463
+ ]);
464
+ export const eventKindSchema = z.enum([
465
+ 'opening', 'move', 'speech', 'message', 'attempt', 'world', 'reaction', 'plan', 'wait', 'arrive', 'keep-playing', 'finish',
466
+ // Game time passing on the server clock, and the clock itself being paused, resumed or sped up.
467
+ 'tick', 'clock',
468
+ ]);
469
+ // The recap card a finish event carries: a verdict, the beats that happened, where the cast ended up, and a last line.
470
+ export const endingSchema = z.object({
471
+ verdict: line,
472
+ highlights: z.array(line).min(1).max(5),
473
+ cast: z.array(z.object({ name: short, line: line })).max(4),
474
+ closing: line,
475
+ });
476
+ // How far an event carries. People in the room witness it. With 'nearby' reach, people
477
+ // in connected places notice it (a shout, smoke, a crash) without seeing what happened;
478
+ // with 'everywhere', everyone in the world does. The notice is what they perceive.
479
+ export const reachSchema = z.enum(['here', 'nearby', 'everywhere']);
480
+ export const eventSchema = z.object({
481
+ seq: z.number().int().min(1),
482
+ at: minutes,
483
+ kind: eventKindSchema,
484
+ actorId: id.nullable(),
485
+ placeId: id.nullable(),
486
+ witnessIds: z.array(id),
487
+ reach: reachSchema.default('here'),
488
+ notice: text.nullable().default(null),
489
+ nearbyIds: z.array(id).default([]),
490
+ summary: text,
491
+ // Older events have no observation fields. Replay uses their saved summary.
492
+ observed: text.nullable().optional(),
493
+ perceivedBy: z.array(id).optional(),
494
+ visibleObjectIds: z.array(id).optional(),
495
+ visibleTensionIds: z.array(id).optional(),
496
+ // The things an act handled, used or changed, or that words were about.
497
+ thingIds: z.array(id).max(8).optional(),
498
+ narration: text.nullable(),
499
+ outcome: z.enum(['succeeded', 'partial', 'failed', 'impossible']).nullable(),
500
+ minutes: z.number().int().min(0).max(100_000),
501
+ effects: z.array(effectSchema),
502
+ causeSeq: z.number().int().min(0).nullable(),
503
+ importance: z.number().int().min(1).max(10),
504
+ suggestions: z.array(short).max(3),
505
+ ending: endingSchema.optional(),
506
+ // How many proposed changes the world could not accept and left out of this event.
507
+ droppedEffects: z.number().int().min(1).optional(),
508
+ // The real time, in epoch milliseconds, at which a clock or tick event happened.
509
+ realAt: z.number().int().min(0).optional(),
510
+ });
511
+ export const stoppingPointSchema = z.object({ at: minutes, tensionId: id, title: short, summary: text });
512
+ // Runs finished before recap cards carry only a title and text.
513
+ export const epilogueSchema = z.object({ title: short, text: text, at: minutes }).extend(endingSchema.partial().shape);
514
+ export const stateSchema = z.object({
515
+ schemaVersion: z.literal(LIVING_SCHEMA_VERSION),
516
+ engine: z.number().int().min(1).default(1),
517
+ gameKind: id,
518
+ seed: z.string().min(1).max(128),
519
+ revision: z.number().int().min(0),
520
+ clock: minutes,
521
+ // When the world began: the moment its opening and facts were written for. Older saves lack it.
522
+ startClock: minutes.optional(),
523
+ // When the player last acted, from engine 47.
524
+ playerActedAt: minutes.optional(),
525
+ status: z.enum(['open', 'finished']),
526
+ playerId: id,
527
+ places: z.record(id, placeSchema),
528
+ people: z.record(id, personSchema),
529
+ objects: z.record(id, objectSchema),
530
+ facts: z.array(line),
531
+ factAspects: z.record(id, z.object({ text: line, changedSeq: z.number().int().min(0), index: z.number().int().min(0).optional() })).default({}),
532
+ conversations: z.array(conversationSchema),
533
+ messages: z.array(messageSchema),
534
+ requests: z.array(requestSchema).default([]),
535
+ stances: z.array(stanceSchema).default([]),
536
+ tensions: z.array(tensionSchema),
537
+ schedule: z.array(scheduledSchema),
538
+ // Threshold crossings predicted for growing values, ordered by time; kept apart so a large count
539
+ // of growing things does not weigh on every change to the main schedule.
540
+ meterSchedule: z.array(scheduledSchema).default([]),
541
+ sightings: z.record(id, sightingSchema),
542
+ events: z.array(eventSchema),
543
+ stoppingPoint: stoppingPointSchema.nullable(),
544
+ forcedEnding: line.nullable(),
545
+ epilogue: epilogueSchema.nullable(),
546
+ opening: z.object({ title: short, situation: text, stakes: text }),
547
+ // The world's physics, technology and social order as authored; older saves carry none.
548
+ setting: z.string().max(2000).default(''),
549
+ currency: z.object({ symbol: z.string().min(1).max(4), name: z.string().min(1).max(40) }).nullable(),
550
+ // The world's deadlines that have passed lately, and what came of each.
551
+ passedDeadlines: z.array(z.object({ what: line, at: minutes, outcome: line, averted: z.literal(true).optional() })).max(8).optional(),
552
+ // Money kept apart from anyone's purse, such as a city reserve or a company account.
553
+ accounts: z.record(id, z.object({ id, name: short, holderId: id.nullable(), balance: z.number().min(-1_000_000_000).max(1_000_000_000), allowsDebt: z.boolean() })).optional(),
554
+ suggestions: z.array(short).max(3),
555
+ kinds: z.record(id, kindDefinitionSchema).default({}),
556
+ kindRequests: z.array(kindRequestSchema).default([]),
557
+ entities: z.record(id, entitySchema).default({}),
558
+ entityPlaceIds: z.record(id, z.array(id)).default({}),
559
+ globalEntityIds: z.array(id).default([]),
560
+ // Decisions still open to votes, so finding them never walks every thing in the world.
561
+ openDecisionIds: z.array(id).optional(),
562
+ // The papers each person wrote, by their author slot, so a mind recalls them without walking every thing.
563
+ authoredIds: z.record(id, z.array(id)).optional(),
564
+ entityMoveSubjectIds: z.record(id, z.array(id)).default({}),
565
+ // Placeless things by the people, places and things they name; those that name nothing apply everywhere.
566
+ globalEntityRefs: z.record(id, z.record(id, z.literal(true))).default({}),
567
+ worldEntityIds: z.record(id, z.literal(true)).default({}),
568
+ changes: z.array(changeSchema).default([]),
569
+ // A live world runs on the server clock: game minutes per real minute, whether it is paused, and
570
+ // the game and real time the clock was last set at. Without a rate, time moves with each event.
571
+ clockRate: z.number().int().min(1).max(MAX_CLOCK_RATE).nullable().default(null),
572
+ paused: z.boolean().default(false),
573
+ clockAnchor: z.object({ game: minutes, real: z.number().int().min(0) }).nullable().default(null),
574
+ // How messages travel here and how many game minutes they take; null when they arrive at once.
575
+ messageTravel: messageTravelSchema.nullable().default(null),
576
+ // The turning points of the player's story as they saw them, bounded, oldest first.
577
+ chronicle: z.array(z.object({ seq: z.number().int().min(1), at: minutes, kind: z.string().min(1).max(40), placeId: id.nullable(),
578
+ summary: z.string().min(1).max(MAX_TEXT), outcome: z.string().max(40).nullable(), importance: z.number().int().min(1).max(10), mine: z.boolean() })).default([]),
579
+ // What a ruling last did with each thing it named, for later rulings: the newest things only.
580
+ thingNotes: z.record(id, z.object({ seq: z.number().int().min(1), at: minutes, text: z.string().min(1).max(THING_NOTE_TEXT) })).default({}),
581
+ });
582
+ // The ids a thing names through its id properties and relations.
583
+ export function entityRefs(kinds, entity) {
584
+ const refs = new Set();
585
+ for (const property of kinds[entity.kindId]?.properties ?? []) {
586
+ const value = entity.properties[property.id]?.value;
587
+ if (property.type === 'id' && typeof value === 'string')
588
+ refs.add(value);
589
+ }
590
+ for (const relation of Object.values(entity.relations))
591
+ refs.add(relation.targetId);
592
+ return [...refs].sort();
593
+ }
594
+ function freezeThrough(value) {
595
+ if (value === null || typeof value !== 'object' || Object.isFrozen(value))
596
+ return;
597
+ Object.freeze(value);
598
+ for (const child of Object.values(value))
599
+ freezeThrough(child);
600
+ }
601
+ // With automatic immutability off, the draft library walks every plain value it meets while drafts remain
602
+ // open, so large indexes would cost their full size on every event. Frozen, they are skipped; the
603
+ // reducer only ever changes them through drafts, which copy on write, and a loaded state starts sealed.
604
+ export function sealLivingIndexes(state) {
605
+ for (const person of Object.values(state.people))
606
+ if (!Object.isFrozen(person.memories))
607
+ Object.freeze(person.memories);
608
+ for (const list of [state.meterSchedule, state.changes, state.globalEntityIds])
609
+ if (!Object.isFrozen(list))
610
+ Object.freeze(list);
611
+ // An accepted event never changes; frozen through, the recent events cost nothing on later events.
612
+ for (const event of state.events)
613
+ if (!Object.isFrozen(event))
614
+ freezeThrough(event);
615
+ for (const table of [state.worldEntityIds, state.globalEntityRefs, state.entityPlaceIds, state.entityMoveSubjectIds]) {
616
+ if (Object.isFrozen(table))
617
+ continue;
618
+ for (const value of Object.values(table))
619
+ if (typeof value === 'object' && !Object.isFrozen(value))
620
+ Object.freeze(value);
621
+ Object.freeze(table);
622
+ }
623
+ return state;
624
+ }
625
+ export function parseLivingState(value) {
626
+ const parsed = stateSchema.parse(value);
627
+ if (value === null || typeof value !== 'object' || !('globalEntityRefs' in value) || !('worldEntityIds' in value)) {
628
+ parsed.globalEntityRefs = {};
629
+ parsed.worldEntityIds = {};
630
+ for (const entity of Object.values(parsed.entities)) {
631
+ if (entity.placeId !== null)
632
+ continue;
633
+ const refs = entityRefs(parsed.kinds, entity);
634
+ if (refs.length === 0)
635
+ parsed.worldEntityIds[entity.id] = true;
636
+ for (const ref of refs)
637
+ (parsed.globalEntityRefs[ref] ??= {})[entity.id] = true;
638
+ }
639
+ }
640
+ if (value !== null && typeof value === 'object' && 'entityPlaceIds' in value
641
+ && 'globalEntityIds' in value && 'entityMoveSubjectIds' in value)
642
+ return sealLivingIndexes(parsed);
643
+ parsed.entityPlaceIds = {};
644
+ parsed.globalEntityIds = [];
645
+ parsed.entityMoveSubjectIds = {};
646
+ for (const entity of Object.values(parsed.entities)) {
647
+ if (entity.placeId === null)
648
+ parsed.globalEntityIds.push(entity.id);
649
+ else
650
+ (parsed.entityPlaceIds[entity.placeId] ??= []).push(entity.id);
651
+ const kind = parsed.kinds[entity.kindId];
652
+ for (const mechanic of kind?.mechanics ?? []) {
653
+ if (mechanic.kind !== 'change' || !mechanic.onEvent)
654
+ continue;
655
+ const subjectId = entity.properties[mechanic.onEvent.subjectPropertyId]?.value;
656
+ if (typeof subjectId === 'string')
657
+ (parsed.entityMoveSubjectIds[subjectId] ??= []).push(entity.id);
658
+ }
659
+ }
660
+ return sealLivingIndexes(parsed);
661
+ }
662
+ export class LivingWorldError extends Error {
663
+ code;
664
+ constructor(code, message, options) {
665
+ super(message, options);
666
+ this.code = code;
667
+ this.name = 'LivingWorldError';
668
+ }
669
+ }