@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.
- package/README.md +398 -45
- package/RUST_THIRD_PARTY_LICENSES.txt +1080 -822
- package/THIRD_PARTY_NOTICES.md +273 -12
- package/bin/zmux-darwin-arm64 +0 -0
- package/bin/ztc-audio-darwin-arm64 +0 -0
- package/bin/ztc-capture-darwin-arm64 +0 -0
- package/bin/ztc-computer-darwin-arm64 +0 -0
- package/bin/ztc-llm-darwin-arm64 +0 -0
- package/bin/ztc-tts-darwin-arm64 +0 -0
- package/bin/ztc-tui-darwin-arm64 +0 -0
- package/bin/ztc-zlicky-overlay-darwin-arm64 +0 -0
- package/bin/zterm-darwin-arm64 +0 -0
- package/dist/App.js +1206 -209
- package/dist/agent/agent.d.ts +74 -8
- package/dist/agent/agent.js +1073 -184
- package/dist/agent/backends/account_rotation.d.ts +4 -0
- package/dist/agent/backends/account_rotation.js +8 -2
- package/dist/agent/backends/anthropic.d.ts +13 -0
- package/dist/agent/backends/anthropic.js +169 -28
- package/dist/agent/backends/claude_cli.js +18 -8
- package/dist/agent/backends/codex_app_server.d.ts +1 -0
- package/dist/agent/backends/codex_app_server.js +55 -3
- package/dist/agent/backends/codex_auth.d.ts +1 -0
- package/dist/agent/backends/codex_auth.js +67 -13
- package/dist/agent/backends/codex_buffered_recovery.d.ts +27 -0
- package/dist/agent/backends/codex_buffered_recovery.js +293 -0
- package/dist/agent/backends/gemini.js +3 -1
- package/dist/agent/backends/http_error.d.ts +26 -0
- package/dist/agent/backends/http_error.js +221 -0
- package/dist/agent/backends/index.d.ts +9 -2
- package/dist/agent/backends/index.js +22 -2
- package/dist/agent/backends/openai.d.ts +0 -6
- package/dist/agent/backends/openai.js +5 -2
- package/dist/agent/backends/openai_compatible.d.ts +5 -4
- package/dist/agent/backends/openai_compatible.js +26 -19
- package/dist/agent/backends/openai_responses.d.ts +8 -3
- package/dist/agent/backends/openai_responses.js +77 -33
- package/dist/agent/backends/provider_ids.d.ts +1 -0
- package/dist/agent/backends/provider_ids.js +4 -0
- package/dist/agent/backends/request_metrics.js +12 -2
- package/dist/agent/backends/types.d.ts +109 -6
- package/dist/agent/backends/types.js +5 -1
- package/dist/agent/backends/zrouter_stream.d.ts +6 -1
- package/dist/agent/backends/zrouter_stream.js +160 -42
- package/dist/agent/background_registry.d.ts +2 -0
- package/dist/agent/background_registry.js +1 -0
- package/dist/agent/claim_observation.d.ts +6 -0
- package/dist/agent/claim_observation.js +54 -0
- package/dist/agent/commands/accounts.js +46 -177
- package/dist/agent/commands/attention.d.ts +2 -0
- package/dist/agent/commands/attention.js +67 -0
- package/dist/agent/commands/auth.js +18 -2
- package/dist/agent/commands/board.d.ts +2 -0
- package/dist/agent/commands/board.js +169 -0
- package/dist/agent/commands/clipboard.js +50 -1
- package/dist/agent/commands/compact.js +21 -13
- package/dist/agent/commands/config.js +4 -1
- package/dist/agent/commands/context.js +6 -1
- package/dist/agent/commands/desktop.d.ts +2 -0
- package/dist/agent/commands/desktop.js +29 -0
- package/dist/agent/commands/effort.js +14 -6
- package/dist/agent/commands/environment.d.ts +3 -0
- package/dist/agent/commands/environment.js +109 -0
- package/dist/agent/commands/evidence.d.ts +2 -0
- package/dist/agent/commands/evidence.js +9 -0
- package/dist/agent/commands/fork.js +4 -3
- package/dist/agent/commands/goal.d.ts +33 -1
- package/dist/agent/commands/goal.js +174 -14
- package/dist/agent/commands/goal_exit.d.ts +36 -0
- package/dist/agent/commands/goal_exit.js +120 -0
- package/dist/agent/commands/help.js +3 -1
- package/dist/agent/commands/history.js +3 -1
- package/dist/agent/commands/inbox.d.ts +2 -0
- package/dist/agent/commands/inbox.js +148 -0
- package/dist/agent/commands/index.js +16 -1
- package/dist/agent/commands/input_mode.js +8 -6
- package/dist/agent/commands/job.d.ts +2 -0
- package/dist/agent/commands/job.js +93 -0
- package/dist/agent/commands/keybindings.js +4 -1
- package/dist/agent/commands/label.d.ts +2 -0
- package/dist/agent/commands/label.js +77 -0
- package/dist/agent/commands/layout.d.ts +2 -0
- package/dist/agent/commands/layout.js +20 -0
- package/dist/agent/commands/mirror.js +16 -1
- package/dist/agent/commands/model.js +12 -2
- package/dist/agent/commands/permissions.d.ts +3 -1
- package/dist/agent/commands/permissions.js +79 -89
- package/dist/agent/commands/plan.js +5 -15
- package/dist/agent/commands/profile.js +21 -2
- package/dist/agent/commands/provider_selection.js +20 -1
- package/dist/agent/commands/rename.js +1 -1
- package/dist/agent/commands/resources.d.ts +2 -0
- package/dist/agent/commands/resources.js +67 -0
- package/dist/agent/commands/rewind.d.ts +3 -0
- package/dist/agent/commands/rewind.js +16 -0
- package/dist/agent/commands/runbooks.d.ts +2 -0
- package/dist/agent/commands/runbooks.js +73 -0
- package/dist/agent/commands/runbooks_lazy.d.ts +2 -0
- package/dist/agent/commands/runbooks_lazy.js +8 -0
- package/dist/agent/commands/sessions.d.ts +1 -1
- package/dist/agent/commands/sessions.js +33 -5
- package/dist/agent/commands/settings.js +185 -39
- package/dist/agent/commands/setup.d.ts +2 -0
- package/dist/agent/commands/setup.js +78 -0
- package/dist/agent/commands/share.d.ts +2 -0
- package/dist/agent/commands/share.js +64 -0
- package/dist/agent/commands/status.js +14 -2
- package/dist/agent/commands/types.d.ts +99 -6
- package/dist/agent/commands/update.js +8 -0
- package/dist/agent/commands/usage.d.ts +2 -0
- package/dist/agent/commands/usage.js +8 -0
- package/dist/agent/factory.d.ts +11 -0
- package/dist/agent/factory.js +113 -88
- package/dist/agent/loop_policy.d.ts +6 -3
- package/dist/agent/loop_policy.js +12 -3
- package/dist/agent/measurement_guidance.d.ts +2 -0
- package/dist/agent/measurement_guidance.js +5 -0
- package/dist/agent/request_encoder.d.ts +8 -1
- package/dist/agent/request_encoder.js +95 -23
- package/dist/agent/runtime/benchmark_comparison.d.ts +30 -0
- package/dist/agent/runtime/benchmark_comparison.js +94 -0
- package/dist/agent/runtime/benchmark_contract.d.ts +48 -0
- package/dist/agent/runtime/benchmark_contract.js +90 -0
- package/dist/agent/runtime/checked_commands.d.ts +32 -0
- package/dist/agent/runtime/checked_commands.js +119 -0
- package/dist/agent/runtime/command_execution_policy.d.ts +26 -0
- package/dist/agent/runtime/command_execution_policy.js +91 -0
- package/dist/agent/runtime/command_jobs.d.ts +36 -18
- package/dist/agent/runtime/command_jobs.js +151 -13
- package/dist/agent/runtime/command_panes.d.ts +59 -0
- package/dist/agent/runtime/command_panes.js +398 -0
- package/dist/agent/runtime/command_wait.d.ts +19 -0
- package/dist/agent/runtime/command_wait.js +167 -0
- package/dist/agent/runtime/cpu_benchmark.d.ts +30 -0
- package/dist/agent/runtime/cpu_benchmark.js +126 -0
- package/dist/agent/runtime/delegated_evidence.d.ts +26 -0
- package/dist/agent/runtime/delegated_evidence.js +80 -0
- package/dist/agent/runtime/evidence.d.ts +127 -0
- package/dist/agent/runtime/evidence.js +468 -0
- package/dist/agent/runtime/execution_context.d.ts +7 -0
- package/dist/agent/runtime/execution_context.js +39 -3
- package/dist/agent/runtime/json_verifier_recipe.d.ts +8 -0
- package/dist/agent/runtime/json_verifier_recipe.js +66 -0
- package/dist/agent/runtime/measurements.d.ts +110 -0
- package/dist/agent/runtime/measurements.js +317 -0
- package/dist/agent/runtime/policy.d.ts +4 -0
- package/dist/agent/runtime/policy.js +31 -20
- package/dist/agent/runtime/provider_native_evidence.d.ts +20 -0
- package/dist/agent/runtime/provider_native_evidence.js +86 -0
- package/dist/agent/runtime/recovery.d.ts +2 -0
- package/dist/agent/runtime/recovery.js +45 -2
- package/dist/agent/runtime/remote_broker_transport.d.ts +10 -0
- package/dist/agent/runtime/remote_broker_transport.js +84 -0
- package/dist/agent/runtime/remote_deletion_receipts.d.ts +3 -0
- package/dist/agent/runtime/remote_deletion_receipts.js +43 -0
- package/dist/agent/runtime/remote_journal_replay.d.ts +13 -0
- package/dist/agent/runtime/remote_journal_replay.js +233 -0
- package/dist/agent/runtime/remote_mutation_journal.d.ts +25 -0
- package/dist/agent/runtime/remote_mutation_journal.js +208 -0
- package/dist/agent/runtime/remote_resource_endpoint.d.ts +7 -0
- package/dist/agent/runtime/remote_resource_endpoint.js +6 -0
- package/dist/agent/runtime/remote_resource_errors.d.ts +5 -0
- package/dist/agent/runtime/remote_resource_errors.js +9 -0
- package/dist/agent/runtime/remote_resource_script.d.ts +2 -0
- package/dist/agent/runtime/remote_resource_script.js +1009 -0
- package/dist/agent/runtime/remote_resources.d.ts +29 -0
- package/dist/agent/runtime/remote_resources.js +160 -0
- package/dist/agent/runtime/source_verification.d.ts +12 -0
- package/dist/agent/runtime/source_verification.js +210 -0
- package/dist/agent/runtime/source_verification_contract.d.ts +75 -0
- package/dist/agent/runtime/source_verification_contract.js +203 -0
- package/dist/agent/runtime/tool_checkpoints.d.ts +11 -0
- package/dist/agent/runtime/tool_checkpoints.js +26 -0
- package/dist/agent/runtime/tool_effects.d.ts +5 -0
- package/dist/agent/runtime/tool_progress.d.ts +12 -0
- package/dist/agent/runtime/tool_progress.js +76 -0
- package/dist/agent/runtime/tool_runtime.d.ts +16 -1
- package/dist/agent/runtime/tool_runtime.js +204 -10
- package/dist/agent/runtime/tracing.d.ts +1 -1
- package/dist/agent/runtime/verifier_capture.d.ts +9 -0
- package/dist/agent/runtime/verifier_capture.js +100 -0
- package/dist/agent/runtime/verifier_contract.d.ts +24 -0
- package/dist/agent/runtime/verifier_contract.js +41 -0
- package/dist/agent/subagent.d.ts +20 -10
- package/dist/agent/subagent.js +266 -29
- package/dist/agent/tool_response_directory.d.ts +24 -0
- package/dist/agent/tool_response_directory.js +61 -0
- package/dist/agent/tool_response_source.d.ts +8 -0
- package/dist/agent/tool_response_source.js +49 -0
- package/dist/agent/tool_response_store.d.ts +75 -4
- package/dist/agent/tool_response_store.js +583 -64
- package/dist/agent/tools/ask_user.d.ts +3 -1
- package/dist/agent/tools/ask_user.js +30 -11
- package/dist/agent/tools/background.js +1 -0
- package/dist/agent/tools/benchmark_cpu.d.ts +2 -0
- package/dist/agent/tools/benchmark_cpu.js +102 -0
- package/dist/agent/tools/compare_benchmarks.d.ts +2 -0
- package/dist/agent/tools/compare_benchmarks.js +53 -0
- package/dist/agent/tools/deferred.js +1 -0
- package/dist/agent/tools/delegate.js +18 -2
- package/dist/agent/tools/helper_requirements.d.ts +7 -0
- package/dist/agent/tools/helper_requirements.js +19 -0
- package/dist/agent/tools/index.d.ts +1 -0
- package/dist/agent/tools/index.js +3 -0
- package/dist/agent/tools/measurement_report.d.ts +22 -0
- package/dist/agent/tools/measurement_report.js +190 -0
- package/dist/agent/tools/pane.d.ts +0 -7
- package/dist/agent/tools/pane.js +5 -4
- package/dist/agent/tools/project_context.d.ts +3 -0
- package/dist/agent/tools/project_context.js +45 -0
- package/dist/agent/tools/recall_tool_response.d.ts +3 -5
- package/dist/agent/tools/recall_tool_response.js +19 -29
- package/dist/agent/tools/registry.d.ts +1 -0
- package/dist/agent/tools/registry.js +23 -0
- package/dist/agent/tools/related_sessions.d.ts +2 -0
- package/dist/agent/tools/related_sessions.js +156 -0
- package/dist/agent/tools/routine.js +13 -3
- package/dist/agent/tools/session_evidence.d.ts +3 -0
- package/dist/agent/tools/session_evidence.js +72 -0
- package/dist/agent/tools/shell.d.ts +4 -3
- package/dist/agent/tools/shell.js +174 -47
- package/dist/agent/tools/tool_search.js +3 -2
- package/dist/agent/tools/types.d.ts +28 -0
- package/dist/agent/tools/verify_artifact.d.ts +2 -0
- package/dist/agent/tools/verify_artifact.js +60 -0
- package/dist/agent/tools/workflow.js +1 -0
- package/dist/app/activity.d.ts +6 -1
- package/dist/app/activity.js +81 -12
- package/dist/app/agent_runner.d.ts +6 -1
- package/dist/app/agent_runner.js +34 -19
- package/dist/app/command_context.js +106 -10
- package/dist/app/controller.d.ts +15 -4
- package/dist/app/controller.js +29 -3
- package/dist/app/escape_stop.d.ts +11 -0
- package/dist/app/escape_stop.js +15 -0
- package/dist/app/liveness.d.ts +6 -4
- package/dist/app/liveness.js +13 -3
- package/dist/app/model_catalog_cache.d.ts +5 -0
- package/dist/app/model_catalog_cache.js +138 -0
- package/dist/app/ordered_transcript.js +43 -4
- package/dist/app/prompt_turn.d.ts +14 -0
- package/dist/app/prompt_turn.js +53 -0
- package/dist/app/recap.d.ts +3 -0
- package/dist/app/recap.js +9 -3
- package/dist/app/restart.d.ts +3 -2
- package/dist/app/restart.js +22 -7
- package/dist/app/rewind.d.ts +3 -3
- package/dist/app/rewind.js +3 -3
- package/dist/app/selection_completion.d.ts +17 -2
- package/dist/app/selection_completion.js +84 -9
- package/dist/app/session_manager.d.ts +38 -6
- package/dist/app/session_manager.js +263 -60
- package/dist/app/session_messages.d.ts +3 -0
- package/dist/app/session_messages.js +60 -0
- package/dist/app/task_scope_router.d.ts +20 -0
- package/dist/app/task_scope_router.js +173 -0
- package/dist/app/transcript_window.d.ts +2 -0
- package/dist/app/transcript_window.js +4 -0
- package/dist/app/workspace_admission_details.d.ts +3 -0
- package/dist/app/workspace_admission_details.js +26 -0
- package/dist/app/workspace_layout_controller.d.ts +11 -0
- package/dist/app/workspace_layout_controller.js +88 -0
- package/dist/app/workspace_monitor.d.ts +1 -0
- package/dist/app/workspace_monitor.js +216 -0
- package/dist/app/workspace_presets.d.ts +29 -0
- package/dist/app/workspace_presets.js +192 -0
- package/dist/attention/queue.d.ts +37 -0
- package/dist/attention/queue.js +183 -0
- package/dist/bench/rf_shared.d.ts +2 -0
- package/dist/board/binding.d.ts +42 -0
- package/dist/board/binding.js +38 -0
- package/dist/board/client.d.ts +42 -0
- package/dist/board/client.js +60 -0
- package/dist/cli.js +1 -1
- package/dist/cli_args.js +19 -17
- package/dist/cli_main.js +110 -13
- package/dist/cli_ratatui.d.ts +183 -16
- package/dist/cli_ratatui.js +3989 -1255
- package/dist/components/ActivityLine.d.ts +3 -2
- package/dist/components/ActivityLine.js +2 -2
- package/dist/components/InputArea.d.ts +19 -1
- package/dist/components/InputArea.js +264 -190
- package/dist/components/MessageList.d.ts +2 -0
- package/dist/components/MessageList.js +3 -1
- package/dist/components/SingleMessage.d.ts +2 -0
- package/dist/components/SingleMessage.js +4 -2
- package/dist/components/StatusBar.d.ts +4 -2
- package/dist/components/StatusBar.js +3 -1
- package/dist/conductor_branch.js +3 -0
- package/dist/config/api_retry.d.ts +6 -1
- package/dist/config/api_retry.js +19 -1
- package/dist/config/defaults.d.ts +2 -1
- package/dist/config/defaults.js +9 -2
- package/dist/config/message_display.d.ts +1 -0
- package/dist/config/message_display.js +17 -2
- package/dist/config/permissions.d.ts +21 -0
- package/dist/config/permissions.js +89 -0
- package/dist/config/resolved.d.ts +2 -2
- package/dist/config/types.d.ts +32 -5
- package/dist/config.d.ts +38 -4
- package/dist/config.js +290 -42
- package/dist/context/project_intelligence.d.ts +44 -0
- package/dist/context/project_intelligence.js +246 -0
- package/dist/desktop/cli_launch.d.ts +8 -0
- package/dist/desktop/cli_launch.js +6 -0
- package/dist/desktop/cli_shim.d.ts +8 -0
- package/dist/desktop/cli_shim.js +120 -0
- package/dist/desktop/runtime.d.ts +16 -0
- package/dist/desktop/runtime.js +161 -0
- package/dist/desktop/worker_launch.d.ts +7 -0
- package/dist/desktop/worker_launch.js +7 -0
- package/dist/diagnostics/cargo_mutants_selection.d.ts +27 -0
- package/dist/diagnostics/cargo_mutants_selection.js +48 -0
- package/dist/diagnostics/native_terminal_benchmark.d.ts +58 -0
- package/dist/diagnostics/native_terminal_benchmark.js +1247 -0
- package/dist/diagnostics/session_evidence_package.d.ts +40 -0
- package/dist/diagnostics/session_evidence_package.js +234 -0
- package/dist/diagnostics/session_export.d.ts +93 -0
- package/dist/diagnostics/session_export.js +634 -0
- package/dist/emulation/tool_adapters.js +48 -18
- package/dist/emulation/ztc_addendum.d.ts +1 -0
- package/dist/emulation/ztc_addendum.js +13 -12
- package/dist/environment/service_runner.d.ts +1 -0
- package/dist/environment/service_runner.js +68 -0
- package/dist/environment/store.d.ts +120 -0
- package/dist/environment/store.js +387 -0
- package/dist/events.d.ts +40 -1
- package/dist/events.js +10 -17
- package/dist/goal_contract.d.ts +25 -0
- package/dist/goal_contract.js +44 -0
- package/dist/headless.d.ts +31 -0
- package/dist/headless.js +578 -70
- package/dist/headless_cli.js +8 -0
- package/dist/headless_cli_args.d.ts +1 -0
- package/dist/headless_cli_args.js +1 -0
- package/dist/intake/cli.d.ts +1 -0
- package/dist/intake/cli.js +33 -0
- package/dist/intake/format.d.ts +2 -0
- package/dist/intake/format.js +14 -0
- package/dist/intake/notifications.d.ts +16 -0
- package/dist/intake/notifications.js +132 -0
- package/dist/intake/store.d.ts +56 -0
- package/dist/intake/store.js +238 -0
- package/dist/library.d.ts +8 -0
- package/dist/library.js +19 -10
- package/dist/mcp/client.d.ts +1 -0
- package/dist/mcp/client.js +20 -0
- package/dist/modes/builtin/plan.yaml +2 -2
- package/dist/modes/handlers.js +1 -1
- package/dist/onboarding/first_run.d.ts +3 -0
- package/dist/onboarding/first_run.js +33 -25
- package/dist/onboarding/setup.d.ts +32 -0
- package/dist/onboarding/setup.js +133 -0
- package/dist/onboarding/setup_agent_health.d.ts +17 -0
- package/dist/onboarding/setup_agent_health.js +79 -0
- package/dist/onboarding/setup_environment.d.ts +66 -0
- package/dist/onboarding/setup_environment.js +219 -0
- package/dist/onboarding/setup_workspace.d.ts +17 -0
- package/dist/onboarding/setup_workspace.js +129 -0
- package/dist/optimize/adapters/index.d.ts +4 -1
- package/dist/optimize/adapters/index.js +7 -0
- package/dist/optimize/adapters/kernelbench.js +14 -5
- package/dist/optimize/adapters/popcorn.js +3 -2
- package/dist/optimize/adapters/profile_benchmark.js +13 -7
- package/dist/optimize/adapters/rfbench.js +25 -14
- package/dist/optimize/adapters/types.d.ts +3 -0
- package/dist/optimize/adapters/zergpod.js +5 -2
- package/dist/optimize/baseline.js +10 -21
- package/dist/optimize/branch.js +9 -12
- package/dist/optimize/combine.js +2 -3
- package/dist/optimize/executor.js +34 -48
- package/dist/optimize/measurements.d.ts +55 -0
- package/dist/optimize/measurements.js +173 -0
- package/dist/optimize/results.d.ts +1 -0
- package/dist/optimize/results.js +11 -33
- package/dist/optimize/tge.js +2 -1
- package/dist/panes/initial_input.d.ts +19 -0
- package/dist/panes/initial_input.js +206 -0
- package/dist/panes/labels.d.ts +16 -0
- package/dist/panes/labels.js +42 -0
- package/dist/panes/model_catalog.d.ts +3 -3
- package/dist/panes/model_catalog.js +28 -4
- package/dist/panes/pane_registry.js +6 -2
- package/dist/panes/types.d.ts +3 -0
- package/dist/panes/ztc_launch.js +19 -0
- package/dist/plugin/optimization.d.ts +2 -0
- package/dist/plugin/optimization.js +1 -0
- package/dist/plugin/runtime.d.ts +2 -0
- package/dist/plugin/simulation.d.ts +6 -1
- package/dist/plugin/simulation_contract.d.ts +836 -1
- package/dist/plugin/simulation_documents.d.ts +22 -0
- package/dist/plugin/simulation_documents.js +1 -0
- package/dist/plugin/simulation_interventions.d.ts +103 -0
- package/dist/plugin/simulation_interventions.js +1 -0
- package/dist/plugin/simulation_living.d.ts +1 -0
- package/dist/plugin/simulation_living.js +3 -0
- package/dist/plugin/simulation_meetings.d.ts +121 -0
- package/dist/plugin/simulation_meetings.js +1 -0
- package/dist/plugin/simulation_story_review.d.ts +111 -0
- package/dist/plugin/simulation_story_review.js +1 -0
- package/dist/plugin/simulation_storyteller.d.ts +91 -0
- package/dist/plugin/simulation_storyteller.js +1 -0
- package/dist/plugin/simulation_structured.d.ts +2 -0
- package/dist/plugin/simulation_structured.js +2 -0
- package/dist/plugin/simulation_toolkit.d.ts +21 -0
- package/dist/plugin/simulation_toolkit.js +24 -0
- package/dist/prompts/tool_delegate_task.j2 +1 -1
- package/dist/remote-broker/Dockerfile +10 -0
- package/dist/remote-broker/archive.py +1227 -0
- package/dist/remote-broker/cutover.py +761 -0
- package/dist/remote-broker/requirements.txt +5 -0
- package/dist/remote-broker/resources.json +6 -0
- package/dist/remote-broker/resources.write-staging.example.json +18 -0
- package/dist/remote-broker/retained.py +686 -0
- package/dist/remote-broker/retained_cleanup.py +550 -0
- package/dist/remote-broker/server.py +648 -0
- package/dist/remote-broker/worker.py +1007 -0
- package/dist/router_auth.d.ts +31 -0
- package/dist/router_auth.js +155 -9
- package/dist/runbooks/catalog.d.ts +3 -0
- package/dist/runbooks/catalog.js +26 -0
- package/dist/runbooks/library.d.ts +11 -0
- package/dist/runbooks/library.js +95 -0
- package/dist/runbooks/package.d.ts +43 -0
- package/dist/runbooks/package.js +102 -0
- package/dist/session.d.ts +65 -13
- package/dist/session.js +548 -43
- package/dist/session_handoff.d.ts +25 -0
- package/dist/session_handoff.js +322 -0
- package/dist/session_handoff_contract.d.ts +89 -0
- package/dist/session_handoff_contract.js +179 -0
- package/dist/session_media.d.ts +41 -0
- package/dist/session_media.js +357 -0
- package/dist/session_ownership.d.ts +16 -0
- package/dist/session_ownership.js +221 -0
- package/dist/session_public.d.ts +10 -2
- package/dist/session_public.js +6 -1
- package/dist/simulation/dynamic_history.d.ts +42 -0
- package/dist/simulation/dynamic_history.js +173 -0
- package/dist/simulation/engines/swarm/pane_manager.js +7 -6
- package/dist/simulation/inference.d.ts +3 -1
- package/dist/simulation/inference.js +19 -1
- package/dist/simulation/intervention_generation.d.ts +27 -0
- package/dist/simulation/intervention_generation.js +246 -0
- package/dist/simulation/intervention_material.d.ts +4 -0
- package/dist/simulation/intervention_material.js +81 -0
- package/dist/simulation/living/context.d.ts +3130 -0
- package/dist/simulation/living/context.js +944 -0
- package/dist/simulation/living/definer.d.ts +12 -0
- package/dist/simulation/living/definer.js +223 -0
- package/dist/simulation/living/definition.d.ts +257 -0
- package/dist/simulation/living/definition.js +341 -0
- package/dist/simulation/living/frame.d.ts +259 -0
- package/dist/simulation/living/frame.js +223 -0
- package/dist/simulation/living/identifiers.d.ts +2 -0
- package/dist/simulation/living/identifiers.js +12 -0
- package/dist/simulation/living/index.d.ts +15 -0
- package/dist/simulation/living/index.js +15 -0
- package/dist/simulation/living/inference.d.ts +219 -0
- package/dist/simulation/living/inference.js +576 -0
- package/dist/simulation/living/mechanics.d.ts +54 -0
- package/dist/simulation/living/mechanics.js +588 -0
- package/dist/simulation/living/model-input.d.ts +25 -0
- package/dist/simulation/living/model-input.js +215 -0
- package/dist/simulation/living/open-world.d.ts +257 -0
- package/dist/simulation/living/open-world.js +102 -0
- package/dist/simulation/living/projection.d.ts +7 -0
- package/dist/simulation/living/projection.js +31 -0
- package/dist/simulation/living/recall.d.ts +17 -0
- package/dist/simulation/living/recall.js +25 -0
- package/dist/simulation/living/reduce.d.ts +15 -0
- package/dist/simulation/living/reduce.js +1853 -0
- package/dist/simulation/living/replay.d.ts +6 -0
- package/dist/simulation/living/replay.js +22 -0
- package/dist/simulation/living/runtime.d.ts +140 -0
- package/dist/simulation/living/runtime.js +3020 -0
- package/dist/simulation/living/shared-kinds.d.ts +24 -0
- package/dist/simulation/living/shared-kinds.js +96 -0
- package/dist/simulation/living/types.d.ts +2785 -0
- package/dist/simulation/living/types.js +669 -0
- package/dist/simulation/llm.d.ts +3 -1
- package/dist/simulation/llm.js +90 -30
- package/dist/simulation/memory/embedding.d.ts +1 -1
- package/dist/simulation/memory/embedding.js +9 -3
- package/dist/simulation/memory/filesystem.d.ts +2 -0
- package/dist/simulation/memory/filesystem.js +5 -1
- package/dist/simulation/memory/filesystem_file_tree.d.ts +4 -1
- package/dist/simulation/memory/filesystem_file_tree.js +41 -10
- package/dist/simulation/memory/filesystem_invariants.js +1 -2
- package/dist/simulation/memory/filesystem_types.d.ts +1 -0
- package/dist/simulation/memory/memory.d.ts +2 -0
- package/dist/simulation/memory/memory.js +5 -1
- package/dist/simulation/orchestration/intent.js +0 -2
- package/dist/simulation/orchestration/lifecycle.js +0 -2
- package/dist/simulation/plugin_host.d.ts +25 -1
- package/dist/simulation/plugin_host.js +334 -17
- package/dist/simulation/session_documents.d.ts +20 -0
- package/dist/simulation/session_documents.js +62 -0
- package/dist/simulation/session_input_validation.d.ts +43 -0
- package/dist/simulation/session_input_validation.js +364 -0
- package/dist/simulation/session_inputs.d.ts +32 -0
- package/dist/simulation/session_inputs.js +154 -0
- package/dist/simulation/telemetry.d.ts +11 -14
- package/dist/simulation/telemetry.js +177 -54
- package/dist/simulation/toolkit/bounded_turns.d.ts +13 -0
- package/dist/simulation/toolkit/bounded_turns.js +80 -0
- package/dist/simulation/toolkit/dynamic_agents.d.ts +25 -0
- package/dist/simulation/toolkit/dynamic_agents.js +218 -0
- package/dist/simulation/toolkit/dynamic_digest.d.ts +1 -0
- package/dist/simulation/toolkit/dynamic_digest.js +8 -0
- package/dist/simulation/toolkit/dynamic_documents.d.ts +7 -0
- package/dist/simulation/toolkit/dynamic_documents.js +71 -0
- package/dist/simulation/toolkit/dynamic_driver.d.ts +8 -0
- package/dist/simulation/toolkit/dynamic_driver.js +269 -0
- package/dist/simulation/toolkit/dynamic_game.d.ts +53 -0
- package/dist/simulation/toolkit/dynamic_game.js +805 -0
- package/dist/simulation/toolkit/dynamic_knowledge.d.ts +15 -0
- package/dist/simulation/toolkit/dynamic_knowledge.js +91 -0
- package/dist/simulation/toolkit/dynamic_mechanics.d.ts +22 -0
- package/dist/simulation/toolkit/dynamic_mechanics.js +910 -0
- package/dist/simulation/toolkit/dynamic_meetings.d.ts +239 -0
- package/dist/simulation/toolkit/dynamic_meetings.js +350 -0
- package/dist/simulation/toolkit/dynamic_progress.d.ts +131 -0
- package/dist/simulation/toolkit/dynamic_progress.js +214 -0
- package/dist/simulation/toolkit/dynamic_projection.d.ts +9 -0
- package/dist/simulation/toolkit/dynamic_projection.js +219 -0
- package/dist/simulation/toolkit/dynamic_runtime.d.ts +412 -0
- package/dist/simulation/toolkit/dynamic_runtime.js +6536 -0
- package/dist/simulation/toolkit/dynamic_state.d.ts +111 -0
- package/dist/simulation/toolkit/dynamic_state.js +1967 -0
- package/dist/simulation/toolkit/dynamic_story_review.d.ts +508 -0
- package/dist/simulation/toolkit/dynamic_story_review.js +333 -0
- package/dist/simulation/toolkit/dynamic_storyteller.d.ts +77 -0
- package/dist/simulation/toolkit/dynamic_storyteller.js +114 -0
- package/dist/simulation/toolkit/dynamic_storyteller_runtime.d.ts +26 -0
- package/dist/simulation/toolkit/dynamic_storyteller_runtime.js +126 -0
- package/dist/simulation/toolkit/dynamic_world.d.ts +22 -0
- package/dist/simulation/toolkit/dynamic_world.js +377 -0
- package/dist/simulation/toolkit/structured_output.d.ts +5 -0
- package/dist/simulation/toolkit/structured_output.js +321 -0
- package/dist/simulation/types/world.d.ts +2 -0
- package/dist/simulation/world/artifact_store.js +1 -1
- package/dist/simulation/world/memory_manager.d.ts +5 -0
- package/dist/simulation/world/memory_manager.js +17 -2
- package/dist/simulation/world/state.d.ts +3 -2
- package/dist/simulation/world/state.js +15 -5
- package/dist/skills/bundled/measurement-validation/SKILL.md +144 -0
- package/dist/terminal_attach.d.ts +1 -0
- package/dist/terminal_attach.js +113 -0
- package/dist/tool_progress.d.ts +3 -0
- package/dist/tool_progress.js +27 -0
- package/dist/types.d.ts +145 -10
- package/dist/types.js +3 -0
- package/dist/ui/core/input.d.ts +3 -0
- package/dist/ui/core/input_segments.d.ts +18 -1
- package/dist/ui/core/input_segments.js +131 -47
- package/dist/ui/core/input_state.d.ts +12 -0
- package/dist/ui/core/layout_yoga.d.ts +1 -1
- package/dist/ui/core/turn_metadata.d.ts +5 -0
- package/dist/ui/core/turn_metadata.js +22 -0
- package/dist/ui/ink/render.d.ts +2 -1
- package/dist/ui/ink/render.js +6 -5
- package/dist/ui/ratatui/headless_pane_manager.d.ts +14 -1
- package/dist/ui/ratatui/headless_pane_manager.js +293 -104
- package/dist/ui/ratatui/index.d.ts +1 -0
- package/dist/ui/ratatui/input.d.ts +4 -0
- package/dist/ui/ratatui/input.js +15 -0
- package/dist/ui/ratatui/ipc_path.d.ts +2 -0
- package/dist/ui/ratatui/ipc_path.js +29 -1
- package/dist/ui/ratatui/mux_persistence.d.ts +3 -1
- package/dist/ui/ratatui/mux_persistence.js +139 -1
- package/dist/ui/ratatui/pane_relay.d.ts +1 -1
- package/dist/ui/ratatui/pane_relay.js +55 -27
- package/dist/ui/ratatui/process.d.ts +17 -1
- package/dist/ui/ratatui/process.js +80 -7
- package/dist/ui/ratatui/protocol.d.ts +236 -1
- package/dist/ui/ratatui/protocol.js +90 -0
- package/dist/ui/scrollback.d.ts +2 -1
- package/dist/ui/scrollback.js +9 -4
- package/dist/ui/stream_typewriter.d.ts +8 -3
- package/dist/ui/stream_typewriter.js +30 -1
- package/dist/ui/streaming_scrollback.d.ts +1 -0
- package/dist/ui/streaming_scrollback.js +1 -1
- package/dist/ui/transcript_render_cache.js +10 -0
- package/dist/ui/views/activity_line.d.ts +5 -3
- package/dist/ui/views/activity_line.js +65 -7
- package/dist/ui/views/app.d.ts +6 -3
- package/dist/ui/views/app.js +17 -6
- package/dist/ui/views/completion_menu.js +10 -5
- package/dist/ui/views/input_area.d.ts +7 -3
- package/dist/ui/views/input_area.js +15 -9
- package/dist/ui/views/message_list.d.ts +4 -1
- package/dist/ui/views/message_list.js +89 -19
- package/dist/ui/views/queue_panel.d.ts +3 -1
- package/dist/ui/views/queue_panel.js +9 -2
- package/dist/ui/views/status_bar.d.ts +4 -2
- package/dist/ui/views/status_bar.js +28 -13
- package/dist/ui/views/theme.d.ts +2 -0
- package/dist/ui/views/theme.js +2 -0
- package/dist/ui/widgets/color_panel.js +18 -0
- package/dist/ui/widgets/form.js +8 -0
- package/dist/ui/widgets/log_view.js +7 -0
- package/dist/ui/widgets/navigator_panel.js +8 -0
- package/dist/ui/widgets/prompt_viewer.js +2 -0
- package/dist/ui/widgets/questionnaire.d.ts +2 -0
- package/dist/ui/widgets/questionnaire.js +79 -16
- package/dist/ui/widgets/resume_panel.d.ts +2 -0
- package/dist/ui/widgets/resume_panel.js +26 -15
- package/dist/ui/widgets/rewind_panel.d.ts +2 -2
- package/dist/ui/widgets/rewind_panel.js +4 -2
- package/dist/ui/widgets/select.js +16 -27
- package/dist/ui/widgets/settings_panel.js +16 -0
- package/dist/ui/widgets/status_line_panel.d.ts +1 -0
- package/dist/ui/widgets/status_line_panel.js +30 -4
- package/dist/ui/widgets/text_input.d.ts +2 -0
- package/dist/ui/widgets/text_input.js +15 -1
- package/dist/ui/widgets/types.d.ts +2 -0
- package/dist/usage_projection.d.ts +24 -0
- package/dist/usage_projection.js +130 -0
- package/dist/usage_snapshot.d.ts +36 -0
- package/dist/usage_snapshot.js +131 -0
- package/dist/utils/assistant_message.d.ts +2 -0
- package/dist/utils/assistant_message.js +5 -0
- package/dist/utils/atomic_write.d.ts +6 -2
- package/dist/utils/atomic_write.js +29 -4
- package/dist/utils/checked_shell.d.ts +25 -0
- package/dist/utils/checked_shell.js +107 -0
- package/dist/utils/compaction.d.ts +4 -1
- package/dist/utils/compaction.js +31 -7
- package/dist/utils/context.d.ts +4 -4
- package/dist/utils/context.js +14 -12
- package/dist/utils/deepseek.d.ts +2 -2
- package/dist/utils/deepseek.js +13 -5
- package/dist/utils/ephemeral.js +4 -0
- package/dist/utils/ephemeral_tools.d.ts +18 -0
- package/dist/utils/ephemeral_tools.js +97 -0
- package/dist/utils/jev_client.d.ts +4 -0
- package/dist/utils/jev_client.js +15 -0
- package/dist/utils/model_cache.d.ts +15 -0
- package/dist/utils/model_cache.js +143 -0
- package/dist/utils/models.d.ts +4 -2
- package/dist/utils/models.js +12 -16
- package/dist/utils/reasoning.d.ts +8 -1
- package/dist/utils/reasoning.js +31 -11
- package/dist/utils/router_catalog.d.ts +49 -0
- package/dist/utils/router_catalog.js +271 -0
- package/dist/utils/sandbox.d.ts +9 -0
- package/dist/utils/sandbox.js +118 -15
- package/dist/utils/shell.d.ts +7 -0
- package/dist/utils/shell.js +98 -34
- package/dist/utils/subprocess_env.d.ts +3 -0
- package/dist/utils/subprocess_env.js +27 -1
- package/dist/web/accounts_mirror.d.ts +3 -1
- package/dist/web/accounts_mirror.js +13 -9
- package/dist/web/child_publication.d.ts +17 -0
- package/dist/web/child_publication.js +45 -0
- package/dist/web/mirror_authenticator.d.ts +31 -11
- package/dist/web/mirror_authenticator.js +67 -17
- package/dist/web/mirror_client.d.ts +31 -4
- package/dist/web/mirror_client.js +189 -23
- package/dist/web/mirror_stream.d.ts +84 -22
- package/dist/web/mirror_stream.js +676 -95
- package/dist/web/observer_query_redaction.d.ts +6 -0
- package/dist/web/observer_query_redaction.js +58 -0
- package/dist/web/pane_registry.d.ts +2 -0
- package/dist/web/pane_registry.js +86 -22
- package/dist/web/tool_image.d.ts +6 -0
- package/dist/web/tool_image.js +17 -0
- package/dist/web/view_plugin.d.ts +14 -0
- package/dist/web/view_plugin.js +23 -1
- package/dist/worker/executor.js +31 -12
- package/dist/worker/index.d.ts +1 -0
- package/dist/worker/toolsets.js +3 -1
- package/dist/worker/types.d.ts +12 -1
- package/dist/workflows/registry.js +1 -0
- package/dist/workflows/registry_handle.d.ts +2 -0
- package/dist/workflows/runtime.d.ts +2 -0
- package/dist/workflows/runtime.js +1 -0
- package/dist/workspace_agent.d.ts +7 -0
- package/dist/workspace_agent.js +36 -0
- package/dist/workspace_collision.d.ts +76 -0
- package/dist/workspace_collision.js +688 -0
- package/dist/workspace_layout.d.ts +18 -0
- package/dist/workspace_layout.js +121 -0
- package/dist/workspace_runtime.d.ts +44 -0
- package/dist/workspace_runtime.js +82 -0
- package/dist/workspace_session_context.d.ts +62 -0
- package/dist/workspace_session_context.js +160 -0
- package/dist/zlm-embed.mjs +32518 -9615
- package/dist/zlm.js +1 -0
- package/node_modules/@zerg/model-contracts/LICENSE.md +375 -0
- package/node_modules/@zerg/model-contracts/README.md +90 -0
- package/node_modules/@zerg/model-contracts/index.d.ts +20 -0
- package/node_modules/@zerg/model-contracts/index.js +223 -0
- package/node_modules/@zerg/model-contracts/package.json +8 -0
- package/node_modules/glob/node_modules/brace-expansion/index.js +78 -22
- package/node_modules/glob/node_modules/brace-expansion/package.json +1 -1
- package/node_modules/readdir-glob/node_modules/brace-expansion/index.js +78 -22
- package/node_modules/readdir-glob/node_modules/brace-expansion/package.json +1 -1
- package/package.json +45 -24
- package/packages/model-contracts/LICENSE.md +375 -0
- package/packages/model-contracts/README.md +90 -0
- package/packages/model-contracts/index.d.ts +20 -0
- package/packages/model-contracts/index.js +223 -0
- package/packages/model-contracts/package.json +8 -0
- package/remote-broker/Dockerfile +10 -0
- package/remote-broker/README.md +308 -0
- package/remote-broker/archive.py +1227 -0
- package/remote-broker/cutover.py +761 -0
- package/remote-broker/requirements.txt +5 -0
- package/remote-broker/resources.example.json +6 -0
- package/remote-broker/resources.write-staging.example.json +18 -0
- package/remote-broker/retained.py +686 -0
- package/remote-broker/retained_cleanup.py +550 -0
- package/remote-broker/server.py +648 -0
- package/scripts/build-remote-broker.mjs +13 -0
- package/scripts/ensure-local-packages.mjs +6 -0
- 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
|
+
}
|