@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,54 @@
1
+ import type { z } from 'zod';
2
+ import type { propertyValueSchema } from './open-world.js';
3
+ import { type LivingEffect, type LivingState } from './types.js';
4
+ type PropertyValue = z.infer<typeof propertyValueSchema>;
5
+ declare const LEVELS: readonly ["none", "low", "medium", "high"];
6
+ type Level = typeof LEVELS[number];
7
+ export type LivingSignal = {
8
+ sourcePlaceId: string | null;
9
+ targetPlaceId: string | null;
10
+ channel: string;
11
+ sourceId: string;
12
+ };
13
+ export declare const GLOBAL_SIGNAL_CHANNEL = "global";
14
+ export declare function signalsFor(state: LivingState, effects: readonly LivingEffect[]): LivingSignal[];
15
+ export declare function signalNotice(state: LivingState, effects: readonly LivingEffect[], observed?: string | null): string | null;
16
+ export declare function importanceFloorForEffects(state: LivingState, effects: readonly LivingEffect[]): number;
17
+ export declare const PEEK_ENTITY: unique symbol;
18
+ export declare function readEntity(state: LivingState, entityId: string): LivingState['entities'][string] | undefined;
19
+ export declare function nearWithMechanic(state: LivingState, nearIds: Iterable<string>, placeId: string | null, mechanicKind: string): string[];
20
+ export declare function placelessNear(state: LivingState, nearIds: Iterable<string>, newestPerName?: number): string[];
21
+ export declare function unindexPlaceless(state: LivingState, entityId: string): void;
22
+ export declare function indexPlaceless(state: LivingState, entityId: string): void;
23
+ export declare function reindexPlaceless(state: LivingState, entityId: string, previousRefs: readonly string[]): void;
24
+ export declare function gatesOn(state: LivingState, subjectId: string): {
25
+ entityId: string;
26
+ name: string;
27
+ propertyId: string;
28
+ actionKinds: readonly string[];
29
+ keeperIds: readonly string[];
30
+ }[];
31
+ export declare function gatesAgainst(state: LivingState, subjectId: string, actionKind: string): ReturnType<typeof gatesOn>;
32
+ export declare function heldHere(state: LivingState, personId: string): boolean;
33
+ export declare function blockedByGate(state: LivingState, subjectId: string, actionKind: string): string | null;
34
+ export declare function blockedActionKinds(state: LivingState, subjectId: string): string[];
35
+ export declare function normViolationsFor(state: LivingState, actorId: string, placeId: string, actionKind: string): Extract<LivingEffect, {
36
+ kind: 'norm.violation';
37
+ }>[];
38
+ export declare function spreadLevel(state: LivingState, sourceId: string, propertyId: string, value: Level, seq: number, at: number): void;
39
+ export declare function runTriggers(state: LivingState, entityId: string, propertyId: string, previous: number | null, next: number, at: number, seq: number): void;
40
+ export declare const LAZY_METER_ENGINE = 32;
41
+ export declare const ACT_GATE_ENGINE = 36;
42
+ export declare const TIDY_PLACE_INDEX_ENGINE = 39;
43
+ export declare const LOCAL_RECOVERY_ENGINE = 36;
44
+ export declare function currentValue(state: LivingState, entity: LivingState['entities'][string], propertyId: string, at: number): PropertyValue | undefined;
45
+ export declare function plain<T>(value: T): T;
46
+ export declare function insertScheduled(state: LivingState, item: LivingState['schedule'][number], list?: 'schedule' | 'meterSchedule'): void;
47
+ export declare function stalePrediction(state: LivingState, item: LivingState['schedule'][number]): boolean;
48
+ export declare function predictionReady(state: LivingState, item: LivingState['schedule'][number]): boolean;
49
+ export declare function dropStalePredictions(state: LivingState, now: number): void;
50
+ export declare function keepPassedCrossings(state: LivingState, entityId: string, propertyId: string, at: number): void;
51
+ export declare function predictCrossings(state: LivingState, entityId: string, propertyId: string, seq: number): void;
52
+ export declare function advanceScopedEntities(state: LivingState, placeId: string | null, to: number, seq: number): void;
53
+ export declare function applyEventChanges(state: LivingState, event: Pick<LivingState['events'][number], 'actorId' | 'effects' | 'seq' | 'at'>): void;
54
+ export {};
@@ -0,0 +1,588 @@
1
+ import { current, isDraft, original } from 'immer';
2
+ import { BOUNDED_IDENTIFIERS_ENGINE, generatedId } from './identifiers.js';
3
+ import { FULL_SCHEDULE_INTENT_ENGINE, scheduledSchema, LivingWorldError, ONE_CHECK_ENGINE, SELF_HOLD_ENGINE, SIGHT_NAMED_ENGINE, entityRefs } from './types.js';
4
+ const LEVELS = ['none', 'low', 'medium', 'high'];
5
+ // The one channel that reaches every place: a broadcast, a city-wide alarm, public news. Only a
6
+ // world's own data may define a kind that signals on it.
7
+ export const GLOBAL_SIGNAL_CHANNEL = 'global';
8
+ // Signals follow the entities as they stand after all of an act's changes, so something made and
9
+ // linked in the same act signals too.
10
+ export function signalsFor(state, effects) {
11
+ const view = new Map();
12
+ const read = (id) => {
13
+ const known = view.get(id);
14
+ if (known)
15
+ return known;
16
+ const entity = state.entities[id];
17
+ if (!entity)
18
+ return undefined;
19
+ const copy = { kindId: entity.kindId, placeId: entity.placeId,
20
+ properties: Object.fromEntries(Object.entries(entity.properties).map(([key, slot]) => [key, slot.value])),
21
+ relations: Object.fromEntries(Object.entries(entity.relations).map(([key, slot]) => [key, slot.targetId])) };
22
+ view.set(id, copy);
23
+ return copy;
24
+ };
25
+ const touched = new Map();
26
+ const touch = (entityId, propertyId) => { (touched.get(entityId) ?? touched.set(entityId, new Set()).get(entityId)).add(propertyId); };
27
+ for (const effect of effects) {
28
+ if (effect.kind === 'entity.create') {
29
+ view.set(effect.entityId, { kindId: effect.kindId, placeId: effect.placeId, properties: { ...effect.initialProperties }, relations: {} });
30
+ for (const propertyId of Object.keys(effect.initialProperties ?? {}))
31
+ touch(effect.entityId, propertyId);
32
+ }
33
+ else if (effect.kind === 'property.set') {
34
+ const entity = read(effect.entityId);
35
+ if (!entity)
36
+ continue;
37
+ entity.properties[effect.propertyId] = effect.value;
38
+ touch(effect.entityId, effect.propertyId);
39
+ }
40
+ else if (effect.kind === 'relation.set') {
41
+ const entity = read(effect.entityId);
42
+ if (entity)
43
+ entity.relations[effect.relationId] = effect.targetId;
44
+ }
45
+ }
46
+ const signals = [];
47
+ for (const [entityId, propertyIds] of touched) {
48
+ const source = view.get(entityId);
49
+ const kind = state.kinds[source.kindId];
50
+ if (!kind)
51
+ continue;
52
+ for (const propertyId of propertyIds) {
53
+ const value = source.properties[propertyId];
54
+ if (value === null || value === undefined || value === false || value === 0 || value === 'none')
55
+ continue;
56
+ for (const mechanic of kind.mechanics) {
57
+ if (mechanic.kind !== 'signal' || mechanic.propertyId !== propertyId)
58
+ continue;
59
+ if (mechanic.channel === GLOBAL_SIGNAL_CHANNEL) {
60
+ signals.push({ sourcePlaceId: source.placeId, targetPlaceId: null, channel: mechanic.channel, sourceId: entityId });
61
+ continue;
62
+ }
63
+ const targetId = source.relations[mechanic.relationId];
64
+ const target = targetId ? read(targetId) : undefined;
65
+ if (!target)
66
+ continue;
67
+ signals.push({ sourcePlaceId: source.placeId, targetPlaceId: target.placeId, channel: mechanic.channel, sourceId: entityId });
68
+ }
69
+ }
70
+ }
71
+ return signals;
72
+ }
73
+ // What reaches people elsewhere: a broadcast carries what was observed where it began; any other
74
+ // signal carries only its sense and where it came from.
75
+ export function signalNotice(state, effects, observed = null) {
76
+ const signals = signalsFor(state, effects);
77
+ const broadcast = signals.find(signal => signal.channel === GLOBAL_SIGNAL_CHANNEL);
78
+ if (broadcast) {
79
+ const name = state.entities[broadcast.sourceId]?.name ?? effects.flatMap(effect => effect.kind === 'entity.create' && effect.entityId === broadcast.sourceId ? [effect.name] : [])[0] ?? 'A broadcast';
80
+ return `${name}: ${observed ?? 'an announcement'}`.slice(0, 2000);
81
+ }
82
+ const signal = signals[0];
83
+ if (!signal)
84
+ return null;
85
+ const from = signal.sourcePlaceId ? state.places[signal.sourcePlaceId]?.name ?? signal.sourcePlaceId : 'nearby';
86
+ // What is seen is the thing itself, named by its kind, never by a name that may be someone's.
87
+ if (signal.channel === 'sight' && state.engine >= SIGHT_NAMED_ENGINE) {
88
+ const kindId = state.entities[signal.sourceId]?.kindId ?? effects.flatMap(effect => effect.kind === 'entity.create' && effect.entityId === signal.sourceId ? [effect.kindId] : [])[0];
89
+ const kind = kindId === undefined ? undefined : state.kinds[kindId]?.name;
90
+ if (kind)
91
+ return `${kind} can be seen ${signal.sourcePlaceId ? `at ${from}` : from}.`;
92
+ }
93
+ return `A ${signal.channel.replace(/-/gu, ' ')} reaches from ${from}.`;
94
+ }
95
+ export function importanceFloorForEffects(state, effects) {
96
+ const created = new Map(effects.filter((effect) => effect.kind === 'entity.create')
97
+ .map(effect => [effect.entityId, effect.kindId]));
98
+ let floor = 1;
99
+ for (const effect of effects) {
100
+ if (effect.kind !== 'property.set' || typeof effect.value !== 'number')
101
+ continue;
102
+ const kindId = state.entities[effect.entityId]?.kindId ?? created.get(effect.entityId);
103
+ if (!kindId)
104
+ continue;
105
+ for (const mechanic of state.kinds[kindId]?.mechanics ?? []) {
106
+ if (mechanic.kind !== 'trigger' || mechanic.propertyId !== effect.propertyId)
107
+ continue;
108
+ const active = mechanic.direction === 'at-least' ? effect.value >= mechanic.threshold : effect.value <= mechanic.threshold;
109
+ if (active)
110
+ floor = Math.max(floor, mechanic.minImportance ?? 1);
111
+ }
112
+ }
113
+ return floor;
114
+ }
115
+ // Reads during the reducer go through a copy-on-access table; a scan that only reads uses this key
116
+ // to look without copying.
117
+ export const PEEK_ENTITY = Symbol('peek-entity');
118
+ export function readEntity(state, entityId) {
119
+ const peek = state.entities[PEEK_ENTITY];
120
+ return peek ? peek(entityId) : state.entities[entityId];
121
+ }
122
+ // A placeless thing is in scope when it names nothing, like a world-wide rule, or when it names one of
123
+ // the given people, places or things, like a debt naming its debtor. A model call takes the newest
124
+ // few for each name, as recall does; rules and gates take them all.
125
+ // Each index object is replaced only when something it lists changes, so the order of the things
126
+ // it names is computed once per version of that index, however many commands read it.
127
+ const orderedIndexes = new WeakMap();
128
+ // The ids in an index from oldest to newest: least recently introduced first, then earliest created.
129
+ // An index lists things in creation order and keeps that order when a thing is re-pointed, as a
130
+ // reload does, so a stable sort by introduction chooses the same things before and after a reload.
131
+ function orderedIds(state, rawIndex) {
132
+ const index = isDraft(rawIndex) ? current(rawIndex) : rawIndex;
133
+ let ordered = orderedIndexes.get(index);
134
+ if (ordered === undefined) {
135
+ ordered = Object.keys(index).map(id => ({ id, seq: readEntity(state, id)?.introducedSeq ?? 0 }))
136
+ .sort((left, right) => left.seq - right.seq)
137
+ .map(item => item.id);
138
+ if (Object.isFrozen(index))
139
+ orderedIndexes.set(index, ordered);
140
+ }
141
+ return ordered;
142
+ }
143
+ // The things in an index whose kind carries a mechanic, computed once per version of that index.
144
+ const mechanicSubsets = new WeakMap();
145
+ function withMechanic(state, rawSource, mechanicKind) {
146
+ if (rawSource === undefined)
147
+ return [];
148
+ // Inside the reducer the index is a draft: its current value is the frozen original when this event
149
+ // has not touched it (a cache hit), or a fresh copy that this event changed (computed, not cached).
150
+ const source = isDraft(rawSource) ? current(rawSource) : rawSource;
151
+ let subsets = mechanicSubsets.get(source);
152
+ const cached = subsets?.get(mechanicKind);
153
+ if (cached !== undefined)
154
+ return cached;
155
+ const ids = Array.isArray(source) ? source : Object.keys(source);
156
+ const subset = ids.filter(id => state.kinds[readEntity(state, id)?.kindId ?? '']?.mechanics.some(mechanic => mechanic.kind === mechanicKind));
157
+ if (Object.isFrozen(source)) {
158
+ if (subsets === undefined) {
159
+ subsets = new Map();
160
+ mechanicSubsets.set(source, subsets);
161
+ }
162
+ subsets.set(mechanicKind, subset);
163
+ }
164
+ return subset;
165
+ }
166
+ // Every thing near the given names, or at the place, whose kind carries the mechanic: what a rule reads.
167
+ export function nearWithMechanic(state, nearIds, placeId, mechanicKind) {
168
+ const ids = new Set(withMechanic(state, state.worldEntityIds, mechanicKind));
169
+ for (const nearId of nearIds)
170
+ for (const entityId of withMechanic(state, state.globalEntityRefs[nearId], mechanicKind))
171
+ ids.add(entityId);
172
+ if (placeId !== null)
173
+ for (const entityId of withMechanic(state, state.entityPlaceIds[placeId], mechanicKind))
174
+ ids.add(entityId);
175
+ return [...ids];
176
+ }
177
+ export function placelessNear(state, nearIds, newestPerName = Number.POSITIVE_INFINITY) {
178
+ const newest = (index) => {
179
+ if (index === undefined)
180
+ return [];
181
+ const ordered = orderedIds(state, index);
182
+ return Number.isFinite(newestPerName) && ordered.length > newestPerName ? ordered.slice(ordered.length - newestPerName) : ordered;
183
+ };
184
+ const ids = new Set(newest(state.worldEntityIds));
185
+ for (const nearId of nearIds)
186
+ for (const entityId of newest(state.globalEntityRefs[nearId]))
187
+ ids.add(entityId);
188
+ return [...ids];
189
+ }
190
+ export function unindexPlaceless(state, entityId) {
191
+ const entity = state.entities[entityId];
192
+ if (!entity || entity.placeId !== null)
193
+ return;
194
+ delete state.worldEntityIds[entityId];
195
+ for (const ref of entityRefs(state.kinds, entity)) {
196
+ const named = state.globalEntityRefs[ref];
197
+ if (!named)
198
+ continue;
199
+ delete named[entityId];
200
+ if (Object.keys(named).length === 0)
201
+ delete state.globalEntityRefs[ref];
202
+ }
203
+ }
204
+ export function indexPlaceless(state, entityId) {
205
+ const entity = state.entities[entityId];
206
+ if (!entity || entity.placeId !== null)
207
+ return;
208
+ const refs = entityRefs(state.kinds, entity);
209
+ if (refs.length === 0)
210
+ state.worldEntityIds[entityId] = true;
211
+ for (const ref of refs)
212
+ (state.globalEntityRefs[ref] ??= {})[entityId] = true;
213
+ }
214
+ // A re-pointed thing leaves the names it no longer names and joins the new ones at the end; the
215
+ // names it keeps naming keep it where it was, so the index stays in creation order.
216
+ export function reindexPlaceless(state, entityId, previousRefs) {
217
+ const entity = state.entities[entityId];
218
+ if (!entity || entity.placeId !== null)
219
+ return;
220
+ const refs = entityRefs(state.kinds, entity);
221
+ const kept = new Set(refs);
222
+ for (const ref of previousRefs) {
223
+ if (kept.has(ref))
224
+ continue;
225
+ const named = state.globalEntityRefs[ref];
226
+ if (!named)
227
+ continue;
228
+ delete named[entityId];
229
+ if (Object.keys(named).length === 0)
230
+ delete state.globalEntityRefs[ref];
231
+ }
232
+ if (refs.length === 0)
233
+ state.worldEntityIds[entityId] = true;
234
+ else
235
+ delete state.worldEntityIds[entityId];
236
+ for (const ref of refs)
237
+ if (!previousRefs.includes(ref))
238
+ (state.globalEntityRefs[ref] ??= {})[entityId] = true;
239
+ }
240
+ // Every gate that holds on a subject now, with the action kinds it blocks. The engine's own
241
+ // action kinds are move, speak, message and act; a ruling's action kind names a specific act.
242
+ // Each gate also names who keeps its subject: the one its value names, or, when its value is no id,
243
+ // the others its thing names.
244
+ export function gatesOn(state, subjectId) {
245
+ const subjectPlaceId = state.people[subjectId]?.placeId ?? state.entities[subjectId]?.placeId ?? null;
246
+ const gates = [];
247
+ for (const entityId of nearWithMechanic(state, [subjectId], subjectPlaceId, 'gate')) {
248
+ const entity = readEntity(state, entityId);
249
+ const kind = state.kinds[entity.kindId];
250
+ for (const mechanic of kind.mechanics) {
251
+ if (mechanic.kind !== 'gate')
252
+ continue;
253
+ if (entity.properties[mechanic.subjectPropertyId]?.value !== subjectId)
254
+ continue;
255
+ const value = entity.properties[mechanic.propertyId]?.value;
256
+ // From engine 42 no one is kept in place by a hold they have on themselves.
257
+ if (state.engine >= SELF_HOLD_ENGINE && value === subjectId)
258
+ continue;
259
+ if (mechanic.atLeast !== undefined) {
260
+ const levels = ['none', 'low', 'medium', 'high'];
261
+ if (typeof value !== 'string' || !levels.includes(value)
262
+ || levels.indexOf(value) < levels.indexOf(mechanic.atLeast))
263
+ continue;
264
+ }
265
+ const keeperIds = (kind.properties.find(slot => slot.id === mechanic.propertyId)?.type === 'id' ? [value]
266
+ : kind.properties.filter(slot => slot.type === 'id' && slot.id !== mechanic.subjectPropertyId).map(slot => entity.properties[slot.id]?.value))
267
+ .filter((id) => typeof id === 'string');
268
+ if (value !== undefined && value !== false && value !== 0 && value !== 'none')
269
+ gates.push({ entityId: entity.id, name: entity.name, propertyId: mechanic.propertyId, actionKinds: mechanic.blockedActionKinds, keeperIds });
270
+ }
271
+ }
272
+ return gates;
273
+ }
274
+ // Someone else, there with the person, who can keep them where they are.
275
+ function keeps(state, personId, keeperId) {
276
+ const person = state.people[personId];
277
+ const keeper = state.people[keeperId];
278
+ return keeperId !== personId && person !== undefined && keeper !== undefined && keeper.placeId === person.placeId && keeper.away === undefined && keeper.departed === undefined;
279
+ }
280
+ // The gates that stop a person taking a kind of act now. A gate on moving holds only while another
281
+ // person there keeps them: with no keeper, a thing as keeper, or the keeper gone, it keeps no one.
282
+ // That only ever refuses less, so it holds at every engine and saved worlds replay as they were.
283
+ export function gatesAgainst(state, subjectId, actionKind) {
284
+ return gatesOn(state, subjectId).filter(gate => gate.actionKinds.includes(actionKind)
285
+ && (actionKind !== 'move' || gate.keeperIds.some(keeperId => keeps(state, subjectId, keeperId))));
286
+ }
287
+ // Kept where they are by the hold of another person who is there with them.
288
+ export function heldHere(state, personId) {
289
+ const held = state.people[personId]?.held;
290
+ return held !== undefined && held.byId !== null && keeps(state, personId, held.byId);
291
+ }
292
+ export function blockedByGate(state, subjectId, actionKind) {
293
+ return gatesAgainst(state, subjectId, actionKind)[0]?.entityId ?? null;
294
+ }
295
+ export function blockedActionKinds(state, subjectId) {
296
+ return [...new Set(gatesOn(state, subjectId).flatMap(gate => gate.actionKinds.filter(actionKind => actionKind !== 'move'
297
+ || gate.keeperIds.some(keeperId => keeps(state, subjectId, keeperId)))))].sort();
298
+ }
299
+ export function normViolationsFor(state, actorId, placeId, actionKind) {
300
+ const actor = state.people[actorId];
301
+ const violations = [];
302
+ const near = new Set([actorId, placeId, ...Object.values(state.people).filter(person => person.placeId === placeId).map(person => person.id)]);
303
+ for (const entityId of nearWithMechanic(state, near, placeId, 'norm')) {
304
+ const entity = readEntity(state, entityId);
305
+ for (const mechanic of state.kinds[entity.kindId].mechanics) {
306
+ if (mechanic.kind !== 'norm' || !mechanic.forbidden || mechanic.actionKind !== actionKind)
307
+ continue;
308
+ if (mechanic.roleId !== null && mechanic.roleId !== actor.roleId)
309
+ continue;
310
+ violations.push({ kind: 'norm.violation', normEntityId: entity.id, actionKind, actorId });
311
+ }
312
+ }
313
+ return violations;
314
+ }
315
+ export function spreadLevel(state, sourceId, propertyId, value, seq, at) {
316
+ const source = state.entities[sourceId];
317
+ const mechanics = state.kinds[source.kindId].mechanics.filter((mechanic) => mechanic.kind === 'spread' && mechanic.propertyId === propertyId);
318
+ for (const mechanic of mechanics) {
319
+ const queue = [{ entityId: sourceId, strength: LEVELS.indexOf(value) }];
320
+ const reached = new Map();
321
+ while (queue.length > 0) {
322
+ const current = queue.shift();
323
+ if (current.strength <= (reached.get(current.entityId) ?? -1))
324
+ continue;
325
+ reached.set(current.entityId, current.strength);
326
+ const entity = state.entities[current.entityId];
327
+ const relation = entity.relations[mechanic.relationId];
328
+ if (!relation)
329
+ continue;
330
+ const target = state.entities[relation.targetId];
331
+ if (!target)
332
+ continue;
333
+ const nextStrength = current.strength - 1;
334
+ if (nextStrength <= 0)
335
+ continue;
336
+ const property = state.kinds[target.kindId].properties.find(slot => slot.id === propertyId);
337
+ if (property?.type !== 'level')
338
+ continue;
339
+ const previous = target.properties[propertyId];
340
+ const previousStrength = previous && typeof previous.value === 'string' ? LEVELS.indexOf(previous.value) : -1;
341
+ if (nextStrength <= previousStrength)
342
+ continue;
343
+ const next = LEVELS[nextStrength];
344
+ target.properties[propertyId] = { value: next, changedSeq: seq, previousSeq: previous?.changedSeq ?? null, knownTo: [], updatedAt: at };
345
+ state.changes.push({ seq, entityId: target.id, slotKind: 'property', slotId: propertyId, value: next });
346
+ queue.push({ entityId: target.id, strength: nextStrength });
347
+ }
348
+ }
349
+ }
350
+ export function runTriggers(state, entityId, propertyId, previous, next, at, seq) {
351
+ const entity = state.entities[entityId];
352
+ for (const [index, mechanic] of state.kinds[entity.kindId].mechanics.entries()) {
353
+ if (mechanic.kind !== 'trigger' || mechanic.propertyId !== propertyId)
354
+ continue;
355
+ const crossed = mechanic.direction === 'at-least'
356
+ ? (previous === null || previous < mechanic.threshold) && next >= mechanic.threshold
357
+ : (previous === null || previous > mechanic.threshold) && next <= mechanic.threshold;
358
+ if (!crossed)
359
+ continue;
360
+ // A thing made already past the threshold joins a check of its kind and trigger pending at its
361
+ // place; a change to a thing that was already there always arms its own.
362
+ const series = generatedId(state.engine, 'trigger', [entity.kindId, index], `trigger-${entity.kindId}-${index}`.slice(0, 64));
363
+ const once = state.engine >= ONE_CHECK_ENGINE;
364
+ if (once && entity.introducedSeq === seq && state.schedule.some(item => item.series === series && item.placeId === entity.placeId))
365
+ continue;
366
+ const id = generatedId(state.engine, 'trigger', [entityId, propertyId, seq, index], undefined, true);
367
+ if (state.engine >= BOUNDED_IDENTIFIERS_ENGINE && plain(state.schedule).some(item => item.id === id))
368
+ continue;
369
+ insertScheduled(state, {
370
+ id, at: at + mechanic.delayMinutes,
371
+ personId: null, kind: 'world', intent: mechanic.intent, placeId: entity.placeId,
372
+ targetId: entityId, sourceSeq: seq, importance: mechanic.minImportance ?? 5, ...(once ? { series } : {}),
373
+ });
374
+ }
375
+ }
376
+ // Engines from 32 on keep a growing value as its last written value, the time it was written, and
377
+ // the rates of its time changes. Readers see the value at their own time, and each threshold it will
378
+ // cross is scheduled when the value is written, so no event has to touch every growing thing.
379
+ export const LAZY_METER_ENGINE = 32;
380
+ // From this engine on, gates block speech and messages in the reducer as well as movement.
381
+ export const ACT_GATE_ENGINE = 36;
382
+ export const TIDY_PLACE_INDEX_ENGINE = 39;
383
+ // From this engine on, recovery is decided where an event happens, never from another place.
384
+ export const LOCAL_RECOVERY_ENGINE = 36;
385
+ function meterRate(state, entity, propertyId) {
386
+ return state.kinds[entity.kindId].mechanics.reduce((rate, mechanic) => mechanic.kind === 'change' && mechanic.propertyId === propertyId && !mechanic.onEvent ? rate + mechanic.deltaPerMinute : rate, 0);
387
+ }
388
+ export function currentValue(state, entity, propertyId, at) {
389
+ const slot = entity.properties[propertyId];
390
+ if (!slot || typeof slot.value !== 'number' || at <= slot.updatedAt)
391
+ return slot?.value;
392
+ return slot.value + (at - slot.updatedAt) * meterRate(state, entity, propertyId);
393
+ }
394
+ // The schedule stays ordered by time and id; a new item goes after any equal one.
395
+ // A large list read through a draft copies itself on the first element read; scans that change
396
+ // nothing read the underlying list instead.
397
+ export function plain(value) {
398
+ return isDraft(value) ? original(value) : value;
399
+ }
400
+ export function insertScheduled(state, item, list = 'schedule') {
401
+ if (state.engine >= FULL_SCHEDULE_INTENT_ENGINE) {
402
+ const parsed = scheduledSchema.safeParse(item);
403
+ if (!parsed.success)
404
+ throw new LivingWorldError('effect-invalid', `Generated schedule is invalid: ${parsed.error.message}`);
405
+ }
406
+ // Inside the reducer, splicing a large draft array traps every shifted element; one plain copy does not.
407
+ let items = state[list];
408
+ if (isDraft(items)) {
409
+ // An unchanged draft's current value is the previous state's own array, so copy it.
410
+ items = current(items).slice();
411
+ state[list] = items;
412
+ }
413
+ let low = 0;
414
+ let high = items.length;
415
+ while (low < high) {
416
+ const middle = (low + high) >> 1;
417
+ const other = items[middle];
418
+ if (other.at < item.at || (other.at === item.at && other.id <= item.id))
419
+ low = middle + 1;
420
+ else
421
+ high = middle;
422
+ }
423
+ items.splice(low, 0, item);
424
+ }
425
+ // A prediction's id names its thing, slot, the write it was made from and its trigger.
426
+ function predictedSlot(item) {
427
+ if (!item.id.startsWith('meter-') || item.targetId === null)
428
+ return null;
429
+ if (item.prediction)
430
+ return { entityId: item.targetId, ...item.prediction };
431
+ const tail = `-${item.sourceSeq}-`;
432
+ const cut = item.id.lastIndexOf(tail);
433
+ return { entityId: item.targetId, propertyId: item.id.slice(`meter-${item.targetId}-`.length, cut), index: Number(item.id.slice(cut + tail.length)) };
434
+ }
435
+ // A prediction holds only while the value it was made from is unchanged. A later write makes its own
436
+ // predictions, and the older ones are dropped when they come due. A thing outside the loaded part of
437
+ // the world cannot be checked, so its prediction waits until the thing is loaded again.
438
+ export function stalePrediction(state, item) {
439
+ const slot = predictedSlot(item);
440
+ if (slot === null)
441
+ return false;
442
+ const entity = readEntity(state, slot.entityId);
443
+ return entity !== undefined && entity.properties[slot.propertyId]?.changedSeq !== item.sourceSeq;
444
+ }
445
+ export function predictionReady(state, item) {
446
+ const slot = predictedSlot(item);
447
+ return slot === null || (readEntity(state, slot.entityId) !== undefined && !stalePrediction(state, item));
448
+ }
449
+ // Stale due predictions go; a due one on a thing that is not loaded waits without holding back the rest.
450
+ export function dropStalePredictions(state, now) {
451
+ // Reading an element through a draft copies the whole list; a read-only scan reads the list itself.
452
+ const items = plain(state.meterSchedule);
453
+ let due = 0;
454
+ let stale = 0;
455
+ while (due < items.length && items[due].at <= now) {
456
+ if (stalePrediction(state, items[due]))
457
+ stale += 1;
458
+ due += 1;
459
+ }
460
+ if (stale === 0)
461
+ return;
462
+ state.meterSchedule = [...items.slice(0, due).filter(item => !stalePrediction(state, item)), ...items.slice(due)];
463
+ }
464
+ // Before a growing slot is written, a crossing its value already made stays a real event: its
465
+ // prediction moves to the schedule, where the new write cannot erase it.
466
+ export function keepPassedCrossings(state, entityId, propertyId, at) {
467
+ const entity = state.entities[entityId];
468
+ const slot = entity?.properties[propertyId];
469
+ if (!entity || !slot)
470
+ return;
471
+ const delays = state.kinds[entity.kindId].mechanics.map(mechanic => mechanic.kind === 'trigger' ? mechanic.delayMinutes : 0);
472
+ const latest = at + Math.max(0, ...delays);
473
+ const passed = plain(state.meterSchedule).filter(item => {
474
+ if (item.at > latest || item.sourceSeq !== slot.changedSeq)
475
+ return false;
476
+ const predicted = predictedSlot(item);
477
+ return predicted !== null && predicted.entityId === entityId && predicted.propertyId === propertyId
478
+ && item.at - (delays[predicted.index] ?? 0) <= at;
479
+ });
480
+ if (passed.length === 0)
481
+ return;
482
+ const ids = new Set(passed.map(item => item.id));
483
+ state.meterSchedule = (isDraft(state.meterSchedule) ? current(state.meterSchedule) : state.meterSchedule).filter(item => !ids.has(item.id));
484
+ for (const item of passed) {
485
+ const slot = predictedSlot(item);
486
+ const { prediction: _prediction, ...settled } = item;
487
+ insertScheduled(state, { ...settled, id: generatedId(state.engine, 'trigger', [slot.entityId, slot.propertyId, item.sourceSeq, slot.index], `trigger-${item.id.slice('meter-'.length)}`, true) });
488
+ }
489
+ }
490
+ export function predictCrossings(state, entityId, propertyId, seq) {
491
+ // An event can write a slot more than once. Only its final value predicts future crossings.
492
+ if (state.engine >= BOUNDED_IDENTIFIERS_ENGINE && plain(state.meterSchedule).some(item => item.targetId === entityId
493
+ && item.prediction?.propertyId === propertyId && item.sourceSeq === seq)) {
494
+ state.meterSchedule = plain(state.meterSchedule).filter(item => item.targetId !== entityId
495
+ || item.prediction?.propertyId !== propertyId || item.sourceSeq !== seq);
496
+ }
497
+ const entity = state.entities[entityId];
498
+ const slot = entity.properties[propertyId];
499
+ const rate = meterRate(state, entity, propertyId);
500
+ if (!slot || typeof slot.value !== 'number' || rate === 0)
501
+ return;
502
+ for (const [index, mechanic] of state.kinds[entity.kindId].mechanics.entries()) {
503
+ if (mechanic.kind !== 'trigger' || mechanic.propertyId !== propertyId)
504
+ continue;
505
+ const gap = mechanic.threshold - slot.value;
506
+ const ahead = mechanic.direction === 'at-least' ? rate > 0 && gap > 0 : rate < 0 && gap < 0;
507
+ if (!ahead)
508
+ continue;
509
+ insertScheduled(state, {
510
+ id: generatedId(state.engine, 'meter', [entityId, propertyId, seq, index], undefined, true), at: slot.updatedAt + Math.ceil(gap / rate) + mechanic.delayMinutes,
511
+ personId: null, kind: 'world', intent: mechanic.intent, placeId: entity.placeId,
512
+ targetId: entityId, sourceSeq: seq, importance: mechanic.minImportance ?? 5,
513
+ ...(state.engine >= BOUNDED_IDENTIFIERS_ENGINE ? { prediction: { propertyId, index } } : {}),
514
+ }, 'meterSchedule');
515
+ }
516
+ }
517
+ export function advanceScopedEntities(state, placeId, to, seq) {
518
+ const ids = [...state.globalEntityIds, ...(placeId === null ? [] : state.entityPlaceIds[placeId] ?? [])];
519
+ for (const entityId of ids) {
520
+ const entity = state.entities[entityId];
521
+ for (const mechanic of state.kinds[entity.kindId].mechanics) {
522
+ if (mechanic.kind !== 'change')
523
+ continue;
524
+ const slot = entity.properties[mechanic.propertyId];
525
+ if (!slot || typeof slot.value !== 'number' || slot.updatedAt >= to)
526
+ continue;
527
+ const previous = slot.value;
528
+ const next = previous + (to - slot.updatedAt) * mechanic.deltaPerMinute;
529
+ if (!Number.isFinite(next))
530
+ throw new Error(`Property ${mechanic.propertyId} exceeds a finite number`);
531
+ entity.properties[mechanic.propertyId] = { ...slot, value: next, changedSeq: seq, previousSeq: slot.changedSeq, updatedAt: to };
532
+ state.changes.push({ seq, entityId: entity.id, slotKind: 'property', slotId: mechanic.propertyId, value: next });
533
+ runTriggers(state, entity.id, mechanic.propertyId, previous, next, to, seq);
534
+ }
535
+ }
536
+ }
537
+ export function applyEventChanges(state, event) {
538
+ for (const effect of event.effects) {
539
+ if (effect.kind !== 'move' || event.actorId !== effect.personId)
540
+ continue;
541
+ for (const entityId of state.entityMoveSubjectIds[effect.personId] ?? []) {
542
+ const entity = state.entities[entityId];
543
+ for (const mechanic of state.kinds[entity.kindId].mechanics) {
544
+ if (mechanic.kind !== 'change' || mechanic.onEvent?.kind !== 'move')
545
+ continue;
546
+ if (entity.properties[mechanic.onEvent.subjectPropertyId]?.value !== effect.personId)
547
+ continue;
548
+ const lazy = state.engine >= LAZY_METER_ENGINE;
549
+ const previous = entity.properties[mechanic.propertyId];
550
+ const previousValue = lazy ? currentValue(state, entity, mechanic.propertyId, event.at) : previous?.value;
551
+ if (previousValue === mechanic.onEvent.value)
552
+ continue;
553
+ if (lazy)
554
+ keepPassedCrossings(state, entity.id, mechanic.propertyId, event.at);
555
+ entity.properties[mechanic.propertyId] = {
556
+ value: mechanic.onEvent.value, changedSeq: event.seq, previousSeq: previous?.changedSeq ?? null,
557
+ knownTo: [...new Set([...(previous?.knownTo ?? []), ...event.effects.flatMap(item => item.kind === 'move' ? [item.personId] : [])])],
558
+ updatedAt: event.at,
559
+ };
560
+ if (entity.placeId !== effect.placeId) {
561
+ unindexPlaceless(state, entity.id);
562
+ if (entity.placeId === null)
563
+ state.globalEntityIds = state.globalEntityIds.filter(id => id !== entity.id);
564
+ else {
565
+ const left = (state.entityPlaceIds[entity.placeId] ?? []).filter(id => id !== entity.id);
566
+ // From this engine a place with nothing left has no list, as when a save is loaded.
567
+ if (left.length === 0 && state.engine >= TIDY_PLACE_INDEX_ENGINE)
568
+ delete state.entityPlaceIds[entity.placeId];
569
+ else
570
+ state.entityPlaceIds[entity.placeId] = left;
571
+ }
572
+ ;
573
+ (state.entityPlaceIds[effect.placeId] ??= []).push(entity.id);
574
+ entity.placeId = effect.placeId;
575
+ if (plain(state.meterSchedule).some(item => item.targetId === entity.id)) {
576
+ state.meterSchedule = (isDraft(state.meterSchedule) ? current(state.meterSchedule) : state.meterSchedule)
577
+ .map(item => item.targetId === entity.id ? { ...item, placeId: effect.placeId } : item);
578
+ }
579
+ }
580
+ state.changes.push({ seq: event.seq, entityId: entity.id, slotKind: 'property', slotId: mechanic.propertyId, value: mechanic.onEvent.value });
581
+ if (typeof mechanic.onEvent.value === 'number')
582
+ runTriggers(state, entity.id, mechanic.propertyId, typeof previousValue === 'number' ? previousValue : null, mechanic.onEvent.value, event.at, event.seq);
583
+ if (lazy)
584
+ predictCrossings(state, entity.id, mechanic.propertyId, event.seq);
585
+ }
586
+ }
587
+ }
588
+ }
@@ -0,0 +1,25 @@
1
+ import type { LivingInferenceCall } from './inference.js';
2
+ export declare const LIVING_INPUT_BUDGETS: {
3
+ readonly attempt: 16000;
4
+ readonly world: 16000;
5
+ readonly 'speech-impact': 16000;
6
+ readonly reaction: 32000;
7
+ readonly reply: 32000;
8
+ readonly plan: 14000;
9
+ readonly 'message-reply': 16000;
10
+ readonly epilogue: 12000;
11
+ readonly define: 12000;
12
+ };
13
+ export declare const LIVING_RESPONSE_SCHEMA_BUDGET = 96000;
14
+ export declare const MODEL_VIEW_NOTE = "Selected context: other people and facts remain in the world. Descriptions may be excerpts. Use only the IDs shown; omission does not mean absence.";
15
+ export declare function assertLivingModelCall(call: Pick<LivingInferenceCall, 'phase' | 'input' | 'responseSchema'>): void;
16
+ type Data = Record<string, unknown>;
17
+ export declare function decisionInputBudget(input: Data, ordinaryBudget: number): number;
18
+ export declare const MODEL_PEOPLE_LIMIT = 24;
19
+ export declare function selectModelPeople(input: Data, close: ReadonlySet<string>): ReadonlySet<string>;
20
+ export declare function syncModelPeople(input: Data): void;
21
+ export declare function modelTextExcerpt(text: string, limit?: number): string;
22
+ export declare function compactModelInput(input: Data, budget: number, priority: ReadonlySet<string>, maximum?: number, things?: ReadonlySet<string>): void;
23
+ export declare function withContextLookup(schema: Readonly<Data>, input: Readonly<Data>): Readonly<Data>;
24
+ export declare function contextSelectionInput(input: Readonly<Data>): Data;
25
+ export {};