@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,239 @@
1
+ import { z } from 'zod';
2
+ import type { SimulationCharacterProposalV1, SimulationDynamicMechanicDefinitionV1, SimulationDynamicWorldStateV1, SimulationPersistentAgentStateV1, SimulationDynamicHistoryEntryV1, SimulationDynamicInferenceCallV1, SimulationDynamicIntentActivityV1, SimulationDynamicStateV1, SimulationGmProposalV1, SimulationServingRouteV1 } from '../../plugin/simulation_contract.js';
3
+ import type { SimulationInteractionPolicyV1, SimulationInteractionStateV1, SimulationMeetingActivityV1, SimulationMeetingChoiceV1, SimulationMeetingV1 } from '../../plugin/simulation_meetings.js';
4
+ export declare const locationSchema: z.ZodObject<{
5
+ id: z.ZodString;
6
+ name: z.ZodString;
7
+ kind: z.ZodEnum<{
8
+ field: "field";
9
+ "meeting-room": "meeting-room";
10
+ workplace: "workplace";
11
+ transit: "transit";
12
+ }>;
13
+ domainObjectId: z.ZodOptional<z.ZodString>;
14
+ }, z.core.$strict>;
15
+ export declare const positionSchema: z.ZodObject<{
16
+ actorId: z.ZodString;
17
+ locationId: z.ZodNullable<z.ZodString>;
18
+ revision: z.ZodNumber;
19
+ cause: z.ZodNullable<z.ZodObject<{
20
+ kind: z.ZodEnum<{
21
+ action: "action";
22
+ initial: "initial";
23
+ meeting: "meeting";
24
+ }>;
25
+ sourceId: z.ZodString;
26
+ }, z.core.$strict>>;
27
+ }, z.core.$strict>;
28
+ export declare const interactionPolicySchema: z.ZodObject<{
29
+ version: z.ZodEnum<{
30
+ "meetings-1": "meetings-1";
31
+ "meetings-2": "meetings-2";
32
+ }>;
33
+ locations: z.ZodArray<z.ZodObject<{
34
+ id: z.ZodString;
35
+ name: z.ZodString;
36
+ kind: z.ZodEnum<{
37
+ field: "field";
38
+ "meeting-room": "meeting-room";
39
+ workplace: "workplace";
40
+ transit: "transit";
41
+ }>;
42
+ domainObjectId: z.ZodOptional<z.ZodString>;
43
+ }, z.core.$strict>>;
44
+ initialActorLocations: z.ZodRecord<z.ZodString, z.ZodNullable<z.ZodString>>;
45
+ meetingLocationId: z.ZodString;
46
+ issue: z.ZodObject<{
47
+ title: z.ZodString;
48
+ domainObjectIds: z.ZodArray<z.ZodString>;
49
+ }, z.core.$strict>;
50
+ actionLocations: z.ZodArray<z.ZodObject<{
51
+ mechanic: z.ZodString;
52
+ location: z.ZodDiscriminatedUnion<[z.ZodObject<{
53
+ kind: z.ZodLiteral<"fixed">;
54
+ locationId: z.ZodString;
55
+ }, z.core.$strict>, z.ZodObject<{
56
+ kind: z.ZodLiteral<"object">;
57
+ intentParameter: z.ZodString;
58
+ objectLocations: z.ZodRecord<z.ZodString, z.ZodString>;
59
+ }, z.core.$strict>], "kind">;
60
+ }, z.core.$strict>>;
61
+ }, z.core.$strict>;
62
+ export declare const interactionSchema: z.ZodObject<{
63
+ policyVersion: z.ZodNullable<z.ZodEnum<{
64
+ "meetings-1": "meetings-1";
65
+ "meetings-2": "meetings-2";
66
+ }>>;
67
+ policy: z.ZodNullable<z.ZodObject<{
68
+ version: z.ZodEnum<{
69
+ "meetings-1": "meetings-1";
70
+ "meetings-2": "meetings-2";
71
+ }>;
72
+ locations: z.ZodArray<z.ZodObject<{
73
+ id: z.ZodString;
74
+ name: z.ZodString;
75
+ kind: z.ZodEnum<{
76
+ field: "field";
77
+ "meeting-room": "meeting-room";
78
+ workplace: "workplace";
79
+ transit: "transit";
80
+ }>;
81
+ domainObjectId: z.ZodOptional<z.ZodString>;
82
+ }, z.core.$strict>>;
83
+ initialActorLocations: z.ZodRecord<z.ZodString, z.ZodNullable<z.ZodString>>;
84
+ meetingLocationId: z.ZodString;
85
+ issue: z.ZodObject<{
86
+ title: z.ZodString;
87
+ domainObjectIds: z.ZodArray<z.ZodString>;
88
+ }, z.core.$strict>;
89
+ actionLocations: z.ZodArray<z.ZodObject<{
90
+ mechanic: z.ZodString;
91
+ location: z.ZodDiscriminatedUnion<[z.ZodObject<{
92
+ kind: z.ZodLiteral<"fixed">;
93
+ locationId: z.ZodString;
94
+ }, z.core.$strict>, z.ZodObject<{
95
+ kind: z.ZodLiteral<"object">;
96
+ intentParameter: z.ZodString;
97
+ objectLocations: z.ZodRecord<z.ZodString, z.ZodString>;
98
+ }, z.core.$strict>], "kind">;
99
+ }, z.core.$strict>>;
100
+ }, z.core.$strict>>;
101
+ locations: z.ZodArray<z.ZodObject<{
102
+ id: z.ZodString;
103
+ name: z.ZodString;
104
+ kind: z.ZodEnum<{
105
+ field: "field";
106
+ "meeting-room": "meeting-room";
107
+ workplace: "workplace";
108
+ transit: "transit";
109
+ }>;
110
+ domainObjectId: z.ZodOptional<z.ZodString>;
111
+ }, z.core.$strict>>;
112
+ positions: z.ZodArray<z.ZodObject<{
113
+ actorId: z.ZodString;
114
+ locationId: z.ZodNullable<z.ZodString>;
115
+ revision: z.ZodNumber;
116
+ cause: z.ZodNullable<z.ZodObject<{
117
+ kind: z.ZodEnum<{
118
+ action: "action";
119
+ initial: "initial";
120
+ meeting: "meeting";
121
+ }>;
122
+ sourceId: z.ZodString;
123
+ }, z.core.$strict>>;
124
+ }, z.core.$strict>>;
125
+ }, z.core.$strict>;
126
+ export declare const meetingTurnSchema: z.ZodObject<{
127
+ meetingId: z.ZodString;
128
+ turnId: z.ZodString;
129
+ speakerActorId: z.ZodString;
130
+ predecessorTurnId: z.ZodNullable<z.ZodString>;
131
+ text: z.ZodString;
132
+ candidateChoiceId: z.ZodNullable<z.ZodEnum<{
133
+ "proceed-both": "proceed-both";
134
+ "proceed-first": "proceed-first";
135
+ "proceed-second": "proceed-second";
136
+ }>>;
137
+ endMeeting: z.ZodOptional<z.ZodBoolean>;
138
+ }, z.core.$strict>;
139
+ export declare const meetingSchema: z.ZodObject<{
140
+ invitation: z.ZodOptional<z.ZodObject<{
141
+ sourceProposalId: z.ZodString;
142
+ authorActorId: z.ZodString;
143
+ recipientActorId: z.ZodString;
144
+ }, z.core.$strict>>;
145
+ meetingId: z.ZodString;
146
+ revision: z.ZodNumber;
147
+ issue: z.ZodString;
148
+ locationId: z.ZodString;
149
+ participantActorIds: z.ZodTuple<[z.ZodString, z.ZodString], null>;
150
+ audienceActorIds: z.ZodArray<z.ZodString>;
151
+ sourceProposalIds: z.ZodTuple<[z.ZodString, z.ZodString], null>;
152
+ turns: z.ZodArray<z.ZodObject<{
153
+ meetingId: z.ZodString;
154
+ turnId: z.ZodString;
155
+ speakerActorId: z.ZodString;
156
+ predecessorTurnId: z.ZodNullable<z.ZodString>;
157
+ text: z.ZodString;
158
+ candidateChoiceId: z.ZodNullable<z.ZodEnum<{
159
+ "proceed-both": "proceed-both";
160
+ "proceed-first": "proceed-first";
161
+ "proceed-second": "proceed-second";
162
+ }>>;
163
+ endMeeting: z.ZodOptional<z.ZodBoolean>;
164
+ }, z.core.$strict>>;
165
+ receipts: z.ZodArray<z.ZodObject<{
166
+ requestVersion: z.ZodOptional<z.ZodLiteral<2>>;
167
+ instructionVersion: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<2>, z.ZodLiteral<3>]>>;
168
+ turnId: z.ZodString;
169
+ speakerActorId: z.ZodString;
170
+ predecessorTurnId: z.ZodNullable<z.ZodString>;
171
+ requested: z.ZodBoolean;
172
+ durationMs: z.ZodNumber;
173
+ priorTurnsDigest: z.ZodString;
174
+ turnDigest: z.ZodNullable<z.ZodString>;
175
+ provider: z.ZodEnum<{
176
+ zergrouter: "zergrouter";
177
+ codex_legacy: "codex_legacy";
178
+ }>;
179
+ role: z.ZodLiteral<"character">;
180
+ model: z.ZodEnum<{
181
+ "gpt-5.6-luna": "gpt-5.6-luna";
182
+ "modal/deepseek-v4.1-flash": "modal/deepseek-v4.1-flash";
183
+ }>;
184
+ reasoningEffort: z.ZodLiteral<"low">;
185
+ status: z.ZodEnum<{
186
+ accepted: "accepted";
187
+ rejected: "rejected";
188
+ declined: "declined";
189
+ }>;
190
+ failureCode: z.ZodOptional<z.ZodString>;
191
+ inputDigest: z.ZodString;
192
+ outputDigest: z.ZodString;
193
+ outputBytes: z.ZodNumber;
194
+ maxTokens: z.ZodLiteral<512>;
195
+ }, z.core.$strict>>;
196
+ status: z.ZodEnum<{
197
+ accepted: "accepted";
198
+ rejected: "rejected";
199
+ }>;
200
+ decision: z.ZodNullable<z.ZodObject<{
201
+ id: z.ZodEnum<{
202
+ "proceed-both": "proceed-both";
203
+ "proceed-first": "proceed-first";
204
+ "proceed-second": "proceed-second";
205
+ }>;
206
+ proceedProposalIds: z.ZodArray<z.ZodString>;
207
+ deferProposalIds: z.ZodArray<z.ZodString>;
208
+ finalTurnId: z.ZodString;
209
+ }, z.core.$strict>>;
210
+ failureCode: z.ZodOptional<z.ZodString>;
211
+ }, z.core.$strict>;
212
+ export declare class DynamicMeetingError extends Error {
213
+ readonly code: string;
214
+ constructor(code: string, message: string);
215
+ }
216
+ export declare function initialInteraction(policy: SimulationInteractionPolicyV1 | undefined, actors: readonly {
217
+ actorId: string;
218
+ }[]): SimulationInteractionStateV1;
219
+ export declare function meetingChoices(ids: readonly [string, string]): readonly SimulationMeetingChoiceV1[];
220
+ export declare function dynamicMeetingSystemPrompt(version?: 1 | 2 | 3): string;
221
+ export declare function conductDynamicMeeting(input: {
222
+ state: SimulationDynamicStateV1;
223
+ proposals: readonly SimulationCharacterProposalV1[];
224
+ publicIntents: readonly SimulationDynamicIntentActivityV1[];
225
+ complete: (call: SimulationDynamicInferenceCallV1) => Promise<string>;
226
+ servingRoute?: SimulationServingRouteV1;
227
+ assertPublic: (value: unknown) => void;
228
+ speakerContext?: (actorId: string, publicRequest: Record<string, unknown>) => Record<string, unknown>;
229
+ privateSpeakerContext?: boolean;
230
+ requestVersion?: 2;
231
+ onActivity?: (activity: SimulationMeetingActivityV1) => Promise<void>;
232
+ }): Promise<readonly SimulationMeetingV1[]>;
233
+ export declare function moveDynamicActors(interaction: SimulationInteractionStateV1, meetings: readonly SimulationMeetingV1[], actions: SimulationGmProposalV1['domainActions'], revision: number): SimulationInteractionStateV1;
234
+ export declare function validateInteractionPolicy(policy: SimulationInteractionPolicyV1 | undefined, world: SimulationDynamicWorldStateV1, actors: readonly SimulationPersistentAgentStateV1[], mechanics: readonly SimulationDynamicMechanicDefinitionV1[]): void;
235
+ export declare function validateMeetingHistory(entry: SimulationDynamicHistoryEntryV1, interaction: SimulationInteractionStateV1, actors: readonly SimulationPersistentAgentStateV1[], agencyVersion?: 'emergent-v1'): void;
236
+ export declare function validateMeetingAdjudications(proposal: Pick<SimulationGmProposalV1, 'adjudications' | 'domainActions'>, meetings: readonly SimulationMeetingV1[], characters: readonly {
237
+ readonly proposalId: string;
238
+ readonly attemptedActions: readonly Pick<SimulationCharacterProposalV1['attemptedActions'][number], 'mechanic' | 'parameters'>[];
239
+ }[], agencyVersion?: 'emergent-v1'): void;
@@ -0,0 +1,350 @@
1
+ import { isDeepStrictEqual } from 'node:util';
2
+ import { z } from 'zod';
3
+ import { digestDynamicText as digest } from './dynamic_digest.js';
4
+ import { dynamicObjectVisibleToActor } from './dynamic_projection.js';
5
+ const id = z.string().trim().min(1).max(128);
6
+ const text = (max) => z.string().trim().min(1).max(max);
7
+ const choiceId = z.enum(['proceed-both', 'proceed-first', 'proceed-second']);
8
+ export const locationSchema = z.object({ id, name: text(160), kind: z.enum(['meeting-room', 'workplace', 'transit', 'field']), domainObjectId: id.optional() }).strict();
9
+ export const positionSchema = z.object({ actorId: id, locationId: id.nullable(), revision: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER), cause: z.object({ kind: z.enum(['initial', 'action', 'meeting']), sourceId: id }).strict().nullable() }).strict();
10
+ export const interactionPolicySchema = z.object({
11
+ version: z.enum(['meetings-1', 'meetings-2']), locations: z.array(locationSchema).min(1).max(32),
12
+ initialActorLocations: z.record(id, id.nullable()), meetingLocationId: id,
13
+ issue: z.object({ title: text(240), domainObjectIds: z.array(id).min(1).max(8) }).strict(),
14
+ actionLocations: z.array(z.object({ mechanic: id, location: z.discriminatedUnion('kind', [
15
+ z.object({ kind: z.literal('fixed'), locationId: id }).strict(),
16
+ z.object({ kind: z.literal('object'), intentParameter: id, objectLocations: z.record(id, id) }).strict(),
17
+ ]) }).strict()).max(32),
18
+ }).strict();
19
+ export const interactionSchema = z.object({ policyVersion: z.enum(['meetings-1', 'meetings-2']).nullable(), policy: interactionPolicySchema.nullable(), locations: z.array(locationSchema).max(32), positions: z.array(positionSchema).min(3).max(8) }).strict();
20
+ const legacyMeetingTurnSchema = z.object({ meetingId: id, turnId: id, speakerActorId: id, predecessorTurnId: id.nullable(), text: text(600), candidateChoiceId: choiceId }).strict();
21
+ export const meetingTurnSchema = legacyMeetingTurnSchema.extend({ candidateChoiceId: choiceId.nullable(), endMeeting: z.boolean().optional() });
22
+ const voluntaryResponseSchema = meetingTurnSchema.extend({ text: z.string().trim().max(600) });
23
+ const receiptSchema = z.object({
24
+ requestVersion: z.literal(2).optional(),
25
+ instructionVersion: z.union([z.literal(2), z.literal(3)]).optional(),
26
+ turnId: id, speakerActorId: id, predecessorTurnId: id.nullable(), requested: z.boolean(), durationMs: z.number().int().min(0).max(240000), priorTurnsDigest: z.string().regex(/^[a-f0-9]{8}$/), turnDigest: z.string().regex(/^[a-f0-9]{8}$/).nullable(),
27
+ provider: z.enum(['codex_legacy', 'zergrouter']), role: z.literal('character'), model: z.enum(['gpt-5.6-luna', 'modal/deepseek-v4.1-flash']), reasoningEffort: z.literal('low'),
28
+ status: z.enum(['accepted', 'declined', 'rejected']), failureCode: id.optional(), inputDigest: z.string().regex(/^[a-f0-9]{8}$/), outputDigest: z.string().regex(/^[a-f0-9]{8}$/), outputBytes: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER), maxTokens: z.literal(512),
29
+ }).strict();
30
+ const invitationSchema = z.object({ sourceProposalId: id, authorActorId: id, recipientActorId: id }).strict();
31
+ export const meetingSchema = z.object({
32
+ invitation: invitationSchema.optional(),
33
+ meetingId: id, revision: z.number().int().min(1).max(Number.MAX_SAFE_INTEGER), issue: text(240), locationId: id,
34
+ participantActorIds: z.tuple([id, id]), audienceActorIds: z.array(id).min(3).max(8), sourceProposalIds: z.tuple([id, id]),
35
+ turns: z.array(meetingTurnSchema).max(3), receipts: z.array(receiptSchema).max(3), status: z.enum(['accepted', 'rejected']),
36
+ decision: z.object({ id: choiceId, proceedProposalIds: z.array(id).min(1).max(2), deferProposalIds: z.array(id).max(1), finalTurnId: id }).strict().nullable(),
37
+ failureCode: id.optional(),
38
+ }).strict();
39
+ export class DynamicMeetingError extends Error {
40
+ code;
41
+ constructor(code, message) {
42
+ super(message);
43
+ this.code = code;
44
+ this.name = 'DynamicMeetingError';
45
+ }
46
+ }
47
+ function fail(code, message) { throw new DynamicMeetingError(code, message); }
48
+ export function initialInteraction(policy, actors) {
49
+ if (policy === undefined)
50
+ return { policyVersion: null, policy: null, locations: [], positions: actors.map(actor => ({ actorId: actor.actorId, locationId: null, revision: 0, cause: null })) };
51
+ const parsed = interactionPolicySchema.safeParse(policy);
52
+ if (!parsed.success)
53
+ fail('interaction-policy-invalid', 'Interaction policy is malformed');
54
+ if (!isDeepStrictEqual(Object.keys(policy.initialActorLocations).sort(), actors.map(actor => actor.actorId).sort()))
55
+ fail('interaction-policy-invalid', 'Initial locations must name every actor exactly once');
56
+ const locations = new Set(policy.locations.map(location => location.id));
57
+ if (locations.size !== policy.locations.length || !locations.has(policy.meetingLocationId)
58
+ || Object.values(policy.initialActorLocations).some(location => location !== null && !locations.has(location))
59
+ || policy.actionLocations.some(mapping => mapping.location.kind === 'fixed' ? !locations.has(mapping.location.locationId) : Object.values(mapping.location.objectLocations).some(location => !locations.has(location))))
60
+ fail('interaction-policy-invalid', 'Interaction locations must be unique and references must resolve');
61
+ return { policyVersion: policy.version, policy: structuredClone(policy), locations: structuredClone(policy.locations), positions: actors.map(actor => {
62
+ const locationId = policy.initialActorLocations[actor.actorId];
63
+ return { actorId: actor.actorId, locationId, revision: 0, cause: locationId === null ? null : { kind: 'initial', sourceId: policy.version } };
64
+ }) };
65
+ }
66
+ export function meetingChoices(ids) {
67
+ return [
68
+ { id: 'proceed-both', proceedProposalIds: [...ids], deferProposalIds: [] },
69
+ { id: 'proceed-first', proceedProposalIds: [ids[0]], deferProposalIds: [ids[1]] },
70
+ { id: 'proceed-second', proceedProposalIds: [ids[1]], deferProposalIds: [ids[0]] },
71
+ ];
72
+ }
73
+ export function dynamicMeetingSystemPrompt(version = 2) {
74
+ if (version === 3)
75
+ return 'You may speak, decline, or stay silent. Empty text declines this discussion without speech. Set endMeeting to true to leave after speaking. candidateChoiceId may be null; listed plans are suggestions, not agreements or orders. No speaker decides for another. Return only the declared schema.';
76
+ return version === 1
77
+ ? 'Speak as the assigned participant. Discuss the shared issue, proposals and prior turns. Choose a listed plan; the last speaker decides. Propose actions without claiming they occurred. Return only the declared schema.'
78
+ : 'Speak as assigned in short, complete sentences. Match speech to the chosen plan: proceed means act now; defer pending conditions. Final speaker decides. Never claim execution. Return only the declared schema.';
79
+ }
80
+ export async function conductDynamicMeeting(input) {
81
+ const { state } = input;
82
+ const voluntary = state.agencyVersion === 'emergent-v1';
83
+ const instructionVersion = voluntary ? 3 : 2;
84
+ const policy = state.interaction.policy;
85
+ if (policy === null)
86
+ return [];
87
+ const authored = policy.version === 'meetings-2';
88
+ const author = authored ? input.proposals.find(proposal => proposal.discussionInvitation != null) : undefined;
89
+ if (authored && author === undefined)
90
+ return [];
91
+ const recipient = author === undefined ? undefined : input.proposals.find(proposal => proposal.actorId === author.discussionInvitation.recipientActorId);
92
+ if (author !== undefined && (recipient === undefined || recipient.actorId === author.actorId
93
+ || [author, recipient].some(proposal => proposal.basedOnRevision !== state.revision
94
+ || !state.agents.some(actor => actor.actorId === proposal.actorId && !actor.humanControlled))))
95
+ fail('meeting-invitation-invalid', 'An invitation must link its author and a current autonomous recipient');
96
+ const invitation = author === undefined ? undefined : { sourceProposalId: author.proposalId, authorActorId: author.actorId, recipientActorId: recipient.actorId };
97
+ const eligible = authored ? [recipient, author].map(proposal => ({
98
+ actorId: proposal.actorId, actorName: state.agents.find(actor => actor.actorId === proposal.actorId).name,
99
+ sourceProposalId: proposal.proposalId,
100
+ })) : input.publicIntents.filter(intent => {
101
+ const proposal = input.proposals.find(item => item.proposalId === intent.sourceProposalId);
102
+ const actor = state.agents.find(item => item.actorId === proposal.actorId);
103
+ return actor.goals.some(goal => goal.id === proposal.intent?.goalId && goal.visibility !== 'private');
104
+ });
105
+ if (eligible.length < 2)
106
+ return [];
107
+ const pair = eligible.slice(0, 2);
108
+ const audience = [...new Set([...pair.map(item => item.actorId), ...state.agents.filter(actor => actor.humanControlled).map(actor => actor.actorId)])];
109
+ const objects = policy.issue.domainObjectIds.map(objectId => state.world.domainObjects.find(object => object.id === objectId));
110
+ if (!authored && objects.some(object => object === undefined || audience.some(actor => !dynamicObjectVisibleToActor(object, actor))))
111
+ return [];
112
+ const location = policy.locations.find(item => item.id === policy.meetingLocationId);
113
+ const meetingId = `meeting-${state.revision + 1}`;
114
+ const sourceProposalIds = [pair[0].sourceProposalId, pair[1].sourceProposalId];
115
+ const issue = author?.discussionInvitation?.topic ?? policy.issue.title;
116
+ const base = { ...(invitation === undefined ? {} : { invitation }), meetingId, revision: state.revision + 1, issue, locationId: location.id,
117
+ participantActorIds: [pair[0].actorId, pair[1].actorId], audienceActorIds: audience, sourceProposalIds };
118
+ const forming = { ...(invitation === undefined ? {} : { invitation }), kind: 'meeting-forming', meetingId, basedOnRevision: state.revision, status: 'pending', validation: 'ztc-simulation-meeting-plan', locationId: location.id, locationName: location.name, issue, participants: pair.map(item => ({ actorId: item.actorId, actorName: item.actorName })) };
119
+ try {
120
+ input.assertPublic(forming);
121
+ }
122
+ catch {
123
+ return [];
124
+ }
125
+ await input.onActivity?.(forming);
126
+ const turns = [];
127
+ const receipts = [];
128
+ const choices = authored ? [] : meetingChoices(sourceProposalIds);
129
+ for (let index = 0; index < 3; index++) {
130
+ const speaker = pair[index === 1 ? 1 : 0];
131
+ const turnId = `${meetingId}-turn-${index + 1}`;
132
+ const predecessorTurnId = turns.at(-1)?.turnId ?? null;
133
+ const publicRequest = {
134
+ ...(input.requestVersion === undefined ? {} : { requestVersion: input.requestVersion }),
135
+ schemaVersion: 1, phase: 'meeting-turn',
136
+ meeting: { ...base, locationName: location.name, ...(authored ? {} : { proposals: pair.map(item => { const activity = input.publicIntents.find(intent => intent.sourceProposalId === item.sourceProposalId); return { proposalId: item.sourceProposalId, actorId: item.actorId, mechanic: activity.mechanic, intent: activity.text }; }) }), choices },
137
+ speaker: { actorId: speaker.actorId, name: speaker.actorName },
138
+ turn: { index, turnId, predecessorTurnId, purpose: voluntary ? 'continue-or-leave' : index === 0 ? 'propose' : index === 1 ? 'respond' : 'decide' },
139
+ priorTurns: structuredClone(turns),
140
+ responseSchema: { type: 'object', additionalProperties: false, required: ['meetingId', 'turnId', 'speakerActorId', 'predecessorTurnId', 'text', 'candidateChoiceId'], properties: {
141
+ meetingId: { const: meetingId }, turnId: { const: turnId }, speakerActorId: { const: speaker.actorId }, predecessorTurnId: { const: predecessorTurnId }, text: { type: 'string', minLength: voluntary ? 0 : 1, maxLength: 600 }, candidateChoiceId: { enum: [...choices.map(choice => choice.id), ...(voluntary ? [null] : [])] },
142
+ ...(voluntary ? { endMeeting: { type: 'boolean' } } : {}),
143
+ } },
144
+ };
145
+ const request = { ...publicRequest, ...(input.speakerContext === undefined ? {} : { speakerContext: input.speakerContext(speaker.actorId, publicRequest) }) };
146
+ const encoded = JSON.stringify(request);
147
+ if (Buffer.byteLength(encoded, 'utf8') > 65536)
148
+ fail('meeting-input-too-large', 'Meeting input exceeds the character request limit');
149
+ let raw = '';
150
+ let requested = false;
151
+ const startedAt = Date.now();
152
+ let turn = null;
153
+ let failureCode;
154
+ try {
155
+ input.assertPublic(input.privateSpeakerContext ? publicRequest : request);
156
+ requested = true;
157
+ raw = await input.complete({ role: 'character', model: 'gpt-5.6-luna', reasoningEffort: 'low', maxTokens: 512, timeoutMs: 20000,
158
+ system: dynamicMeetingSystemPrompt(instructionVersion), input: encoded });
159
+ if (Buffer.byteLength(raw, 'utf8') > 4096)
160
+ fail('meeting-output-too-large', 'Meeting output exceeds the character response limit');
161
+ const parsed = (voluntary ? voluntaryResponseSchema : legacyMeetingTurnSchema).safeParse(JSON.parse(raw));
162
+ if (!parsed.success)
163
+ fail('meeting-turn-invalid', 'Meeting turn is malformed');
164
+ turn = parsed.data;
165
+ if (authored && turn.candidateChoiceId !== null)
166
+ fail('meeting-turn-invalid', 'An invitation does not propose a binding plan');
167
+ if (turn.meetingId !== meetingId || turn.turnId !== turnId || turn.speakerActorId !== speaker.actorId || turn.predecessorTurnId !== predecessorTurnId)
168
+ fail('meeting-turn-lineage-invalid', 'Meeting turn must match its assigned speaker and predecessor');
169
+ input.assertPublic(turn);
170
+ }
171
+ catch (error) {
172
+ turn = null;
173
+ failureCode = error instanceof Error && 'code' in error && typeof error.code === 'string' ? error.code : 'meeting-turn-rejected';
174
+ }
175
+ const declined = voluntary && turn?.text === '';
176
+ receipts.push({ ...(input.requestVersion === undefined ? {} : { requestVersion: input.requestVersion }), instructionVersion, requested, durationMs: Math.max(0, Date.now() - startedAt), turnId, speakerActorId: speaker.actorId, predecessorTurnId, priorTurnsDigest: digest(JSON.stringify(turns)), turnDigest: turn === null || declined ? null : digest(JSON.stringify(turn)), provider: input.servingRoute?.provider ?? 'codex_legacy', role: 'character', model: input.servingRoute?.model ?? 'gpt-5.6-luna', reasoningEffort: 'low', status: turn === null ? 'rejected' : declined ? 'declined' : 'accepted', ...(failureCode === undefined ? {} : { failureCode }), inputDigest: digest(encoded), outputDigest: digest(raw), outputBytes: Buffer.byteLength(raw, 'utf8'), maxTokens: 512 });
177
+ if (turn === null)
178
+ return [{ ...base, turns, receipts, status: 'rejected', decision: null, failureCode: failureCode }];
179
+ if (declined)
180
+ return [{ ...base, turns, receipts, status: 'accepted', decision: null }];
181
+ turns.push(turn);
182
+ await input.onActivity?.({ ...turn, kind: 'meeting-turn', basedOnRevision: state.revision, status: 'pending', validation: 'ztc-simulation-meeting-turn', speakerName: speaker.actorName });
183
+ if (voluntary && turn.endMeeting)
184
+ return [{ ...base, turns, receipts, status: 'accepted', decision: null }];
185
+ }
186
+ if (voluntary)
187
+ return [{ ...base, turns, receipts, status: 'accepted', decision: null }];
188
+ const final = turns[2];
189
+ return [{ ...base, turns, receipts, status: 'accepted', decision: { ...choices.find(choice => choice.id === final.candidateChoiceId), finalTurnId: final.turnId } }];
190
+ }
191
+ export function moveDynamicActors(interaction, meetings, actions, revision) {
192
+ if (interaction.policy === null)
193
+ return structuredClone(interaction);
194
+ const positions = new Map(interaction.positions.map(position => [position.actorId, structuredClone(position)]));
195
+ for (const meeting of meetings)
196
+ if (meeting.status === 'accepted' && !meeting.receipts.some(receipt => receipt.instructionVersion === 3))
197
+ for (const actorId of meeting.participantActorIds)
198
+ positions.set(actorId, { actorId, locationId: meeting.locationId, revision, cause: { kind: 'meeting', sourceId: meeting.meetingId } });
199
+ for (const action of actions) {
200
+ if (action.mechanic === 'act-freely' || action.mechanic === 'world-scene') {
201
+ const resolution = action.parameters.resolution;
202
+ if (resolution && typeof resolution === 'object' && !Array.isArray(resolution) && 'scene' in resolution && typeof resolution.scene === 'string') {
203
+ const scene = JSON.parse(resolution.scene);
204
+ for (const move of scene.moves ?? []) {
205
+ if (!positions.has(move.actorId) || !interaction.locations.some(location => location.id === move.locationId))
206
+ fail('scene-movement-invalid', 'A scene move requires a known actor and location');
207
+ positions.set(move.actorId, { actorId: move.actorId, locationId: move.locationId, revision, cause: { kind: 'action', sourceId: action.id } });
208
+ }
209
+ }
210
+ }
211
+ if (action.actorId === undefined)
212
+ continue;
213
+ const mapping = interaction.policy.actionLocations.find(item => item.mechanic === action.mechanic);
214
+ if (mapping === undefined)
215
+ continue;
216
+ const intent = action.parameters.intent;
217
+ const target = mapping.location.kind === 'object' && intent !== null && typeof intent === 'object' && !Array.isArray(intent) ? intent[mapping.location.intentParameter] : undefined;
218
+ const locationId = mapping.location.kind === 'fixed' ? mapping.location.locationId : typeof target === 'string' ? mapping.location.objectLocations[target] : undefined;
219
+ if (locationId === undefined)
220
+ continue;
221
+ positions.set(action.actorId, { actorId: action.actorId, locationId, revision, cause: { kind: 'action', sourceId: action.id } });
222
+ }
223
+ return { ...interaction, positions: interaction.positions.map(position => positions.get(position.actorId)) };
224
+ }
225
+ export function validateInteractionPolicy(policy, world, actors, mechanics) {
226
+ const interaction = initialInteraction(policy, actors);
227
+ if (policy === undefined)
228
+ return;
229
+ const player = actors.find(actor => actor.humanControlled);
230
+ const publicObject = (id) => world.domainObjects.find(object => object.id === id && dynamicObjectVisibleToActor(object, player.actorId));
231
+ if (interaction.locations.some(location => location.domainObjectId !== undefined && publicObject(location.domainObjectId) === undefined)
232
+ || policy.issue.domainObjectIds.some(id => publicObject(id) === undefined))
233
+ fail('interaction-policy-invalid', 'Locations and shared issues must reference public domain objects');
234
+ if (new Set(policy.actionLocations.map(mapping => mapping.mechanic)).size !== policy.actionLocations.length)
235
+ fail('interaction-policy-invalid', 'A mechanic has at most one action location mapping');
236
+ for (const mapping of policy.actionLocations) {
237
+ const definition = mechanics.find(item => item.id === mapping.mechanic);
238
+ if (definition === undefined)
239
+ fail('interaction-policy-invalid', 'Action location mapping must reference a declared mechanic');
240
+ if (mapping.location.kind === 'object') {
241
+ const name = mapping.location.intentParameter;
242
+ const parameter = definition.intentParameters.find(item => item.id === name);
243
+ if (parameter?.kind !== 'object-reference' || Object.keys(mapping.location.objectLocations).some(id => {
244
+ const object = publicObject(id);
245
+ return object === undefined || !parameter.objectKinds.includes(object.kind);
246
+ }))
247
+ fail('interaction-policy-invalid', 'Object movement mapping must match a public structured mechanic reference');
248
+ }
249
+ }
250
+ }
251
+ export function validateMeetingHistory(entry, interaction, actors, agencyVersion) {
252
+ validateMeetingAdjudications(entry.gmProposal, entry.meetings ?? [], entry.characterProposals, agencyVersion);
253
+ for (const meeting of entry.meetings ?? []) {
254
+ const policy = interaction.policy;
255
+ const sources = meeting.sourceProposalIds.map(id => entry.characterProposals.find(proposal => proposal.proposalId === id));
256
+ if (policy === null || meeting.meetingId !== `meeting-${entry.revision}` || meeting.revision !== entry.revision
257
+ || meeting.locationId !== policy.meetingLocationId || (policy.version === 'meetings-1' && (meeting.issue !== policy.issue.title || meeting.invitation !== undefined))
258
+ || new Set(meeting.participantActorIds).size !== 2 || new Set(meeting.sourceProposalIds).size !== 2
259
+ || sources.some((source, index) => source === undefined || source.actorId !== meeting.participantActorIds[index]
260
+ || !actors.some(actor => actor.actorId === source.actorId && !actor.humanControlled))
261
+ || !isDeepStrictEqual(meeting.audienceActorIds, [...meeting.participantActorIds, ...actors.filter(actor => actor.humanControlled).map(actor => actor.actorId)]))
262
+ fail('meeting-lineage-invalid', 'Meeting participants and sources must match canonical proposals');
263
+ if (policy.version === 'meetings-2') {
264
+ const recipient = sources[0], author = sources[1];
265
+ if (agencyVersion !== 'emergent-v1' || author.discussionInvitation == null
266
+ || author.discussionInvitation.recipientActorId !== recipient.actorId
267
+ || author.basedOnRevision !== entry.revision - 1 || recipient.basedOnRevision !== entry.revision - 1
268
+ || meeting.issue !== author.discussionInvitation.topic
269
+ || !isDeepStrictEqual(meeting.invitation, { sourceProposalId: author.proposalId, authorActorId: author.actorId, recipientActorId: recipient.actorId })
270
+ || meeting.turns.some(turn => turn.candidateChoiceId !== null))
271
+ fail('meeting-invitation-invalid', 'A discussion must match its original authored invitation');
272
+ }
273
+ const voluntary = meeting.receipts.some(receipt => receipt.instructionVersion === 3);
274
+ if (voluntary !== (agencyVersion === 'emergent-v1') || (voluntary && meeting.receipts.some(receipt => receipt.instructionVersion !== 3)))
275
+ fail('meeting-instruction-invalid', 'Meeting instructions must match the saved agency version');
276
+ for (const [index, turn] of meeting.turns.entries()) {
277
+ if (!(voluntary ? meetingTurnSchema : legacyMeetingTurnSchema).safeParse(turn).success)
278
+ fail('meeting-turn-invalid', 'Stored speech must match its instruction version');
279
+ const predecessor = meeting.turns[index - 1]?.turnId ?? null;
280
+ if (turn.meetingId !== meeting.meetingId || turn.turnId !== `${meeting.meetingId}-turn-${index + 1}`
281
+ || turn.speakerActorId !== meeting.participantActorIds[index === 1 ? 1 : 0]
282
+ || turn.predecessorTurnId !== predecessor)
283
+ fail('meeting-turn-lineage-invalid', 'Meeting transcript must follow the assigned speakers and predecessor chain');
284
+ }
285
+ for (const [index, receipt] of meeting.receipts.entries()) {
286
+ const turn = meeting.turns[index];
287
+ if (receipt.turnId !== `${meeting.meetingId}-turn-${index + 1}` || receipt.speakerActorId !== meeting.participantActorIds[index === 1 ? 1 : 0]
288
+ || receipt.predecessorTurnId !== (meeting.turns[index - 1]?.turnId ?? null)
289
+ || receipt.priorTurnsDigest !== digest(JSON.stringify(meeting.turns.slice(0, index)))
290
+ || (!receipt.requested && (receipt.status !== 'rejected' || receipt.outputBytes !== 0 || receipt.outputDigest !== digest('')))
291
+ || (receipt.status === 'declined' ? !voluntary || turn !== undefined || receipt.failureCode !== undefined || receipt.turnDigest !== null || receipt.outputBytes === 0 || receipt.outputBytes > 4096 : receipt.status === 'accepted' ? turn === undefined || receipt.failureCode !== undefined || receipt.outputBytes === 0 || receipt.outputBytes > 4096 || receipt.turnDigest !== digest(JSON.stringify(turn)) : turn !== undefined || receipt.failureCode === undefined || receipt.turnDigest !== null))
292
+ fail('meeting-receipt-invalid', 'Meeting receipts must match their validated ordered turns');
293
+ }
294
+ if (voluntary) {
295
+ validateVoluntaryMeeting(meeting);
296
+ continue;
297
+ }
298
+ if (meeting.status === 'accepted') {
299
+ const final = meeting.turns[2];
300
+ const choice = final === undefined ? undefined : meetingChoices(meeting.sourceProposalIds).find(choice => choice.id === final.candidateChoiceId);
301
+ if (meeting.turns.length !== 3 || meeting.receipts.length !== 3 || meeting.receipts.some(receipt => receipt.status !== 'accepted')
302
+ || choice === undefined || !isDeepStrictEqual(meeting.decision, { ...choice, finalTurnId: final.turnId }) || meeting.failureCode !== undefined)
303
+ fail('meeting-decision-invalid', 'Accepted meeting must contain three turns and the final ordered choice');
304
+ }
305
+ else if (meeting.decision !== null || meeting.failureCode === undefined
306
+ || (meeting.failureCode === 'world-consequences-rejected' ? meeting.turns.length !== 3 || meeting.receipts.length !== 3 : meeting.receipts.length !== meeting.turns.length + 1 || meeting.receipts.at(-1)?.status !== 'rejected'))
307
+ fail('meeting-decision-invalid', 'Rejected meeting cannot claim a decision or omit a failed receipt');
308
+ }
309
+ }
310
+ function validateVoluntaryMeeting(meeting) {
311
+ if (meeting.decision !== null)
312
+ fail('meeting-decision-invalid', 'Voluntary discussion cannot impose a decision');
313
+ const last = meeting.receipts.at(-1);
314
+ const stopped = meeting.turns.some((turn, index) => turn.endMeeting && index < meeting.receipts.length - 1)
315
+ || meeting.receipts.slice(0, -1).some(receipt => receipt.status !== 'accepted');
316
+ if (stopped || last === undefined)
317
+ fail('meeting-receipt-invalid', 'Discussion must stop when a participant leaves or a call fails');
318
+ const complete = (last.status === 'declined' && meeting.receipts.length === meeting.turns.length + 1)
319
+ || (last.status === 'accepted' && meeting.receipts.length === meeting.turns.length
320
+ && (meeting.turns.length === 3 || meeting.turns.at(-1)?.endMeeting === true));
321
+ if (meeting.status === 'accepted') {
322
+ if (!complete || meeting.failureCode !== undefined)
323
+ fail('meeting-decision-invalid', 'Discussion must end with voluntary speech or decline');
324
+ }
325
+ else if (meeting.failureCode === 'world-consequences-rejected' ? !complete
326
+ : meeting.failureCode === undefined || last.status !== 'rejected' || meeting.receipts.length !== meeting.turns.length + 1)
327
+ fail('meeting-decision-invalid', 'Rejected discussion must preserve its failed receipt');
328
+ }
329
+ export function validateMeetingAdjudications(proposal, meetings, characters, agencyVersion) {
330
+ if (agencyVersion === 'emergent-v1') {
331
+ for (const ruling of proposal.adjudications) {
332
+ if (ruling.meetingId !== undefined && !meetings.some(meeting => meeting.meetingId === ruling.meetingId && meeting.sourceProposalIds.includes(ruling.characterProposalId)))
333
+ fail('meeting-adjudication-invalid', 'A meeting reference must belong to this proposal');
334
+ }
335
+ return;
336
+ }
337
+ const accepted = meetings.filter(meeting => meeting.status === 'accepted');
338
+ for (const ruling of proposal.adjudications) {
339
+ const meeting = accepted.find(meeting => meeting.decision?.deferProposalIds.includes(ruling.characterProposalId));
340
+ if (meeting === undefined ? ruling.outcome === 'deferred' || ruling.meetingId !== undefined
341
+ : ruling.outcome !== 'deferred' || ruling.meetingId !== meeting.meetingId || ruling.actionIds.length !== 0)
342
+ fail('meeting-adjudication-invalid', 'Deferred adjudication must match an accepted meeting decision');
343
+ if (meeting !== undefined) {
344
+ const source = characters.find(character => character.proposalId === ruling.characterProposalId);
345
+ if (source === undefined || proposal.domainActions.some(action => action.sourceCharacterProposalId === source.proposalId
346
+ || (action.actorId === undefined && source.attemptedActions.some(attempt => action.mechanic === attempt.mechanic && isDeepStrictEqual(action.parameters.intent, attempt.parameters.intent)))))
347
+ fail('meeting-adjudication-invalid', 'A deferred source cannot perform an action or an actorless substitute');
348
+ }
349
+ }
350
+ }