@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
package/dist/headless_cli.js
CHANGED
|
@@ -64,6 +64,14 @@ async function main() {
|
|
|
64
64
|
configStore.setCliOverride('model', options.model);
|
|
65
65
|
if (options.effort)
|
|
66
66
|
configStore.setCliOverride('codexEffort', options.effort);
|
|
67
|
+
// The headless package is a standalone entry, so it must discover configured
|
|
68
|
+
// MCP tools before the synchronous agent factory builds the allowed surface.
|
|
69
|
+
// Required servers fail startup; optional failures retain the client policy.
|
|
70
|
+
const servers = configStore.get().mcpServers;
|
|
71
|
+
if (servers && Object.keys(servers).length > 0) {
|
|
72
|
+
const { initMcpServers } = await import('./mcp/client.js');
|
|
73
|
+
await initMcpServers(servers);
|
|
74
|
+
}
|
|
67
75
|
try {
|
|
68
76
|
const { preloadSkillsManifest } = await import('./skills/registry.js');
|
|
69
77
|
await preloadSkillsManifest();
|
|
@@ -9,6 +9,7 @@ export function parseHeadlessCliArgs(args) {
|
|
|
9
9
|
jsonStream: false,
|
|
10
10
|
};
|
|
11
11
|
const booleanFlags = new Map([
|
|
12
|
+
['--detach-environment', () => { options.detachEnvironment = true; }],
|
|
12
13
|
['--json', () => { options.json = true; }],
|
|
13
14
|
['--json-stream', () => { options.jsonStream = true; }],
|
|
14
15
|
['--quiet', () => { options.quiet = true; }],
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runInboxCli(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { receiveIntakeRequest, listIntakeReceipts, getIntakeReceipt } from './store.js';
|
|
3
|
+
import { formatIntakeReceipt } from './format.js';
|
|
4
|
+
export async function runInboxCli(args) {
|
|
5
|
+
const json = args.includes('--json');
|
|
6
|
+
const tokens = args.filter(arg => arg !== '--json');
|
|
7
|
+
let result;
|
|
8
|
+
if (tokens[0] === 'receive' && tokens[1] === '--file' && tokens.length === 3) {
|
|
9
|
+
if ((await stat(tokens[2])).size > 64 * 1024)
|
|
10
|
+
throw new Error('Intake envelope exceeds 64 KiB.');
|
|
11
|
+
result = await receiveIntakeRequest(JSON.parse(await readFile(tokens[2], 'utf8')));
|
|
12
|
+
}
|
|
13
|
+
else if ((tokens[0] === 'list' && tokens.length === 1) || tokens.length === 0) {
|
|
14
|
+
result = await listIntakeReceipts();
|
|
15
|
+
}
|
|
16
|
+
else if (tokens[0] === 'show' && tokens.length === 2) {
|
|
17
|
+
result = await getIntakeReceipt(tokens[1]);
|
|
18
|
+
}
|
|
19
|
+
else
|
|
20
|
+
throw new Error('Usage: ztc inbox list|show <req-ID>|receive --file <request.json> [--json]');
|
|
21
|
+
if (json)
|
|
22
|
+
process.stdout.write(JSON.stringify(result) + '\n');
|
|
23
|
+
else if ('receipts' in result) {
|
|
24
|
+
const list = result;
|
|
25
|
+
console.log(list.receipts.length ? list.receipts.map(formatIntakeReceipt).join('\n\n') : 'Inbox is empty. Receive a request with ztc inbox receive --file request.json.');
|
|
26
|
+
}
|
|
27
|
+
else if ('receipt' in result) {
|
|
28
|
+
const received = result;
|
|
29
|
+
console.log(`${received.duplicate ? 'Existing' : 'New'} receipt\n${formatIntakeReceipt(received.receipt)}`);
|
|
30
|
+
}
|
|
31
|
+
else
|
|
32
|
+
console.log(formatIntakeReceipt(result));
|
|
33
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function formatIntakeReceipt(receipt) {
|
|
2
|
+
return [receipt.intakeId, `Task: ${receipt.taskId}`,
|
|
3
|
+
`Source: ${receipt.source.channel} · ${receipt.source.account} · ${receipt.source.eventId}`,
|
|
4
|
+
`Received: ${receipt.receivedAt}${receipt.sentAt ? ` · sent ${receipt.sentAt}` : ''}`,
|
|
5
|
+
`State: ${receipt.state}${receipt.state === 'accepted' ? ' (submitted, outcome not yet recorded)' : ''}`,
|
|
6
|
+
`Acknowledgment: ${receipt.acknowledgedAt ?? 'pending'}`,
|
|
7
|
+
`Owner: ${receipt.owner ? `${receipt.owner.sessionId} · ${receipt.owner.cwd}` : 'unassigned, awaiting your review'}`,
|
|
8
|
+
`Request: ${receipt.action}`, receipt.outcome ? `Outcome: ${receipt.outcome}` : '',
|
|
9
|
+
receipt.owner ? `Session: /inbox open ${receipt.intakeId} session` : '',
|
|
10
|
+
...Object.entries(receipt.links ?? {}).map(([kind, target]) => `${kind}: ${target}\nOpen: /inbox open ${receipt.intakeId} ${kind}`),
|
|
11
|
+
`Acknowledge: /inbox ack ${receipt.intakeId}`,
|
|
12
|
+
receipt.state === 'received' ? `Run only after review: /inbox run ${receipt.intakeId}` : '',
|
|
13
|
+
].filter(Boolean).join('\n');
|
|
14
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type IntakeOwner } from './store.js';
|
|
2
|
+
/** Read-only receipt notifications. This surface never acknowledges or runs work. */
|
|
3
|
+
export declare class IntakeNotifications {
|
|
4
|
+
private seen;
|
|
5
|
+
private polling;
|
|
6
|
+
private profileDirectory;
|
|
7
|
+
private watcher?;
|
|
8
|
+
private watchedDirectory?;
|
|
9
|
+
private initialRead;
|
|
10
|
+
private changed;
|
|
11
|
+
private receipts;
|
|
12
|
+
private overflow;
|
|
13
|
+
dispose(): void;
|
|
14
|
+
private watchProfile;
|
|
15
|
+
poll(owner: IntakeOwner): Promise<string | null>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { getIntakeReceipt, listIntakeReceipts } from './store.js';
|
|
2
|
+
import { watch } from 'node:fs';
|
|
3
|
+
import { lstat } from 'node:fs/promises';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { profileConfigDir } from '../config/profiles.js';
|
|
6
|
+
/** Read-only receipt notifications. This surface never acknowledges or runs work. */
|
|
7
|
+
export class IntakeNotifications {
|
|
8
|
+
seen = new Set();
|
|
9
|
+
polling = false;
|
|
10
|
+
profileDirectory = '';
|
|
11
|
+
watcher;
|
|
12
|
+
watchedDirectory;
|
|
13
|
+
initialRead = true;
|
|
14
|
+
changed = new Set();
|
|
15
|
+
receipts = new Map();
|
|
16
|
+
overflow = false;
|
|
17
|
+
dispose() { this.watcher?.close(); this.watcher = undefined; this.watchedDirectory = undefined; }
|
|
18
|
+
async watchProfile(directory) {
|
|
19
|
+
try {
|
|
20
|
+
const info = await lstat(join(directory, 'inbox'));
|
|
21
|
+
if (!info.isDirectory() || info.isSymbolicLink())
|
|
22
|
+
throw new Error('Inbox notifications require an owned directory.');
|
|
23
|
+
if (this.watcher && this.watchedDirectory?.dev === info.dev && this.watchedDirectory.ino === info.ino)
|
|
24
|
+
return;
|
|
25
|
+
this.dispose();
|
|
26
|
+
this.initialRead = true;
|
|
27
|
+
// Watch new receipt directories only, avoiding one native watch per revision/history directory.
|
|
28
|
+
const watcher = watch(join(directory, 'inbox'), { recursive: false }, (_event, filename) => {
|
|
29
|
+
if (this.watcher !== watcher || this.profileDirectory !== directory)
|
|
30
|
+
return;
|
|
31
|
+
const match = filename?.toString().replace(/\\/g, '/').match(/^(req-[a-f0-9]{64})(?:\/\d{6}\.json)?$/);
|
|
32
|
+
if (!match)
|
|
33
|
+
return;
|
|
34
|
+
if (this.changed.size >= 512 && !this.changed.has(match[1])) {
|
|
35
|
+
this.overflow = true;
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
this.changed.add(match[1]);
|
|
39
|
+
});
|
|
40
|
+
this.watcher = watcher;
|
|
41
|
+
this.watchedDirectory = { dev: info.dev, ino: info.ino };
|
|
42
|
+
watcher.on('error', () => { if (this.watcher === watcher) {
|
|
43
|
+
this.dispose();
|
|
44
|
+
this.initialRead = true;
|
|
45
|
+
} });
|
|
46
|
+
watcher.unref();
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
this.dispose();
|
|
50
|
+
this.initialRead = true;
|
|
51
|
+
} // An inbox created later is picked up on the next poll.
|
|
52
|
+
}
|
|
53
|
+
async poll(owner) {
|
|
54
|
+
if (this.polling)
|
|
55
|
+
return null;
|
|
56
|
+
this.polling = true;
|
|
57
|
+
try {
|
|
58
|
+
const profileDirectory = profileConfigDir();
|
|
59
|
+
if (profileDirectory !== this.profileDirectory) {
|
|
60
|
+
this.dispose();
|
|
61
|
+
this.receipts.clear();
|
|
62
|
+
this.changed.clear();
|
|
63
|
+
this.initialRead = true;
|
|
64
|
+
this.overflow = false;
|
|
65
|
+
this.seen.clear();
|
|
66
|
+
this.profileDirectory = profileDirectory;
|
|
67
|
+
}
|
|
68
|
+
await this.watchProfile(profileDirectory);
|
|
69
|
+
if (this.initialRead) {
|
|
70
|
+
const result = await listIntakeReceipts();
|
|
71
|
+
if (profileConfigDir() !== profileDirectory)
|
|
72
|
+
return null;
|
|
73
|
+
this.receipts = new Map(result.receipts.map(receipt => [receipt.intakeId, receipt]));
|
|
74
|
+
this.initialRead = !this.watcher;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
// One tick reads at most 64 changed receipts, never all retained history.
|
|
78
|
+
for (const id of [...this.changed].slice(0, 64)) {
|
|
79
|
+
if (profileConfigDir() !== profileDirectory)
|
|
80
|
+
return null;
|
|
81
|
+
this.changed.delete(id);
|
|
82
|
+
try {
|
|
83
|
+
this.receipts.set(id, await getIntakeReceipt(id));
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (error instanceof Error && error.message === 'Receipt is still being published; retry.')
|
|
87
|
+
this.changed.add(id);
|
|
88
|
+
else if (error.code === 'ENOENT')
|
|
89
|
+
this.receipts.delete(id);
|
|
90
|
+
else
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (profileConfigDir() !== profileDirectory)
|
|
96
|
+
return null;
|
|
97
|
+
const receipts = [...this.receipts.values()].sort((a, b) => b.receivedAt.localeCompare(a.receivedAt) || a.intakeId.localeCompare(b.intakeId)).slice(0, 100);
|
|
98
|
+
this.receipts = new Map(receipts.map(receipt => [receipt.intakeId, receipt]));
|
|
99
|
+
if (this.overflow) {
|
|
100
|
+
this.overflow = false;
|
|
101
|
+
return 'Inbox activity exceeded the 512-receipt notification queue. Use /inbox to review the retained requests. Nothing has been started.';
|
|
102
|
+
}
|
|
103
|
+
const visible = new Set(receipts.map(receipt => receipt.intakeId));
|
|
104
|
+
this.seen = new Set([...this.seen].filter(id => visible.has(id)));
|
|
105
|
+
const candidates = receipts.filter(receipt => receipt.state === 'received' && !receipt.acknowledgedAt && !this.seen.has(receipt.intakeId)
|
|
106
|
+
&& (!receipt.owner || (receipt.owner.sessionId === owner.sessionId && receipt.owner.cwd === owner.cwd)));
|
|
107
|
+
const pending = [];
|
|
108
|
+
// A receipt may be acknowledged after discovery. Verify only unseen,
|
|
109
|
+
// eligible candidates instead of recursively watching all past revisions.
|
|
110
|
+
for (const candidate of candidates) {
|
|
111
|
+
if (profileConfigDir() !== profileDirectory)
|
|
112
|
+
return null;
|
|
113
|
+
const receipt = await getIntakeReceipt(candidate.intakeId);
|
|
114
|
+
if (profileConfigDir() !== profileDirectory)
|
|
115
|
+
return null;
|
|
116
|
+
this.receipts.set(receipt.intakeId, receipt);
|
|
117
|
+
if (receipt.state === 'received' && !receipt.acknowledgedAt && (!receipt.owner || (receipt.owner.sessionId === owner.sessionId && receipt.owner.cwd === owner.cwd)))
|
|
118
|
+
pending.push(receipt);
|
|
119
|
+
}
|
|
120
|
+
if (!pending.length)
|
|
121
|
+
return null;
|
|
122
|
+
for (const receipt of pending)
|
|
123
|
+
this.seen.add(receipt.intakeId);
|
|
124
|
+
return [`Inbox: ${pending.length} new request${pending.length === 1 ? '' : 's'} awaiting your review.`,
|
|
125
|
+
...pending.slice(0, 3).map(receipt => `${receipt.source.channel} · ${receipt.action.replace(/\s+/g, ' ').slice(0, 80)}\n/inbox show ${receipt.intakeId}`),
|
|
126
|
+
'Receipt only. Use /inbox to review; nothing has been started.'].join('\n');
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
this.polling = false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export interface IntakeOwner {
|
|
2
|
+
sessionId: string;
|
|
3
|
+
cwd: string;
|
|
4
|
+
}
|
|
5
|
+
export interface IntakeLinks {
|
|
6
|
+
source?: string;
|
|
7
|
+
card?: string;
|
|
8
|
+
artifact?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface IntakeRequest {
|
|
11
|
+
source: {
|
|
12
|
+
channel: string;
|
|
13
|
+
account: string;
|
|
14
|
+
eventId: string;
|
|
15
|
+
};
|
|
16
|
+
action: string;
|
|
17
|
+
sentAt?: string;
|
|
18
|
+
owner?: IntakeOwner;
|
|
19
|
+
links?: IntakeLinks;
|
|
20
|
+
}
|
|
21
|
+
export type IntakeState = 'received' | 'accepted' | 'completed' | 'failed' | 'dismissed';
|
|
22
|
+
export interface IntakeReceipt extends IntakeRequest {
|
|
23
|
+
schemaVersion: 1;
|
|
24
|
+
intakeId: string;
|
|
25
|
+
taskId: string;
|
|
26
|
+
receivedAt: string;
|
|
27
|
+
revision: number;
|
|
28
|
+
state: IntakeState;
|
|
29
|
+
acknowledgedAt?: string;
|
|
30
|
+
acceptedAt?: string;
|
|
31
|
+
outcome?: string;
|
|
32
|
+
}
|
|
33
|
+
export type IntakeChange = {
|
|
34
|
+
type: 'acknowledge';
|
|
35
|
+
} | {
|
|
36
|
+
type: 'accept';
|
|
37
|
+
owner: IntakeOwner;
|
|
38
|
+
} | {
|
|
39
|
+
type: 'complete' | 'fail' | 'dismiss';
|
|
40
|
+
note: string;
|
|
41
|
+
} | {
|
|
42
|
+
type: 'link';
|
|
43
|
+
links: IntakeLinks;
|
|
44
|
+
};
|
|
45
|
+
export declare function validateIntakeRequest(value: unknown): IntakeRequest;
|
|
46
|
+
export declare function getIntakeReceipt(id: string): Promise<IntakeReceipt>;
|
|
47
|
+
export declare function receiveIntakeRequest(value: unknown): Promise<{
|
|
48
|
+
receipt: IntakeReceipt;
|
|
49
|
+
duplicate: boolean;
|
|
50
|
+
}>;
|
|
51
|
+
export declare function listIntakeReceipts(limit?: number): Promise<{
|
|
52
|
+
receipts: IntakeReceipt[];
|
|
53
|
+
total: number;
|
|
54
|
+
unavailable?: number;
|
|
55
|
+
}>;
|
|
56
|
+
export declare function changeIntakeReceipt(id: string, change: IntakeChange): Promise<IntakeReceipt>;
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { mkdir, readFile, readdir, writeFile, link, unlink, stat } from 'node:fs/promises';
|
|
3
|
+
import { join, isAbsolute } from 'node:path';
|
|
4
|
+
import { profileConfigDir } from '../config/profiles.js';
|
|
5
|
+
const MAX_BYTES = 64 * 1024;
|
|
6
|
+
class IntakeRecordError extends Error {
|
|
7
|
+
}
|
|
8
|
+
const ID = /^req-[a-f0-9]{64}$/;
|
|
9
|
+
const root = () => join(profileConfigDir(), 'inbox');
|
|
10
|
+
const directory = (id) => {
|
|
11
|
+
if (!ID.test(id))
|
|
12
|
+
throw new Error('Use the full req- ID from /inbox.');
|
|
13
|
+
return join(root(), id);
|
|
14
|
+
};
|
|
15
|
+
function text(value, name, max) {
|
|
16
|
+
if (typeof value !== 'string' || !value.trim() || value.length > max || /[\x00-\x08\x0b-\x1f\x7f]/.test(value)) {
|
|
17
|
+
throw new Error(`${name} must contain 1–${max} characters without terminal control characters.`);
|
|
18
|
+
}
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
function owner(value) {
|
|
22
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
23
|
+
throw new Error('Invalid owner object.');
|
|
24
|
+
const sessionId = text(value.sessionId, 'Session ID', 128);
|
|
25
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(sessionId))
|
|
26
|
+
throw new Error('Invalid session ID.');
|
|
27
|
+
const cwd = text(value.cwd, 'Working directory', 4096);
|
|
28
|
+
if (!isAbsolute(cwd))
|
|
29
|
+
throw new Error('Owner working directory must be absolute.');
|
|
30
|
+
return { sessionId, cwd };
|
|
31
|
+
}
|
|
32
|
+
function links(value) {
|
|
33
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
34
|
+
throw new Error('Invalid links object.');
|
|
35
|
+
const result = {};
|
|
36
|
+
for (const key of ['source', 'card']) {
|
|
37
|
+
if (value[key] === undefined)
|
|
38
|
+
continue;
|
|
39
|
+
const url = new URL(text(value[key], `${key} URL`, 4096));
|
|
40
|
+
if (url.protocol !== 'https:' || url.username || url.password)
|
|
41
|
+
throw new Error('Receipt links must use HTTPS without credentials.');
|
|
42
|
+
if (key === 'card' && (url.hostname !== 'zergboard.com' || !/^\/app\/cards\/[a-f0-9-]{36}$/.test(url.pathname))) {
|
|
43
|
+
throw new Error('Card links must point to a ZergBoard card.');
|
|
44
|
+
}
|
|
45
|
+
result[key] = text(url.href, `${key} URL`, 4096);
|
|
46
|
+
}
|
|
47
|
+
if (value.artifact !== undefined) {
|
|
48
|
+
result.artifact = text(value.artifact, 'Artifact path', 4096);
|
|
49
|
+
if (!isAbsolute(result.artifact))
|
|
50
|
+
throw new Error('Artifact path must be absolute.');
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
export function validateIntakeRequest(value) {
|
|
55
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
56
|
+
throw new Error('Expected an intake request object.');
|
|
57
|
+
const input = value;
|
|
58
|
+
if (!input.source || typeof input.source !== 'object')
|
|
59
|
+
throw new Error('Request source is required.');
|
|
60
|
+
const channel = text(input.source.channel, 'Source channel', 64);
|
|
61
|
+
const account = text(input.source.account, 'Source account', 256);
|
|
62
|
+
const eventId = text(input.source.eventId, 'Source event ID', 1024);
|
|
63
|
+
if ([channel, account, eventId].some(value => /[\n\t]/.test(value)))
|
|
64
|
+
throw new Error('Source provenance must use a single line.');
|
|
65
|
+
const action = text(input.action, 'Requested action', 16_384);
|
|
66
|
+
let sentAt;
|
|
67
|
+
if (input.sentAt !== undefined) {
|
|
68
|
+
if (typeof input.sentAt !== 'string' || !Number.isFinite(Date.parse(input.sentAt)))
|
|
69
|
+
throw new Error('Invalid source timestamp.');
|
|
70
|
+
sentAt = new Date(input.sentAt).toISOString();
|
|
71
|
+
}
|
|
72
|
+
return { source: { channel, account, eventId }, action, ...(sentAt ? { sentAt } : {}),
|
|
73
|
+
...(input.owner !== undefined ? { owner: owner(input.owner) } : {}), ...(input.links !== undefined ? { links: links(input.links) } : {}) };
|
|
74
|
+
}
|
|
75
|
+
// Publish immutable files with an exclusive hard link. Competing processes can
|
|
76
|
+
// neither overwrite a receipt nor publish two revisions at the same position.
|
|
77
|
+
// A crash leaves, at worst, an ignored temporary file; it never leaves a lock.
|
|
78
|
+
async function publish(path, value) {
|
|
79
|
+
const content = JSON.stringify(value);
|
|
80
|
+
if (Buffer.byteLength(content) > MAX_BYTES)
|
|
81
|
+
throw new Error('Inbox record exceeds 64 KiB.');
|
|
82
|
+
const temporary = `${path}.tmp-${randomUUID()}`;
|
|
83
|
+
await writeFile(temporary, content, { flag: 'wx', mode: 0o600 });
|
|
84
|
+
try {
|
|
85
|
+
await link(temporary, path);
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (error.code === 'EEXIST')
|
|
90
|
+
return false;
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
await unlink(temporary);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async function read(path) {
|
|
98
|
+
if ((await stat(path)).size > MAX_BYTES)
|
|
99
|
+
throw new IntakeRecordError('Inbox record exceeds 64 KiB.');
|
|
100
|
+
const bytes = await readFile(path, 'utf8');
|
|
101
|
+
let receipt;
|
|
102
|
+
try {
|
|
103
|
+
receipt = JSON.parse(bytes);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
if (error instanceof SyntaxError)
|
|
107
|
+
throw new IntakeRecordError('Inbox record is not valid JSON.');
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
if (!receipt || typeof receipt !== 'object' || Array.isArray(receipt)
|
|
111
|
+
|| receipt.schemaVersion !== 1 || !ID.test(receipt.intakeId))
|
|
112
|
+
throw new IntakeRecordError('Unsupported inbox record.');
|
|
113
|
+
if (typeof receipt.receivedAt !== 'string' || !Number.isFinite(Date.parse(receipt.receivedAt))
|
|
114
|
+
|| !Number.isSafeInteger(receipt.revision) || receipt.revision < 0 || receipt.revision > 999999
|
|
115
|
+
|| !['received', 'accepted', 'completed', 'failed', 'dismissed'].includes(receipt.state)) {
|
|
116
|
+
throw new IntakeRecordError('Invalid inbox receipt metadata.');
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
validateIntakeRequest(receipt);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
if (error instanceof Error)
|
|
123
|
+
throw new IntakeRecordError(error.message);
|
|
124
|
+
throw error;
|
|
125
|
+
}
|
|
126
|
+
return receipt;
|
|
127
|
+
}
|
|
128
|
+
export async function getIntakeReceipt(id) {
|
|
129
|
+
return readReceiptDirectory(directory(id));
|
|
130
|
+
}
|
|
131
|
+
async function readReceiptDirectory(dir) {
|
|
132
|
+
const files = await readdir(dir);
|
|
133
|
+
const revisions = files.filter(file => /^\d{6}\.json$/.test(file)).sort();
|
|
134
|
+
if (!revisions.length)
|
|
135
|
+
throw new Error('Receipt is still being published; retry.');
|
|
136
|
+
return read(join(dir, revisions.at(-1)));
|
|
137
|
+
}
|
|
138
|
+
export async function receiveIntakeRequest(value) {
|
|
139
|
+
const input = validateIntakeRequest(value);
|
|
140
|
+
const hash = createHash('sha256').update(JSON.stringify(input.source)).digest('hex');
|
|
141
|
+
const intakeId = `req-${hash}`;
|
|
142
|
+
const dir = directory(intakeId);
|
|
143
|
+
await mkdir(dir, { recursive: true, mode: 0o700 });
|
|
144
|
+
const receipt = { ...input, schemaVersion: 1, intakeId, taskId: `task-${hash}`,
|
|
145
|
+
receivedAt: new Date().toISOString(), revision: 0, state: 'received' };
|
|
146
|
+
if (await publish(join(dir, '000000.json'), receipt))
|
|
147
|
+
return { receipt, duplicate: false };
|
|
148
|
+
const original = await read(join(dir, '000000.json'));
|
|
149
|
+
if (JSON.stringify(validateIntakeRequest(original)) !== JSON.stringify(input)) {
|
|
150
|
+
throw new Error('Source event ID was reused with different request content. The original receipt was preserved.');
|
|
151
|
+
}
|
|
152
|
+
return { receipt: await getIntakeReceipt(intakeId), duplicate: true };
|
|
153
|
+
}
|
|
154
|
+
export async function listIntakeReceipts(limit = 100) {
|
|
155
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 1000)
|
|
156
|
+
throw new Error('Inbox limit must be 1–1000.');
|
|
157
|
+
const profileRoot = root();
|
|
158
|
+
let files;
|
|
159
|
+
try {
|
|
160
|
+
files = await readdir(profileRoot);
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
if (error.code === 'ENOENT')
|
|
164
|
+
return { receipts: [], total: 0 };
|
|
165
|
+
throw error;
|
|
166
|
+
}
|
|
167
|
+
const ids = files.filter(file => ID.test(file));
|
|
168
|
+
const receipts = [];
|
|
169
|
+
let total = 0;
|
|
170
|
+
let unavailable = 0;
|
|
171
|
+
// Keep filesystem reads sequential and the preview bounded. Durable records
|
|
172
|
+
// remain addressable by their immutable ID after they leave the preview.
|
|
173
|
+
for (const id of ids) {
|
|
174
|
+
try {
|
|
175
|
+
receipts.push(await readReceiptDirectory(join(profileRoot, id)));
|
|
176
|
+
total++;
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
if (error instanceof Error && error.message === 'Receipt is still being published; retry.')
|
|
180
|
+
continue;
|
|
181
|
+
if (error instanceof IntakeRecordError) {
|
|
182
|
+
unavailable++;
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
throw error;
|
|
186
|
+
}
|
|
187
|
+
receipts.sort((a, b) => b.receivedAt.localeCompare(a.receivedAt) || a.intakeId.localeCompare(b.intakeId));
|
|
188
|
+
if (receipts.length > limit)
|
|
189
|
+
receipts.pop();
|
|
190
|
+
}
|
|
191
|
+
return { receipts, total, ...(unavailable > 0 ? { unavailable } : {}) };
|
|
192
|
+
}
|
|
193
|
+
export async function changeIntakeReceipt(id, change) {
|
|
194
|
+
for (let attempt = 0; attempt < 32; attempt++) {
|
|
195
|
+
const before = await getIntakeReceipt(id);
|
|
196
|
+
const next = { ...before, revision: before.revision + 1 };
|
|
197
|
+
if (next.revision > 999999)
|
|
198
|
+
throw new Error('Receipt revision limit reached.');
|
|
199
|
+
const now = new Date().toISOString();
|
|
200
|
+
switch (change.type) {
|
|
201
|
+
case 'acknowledge':
|
|
202
|
+
if (before.acknowledgedAt)
|
|
203
|
+
return before;
|
|
204
|
+
next.acknowledgedAt = now;
|
|
205
|
+
break;
|
|
206
|
+
case 'accept': {
|
|
207
|
+
if (before.state !== 'received')
|
|
208
|
+
throw new Error(`Request is ${before.state}; it cannot be submitted again.`);
|
|
209
|
+
const target = owner(change.owner);
|
|
210
|
+
if (before.owner && (before.owner.sessionId !== target.sessionId || before.owner.cwd !== target.cwd)) {
|
|
211
|
+
throw new Error('Request belongs to another session. Open its receipt to resume that owner.');
|
|
212
|
+
}
|
|
213
|
+
next.owner = target;
|
|
214
|
+
next.state = 'accepted';
|
|
215
|
+
next.acceptedAt = now;
|
|
216
|
+
next.acknowledgedAt ??= now;
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
case 'complete':
|
|
220
|
+
case 'fail':
|
|
221
|
+
case 'dismiss':
|
|
222
|
+
if (change.type === 'dismiss' ? before.state !== 'received' : before.state !== 'accepted') {
|
|
223
|
+
throw new Error(`Cannot ${change.type} a ${before.state} request.`);
|
|
224
|
+
}
|
|
225
|
+
next.state = change.type === 'complete' ? 'completed' : change.type === 'fail' ? 'failed' : 'dismissed';
|
|
226
|
+
next.outcome = text(change.note, 'Outcome note', 4096);
|
|
227
|
+
next.acknowledgedAt ??= now;
|
|
228
|
+
break;
|
|
229
|
+
case 'link':
|
|
230
|
+
next.links = { ...before.links, ...links(change.links) };
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
const path = join(directory(id), `${String(next.revision).padStart(6, '0')}.json`);
|
|
234
|
+
if (await publish(path, next))
|
|
235
|
+
return next;
|
|
236
|
+
}
|
|
237
|
+
throw new Error('Receipt changed too often; retry.');
|
|
238
|
+
}
|
package/dist/library.d.ts
CHANGED
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
*/
|
|
26
26
|
import { Agent } from './agent/agent.js';
|
|
27
27
|
import type { AgentBackend } from './agent/backends/types.js';
|
|
28
|
+
import type { NativeAnthropicMessagesRouterConfig } from './agent/backends/index.js';
|
|
28
29
|
import type { Tool } from './agent/tools/types.js';
|
|
29
30
|
import type { Policy } from './agent/runtime/policy.js';
|
|
30
31
|
import type { HostApprovalContext } from './agent/runtime/tool_runtime.js';
|
|
@@ -33,13 +34,18 @@ import type { ToolCapability } from './agent/runtime/capabilities.js';
|
|
|
33
34
|
import type { AgentHandlerFn } from './agent/tools/sim_domain_tools.js';
|
|
34
35
|
import type { AgentEvent, Message } from './types.js';
|
|
35
36
|
import type { HostMetadata, InferenceCredentialProvider, ToolEffectObserver } from './host/index.js';
|
|
37
|
+
import type { CodexReasoningEffort } from './config/types.js';
|
|
36
38
|
export type { AgentEvent, Message, MessageRole, ToolCall } from './types.js';
|
|
37
39
|
export type { AgentConfig } from './agent/agent.js';
|
|
38
40
|
export type { AgentBackend } from './agent/backends/types.js';
|
|
41
|
+
export type { NativeAnthropicMessagesRouterConfig } from './agent/backends/anthropic.js';
|
|
42
|
+
export type { ContentBlock, RequestContentBlock, ThinkingBlock, RedactedThinkingBlock } from './agent/backends/types.js';
|
|
39
43
|
export type { Tool } from './agent/tools/types.js';
|
|
40
44
|
export type { AgentHandlerFn } from './agent/tools/sim_domain_tools.js';
|
|
41
45
|
/** Options for `createAgent`. All fields are optional; sensible defaults come from env. */
|
|
42
46
|
export interface CreateAgentOptions {
|
|
47
|
+
/** Explicit hosted native Messages transport; ambient provider keys are ignored. */
|
|
48
|
+
nativeAnthropicMessagesRouter?: NativeAnthropicMessagesRouterConfig;
|
|
43
49
|
/** Provider name: 'anthropic' | 'openai' | 'gemini' | 'kimi' | 'deepseek' | ... */
|
|
44
50
|
provider?: string;
|
|
45
51
|
/** Model id. Defaults to the provider's canonical model. */
|
|
@@ -128,6 +134,8 @@ export interface CreateAgentOptions {
|
|
|
128
134
|
* explicitly here if you need to pin the value across ZTC upgrades.
|
|
129
135
|
*/
|
|
130
136
|
maxTokens?: number;
|
|
137
|
+
/** Provider reasoning effort for every request. Opus 5.5 defaults to high. */
|
|
138
|
+
codexEffort?: CodexReasoningEffort;
|
|
131
139
|
/** Auto-continue on incomplete responses (default true). */
|
|
132
140
|
autoContinue?: boolean;
|
|
133
141
|
/**
|
package/dist/library.js
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
* }
|
|
25
25
|
*/
|
|
26
26
|
import { Agent } from './agent/agent.js';
|
|
27
|
-
import { createBackendForProvider } from './agent/backends/index.js';
|
|
27
|
+
import { createBackendForProvider, createNativeAnthropicMessagesRouterBackend } from './agent/backends/index.js';
|
|
28
28
|
import { defaultTools as baseDefaultTools } from './agent/tools/registry.js';
|
|
29
29
|
import { toolSearchTool } from './agent/tools/tool_search.js';
|
|
30
30
|
import { recallToolResponseTool } from './agent/tools/recall_tool_response.js';
|
|
@@ -44,10 +44,16 @@ export async function createAgent(opts = {}) {
|
|
|
44
44
|
if (opts.backend && opts.inferenceCredentialProvider) {
|
|
45
45
|
throw new Error('backend and inferenceCredentialProvider are mutually exclusive');
|
|
46
46
|
}
|
|
47
|
+
if (opts.nativeAnthropicMessagesRouter && (opts.backend || opts.inferenceCredentialProvider)) {
|
|
48
|
+
throw new Error('nativeAnthropicMessagesRouter supplies its own backend and credential authority');
|
|
49
|
+
}
|
|
47
50
|
const ambientDiscovery = opts.ambientDiscovery ?? true;
|
|
48
|
-
const provider = opts.provider ?? (ambientDiscovery ? inferDefaultProvider() : 'anthropic');
|
|
51
|
+
const provider = opts.provider ?? (opts.nativeAnthropicMessagesRouter ? 'anthropic' : ambientDiscovery ? inferDefaultProvider() : 'anthropic');
|
|
52
|
+
if (opts.nativeAnthropicMessagesRouter && provider !== 'anthropic' && provider !== 'claude') {
|
|
53
|
+
throw new Error('Native Anthropic Router requires the anthropic provider');
|
|
54
|
+
}
|
|
49
55
|
const model = opts.model ?? getDefaultModelForProvider(provider);
|
|
50
|
-
const apiKey = opts.inferenceCredentialProvider
|
|
56
|
+
const apiKey = opts.inferenceCredentialProvider || opts.nativeAnthropicMessagesRouter
|
|
51
57
|
? ''
|
|
52
58
|
: (opts.apiKey ?? (ambientDiscovery ? getDefaultApiKeyForProvider(provider) : undefined) ?? '');
|
|
53
59
|
const makeBackend = (bearer) => createBackendForProvider(provider, {
|
|
@@ -55,7 +61,8 @@ export async function createAgent(opts = {}) {
|
|
|
55
61
|
apiEndpoint: opts.apiEndpoint,
|
|
56
62
|
baseUrl: opts.openaiCompatibleBaseUrl,
|
|
57
63
|
});
|
|
58
|
-
const backend = opts.backend ?? (opts.
|
|
64
|
+
const backend = opts.backend ?? (opts.nativeAnthropicMessagesRouter
|
|
65
|
+
? createNativeAnthropicMessagesRouterBackend(opts.nativeAnthropicMessagesRouter) : (opts.inferenceCredentialProvider
|
|
59
66
|
? createCredentialedBackend({
|
|
60
67
|
provider: opts.inferenceCredentialProvider,
|
|
61
68
|
providerId: provider,
|
|
@@ -63,7 +70,7 @@ export async function createAgent(opts = {}) {
|
|
|
63
70
|
context: opts.inferenceCredentialContext,
|
|
64
71
|
requestId: opts.inferenceRequestId,
|
|
65
72
|
})
|
|
66
|
-
: makeBackend(apiKey));
|
|
73
|
+
: makeBackend(apiKey)));
|
|
67
74
|
let tools = opts.tools
|
|
68
75
|
? [...opts.tools]
|
|
69
76
|
: (ambientDiscovery ? [...defaultTools] : []);
|
|
@@ -108,8 +115,8 @@ export async function createAgent(opts = {}) {
|
|
|
108
115
|
}
|
|
109
116
|
const config = {
|
|
110
117
|
apiKey,
|
|
111
|
-
disableApiKeyFallback: opts.inferenceCredentialProvider
|
|
112
|
-
runtimeCredentialsAvailable: opts.inferenceCredentialProvider
|
|
118
|
+
disableApiKeyFallback: Boolean(opts.inferenceCredentialProvider || opts.nativeAnthropicMessagesRouter),
|
|
119
|
+
runtimeCredentialsAvailable: Boolean(opts.inferenceCredentialProvider || opts.nativeAnthropicMessagesRouter),
|
|
113
120
|
ambientDiscovery,
|
|
114
121
|
model,
|
|
115
122
|
apiEndpoint: opts.apiEndpoint,
|
|
@@ -117,15 +124,16 @@ export async function createAgent(opts = {}) {
|
|
|
117
124
|
backend,
|
|
118
125
|
tools,
|
|
119
126
|
alwaysLoadedToolNames: opts.alwaysLoadedToolNames,
|
|
120
|
-
deferToolSchemas: opts.deferToolSchemas,
|
|
127
|
+
deferToolSchemas: opts.deferToolSchemas ?? (opts.nativeAnthropicMessagesRouter ? false : undefined),
|
|
121
128
|
cwd: opts.cwd,
|
|
122
|
-
pinTaskHeader: opts.pinTaskHeader,
|
|
123
|
-
subprocessEnv: opts.inferenceCredentialProvider
|
|
129
|
+
pinTaskHeader: opts.nativeAnthropicMessagesRouter ? false : opts.pinTaskHeader,
|
|
130
|
+
subprocessEnv: opts.inferenceCredentialProvider || opts.nativeAnthropicMessagesRouter
|
|
124
131
|
? buildCredentialSafeSubprocessEnv(opts.subprocessEnv ?? process.env)
|
|
125
132
|
: opts.subprocessEnv,
|
|
126
133
|
toolEffectObserver: opts.toolEffectObserver,
|
|
127
134
|
maxIterations: opts.maxIterations,
|
|
128
135
|
maxTokens: opts.maxTokens,
|
|
136
|
+
codexEffort: opts.codexEffort,
|
|
129
137
|
autoContinue: opts.autoContinue,
|
|
130
138
|
llmRequestTimeoutMs: opts.llmRequestTimeoutMs,
|
|
131
139
|
policy: opts.policy,
|
|
@@ -198,6 +206,7 @@ async function* runAndAppend(agent, messages, userMsg) {
|
|
|
198
206
|
id: `assistant_${Date.now()}`,
|
|
199
207
|
role: 'assistant',
|
|
200
208
|
content: result.content,
|
|
209
|
+
...(result.nativeContent ? { nativeContent: result.nativeContent, nativeModel: result.nativeModel, nativeContextId: result.nativeContextId } : {}),
|
|
201
210
|
timestamp: new Date(),
|
|
202
211
|
toolCalls: result.toolCalls?.length ? result.toolCalls : undefined,
|
|
203
212
|
// Reasoning models expect their trace replayed with the assistant
|
package/dist/mcp/client.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { MCPServerConfig } from '../config/types.js';
|
|
2
|
+
export declare const MAX_MCP_IMAGE_BYTES: number;
|
|
2
3
|
export { ZTC_MCP_TOOL_CALL_ID_META_KEY, RequiredMcpServerError, getMcpTools, getMcpServerStatuses, noteShadowedMcpTool, getColonyAttachInfo, closeMcpServers, type McpServerStatus, } from './registry.js';
|
|
3
4
|
/**
|
|
4
5
|
* Connect every configured (and the default colony) MCP server and collect their
|