@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,131 @@
1
+ import type { SimulationDefinitionV1, SimulationDynamicMechanicDefinitionV1, SimulationDynamicPlayFrameV1 as DynamicPlayFrame } from '../../plugin/simulation_contract.js';
2
+ type MilestoneBase = {
3
+ id: string;
4
+ label: string;
5
+ act?: 1 | 2 | 3;
6
+ };
7
+ export type MilestoneRule = (MilestoneBase & {
8
+ kind: 'resource';
9
+ resourceId: string;
10
+ comparator: 'at-least' | 'at-most';
11
+ value: number;
12
+ }) | (MilestoneBase & {
13
+ kind: 'records';
14
+ objectKind: string;
15
+ status?: string | readonly string[];
16
+ minimum: number;
17
+ }) | (MilestoneBase & {
18
+ kind: 'beats';
19
+ minimum: number;
20
+ });
21
+ export type ActStatus = 'done' | 'current' | 'locked';
22
+ export type ActView = {
23
+ number: number;
24
+ title: string;
25
+ status: ActStatus;
26
+ met: number;
27
+ milestones: readonly MilestoneState[];
28
+ };
29
+ export declare function groupActs(rules: readonly MilestoneRule[], states: readonly MilestoneState[], version?: 'completed-acts-v1'): ActView[];
30
+ export type MilestoneState = {
31
+ id: string;
32
+ label: string;
33
+ met: boolean;
34
+ progress: string;
35
+ };
36
+ export type SimulationCatalogEntry = SimulationDefinitionV1 & {
37
+ milestones: readonly MilestoneRule[];
38
+ glossary: readonly string[];
39
+ };
40
+ export declare function evaluateMilestones(rules: readonly MilestoneRule[], frame: Pick<DynamicPlayFrame, 'world' | 'domainObjects' | 'revision'>): readonly MilestoneState[];
41
+ export declare function summarizeMilestones(states: readonly MilestoneState[]): string;
42
+ export type MilestoneRelationKind = 'may-advance' | 'tests' | 'tradeoff';
43
+ export type MilestoneRelationCondition = {
44
+ source: 'intent';
45
+ parameter: string;
46
+ equals: string;
47
+ } | {
48
+ source: 'object';
49
+ parameter: string;
50
+ objectKind: string;
51
+ field: string;
52
+ equals: string;
53
+ status?: string;
54
+ };
55
+ export type MilestoneRelation = {
56
+ mechanic: string;
57
+ milestoneId: string;
58
+ relation: MilestoneRelationKind;
59
+ why: string;
60
+ when?: readonly MilestoneRelationCondition[];
61
+ };
62
+ export type ChoiceMilestoneLink = {
63
+ actionId: string;
64
+ milestoneId: string;
65
+ relation: MilestoneRelationKind;
66
+ why: string;
67
+ };
68
+ export type DynamicPublicProgress = {
69
+ relations?: readonly MilestoneRelation[];
70
+ choiceLinks?: {
71
+ revision: number;
72
+ links: readonly ChoiceMilestoneLink[];
73
+ };
74
+ revision: number;
75
+ rules: readonly MilestoneRule[];
76
+ milestones: readonly MilestoneState[];
77
+ acts: readonly ActView[];
78
+ allTargetsMet: boolean;
79
+ };
80
+ export declare function evaluatePublicProgress(rules: readonly MilestoneRule[], frame: Pick<DynamicPlayFrame, 'world' | 'domainObjects' | 'revision'>, relations?: readonly MilestoneRelation[], mechanics?: readonly SimulationDynamicMechanicDefinitionV1[], version?: 'completed-acts-v1'): DynamicPublicProgress;
81
+ export declare function withPublicChoiceLinks(progress: DynamicPublicProgress, frame: Pick<DynamicPlayFrame, 'revision' | 'availableActions' | 'domainObjects'>): DynamicPublicProgress;
82
+ /** A chapter is one act. The player earns its result inside this many decisions. */
83
+ export declare const CHAPTER_MIN_DECISIONS = 5;
84
+ export declare const CHAPTER_MAX_DECISIONS = 8;
85
+ export type ChapterResult = 'open' | 'win' | 'mixed' | 'loss';
86
+ export type ChapterStanding = {
87
+ act: number;
88
+ acts: number;
89
+ decisions: number;
90
+ /** Decisions that did real work: accepted, and not an abandonment. Only these earn a win. */
91
+ workingDecisions: number;
92
+ decisionsLeft: number;
93
+ goals: readonly {
94
+ id: string;
95
+ label: string;
96
+ met: boolean;
97
+ share: number;
98
+ }[];
99
+ /** Mean progress over the act's goals, from the chapter's start toward each target. */
100
+ score: number;
101
+ /** Meters that end the chapter as a loss at their bad end, with the share of starting room left. */
102
+ dangers: readonly {
103
+ resourceId: string;
104
+ label: string;
105
+ value: number;
106
+ bound: number;
107
+ room: number;
108
+ }[];
109
+ result: ChapterResult;
110
+ lossCause: null | {
111
+ kind: 'meter';
112
+ resourceId: string;
113
+ label: string;
114
+ } | {
115
+ kind: 'out-of-decisions';
116
+ };
117
+ };
118
+ /**
119
+ * Code decides a chapter's result from public state alone. A loss is checked first: a meter at its bad end,
120
+ * or the decisions spent under half way. A win needs every goal of the act and at least the minimum decisions.
121
+ * A meter that starts at its bad end (a count that begins at zero) can never be a way to lose.
122
+ */
123
+ export declare function evaluateChapterStanding(input: {
124
+ rules: readonly MilestoneRule[];
125
+ act: number;
126
+ decisions: number;
127
+ workingDecisions: number;
128
+ frame: Pick<DynamicPlayFrame, 'world' | 'domainObjects' | 'revision'>;
129
+ startResources: Readonly<Record<string, number>>;
130
+ }): ChapterStanding;
131
+ export {};
@@ -0,0 +1,214 @@
1
+ const PUBLIC_PROGRESS_MAX_BYTES = 16_384;
2
+ const publicProgressBytes = (value) => new TextEncoder().encode(JSON.stringify(value)).length;
3
+ // The first incomplete act sets the current focus; later conditions can already be satisfied.
4
+ export function groupActs(rules, states, version) {
5
+ const stateById = new Map(states.map(state => [state.id, state]));
6
+ const numbers = [...new Set(rules.map(rule => rule.act ?? 1))].sort((left, right) => left - right);
7
+ let opened = true;
8
+ return numbers.map((number) => {
9
+ const milestones = rules
10
+ .filter(rule => (rule.act ?? 1) === number)
11
+ .flatMap(rule => { const state = stateById.get(rule.id); return state === undefined ? [] : [state]; });
12
+ const met = milestones.filter(state => state.met).length;
13
+ const complete = milestones.length > 0 && met === milestones.length;
14
+ const status = complete && version === 'completed-acts-v1' ? 'done' : !opened ? 'locked' : complete ? 'done' : 'current';
15
+ if (!complete)
16
+ opened = false;
17
+ return { number, title: `Act ${number} of ${numbers.length}`, status, met, milestones };
18
+ });
19
+ }
20
+ // Milestones read only what the player can see: public meters, visible records, and the beat.
21
+ export function evaluateMilestones(rules, frame) {
22
+ return rules.map((rule) => {
23
+ if (rule.kind === 'resource') {
24
+ const resource = frame.world.find(candidate => candidate.id === rule.resourceId);
25
+ if (resource === undefined)
26
+ return { id: rule.id, label: rule.label, met: false, progress: 'Not visible yet' };
27
+ if (rule.comparator === 'at-least') {
28
+ return { id: rule.id, label: rule.label, met: resource.value >= rule.value, progress: `${resource.label} ${resource.value} of ${rule.value}` };
29
+ }
30
+ const met = resource.value <= rule.value;
31
+ return {
32
+ id: rule.id,
33
+ label: rule.label,
34
+ met,
35
+ progress: met ? `${resource.label} ${resource.value}, held` : `${resource.label} ${resource.value}, needs ${rule.value} or less`,
36
+ };
37
+ }
38
+ if (rule.kind === 'records') {
39
+ // A status list names each currently qualifying record state.
40
+ const statuses = rule.status === undefined ? undefined : typeof rule.status === 'string' ? [rule.status] : [...rule.status];
41
+ const count = frame.domainObjects.filter(object => (object.kind === rule.objectKind && (statuses === undefined || statuses.includes(object.status)))).length;
42
+ const noun = `${rule.objectKind.replaceAll('-', ' ')}${rule.minimum === 1 ? '' : 's'}`;
43
+ const state = statuses === undefined ? '' : ` ${statuses.join(' or ')}`;
44
+ return { id: rule.id, label: rule.label, met: count >= rule.minimum, progress: `${Math.min(count, rule.minimum)} of ${rule.minimum} ${noun}${state}` };
45
+ }
46
+ return { id: rule.id, label: rule.label, met: frame.revision >= rule.minimum, progress: `Beat ${Math.min(frame.revision, rule.minimum)} of ${rule.minimum}` };
47
+ });
48
+ }
49
+ export function summarizeMilestones(states) {
50
+ if (states.length === 0)
51
+ return 'No milestones yet';
52
+ const met = states.filter(state => state.met).length;
53
+ return `${met} of ${states.length} milestone${states.length === 1 ? '' : 's'} met`;
54
+ }
55
+ export function evaluatePublicProgress(rules, frame, relations = [], mechanics = [], version) {
56
+ if (rules.length > 32 || rules.some(rule => (rule.id.length > 100 || rule.label.length > 160
57
+ || (rule.kind === 'resource' && rule.resourceId.length > 100)
58
+ || (rule.kind === 'records' && (rule.objectKind.length > 100
59
+ || (typeof rule.status === 'string' ? rule.status.length > 100
60
+ : rule.status !== undefined && (rule.status.length > 16 || rule.status.some(status => status.length > 100))))))))
61
+ throw new Error('Public milestone definitions exceed their context bounds');
62
+ const milestones = evaluateMilestones(rules, frame);
63
+ const projection = {
64
+ revision: frame.revision,
65
+ rules: structuredClone(rules),
66
+ relations: publicMilestoneRelations(rules, relations, mechanics, frame.domainObjects),
67
+ milestones,
68
+ acts: groupActs(rules, milestones, version),
69
+ allTargetsMet: milestones.length > 0 && milestones.every(state => state.met),
70
+ };
71
+ if (publicProgressBytes(projection) > PUBLIC_PROGRESS_MAX_BYTES) {
72
+ throw new Error('Public milestone projection exceeds its context budget');
73
+ }
74
+ return projection;
75
+ }
76
+ function publicMilestoneRelations(rules, relations, mechanics, objects) {
77
+ const ids = new Set(rules.map(rule => rule.id));
78
+ const seen = new Set();
79
+ return relations.slice(0, 64).flatMap(relation => {
80
+ const mechanic = mechanics.find(item => item.id === relation.mechanic && item.actor !== 'game-master');
81
+ if (!mechanic || !ids.has(relation.milestoneId)
82
+ || !['may-advance', 'tests', 'tradeoff'].includes(relation.relation)
83
+ || relation.why.trim().length === 0 || relation.why.length > 160
84
+ || (relation.when?.length ?? 0) > 2)
85
+ return [];
86
+ const conditions = relation.when ?? [];
87
+ if (conditions.some(condition => {
88
+ const parameter = mechanic.intentParameters.find(item => item.id === condition.parameter);
89
+ if (!parameter || condition.equals.length > 100)
90
+ return true;
91
+ if (condition.source === 'intent')
92
+ return parameter.kind !== 'enum' || !parameter.values.includes(condition.equals);
93
+ return parameter.kind !== 'object-reference' || !parameter.objectKinds.includes(condition.objectKind)
94
+ || condition.field.length === 0 || condition.field.length > 100 || (condition.status?.length ?? 0) > 100
95
+ || !objects.some(object => object.kind === condition.objectKind && Object.hasOwn(object.data, condition.field));
96
+ }))
97
+ return [];
98
+ const clean = {
99
+ mechanic: relation.mechanic, milestoneId: relation.milestoneId,
100
+ relation: relation.relation, why: relation.why,
101
+ ...(conditions.length === 0 ? {} : { when: conditions.map(condition => condition.source === 'intent'
102
+ ? { source: condition.source, parameter: condition.parameter, equals: condition.equals }
103
+ : { source: condition.source, parameter: condition.parameter, objectKind: condition.objectKind,
104
+ field: condition.field, equals: condition.equals,
105
+ ...(condition.status === undefined ? {} : { status: condition.status }) }) }),
106
+ };
107
+ const key = JSON.stringify(clean);
108
+ if (seen.has(key))
109
+ return [];
110
+ seen.add(key);
111
+ return [clean];
112
+ });
113
+ }
114
+ function isIntentObject(value) {
115
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
116
+ }
117
+ // Relations annotate accepted public choices. They do not calculate legality or effects.
118
+ export function withPublicChoiceLinks(progress, frame) {
119
+ const links = [];
120
+ if (progress.revision === frame.revision) {
121
+ for (const action of frame.availableActions.slice(0, 4)) {
122
+ const intent = action.parameters.intent;
123
+ if (!isIntentObject(intent))
124
+ continue;
125
+ const seen = new Set();
126
+ for (const relation of progress.relations ?? []) {
127
+ const milestone = progress.milestones.find(item => item.id === relation.milestoneId);
128
+ if (relation.mechanic !== action.mechanic || !milestone
129
+ || (relation.relation === 'may-advance' && milestone.met)
130
+ || seen.has(relation.milestoneId) || seen.size >= 4)
131
+ continue;
132
+ const matches = (relation.when ?? []).every(condition => {
133
+ if (condition.source === 'intent')
134
+ return intent[condition.parameter] === condition.equals;
135
+ const object = frame.domainObjects.find(item => item.id === intent[condition.parameter] && item.kind === condition.objectKind);
136
+ return object !== undefined && (condition.status === undefined || object.status === condition.status)
137
+ && object.data[condition.field] === condition.equals;
138
+ });
139
+ if (!matches)
140
+ continue;
141
+ seen.add(relation.milestoneId);
142
+ links.push({ actionId: action.id, milestoneId: relation.milestoneId, relation: relation.relation, why: relation.why });
143
+ }
144
+ }
145
+ }
146
+ const { choiceLinks: _previous, ...base } = progress;
147
+ if (publicProgressBytes(base) > PUBLIC_PROGRESS_MAX_BYTES) {
148
+ throw new Error('Public milestone projection exceeds its context budget');
149
+ }
150
+ const result = { ...base, choiceLinks: { revision: frame.revision, links } };
151
+ while (links.length > 0 && publicProgressBytes(result) > PUBLIC_PROGRESS_MAX_BYTES)
152
+ links.pop();
153
+ return publicProgressBytes(result) <= PUBLIC_PROGRESS_MAX_BYTES ? result : base;
154
+ }
155
+ /** A chapter is one act. The player earns its result inside this many decisions. */
156
+ export const CHAPTER_MIN_DECISIONS = 5;
157
+ export const CHAPTER_MAX_DECISIONS = 8;
158
+ const clampShare = (value) => Math.min(1, Math.max(0, value));
159
+ /**
160
+ * Code decides a chapter's result from public state alone. A loss is checked first: a meter at its bad end,
161
+ * or the decisions spent under half way. A win needs every goal of the act and at least the minimum decisions.
162
+ * A meter that starts at its bad end (a count that begins at zero) can never be a way to lose.
163
+ */
164
+ export function evaluateChapterStanding(input) {
165
+ const { rules, act, decisions, workingDecisions, frame, startResources } = input;
166
+ const actRules = rules.filter(rule => (rule.act ?? 1) === act);
167
+ if (actRules.length === 0)
168
+ throw new Error(`Act ${act} has no goals`);
169
+ const states = evaluateMilestones(actRules, frame);
170
+ const goals = actRules.map((rule, index) => {
171
+ const met = states[index].met;
172
+ return { id: rule.id, label: rule.label, met, share: met ? 1 : unmetGoalShare(rule, frame, startResources) };
173
+ });
174
+ const score = goals.reduce((total, goal) => total + goal.share, 0) / goals.length;
175
+ const dangers = frame.world.flatMap((meter) => {
176
+ if (meter.dangerDirection === 'none' || meter.initial === undefined)
177
+ return [];
178
+ const bound = meter.dangerDirection === 'low' ? meter.minimum : meter.maximum;
179
+ if (meter.initial === bound)
180
+ return [];
181
+ return [{ resourceId: meter.id, label: meter.label, value: meter.value, bound, room: clampShare((meter.value - bound) / (meter.initial - bound)) }];
182
+ });
183
+ const spent = dangers.find(danger => danger.value === danger.bound);
184
+ const allMet = goals.every(goal => goal.met);
185
+ const outOfDecisions = decisions >= CHAPTER_MAX_DECISIONS;
186
+ // A win is earned: the goals are met and the player's own decisions did real work at least the minimum number of times.
187
+ const result = spent !== undefined ? 'loss'
188
+ : allMet && workingDecisions >= CHAPTER_MIN_DECISIONS ? 'win'
189
+ : !outOfDecisions ? 'open'
190
+ : score >= 0.5 ? 'mixed' : 'loss';
191
+ return {
192
+ act, acts: new Set(rules.map(rule => rule.act ?? 1)).size, decisions, workingDecisions,
193
+ decisionsLeft: Math.max(0, CHAPTER_MAX_DECISIONS - decisions), goals, score, dangers, result,
194
+ lossCause: result !== 'loss' ? null : spent !== undefined ? { kind: 'meter', resourceId: spent.resourceId, label: spent.label } : { kind: 'out-of-decisions' },
195
+ };
196
+ }
197
+ /** How far an unmet goal has come, from the chapter's start toward its target. */
198
+ function unmetGoalShare(rule, frame, startResources) {
199
+ if (rule.kind === 'resource') {
200
+ const meter = frame.world.find(candidate => candidate.id === rule.resourceId);
201
+ const start = startResources[rule.resourceId] ?? meter?.initial;
202
+ if (meter === undefined || start === undefined || start === rule.value)
203
+ return 0;
204
+ return clampShare((meter.value - start) / (rule.value - start));
205
+ }
206
+ if (rule.kind === 'records') {
207
+ const statuses = rule.status === undefined ? undefined : typeof rule.status === 'string' ? [rule.status] : rule.status;
208
+ const count = frame.domainObjects.filter(object => object.kind === rule.objectKind && (statuses === undefined || statuses.includes(object.status))).length;
209
+ return clampShare(count / rule.minimum);
210
+ }
211
+ if (rule.kind === 'beats')
212
+ return clampShare(frame.revision / rule.minimum);
213
+ return 0;
214
+ }
@@ -0,0 +1,9 @@
1
+ import type { SimulationDomainActionProposalV1, SimulationDynamicAgentViewV1, SimulationDynamicDomainObjectV1, SimulationDynamicDomainObjectViewV1, SimulationDynamicHistoryEntryV1, SimulationDynamicPlayFrameV1, SimulationDynamicResourceDefinitionV1, SimulationDynamicWorldEffectV1, SimulationDynamicWorldEffectViewV1, SimulationGmProposalV1, SimulationPersistentAgentStateV1 } from '../../plugin/simulation_contract.js';
2
+ type PublicResourceDefinition = Pick<SimulationDynamicResourceDefinitionV1, 'id' | 'label' | 'visibility'>;
3
+ export declare function projectDynamicPlayerDecision(history: readonly SimulationDynamicHistoryEntryV1[]): NonNullable<SimulationDynamicPlayFrameV1['playerDecision']> | null;
4
+ export declare function projectDynamicTimeline(history: readonly SimulationDynamicHistoryEntryV1[], agents: readonly SimulationPersistentAgentStateV1[]): SimulationDynamicPlayFrameV1['timeline'];
5
+ export declare function projectDynamicAgents(agents: readonly SimulationPersistentAgentStateV1[], history: readonly SimulationDynamicHistoryEntryV1[], responses: SimulationGmProposalV1['characterResponses']): SimulationDynamicAgentViewV1[];
6
+ export declare function projectDynamicDomainObjectsForActor(objects: readonly SimulationDynamicDomainObjectV1[], actorId: string): SimulationDynamicDomainObjectViewV1[];
7
+ export declare function projectDynamicEffectsForActor(effects: readonly SimulationDynamicWorldEffectV1[], resources: readonly PublicResourceDefinition[], actorId: string, actions?: readonly SimulationDomainActionProposalV1[], actors?: readonly Pick<SimulationPersistentAgentStateV1, 'actorId' | 'name'>[]): SimulationDynamicWorldEffectViewV1[];
8
+ export declare function dynamicObjectVisibleToActor(object: SimulationDynamicDomainObjectV1, actorId: string): boolean;
9
+ export {};
@@ -0,0 +1,219 @@
1
+ export function projectDynamicPlayerDecision(history) {
2
+ const ruling = history.at(-1)?.gmProposal.playerAdjudication;
3
+ if (!ruling)
4
+ return null;
5
+ const choice = history.at(-2)?.gmProposal.availableActions
6
+ .find(action => action.id === ruling.playerActionId);
7
+ return {
8
+ label: history.at(-1)?.playerIntent?.slice(0, 120) ?? choice?.label ?? 'Your opening move',
9
+ playerActionId: ruling.playerActionId,
10
+ outcome: ruling.outcome,
11
+ reason: ruling.reason,
12
+ };
13
+ }
14
+ const MAX_TIMELINE_ACTIONS_PER_BEAT = 6;
15
+ // The timeline tells each beat twice: one entry per committed autonomous action
16
+ // (an interaction when it targets or changes another agent), then the beat itself.
17
+ export function projectDynamicTimeline(history, agents) {
18
+ const humanIds = new Set(agents.filter(agent => agent.humanControlled).map(agent => agent.actorId));
19
+ return history.flatMap((entry) => {
20
+ const proposal = entry.gmProposal;
21
+ const actions = (proposal?.domainActions ?? [])
22
+ .filter(action => action.actorId !== undefined
23
+ && action.sourcePlayerActionId === undefined
24
+ && !humanIds.has(action.actorId))
25
+ .slice(0, MAX_TIMELINE_ACTIONS_PER_BEAT)
26
+ .map((action) => {
27
+ const actorId = action.actorId ?? '';
28
+ const citing = new Set((proposal.agentUpdates ?? [])
29
+ .filter(update => update.sourceActionIds.includes(action.id))
30
+ .map(update => update.actorId));
31
+ const ruling = (proposal.adjudications ?? []).find(candidate => candidate.actionIds.includes(action.id));
32
+ const target = action.targetActorId === undefined ? '' : ` → ${actorName(agents, action.targetActorId)}`;
33
+ return {
34
+ revision: entry.revision,
35
+ eventId: entry.eventId,
36
+ kind: action.targetActorId !== undefined || citing.size > 1
37
+ ? 'agent-interaction'
38
+ : 'agent-action',
39
+ title: clipText(`${actorName(agents, actorId)}${target} · ${humanize(action.mechanic)}`, 160),
40
+ summary: clipText(ruling?.reason ?? action.reason, 2_000),
41
+ };
42
+ });
43
+ const replans = proposal.agentUpdates.filter(update => update.sourceAdjudicationProposalIds !== undefined)
44
+ .slice(0, MAX_TIMELINE_ACTIONS_PER_BEAT - actions.length)
45
+ .map(update => {
46
+ const actor = agents.find(candidate => candidate.actorId === update.actorId);
47
+ const visiblePlan = update.nextIntent !== null && actor?.goals.some(goal => goal.id === update.nextIntent?.goalId && (goal.visibility === 'public' || goal.visibility === 'player-known'));
48
+ return {
49
+ revision: entry.revision,
50
+ eventId: entry.eventId,
51
+ kind: 'adjudication',
52
+ title: clipText(`${actorName(agents, update.actorId)} · Plan after failed attempt`, 160),
53
+ summary: clipText(`Their attempted action did not commit.${visiblePlan ? ` ${update.nextIntent?.summary}` : ''}`, 2_000),
54
+ };
55
+ });
56
+ const review = entry.storyReview;
57
+ const reviews = review === undefined ? [] : [{ revision: entry.revision, eventId: entry.eventId, kind: 'story-review',
58
+ title: review.status === 'rejected' ? 'Story review failed' : `Story review: ${review.decision.kind}`,
59
+ summary: review.status === 'rejected' ? 'No story judgment was accepted. The validated world transition remains recorded.' : review.decision.explanation }];
60
+ return [...actions, ...replans, ...reviews, {
61
+ revision: entry.revision,
62
+ eventId: entry.eventId,
63
+ kind: entry.kind,
64
+ title: entry.title,
65
+ summary: entry.summary,
66
+ }];
67
+ });
68
+ }
69
+ function clipText(value, maximum) {
70
+ return value.length <= maximum ? value : `${value.slice(0, maximum - 1)}…`;
71
+ }
72
+ export function projectDynamicAgents(agents, history, responses) {
73
+ const playerActorId = agents.find(agent => agent.humanControlled)?.actorId;
74
+ return agents.map(agent => {
75
+ const response = responses.find(item => item.actorId === agent.actorId);
76
+ const intentGoal = agent.currentIntent === null
77
+ ? undefined
78
+ : agent.goals.find(goal => goal.id === agent.currentIntent?.goalId);
79
+ const recent = history
80
+ .flatMap(entry => entry.gmProposal.domainActions
81
+ .filter(action => action.actorId === agent.actorId)
82
+ .map((action) => {
83
+ const adjudication = entry.gmProposal.adjudications
84
+ .find(candidate => candidate.actionIds.includes(action.id));
85
+ const target = action.targetActorId === undefined
86
+ ? 'the world'
87
+ : agents.find(candidate => candidate.actorId === action.targetActorId)?.name
88
+ ?? action.targetActorId;
89
+ return {
90
+ action,
91
+ eventId: entry.eventId,
92
+ outcome: adjudication?.outcome ?? 'accepted',
93
+ target,
94
+ };
95
+ }))
96
+ .slice(-3);
97
+ return {
98
+ id: agent.actorId,
99
+ name: agent.name,
100
+ role: agent.role,
101
+ humanControlled: agent.humanControlled,
102
+ mood: response?.mood ?? 'Watching',
103
+ currentIntent: agent.currentIntent === null
104
+ ? null
105
+ : intentGoal?.visibility === 'private'
106
+ ? 'Private intent'
107
+ : agent.currentIntent.summary,
108
+ goals: agent.goals.map((goal, index) => knowledge(goal.id, goal.description, goal.visibility, `redacted-goal-${index + 1}`, goal.priority)),
109
+ beliefs: agent.beliefs.map((belief, index) => knowledge(belief.id, belief.claim, belief.visibility, `redacted-belief-${index + 1}`, belief.confidence, belief.evidenceEventIds.at(-1))),
110
+ relationships: agent.relationships.map((relationship, index) => knowledge(`relationship-${agent.actorId}-${relationship.targetActorId}`, relationship.visibility === 'private'
111
+ ? 'Private relationship state'
112
+ : `${actorName(agents, relationship.targetActorId)}: trust ${relationship.trust}, obligation ${relationship.obligation}`, relationship.visibility, `redacted-relationship-${index + 1}`, relationship.trust, relationship.changedByEventId)),
113
+ memories: agent.memories.slice(-6).map((memory, index) => knowledge(memory.id, memory.summary, memory.visibility, `redacted-memory-${index + 1}`, memory.salience, memory.eventId)),
114
+ resources: Object.entries(agent.resources)
115
+ .sort(([left], [right]) => left.localeCompare(right))
116
+ .flatMap(([id, value]) => {
117
+ const visibility = agent.resourceVisibility[id];
118
+ const visible = agent.actorId === playerActorId
119
+ || visibility === 'public'
120
+ || visibility === 'player-known';
121
+ return visible
122
+ ? [{
123
+ id: `resource-${agent.actorId}-${id}`,
124
+ text: humanize(id),
125
+ value,
126
+ visibility: visibility === 'public' ? 'public' : 'player-known',
127
+ }]
128
+ : [];
129
+ }),
130
+ recentAutonomousActions: recent.map(item => ({
131
+ id: item.action.id,
132
+ text: `${humanize(item.action.mechanic)} → ${item.target} · ${item.outcome}: ${item.action.reason}`,
133
+ sourceEventId: item.eventId,
134
+ visibility: 'player-known',
135
+ })),
136
+ };
137
+ });
138
+ }
139
+ export function projectDynamicDomainObjectsForActor(objects, actorId) {
140
+ const visible = objects.filter(object => dynamicObjectVisibleToActor(object, actorId));
141
+ const visibleIds = new Set(visible.map(object => object.id));
142
+ return visible.map(object => ({
143
+ id: object.id,
144
+ kind: object.kind,
145
+ label: object.label,
146
+ status: object.status,
147
+ version: object.version,
148
+ ownerActorId: object.ownerActorId,
149
+ data: structuredClone(object.data),
150
+ links: structuredClone(object.links.filter(link => (link.targetType !== 'object' || visibleIds.has(link.targetId)))),
151
+ updatedRevision: object.provenance.updatedRevision,
152
+ }));
153
+ }
154
+ export function projectDynamicEffectsForActor(effects, resources, actorId, actions = [], actors = []) {
155
+ const resourcesById = new Map(resources
156
+ .filter(resource => resource.visibility !== 'private')
157
+ .map(resource => [resource.id, resource]));
158
+ return effects.flatMap((effect) => {
159
+ if (effect.operation === 'resource.change') {
160
+ const resource = resourcesById.get(effect.resourceId);
161
+ const source = actions.find(action => action.id === effect.actionId);
162
+ return resource === undefined
163
+ ? []
164
+ : [{
165
+ operation: effect.operation,
166
+ resourceId: effect.resourceId,
167
+ resourceLabel: resource.label,
168
+ delta: effect.delta,
169
+ ...(source === undefined ? {} : { cause: {
170
+ actor: source.actorId === undefined ? 'World event'
171
+ : actors.find(actor => actor.actorId === source.actorId)?.name ?? 'Participant',
172
+ action: humanize(source.mechanic),
173
+ reason: source.reason,
174
+ } }),
175
+ }];
176
+ }
177
+ if ('fact' in effect) {
178
+ return [{
179
+ operation: effect.operation,
180
+ fact: effect.fact,
181
+ }];
182
+ }
183
+ if (!dynamicObjectVisibleToActor(effect.object, actorId))
184
+ return [];
185
+ return [{
186
+ operation: effect.operation,
187
+ objectId: effect.object.id,
188
+ objectKind: effect.object.kind,
189
+ objectLabel: effect.object.label,
190
+ status: effect.object.status,
191
+ version: effect.object.version,
192
+ expectedVersion: effect.expectedVersion,
193
+ ownerActorId: effect.object.ownerActorId,
194
+ }];
195
+ });
196
+ }
197
+ export function dynamicObjectVisibleToActor(object, actorId) {
198
+ return object.visibility.scope === 'world'
199
+ || (object.visibility.scope === 'shared'
200
+ && object.visibility.actorIds.includes(actorId))
201
+ || (object.visibility.scope === 'private' && object.ownerActorId === actorId);
202
+ }
203
+ function actorName(agents, actorId) {
204
+ return agents.find(agent => agent.actorId === actorId)?.name ?? actorId;
205
+ }
206
+ function knowledge(id, text, visibility, redactedId, value, sourceEventId) {
207
+ return visibility === 'private'
208
+ ? { id: redactedId, text: 'Private knowledge', visibility: 'redacted' }
209
+ : {
210
+ id,
211
+ text,
212
+ visibility,
213
+ ...(value === undefined ? {} : { value }),
214
+ ...(sourceEventId === undefined ? {} : { sourceEventId }),
215
+ };
216
+ }
217
+ function humanize(value) {
218
+ return value.replaceAll('-', ' ').replace(/\b\w/g, character => character.toUpperCase());
219
+ }