ummaya 0.2.4 → 0.2.6
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 +15 -2
- package/bin/ummaya +10 -1
- package/bun.lock +180 -244
- package/npm-shrinkwrap.json +760 -1760
- package/package.json +39 -22
- package/prompts/manifest.yaml +1 -1
- package/prompts/system_v1.md +1 -0
- package/pyproject.toml +27 -2
- package/specs/2803-document-production-hardening/contracts/document-tools.schema.json +1043 -0
- package/src/ummaya/_canonical/__init__.py +2 -0
- package/src/ummaya/_canonical/baselines.yaml +113 -0
- package/src/ummaya/engine/engine.py +29 -132
- package/src/ummaya/evidence/__init__.py +21 -2
- package/src/ummaya/evidence/dataset_contract.py +193 -0
- package/src/ummaya/evidence/document_authoring_cases.py +33 -0
- package/src/ummaya/evidence/document_harness.py +313 -0
- package/src/ummaya/evidence/document_viewer_ux.py +391 -0
- package/src/ummaya/evidence/gates.py +70 -0
- package/src/ummaya/evidence/json_types.py +20 -0
- package/src/ummaya/evidence/models.py +88 -1
- package/src/ummaya/evidence/output_payload.py +89 -0
- package/src/ummaya/evidence/payload_documents.py +233 -0
- package/src/ummaya/evidence/route_contracts.py +224 -0
- package/src/ummaya/evidence/route_helpers.py +150 -0
- package/src/ummaya/evidence/runner.py +81 -212
- package/src/ummaya/evidence/source_provenance.py +246 -0
- package/src/ummaya/evidence/source_provenance_redaction.py +176 -0
- package/src/ummaya/evidence/tool_layer.py +39 -0
- package/src/ummaya/evidence/tool_layer_models.py +151 -0
- package/src/ummaya/ipc/adapter_manifest_emitter.py +26 -10
- package/src/ummaya/ipc/document_intent_normalization.py +185 -0
- package/src/ummaya/ipc/frame_schema.py +5 -5
- package/src/ummaya/ipc/route_diagnostics.py +73 -0
- package/src/ummaya/ipc/stdio.py +1109 -477
- package/src/ummaya/llm/client.py +102 -3
- package/src/ummaya/llm/config.py +8 -3
- package/src/ummaya/primitives/__init__.py +6 -2
- package/src/ummaya/primitives/delegation.py +1 -1
- package/src/ummaya/primitives/document.py +28 -0
- package/src/ummaya/settings.py +0 -3
- package/src/ummaya/tools/discovery_bridge.py +17 -1
- package/src/ummaya/tools/documents/__init__.py +297 -0
- package/src/ummaya/tools/documents/adapter_registry.py +487 -0
- package/src/ummaya/tools/documents/archive_container_probe.py +167 -0
- package/src/ummaya/tools/documents/artifact_store.py +454 -0
- package/src/ummaya/tools/documents/authoring.py +283 -0
- package/src/ummaya/tools/documents/baselines.py +132 -0
- package/src/ummaya/tools/documents/capability.py +331 -0
- package/src/ummaya/tools/documents/contracts.py +112 -0
- package/src/ummaya/tools/documents/conversion.py +521 -0
- package/src/ummaya/tools/documents/diff.py +275 -0
- package/src/ummaya/tools/documents/engines.py +163 -0
- package/src/ummaya/tools/documents/evaluation.py +291 -0
- package/src/ummaya/tools/documents/explicit_values.py +108 -0
- package/src/ummaya/tools/documents/fixtures.py +174 -0
- package/src/ummaya/tools/documents/format_completion_audit.py +471 -0
- package/src/ummaya/tools/documents/formats/__init__.py +2 -0
- package/src/ummaya/tools/documents/formats/archive.py +528 -0
- package/src/ummaya/tools/documents/formats/base.py +41 -0
- package/src/ummaya/tools/documents/formats/code_file.py +211 -0
- package/src/ummaya/tools/documents/formats/data_file.py +272 -0
- package/src/ummaya/tools/documents/formats/hwp.py +284 -0
- package/src/ummaya/tools/documents/formats/hwpx.py +1837 -0
- package/src/ummaya/tools/documents/formats/odf.py +435 -0
- package/src/ummaya/tools/documents/formats/ooxml.py +1030 -0
- package/src/ummaya/tools/documents/formats/passive.py +766 -0
- package/src/ummaya/tools/documents/formats/pdf.py +702 -0
- package/src/ummaya/tools/documents/formats/text_web.py +268 -0
- package/src/ummaya/tools/documents/hwp_conversion_probe.py +178 -0
- package/src/ummaya/tools/documents/hwp_direct_candidate.py +141 -0
- package/src/ummaya/tools/documents/inspection.py +289 -0
- package/src/ummaya/tools/documents/intake.py +1079 -0
- package/src/ummaya/tools/documents/legacy_office_promotion_probe.py +366 -0
- package/src/ummaya/tools/documents/models.py +1598 -0
- package/src/ummaya/tools/documents/odf_promotion_probe.py +167 -0
- package/src/ummaya/tools/documents/orchestrator.py +96 -0
- package/src/ummaya/tools/documents/passive_capability_probe.py +251 -0
- package/src/ummaya/tools/documents/patch.py +170 -0
- package/src/ummaya/tools/documents/pdfa_conformance.py +284 -0
- package/src/ummaya/tools/documents/pdfa_promotion_probe.py +198 -0
- package/src/ummaya/tools/documents/permissions.py +110 -0
- package/src/ummaya/tools/documents/planner.py +616 -0
- package/src/ummaya/tools/documents/registry.py +2733 -0
- package/src/ummaya/tools/documents/render.py +978 -0
- package/src/ummaya/tools/documents/render_comparison.py +113 -0
- package/src/ummaya/tools/documents/render_comparison_models.py +74 -0
- package/src/ummaya/tools/documents/render_comparison_regions.py +73 -0
- package/src/ummaya/tools/documents/render_comparison_style.py +161 -0
- package/src/ummaya/tools/documents/reread.py +157 -0
- package/src/ummaya/tools/documents/runtime_authoring.py +244 -0
- package/src/ummaya/tools/documents/runtime_authoring_bundle.py +76 -0
- package/src/ummaya/tools/documents/scorecard.py +184 -0
- package/src/ummaya/tools/documents/socratic_planner.py +193 -0
- package/src/ummaya/tools/documents/style.py +48 -0
- package/src/ummaya/tools/documents/tool_defs.py +523 -0
- package/src/ummaya/tools/documents/validate.py +347 -0
- package/src/ummaya/tools/executor.py +29 -0
- package/src/ummaya/tools/live_proxy.py +0 -3
- package/src/ummaya/tools/models.py +5 -1
- package/src/ummaya/tools/register_all.py +8 -0
- package/src/ummaya/tools/registry.py +10 -1
- package/src/ummaya/tools/routing/__init__.py +59 -0
- package/src/ummaya/tools/routing/builder.py +105 -0
- package/src/ummaya/tools/routing/cards.py +29 -0
- package/src/ummaya/tools/routing/decision_service.py +534 -0
- package/src/ummaya/tools/routing/decision_types.py +74 -0
- package/src/ummaya/tools/routing/feasibility.py +122 -0
- package/src/ummaya/tools/routing/intent.py +17 -0
- package/src/ummaya/tools/routing/intent_extractor.py +207 -0
- package/src/ummaya/tools/routing/intent_patterns.py +160 -0
- package/src/ummaya/tools/routing/intent_public_data.py +150 -0
- package/src/ummaya/tools/routing/intent_types.py +48 -0
- package/src/ummaya/tools/routing/lint.py +78 -0
- package/src/ummaya/tools/routing/metadata.py +174 -0
- package/src/ummaya/tools/routing/projection.py +340 -0
- package/src/ummaya/tools/routing/retrieval_policy.py +629 -0
- package/src/ummaya/tools/routing/schema.py +81 -0
- package/src/ummaya/tools/routing/types.py +96 -0
- package/src/ummaya/tools/routing_index.py +2 -2
- package/src/ummaya/tools/search.py +34 -746
- package/tests/fixtures/documents/public_forms/baselines.yaml +113 -0
- package/tui/bun.lock +126 -305
- package/tui/package.json +35 -22
- package/tui/src/.cc-byte-identical-whitelist.yaml +266 -0
- package/tui/src/QueryEngine.ts +12 -8
- package/tui/src/bridge/inboundAttachments.ts +3 -3
- package/tui/src/cli/handlers/auth.ts +3 -12
- package/tui/src/cli/handlers/mcp.tsx +0 -1
- package/tui/src/cli/print.ts +8 -9
- package/tui/src/commands/insights.ts +1 -1
- package/tui/src/commands/install-github-app/types.ts +8 -30
- package/tui/src/commands/plugin/types.ts +6 -28
- package/tui/src/commands/plugin/unifiedTypes.ts +4 -26
- package/tui/src/commands/rename/generateSessionName.ts +1 -1
- package/tui/src/components/Feedback.tsx +1 -1
- package/tui/src/components/LogoV2/EmergencyTip.tsx +11 -2
- package/tui/src/components/LogoV2/WelcomeV2.tsx +1 -3
- package/tui/src/components/ScrollKeybindingHandler.tsx +6 -6
- package/tui/src/components/Spinner/types.ts +6 -28
- package/tui/src/components/agents/generateAgent.ts +1 -1
- package/tui/src/components/agents/new-agent-creation/types.ts +4 -26
- package/tui/src/components/config/EnvSecretIsolatedEditor.tsx +1 -1
- package/tui/src/components/mcp/types.ts +16 -38
- package/tui/src/components/messages/AssistantToolUseMessage.tsx +3 -2
- package/tui/src/components/messages/UserCrossSessionMessage.ts +16 -4
- package/tui/src/components/messages/UserForkBoilerplateMessage.ts +16 -4
- package/tui/src/components/messages/UserGitHubWebhookMessage.ts +16 -4
- package/tui/src/components/messages/UserToolResultMessage/utils.tsx +3 -2
- package/tui/src/components/permissions/MonitorPermissionRequest/MonitorPermissionRequest.ts +9 -4
- package/tui/src/components/permissions/ReviewArtifactPermissionRequest/ReviewArtifactPermissionRequest.ts +9 -4
- package/tui/src/components/primitive/DocumentSocraticReviewBlock.tsx +129 -0
- package/tui/src/components/primitive/DocumentToolResultCard.tsx +224 -0
- package/tui/src/components/primitive/documentSocraticReview.ts +215 -0
- package/tui/src/components/primitive/index.tsx +43 -1
- package/tui/src/components/primitive/types.ts +137 -0
- package/tui/src/components/ui/option.ts +4 -26
- package/tui/src/constants/common.ts +0 -2
- package/tui/src/constants/prompts.ts +4 -3
- package/tui/src/constants/querySource.ts +4 -26
- package/tui/src/entrypoints/sdk/controlTypes.ts +26 -48
- package/tui/src/entrypoints/sdk/coreTypes.generated.ts +3 -25
- package/tui/src/entrypoints/sdk/runtimeTypes.ts +38 -60
- package/tui/src/entrypoints/sdk/sdkUtilityTypes.ts +4 -26
- package/tui/src/entrypoints/sdk/settingsTypes.generated.ts +3 -25
- package/tui/src/entrypoints/sdk/toolTypes.ts +3 -25
- package/tui/src/hooks/toolPermission/handlers/interactiveHandler.ts +10 -0
- package/tui/src/hooks/useApiKeyVerification.ts +1 -1
- package/tui/src/hooks/useVirtualScroll.ts +1 -1
- package/tui/src/ink/ink.tsx +33 -14
- package/tui/src/ink/reconciler.ts +2 -3
- package/tui/src/ink/render-to-screen.ts +30 -10
- package/tui/src/ipc/bridge.ts +62 -15
- package/tui/src/ipc/bridgeSingleton.ts +5 -1
- package/tui/src/ipc/codec.ts +3 -3
- package/tui/src/ipc/frames.generated.ts +12 -12
- package/tui/src/ipc/llmClient.ts +151 -27
- package/tui/src/ipc/schema/frame.schema.json +1 -1
- package/tui/src/keybindings/defaultBindings.ts +4 -0
- package/tui/src/main.tsx +32 -15
- package/tui/src/native-ts/file-index/index.ts +33 -3
- package/tui/src/observability/surface.ts +2 -2
- package/tui/src/probes/toolRegistryProbe.tsx +3 -1
- package/tui/src/projectOnboardingState.ts +7 -6
- package/tui/src/query/chatMessageTypes.ts +18 -0
- package/tui/src/query/chatMessagesBuilder.ts +1 -1
- package/tui/src/query/deps.ts +1 -1
- package/tui/src/query/messageGuards.ts +106 -0
- package/tui/src/query/publicDataTerminalRepair.ts +384 -0
- package/tui/src/query/run.ts +1075 -0
- package/tui/src/query/supportBoundary.ts +168 -0
- package/tui/src/query/toolResultErrors.ts +103 -0
- package/tui/src/query/toolRunner.ts +687 -0
- package/tui/src/query/unavailableToolRepair.ts +118 -0
- package/tui/src/query.ts +9 -2186
- package/tui/src/screens/REPL.tsx +40 -29
- package/tui/src/services/api/adapterManifest.ts +4 -0
- package/tui/src/services/api/backendChat/events.ts +117 -0
- package/tui/src/services/api/backendChat/finalMessage.ts +40 -0
- package/tui/src/services/api/backendChat/frame.ts +9 -0
- package/tui/src/services/api/backendChat/streaming.ts +430 -0
- package/tui/src/services/api/backendChat/types.ts +62 -0
- package/tui/src/services/api/backendChat.ts +1 -0
- package/tui/src/services/api/client.ts +65 -2
- package/tui/src/services/api/errorUtils.ts +5 -5
- package/tui/src/services/api/errors.ts +1 -1
- package/tui/src/services/api/logging.ts +1 -1
- package/tui/src/services/api/ummaya/evidence.ts +194 -0
- package/tui/src/services/api/ummaya/messages.ts +255 -0
- package/tui/src/services/api/ummaya/nonStreaming.ts +66 -0
- package/tui/src/services/api/ummaya/provider.ts +200 -0
- package/tui/src/services/api/ummaya/reasoning.ts +24 -0
- package/tui/src/services/api/ummaya/request.ts +200 -0
- package/tui/src/services/api/ummaya/selectionContext.ts +240 -0
- package/tui/src/services/api/ummaya/streaming.ts +365 -0
- package/tui/src/services/api/ummaya/streamingPayload.ts +129 -0
- package/tui/src/services/api/ummaya/streamingReader.ts +40 -0
- package/tui/src/services/api/ummaya/toolSelection.ts +217 -0
- package/tui/src/services/api/ummaya/types.ts +110 -0
- package/tui/src/services/api/ummaya/usage.ts +30 -0
- package/tui/src/services/api/ummaya.ts +26 -418
- package/tui/src/services/api/withRetry.ts +1 -1
- package/tui/src/services/awaySummary.ts +2 -2
- package/tui/src/services/claudeAiLimits.ts +1 -1
- package/tui/src/services/compact/autoCompact.ts +1 -1
- package/tui/src/services/compact/compact.ts +1 -1
- package/tui/src/services/lsp/types.ts +8 -30
- package/tui/src/services/tips/types.ts +6 -28
- package/tui/src/services/tokenEstimation.ts +1 -1
- package/tui/src/services/toolRegistry/bootGuard.ts +5 -5
- package/tui/src/services/toolUseSummary/toolUseSummaryGenerator.ts +1 -1
- package/tui/src/services/tools/toolExecution.ts +94 -1
- package/tui/src/store/pendingPermissionSlot.ts +1 -1
- package/tui/src/store/session-store.ts +10 -36
- package/tui/src/stubs/any-stub.ts +15 -10
- package/tui/src/stubs/color-diff-napi.ts +37 -23
- package/tui/src/stubs/globals.d.ts +3 -3
- package/tui/src/stubs/macro-preload.ts +23 -12
- package/tui/src/tools/AdapterTool/AdapterTool.ts +1207 -714
- package/tui/src/tools/AdapterTool/routeDiagnostics.ts +75 -0
- package/tui/src/tools/AgentTool/AgentTool.tsx +84 -1371
- package/tui/src/tools/AgentTool/agentToolHandoff.ts +114 -0
- package/tui/src/tools/AgentTool/agentToolPartialResult.ts +16 -0
- package/tui/src/tools/AgentTool/agentToolProgress.ts +32 -0
- package/tui/src/tools/AgentTool/agentToolResolver.ts +161 -0
- package/tui/src/tools/AgentTool/agentToolResult.ts +163 -0
- package/tui/src/tools/AgentTool/agentToolUtils.ts +14 -686
- package/tui/src/tools/AgentTool/asyncAgentLifecycle.ts +208 -0
- package/tui/src/tools/AgentTool/asyncLifecycle.ts +153 -0
- package/tui/src/tools/AgentTool/backgroundedCompletion.ts +126 -0
- package/tui/src/tools/AgentTool/backgroundedLifecycle.ts +174 -0
- package/tui/src/tools/AgentTool/foregroundBackground.ts +83 -0
- package/tui/src/tools/AgentTool/foregroundDrain.tsx +133 -0
- package/tui/src/tools/AgentTool/foregroundFinalize.ts +98 -0
- package/tui/src/tools/AgentTool/foregroundLifecycle.tsx +237 -0
- package/tui/src/tools/AgentTool/foregroundProgress.tsx +169 -0
- package/tui/src/tools/AgentTool/foregroundTask.ts +89 -0
- package/tui/src/tools/AgentTool/forkSubagent.ts +1 -12
- package/tui/src/tools/AgentTool/forkSubagentGate.ts +34 -0
- package/tui/src/tools/AgentTool/launchRouting.ts +203 -0
- package/tui/src/tools/AgentTool/lifecycle.ts +244 -0
- package/tui/src/tools/AgentTool/mcpRouting.ts +73 -0
- package/tui/src/tools/AgentTool/orchestrationSupport.ts +70 -0
- package/tui/src/tools/AgentTool/permissions.ts +39 -0
- package/tui/src/tools/AgentTool/promptSetup.ts +181 -0
- package/tui/src/tools/AgentTool/remoteRouting.ts +62 -0
- package/tui/src/tools/AgentTool/resultMapping.ts +116 -0
- package/tui/src/tools/AgentTool/resumeAgent.ts +39 -107
- package/tui/src/tools/AgentTool/resumeAgentHelpers.ts +140 -0
- package/tui/src/tools/AgentTool/runAgent.ts +1 -1
- package/tui/src/tools/AgentTool/runtimeConfig.ts +57 -0
- package/tui/src/tools/AgentTool/schemas.ts +196 -0
- package/tui/src/tools/AgentTool/sourceVerificationPropagation.ts +263 -0
- package/tui/src/tools/AgentTool/worktreeLifecycle.ts +105 -0
- package/tui/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +174 -202
- package/tui/src/tools/BashTool/BashTool.tsx +71 -1072
- package/tui/src/tools/BashTool/bashCommandHelpers.ts +12 -12
- package/tui/src/tools/BashTool/bashPermissions/astPreflight.ts +173 -0
- package/tui/src/tools/BashTool/bashPermissions/classifierChecks.ts +199 -0
- package/tui/src/tools/BashTool/bashPermissions/compoundGuards.ts +53 -0
- package/tui/src/tools/BashTool/bashPermissions/constants.ts +99 -0
- package/tui/src/tools/BashTool/bashPermissions/index.ts +38 -0
- package/tui/src/tools/BashTool/bashPermissions/legacyMisparsing.ts +62 -0
- package/tui/src/tools/BashTool/bashPermissions/main.ts +135 -0
- package/tui/src/tools/BashTool/bashPermissions/normalizedCommands.ts +33 -0
- package/tui/src/tools/BashTool/bashPermissions/operatorFlow.ts +98 -0
- package/tui/src/tools/BashTool/bashPermissions/permissionChecks.ts +200 -0
- package/tui/src/tools/BashTool/bashPermissions/prefixSuggestions.ts +88 -0
- package/tui/src/tools/BashTool/bashPermissions/promptClassifierRules.ts +125 -0
- package/tui/src/tools/BashTool/bashPermissions/ruleDelegates.ts +19 -0
- package/tui/src/tools/BashTool/bashPermissions/ruleMatching.ts +145 -0
- package/tui/src/tools/BashTool/bashPermissions/sandboxAutoAllow.ts +75 -0
- package/tui/src/tools/BashTool/bashPermissions/subcommandFlow.ts +205 -0
- package/tui/src/tools/BashTool/bashPermissions/subcommandGuards.ts +73 -0
- package/tui/src/tools/BashTool/bashPermissions/subcommandResultHelpers.ts +116 -0
- package/tui/src/tools/BashTool/bashPermissions/types.ts +26 -0
- package/tui/src/tools/BashTool/bashPermissions/wrapperStripping.ts +139 -0
- package/tui/src/tools/BashTool/bashPermissions.ts +26 -2621
- package/tui/src/tools/BashTool/call.ts +202 -0
- package/tui/src/tools/BashTool/callLoader.ts +35 -0
- package/tui/src/tools/BashTool/commandClassification.ts +151 -0
- package/tui/src/tools/BashTool/commandClassificationLoader.ts +40 -0
- package/tui/src/tools/BashTool/cwdReset.ts +33 -0
- package/tui/src/tools/BashTool/lineTruncation.ts +11 -0
- package/tui/src/tools/BashTool/modeValidation.ts +13 -1
- package/tui/src/tools/BashTool/outputPersistence.ts +42 -0
- package/tui/src/tools/BashTool/permissionClassification.ts +66 -0
- package/tui/src/tools/BashTool/permissionLoader.ts +44 -0
- package/tui/src/tools/BashTool/resultLoader.ts +29 -0
- package/tui/src/tools/BashTool/resultMapping.ts +83 -0
- package/tui/src/tools/BashTool/sandboxPolicy.ts +79 -0
- package/tui/src/tools/BashTool/schemas.ts +65 -0
- package/tui/src/tools/BashTool/sedEditExecution.ts +59 -0
- package/tui/src/tools/BashTool/shellExecution.tsx +245 -0
- package/tui/src/tools/BashTool/shellOutputUtils.ts +85 -0
- package/tui/src/tools/BashTool/shellPermissionGauntlet.ts +97 -0
- package/tui/src/tools/BashTool/uiLoader.ts +37 -0
- package/tui/src/tools/BriefTool/upload.ts +1 -1
- package/tui/src/tools/CalculatorTool/parser.ts +2 -2
- package/tui/src/tools/DocumentPrimitive/DocumentPrimitive.ts +262 -0
- package/tui/src/tools/DocumentPrimitive/dispatchNormalization.ts +270 -0
- package/tui/src/tools/DocumentPrimitive/documentDestinationPath.ts +18 -0
- package/tui/src/tools/DocumentPrimitive/documentMutationGuard.ts +22 -0
- package/tui/src/tools/DocumentPrimitive/documentPatchNormalization.ts +248 -0
- package/tui/src/tools/DocumentPrimitive/documentSourceVerification.ts +245 -0
- package/tui/src/tools/DocumentPrimitive/documentSourceVerificationFields.ts +103 -0
- package/tui/src/tools/DocumentPrimitive/modelVisibleOutput.ts +40 -0
- package/tui/src/tools/DocumentPrimitive/prompt.ts +35 -0
- package/tui/src/tools/FileEditTool/FileEditTool.ts +9 -507
- package/tui/src/tools/FileEditTool/call.ts +228 -0
- package/tui/src/tools/FileEditTool/validateInput.ts +196 -0
- package/tui/src/tools/FileReadTool/imageProcessor.ts +13 -0
- package/tui/src/tools/FileWriteTool/FileWriteTool.ts +7 -300
- package/tui/src/tools/FileWriteTool/call.ts +223 -0
- package/tui/src/tools/FileWriteTool/validateInput.ts +80 -0
- package/tui/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +19 -3
- package/tui/src/tools/LookupPrimitive/LookupPrimitive.ts +25 -32
- package/tui/src/tools/LookupPrimitive/prompt.ts +0 -2
- package/tui/src/tools/MCPTool/trustPolicy.ts +118 -0
- package/tui/src/tools/McpAuthTool/McpAuthTool.ts +21 -3
- package/tui/src/tools/NotebookEditTool/NotebookEditTool.ts +7 -326
- package/tui/src/tools/NotebookEditTool/call.ts +254 -0
- package/tui/src/tools/NotebookEditTool/notebookModel.ts +51 -0
- package/tui/src/tools/NotebookEditTool/validateInput.ts +142 -0
- package/tui/src/tools/PowerShellTool/PowerShellTool.tsx +46 -937
- package/tui/src/tools/PowerShellTool/acceptEditsCommandValidation.ts +162 -0
- package/tui/src/tools/PowerShellTool/call.ts +179 -0
- package/tui/src/tools/PowerShellTool/callLoader.ts +37 -0
- package/tui/src/tools/PowerShellTool/commandClassification.ts +86 -0
- package/tui/src/tools/PowerShellTool/modeValidation.ts +25 -332
- package/tui/src/tools/PowerShellTool/outputPersistence.ts +42 -0
- package/tui/src/tools/PowerShellTool/permissionClassification.ts +28 -0
- package/tui/src/tools/PowerShellTool/resultLoader.ts +31 -0
- package/tui/src/tools/PowerShellTool/resultMapping.ts +75 -0
- package/tui/src/tools/PowerShellTool/schemas.ts +40 -0
- package/tui/src/tools/PowerShellTool/shellExecution.tsx +258 -0
- package/tui/src/tools/PowerShellTool/symlinkModeValidation.ts +44 -0
- package/tui/src/tools/PowerShellTool/uiLoader.ts +37 -0
- package/tui/src/tools/PowerShellTool/validation.ts +39 -0
- package/tui/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +19 -3
- package/tui/src/tools/ResolveLocationPrimitive/ResolveLocationPrimitive.ts +1 -11
- package/tui/src/tools/ResolveLocationPrimitive/prompt.ts +2 -6
- package/tui/src/tools/SkillTool/SkillTool.ts +2 -2
- package/tui/src/tools/SubmitPrimitive/SubmitPrimitive.ts +27 -10
- package/tui/src/tools/TaskCreateTool/TaskCreateTool.ts +16 -2
- package/tui/src/tools/TaskGetTool/TaskGetTool.ts +23 -3
- package/tui/src/tools/TaskListTool/TaskListTool.ts +22 -4
- package/tui/src/tools/TaskOutputTool/TaskOutputTool.tsx +46 -547
- package/tui/src/tools/TaskOutputTool/lookup.ts +216 -0
- package/tui/src/tools/TaskOutputTool/render.tsx +257 -0
- package/tui/src/tools/TaskOutputTool/schemas.ts +55 -0
- package/tui/src/tools/TaskOutputTool/serialization.ts +36 -0
- package/tui/src/tools/TaskStopTool/TaskStopTool.ts +10 -0
- package/tui/src/tools/TaskUpdateTool/TaskUpdateTool.ts +14 -364
- package/tui/src/tools/TaskUpdateTool/completion.ts +62 -0
- package/tui/src/tools/TaskUpdateTool/schemas.ts +62 -0
- package/tui/src/tools/TaskUpdateTool/serialization.ts +46 -0
- package/tui/src/tools/TaskUpdateTool/statusUpdate.ts +247 -0
- package/tui/src/tools/TodoWriteTool/TodoWriteTool.ts +21 -2
- package/tui/src/tools/ToolSearchTool/ToolSearchTool.ts +21 -302
- package/tui/src/tools/ToolSearchTool/ccSupportTools.ts +223 -0
- package/tui/src/tools/ToolSearchTool/descriptionCache.ts +50 -0
- package/tui/src/tools/ToolSearchTool/keywordSearch.ts +216 -0
- package/tui/src/tools/ToolSearchTool/prompt.ts +10 -4
- package/tui/src/tools/ToolSearchTool/resultMapping.ts +30 -0
- package/tui/src/tools/ToolSearchTool/schemas.ts +30 -0
- package/tui/src/tools/ToolSearchTool/searchPool.ts +47 -0
- package/tui/src/tools/ToolSearchTool/supportIntentHints.ts +140 -0
- package/tui/src/tools/TranslateTool/TranslateTool.ts +1 -1
- package/tui/src/tools/VerifyPrimitive/VerifyPrimitive.ts +2 -1
- package/tui/src/tools/WebFetchTool/WebFetchTool.ts +43 -138
- package/tui/src/tools/WebFetchTool/call.ts +227 -0
- package/tui/src/tools/WebFetchTool/resolvedAddressSafety.ts +78 -0
- package/tui/src/tools/WebFetchTool/sourceVerification.ts +204 -0
- package/tui/src/tools/WebFetchTool/types.ts +23 -0
- package/tui/src/tools/WebFetchTool/urlSafety.ts +181 -0
- package/tui/src/tools/WebFetchTool/utils.ts +1 -1
- package/tui/src/tools/WebSearchTool/UI.tsx +0 -1
- package/tui/src/tools/WebSearchTool/WebSearchTool.ts +9 -313
- package/tui/src/tools/WebSearchTool/call.ts +33 -0
- package/tui/src/tools/WebSearchTool/responseMapping.ts +190 -0
- package/tui/src/tools/WebSearchTool/resultBlock.ts +47 -0
- package/tui/src/tools/WebSearchTool/schemas.ts +47 -0
- package/tui/src/tools/WebSearchTool/toolSchema.ts +12 -0
- package/tui/src/tools/WorkspaceToolAdapter/WorkspaceToolAdapter.ts +79 -0
- package/tui/src/tools/WorkspaceToolAdapter/allowedRootPolicy.ts +85 -0
- package/tui/src/tools/WorkspaceToolAdapter/documentFormatGuards.ts +73 -0
- package/tui/src/tools/WorkspaceToolAdapter/inputNormalization.ts +105 -0
- package/tui/src/tools/WorkspaceToolAdapter/mcpExposurePolicy.ts +64 -0
- package/tui/src/tools/WorkspaceToolAdapter/toolDefFactory.ts +215 -0
- package/tui/src/tools/WorkspaceToolAdapter/toolNames.ts +6 -0
- package/tui/src/tools/WorkspaceToolAdapter/workspacePolicy.ts +15 -0
- package/tui/src/tools/_shared/dispatchPrimitive.ts +6 -6
- package/tui/src/tools/_shared/documentChangeToPatch.ts +125 -0
- package/tui/src/tools/_shared/documentDispatchArguments.ts +87 -0
- package/tui/src/tools/_shared/documentPrimitiveTimeout.ts +13 -0
- package/tui/src/tools/_shared/documentToolResultRender.ts +98 -0
- package/tui/src/tools/_shared/pendingCallRegistry.ts +1 -6
- package/tui/src/tools/_shared/rootPrimitiveInput.ts +1 -0
- package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPatterns.ts +58 -0
- package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPrompt.ts +271 -0
- package/tui/src/tools/_shared/toolChoiceRepair/documentRepair.ts +452 -0
- package/tui/src/tools/_shared/toolChoiceRepair/messageAccess.ts +80 -0
- package/tui/src/tools/_shared/toolChoiceRepair/publicDataRepair.ts +92 -0
- package/tui/src/tools/_shared/toolChoiceRepair/supportRepair.ts +135 -0
- package/tui/src/tools/_shared/toolChoiceRepair.ts +55 -860
- package/tui/src/tools/shared/mockDisclaimer.ts +1 -1
- package/tui/src/tools.ts +39 -190
- package/tui/src/types/fileSuggestion.ts +4 -26
- package/tui/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +186 -148
- package/tui/src/types/generated/events_mono/common/v1/auth.ts +25 -11
- package/tui/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +47 -30
- package/tui/src/types/generated/google/protobuf/timestamp.ts +21 -7
- package/tui/src/types/message.ts +80 -102
- package/tui/src/types/messageQueueTypes.ts +6 -28
- package/tui/src/types/notebook.ts +16 -38
- package/tui/src/types/statusLine.ts +4 -26
- package/tui/src/types/tools.ts +24 -46
- package/tui/src/types/utils.ts +6 -28
- package/tui/src/upstreamproxy/relay.ts +7 -3
- package/tui/src/upstreamproxy/upstreamproxy.ts +1 -1
- package/tui/src/utils/assistantMessageFactories.ts +9 -3
- package/tui/src/utils/auth.ts +129 -139
- package/tui/src/utils/bash/ast.ts +23 -23
- package/tui/src/utils/bash/bashParser.ts +5 -5
- package/tui/src/utils/billing.ts +1 -1
- package/tui/src/utils/claudeDesktop.ts +4 -4
- package/tui/src/utils/collapseReadSearch.ts +3 -3
- package/tui/src/utils/cronTasks.ts +1 -1
- package/tui/src/utils/execFileNoThrow.ts +1 -1
- package/tui/src/utils/filePersistence/types.ts +16 -38
- package/tui/src/utils/forkedAgent.ts +1 -1
- package/tui/src/utils/gracefulShutdown.ts +4 -4
- package/tui/src/utils/heapDumpService.ts +12 -8
- package/tui/src/utils/hooks/apiQueryHookHelper.ts +1 -1
- package/tui/src/utils/hooks/execPromptHook.ts +1 -1
- package/tui/src/utils/hooks/skillImprovement.ts +1 -1
- package/tui/src/utils/mcp/dateTimeParser.ts +1 -1
- package/tui/src/utils/messages.ts +18 -0
- package/tui/src/utils/migrateSessions.ts +3 -3
- package/tui/src/utils/model/model.ts +6 -6
- package/tui/src/utils/permissions/yoloClassifier.ts +1 -1
- package/tui/src/utils/plugins/headlessPluginInstall.ts +1 -1
- package/tui/src/utils/plugins/mcpPluginIntegration.ts +1 -1
- package/tui/src/utils/plugins/mcpbHandler.ts +1 -1
- package/tui/src/utils/plugins/pluginLoader.ts +8 -8
- package/tui/src/utils/protectedNamespace.ts +5 -3
- package/tui/src/utils/rawJsonToolCall.ts +242 -0
- package/tui/src/utils/ripgrep.ts +16 -7
- package/tui/src/utils/sessionTitle.ts +1 -1
- package/tui/src/utils/settings/permissionValidation.ts +14 -2
- package/tui/src/utils/shell/prefix.ts +1 -1
- package/tui/src/utils/sideQuery.ts +1 -1
- package/tui/src/utils/systemThemeWatcher.ts +13 -3
- package/tui/src/utils/teleport.tsx +1 -1
- package/uv.lock +426 -45
- package/tui/src/services/api/claude.ts +0 -3540
- package/tui/src/tools/_shared/directPublicDataGuard.ts +0 -362
- package/tui/src/tools/_shared/kmaAnalysisGuard.ts +0 -197
- package/tui/src/tools/_shared/kmaAviationGuard.ts +0 -70
- package/tui/src/tools/_shared/nmcAedGuard.ts +0 -234
- package/tui/src/tools/_shared/protectedCheckGuard.ts +0 -207
- package/tui/src/tools/_shared/textToolCallGuard.ts +0 -91
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'
|
|
2
|
+
import { BASH_TOOL_NAME } from '../BashTool/toolName.js'
|
|
3
|
+
import { FILE_READ_TOOL_NAME } from '../FileReadTool/prompt.js'
|
|
4
|
+
import { formatSourceVerificationForModel } from '../WebFetchTool/sourceVerification.js'
|
|
5
|
+
import { ONE_SHOT_BUILTIN_AGENT_TYPES } from './constants.js'
|
|
6
|
+
import type { AgentToolOutput } from './schemas.js'
|
|
7
|
+
|
|
8
|
+
function assertNever(value: never): never {
|
|
9
|
+
throw new Error(`Unexpected agent tool result status: ${JSON.stringify(value)}`)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function mapAgentToolResultToToolResultBlockParam(
|
|
13
|
+
data: AgentToolOutput,
|
|
14
|
+
toolUseID: string,
|
|
15
|
+
): ToolResultBlockParam {
|
|
16
|
+
switch (data.status) {
|
|
17
|
+
case 'teammate_spawned':
|
|
18
|
+
return {
|
|
19
|
+
tool_use_id: toolUseID,
|
|
20
|
+
type: 'tool_result',
|
|
21
|
+
content: [
|
|
22
|
+
{
|
|
23
|
+
type: 'text',
|
|
24
|
+
text: `Spawned successfully.
|
|
25
|
+
agent_id: ${data.teammate_id}
|
|
26
|
+
name: ${data.name}
|
|
27
|
+
team_name: ${data.team_name}
|
|
28
|
+
evidence_join_key: ${data.evidenceJoinKey}
|
|
29
|
+
parent_tool_use_id: ${data.parentToolUseId}
|
|
30
|
+
resume_token: ${data.resumeToken}
|
|
31
|
+
permission_flow: ${data.permissionFlow}
|
|
32
|
+
The agent is now running and will receive instructions via mailbox.`,
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
}
|
|
36
|
+
case 'remote_launched':
|
|
37
|
+
return {
|
|
38
|
+
tool_use_id: toolUseID,
|
|
39
|
+
type: 'tool_result',
|
|
40
|
+
content: [
|
|
41
|
+
{
|
|
42
|
+
type: 'text',
|
|
43
|
+
text: `Remote agent launched in CCR.\ntaskId: ${data.taskId}\nsession_url: ${data.sessionUrl}\noutput_file: ${data.outputFile}\nThe agent is running remotely. You will be notified automatically when it completes.\nBriefly tell the user what you launched and end your response.`,
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
}
|
|
47
|
+
case 'async_launched':
|
|
48
|
+
return mapAsyncAgentResult(data, toolUseID)
|
|
49
|
+
case 'completed':
|
|
50
|
+
return mapCompletedAgentResult(data, toolUseID)
|
|
51
|
+
default:
|
|
52
|
+
return assertNever(data)
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function mapAsyncAgentResult(
|
|
57
|
+
data: Extract<AgentToolOutput, { readonly status: 'async_launched' }>,
|
|
58
|
+
toolUseID: string,
|
|
59
|
+
): ToolResultBlockParam {
|
|
60
|
+
const supportMetadata = `evidence_join_key: ${data.evidenceJoinKey}\nparent_tool_use_id: ${data.parentToolUseId}\nresume_token: ${data.resumeToken}\npermission_flow: ${data.permissionFlow}`
|
|
61
|
+
const prefix = `Async agent launched successfully.\nagentId: ${data.agentId} (internal ID - do not mention to user. Use SendMessage with to: '${data.agentId}' to continue this agent.)\n${supportMetadata}\nThe agent is working in the background. You will be notified automatically when it completes.`
|
|
62
|
+
const instructions = data.canReadOutputFile
|
|
63
|
+
? `Do not duplicate this agent's work — avoid working with the same files or topics it is using. Work on non-overlapping tasks, or briefly tell the user what you launched and end your response.\noutput_file: ${data.outputFile}\nIf asked, you can check progress before completion by using ${FILE_READ_TOOL_NAME} or ${BASH_TOOL_NAME} tail on the output file.`
|
|
64
|
+
: `Briefly tell the user what you launched and end your response. Do not generate any other text — agent results will arrive in a subsequent message.`
|
|
65
|
+
return {
|
|
66
|
+
tool_use_id: toolUseID,
|
|
67
|
+
type: 'tool_result',
|
|
68
|
+
content: [{ type: 'text', text: `${prefix}\n${instructions}` }],
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function mapCompletedAgentResult(
|
|
73
|
+
data: Extract<AgentToolOutput, { readonly status: 'completed' }>,
|
|
74
|
+
toolUseID: string,
|
|
75
|
+
): ToolResultBlockParam {
|
|
76
|
+
const worktreeInfoText = data.worktreePath
|
|
77
|
+
? `\nworktreePath: ${data.worktreePath}\nworktreeBranch: ${data.worktreeBranch}`
|
|
78
|
+
: ''
|
|
79
|
+
const sourceVerificationText = formatSourceVerificationForModel(
|
|
80
|
+
data.sourceVerification,
|
|
81
|
+
)
|
|
82
|
+
const sourceVerificationSuffix = sourceVerificationText
|
|
83
|
+
? `\n${sourceVerificationText}`
|
|
84
|
+
: ''
|
|
85
|
+
const contentOrMarker =
|
|
86
|
+
data.content.length > 0
|
|
87
|
+
? data.content
|
|
88
|
+
: [{ type: 'text' as const, text: '(Subagent completed but returned no output.)' }]
|
|
89
|
+
|
|
90
|
+
if (
|
|
91
|
+
data.agentType &&
|
|
92
|
+
ONE_SHOT_BUILTIN_AGENT_TYPES.has(data.agentType) &&
|
|
93
|
+
!worktreeInfoText
|
|
94
|
+
) {
|
|
95
|
+
return { tool_use_id: toolUseID, type: 'tool_result', content: contentOrMarker }
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return {
|
|
99
|
+
tool_use_id: toolUseID,
|
|
100
|
+
type: 'tool_result',
|
|
101
|
+
content: [
|
|
102
|
+
...contentOrMarker,
|
|
103
|
+
{
|
|
104
|
+
type: 'text',
|
|
105
|
+
text: `agentId: ${data.agentId} (use SendMessage with to: '${data.agentId}' to continue this agent)${worktreeInfoText}
|
|
106
|
+
evidence_join_key: ${data.evidenceJoinKey}
|
|
107
|
+
parent_tool_use_id: ${data.parentToolUseId}
|
|
108
|
+
resume_token: ${data.resumeToken}
|
|
109
|
+
permission_flow: ${data.permissionFlow}
|
|
110
|
+
<usage>total_tokens: ${data.totalTokens}
|
|
111
|
+
tool_uses: ${data.totalToolUseCount}
|
|
112
|
+
duration_ms: ${data.totalDurationMs}</usage>${sourceVerificationSuffix}`,
|
|
113
|
+
},
|
|
114
|
+
],
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import { promises as fsp } from 'fs'
|
|
2
1
|
import { getSdkAgentProgressSummariesEnabled } from '../../bootstrap/state.js'
|
|
3
|
-
import { getSystemPrompt } from '../../constants/prompts.js'
|
|
4
2
|
import { isCoordinatorMode } from '../../coordinator/coordinatorMode.js'
|
|
5
3
|
import type { CanUseToolFn } from '../../hooks/useCanUseTool.js'
|
|
6
4
|
import type { ToolUseContext } from '../../Tool.js'
|
|
@@ -9,29 +7,21 @@ import { assembleToolPool } from '../../tools.js'
|
|
|
9
7
|
import { asAgentId } from '../../types/ids.js'
|
|
10
8
|
import { runWithAgentContext } from '../../utils/agentContext.js'
|
|
11
9
|
import { runWithCwdOverride } from '../../utils/cwd.js'
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
createUserMessage,
|
|
15
|
-
filterOrphanedThinkingOnlyMessages,
|
|
16
|
-
filterUnresolvedToolUses,
|
|
17
|
-
filterWhitespaceOnlyAssistantMessages,
|
|
18
|
-
} from '../../utils/messages.js'
|
|
10
|
+
import { createUserMessage } from '../../utils/messages.js'
|
|
19
11
|
import { getAgentModel } from '../../utils/model/agent.js'
|
|
20
12
|
import { getQuerySourceForAgent } from '../../utils/promptCategory.js'
|
|
21
|
-
import {
|
|
22
|
-
getAgentTranscript,
|
|
23
|
-
readAgentMetadata,
|
|
24
|
-
} from '../../utils/sessionStorage.js'
|
|
25
|
-
import { buildEffectiveSystemPrompt } from '../../utils/systemPrompt.js'
|
|
26
|
-
import type { SystemPrompt } from '../../utils/systemPromptType.js'
|
|
27
13
|
import { getTaskOutputPath } from '../../utils/task/diskOutput.js'
|
|
28
14
|
import { getParentSessionId } from '../../utils/teammate.js'
|
|
29
|
-
import {
|
|
30
|
-
import { runAsyncAgentLifecycle } from './agentToolUtils.js'
|
|
31
|
-
import { GENERAL_PURPOSE_AGENT } from './built-in/generalPurposeAgent.js'
|
|
15
|
+
import { runAsyncAgentLifecycle } from './asyncAgentLifecycle.js'
|
|
32
16
|
import { FORK_AGENT, isForkSubagentEnabled } from './forkSubagent.js'
|
|
33
|
-
import type { AgentDefinition } from './loadAgentsDir.js'
|
|
34
17
|
import { isBuiltInAgent } from './loadAgentsDir.js'
|
|
18
|
+
import { buildCoordinatorWorkerPermissionContext } from './orchestrationSupport.js'
|
|
19
|
+
import {
|
|
20
|
+
buildForkParentSystemPrompt,
|
|
21
|
+
loadResumeTranscriptState,
|
|
22
|
+
resolveResumedWorktreePath,
|
|
23
|
+
selectResumeAgentDefinition,
|
|
24
|
+
} from './resumeAgentHelpers.js'
|
|
35
25
|
import { runAgent } from './runAgent.js'
|
|
36
26
|
|
|
37
27
|
export type ResumeAgentResult = {
|
|
@@ -39,6 +29,7 @@ export type ResumeAgentResult = {
|
|
|
39
29
|
description: string
|
|
40
30
|
outputFile: string
|
|
41
31
|
}
|
|
32
|
+
|
|
42
33
|
export async function resumeAgentBackground({
|
|
43
34
|
agentId,
|
|
44
35
|
prompt,
|
|
@@ -60,92 +51,25 @@ export async function resumeAgentBackground({
|
|
|
60
51
|
toolUseContext.setAppStateForTasks ?? toolUseContext.setAppState
|
|
61
52
|
const permissionMode = appState.toolPermissionContext.mode
|
|
62
53
|
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
throw new Error(`No transcript found for agent ID: ${agentId}`)
|
|
69
|
-
}
|
|
70
|
-
const resumedMessages = filterWhitespaceOnlyAssistantMessages(
|
|
71
|
-
filterOrphanedThinkingOnlyMessages(
|
|
72
|
-
filterUnresolvedToolUses(transcript.messages),
|
|
73
|
-
),
|
|
74
|
-
)
|
|
75
|
-
const resumedReplacementState = reconstructForSubagentResume(
|
|
76
|
-
toolUseContext.contentReplacementState,
|
|
77
|
-
resumedMessages,
|
|
78
|
-
transcript.contentReplacements,
|
|
79
|
-
)
|
|
80
|
-
// Best-effort: if the original worktree was removed externally, fall back
|
|
81
|
-
// to parent cwd rather than crashing on chdir later.
|
|
82
|
-
const resumedWorktreePath = meta?.worktreePath
|
|
83
|
-
? await fsp.stat(meta.worktreePath).then(
|
|
84
|
-
s => (s.isDirectory() ? meta.worktreePath : undefined),
|
|
85
|
-
() => {
|
|
86
|
-
logForDebugging(
|
|
87
|
-
`Resumed worktree ${meta.worktreePath} no longer exists; falling back to parent cwd`,
|
|
88
|
-
)
|
|
89
|
-
return undefined
|
|
90
|
-
},
|
|
91
|
-
)
|
|
92
|
-
: undefined
|
|
93
|
-
if (resumedWorktreePath) {
|
|
94
|
-
// Bump mtime so stale-worktree cleanup doesn't delete a just-resumed worktree (#22355)
|
|
95
|
-
const now = new Date()
|
|
96
|
-
await fsp.utimes(resumedWorktreePath, now, now)
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// Skip filterDeniedAgents re-gating — original spawn already passed permission checks
|
|
100
|
-
let selectedAgent: AgentDefinition
|
|
101
|
-
let isResumedFork = false
|
|
102
|
-
if (meta?.agentType === FORK_AGENT.agentType) {
|
|
103
|
-
selectedAgent = FORK_AGENT
|
|
104
|
-
isResumedFork = true
|
|
105
|
-
} else if (meta?.agentType) {
|
|
106
|
-
const found = toolUseContext.options.agentDefinitions.activeAgents.find(
|
|
107
|
-
a => a.agentType === meta.agentType,
|
|
54
|
+
const resumeAgentId = asAgentId(agentId)
|
|
55
|
+
const { resumedMessages, resumedReplacementState, meta } =
|
|
56
|
+
await loadResumeTranscriptState(
|
|
57
|
+
resumeAgentId,
|
|
58
|
+
toolUseContext.contentReplacementState,
|
|
108
59
|
)
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}
|
|
60
|
+
const resumedWorktreePath = await resolveResumedWorktreePath(
|
|
61
|
+
meta?.worktreePath,
|
|
62
|
+
)
|
|
63
|
+
const { selectedAgent, isResumedFork } = selectResumeAgentDefinition({
|
|
64
|
+
agentType: meta?.agentType,
|
|
65
|
+
activeAgents: toolUseContext.options.agentDefinitions.activeAgents,
|
|
66
|
+
})
|
|
113
67
|
|
|
114
68
|
const uiDescription = meta?.description ?? '(resumed)'
|
|
115
69
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
forkParentSystemPrompt = toolUseContext.renderedSystemPrompt
|
|
120
|
-
} else {
|
|
121
|
-
const mainThreadAgentDefinition = appState.agent
|
|
122
|
-
? appState.agentDefinitions.activeAgents.find(
|
|
123
|
-
a => a.agentType === appState.agent,
|
|
124
|
-
)
|
|
125
|
-
: undefined
|
|
126
|
-
const additionalWorkingDirectories = Array.from(
|
|
127
|
-
appState.toolPermissionContext.additionalWorkingDirectories.keys(),
|
|
128
|
-
)
|
|
129
|
-
const defaultSystemPrompt = await getSystemPrompt(
|
|
130
|
-
toolUseContext.options.tools,
|
|
131
|
-
toolUseContext.options.mainLoopModel,
|
|
132
|
-
additionalWorkingDirectories,
|
|
133
|
-
toolUseContext.options.mcpClients,
|
|
134
|
-
)
|
|
135
|
-
forkParentSystemPrompt = buildEffectiveSystemPrompt({
|
|
136
|
-
mainThreadAgentDefinition,
|
|
137
|
-
toolUseContext,
|
|
138
|
-
customSystemPrompt: toolUseContext.options.customSystemPrompt,
|
|
139
|
-
defaultSystemPrompt,
|
|
140
|
-
appendSystemPrompt: toolUseContext.options.appendSystemPrompt,
|
|
141
|
-
})
|
|
142
|
-
}
|
|
143
|
-
if (!forkParentSystemPrompt) {
|
|
144
|
-
throw new Error(
|
|
145
|
-
'Cannot resume fork agent: unable to reconstruct parent system prompt',
|
|
146
|
-
)
|
|
147
|
-
}
|
|
148
|
-
}
|
|
70
|
+
const forkParentSystemPrompt = isResumedFork
|
|
71
|
+
? await buildForkParentSystemPrompt({ toolUseContext, appState })
|
|
72
|
+
: undefined
|
|
149
73
|
|
|
150
74
|
// Resolve model for analytics metadata (runAgent resolves its own internally)
|
|
151
75
|
const resolvedAgentModel = getAgentModel(
|
|
@@ -155,10 +79,10 @@ export async function resumeAgentBackground({
|
|
|
155
79
|
permissionMode,
|
|
156
80
|
)
|
|
157
81
|
|
|
158
|
-
const workerPermissionContext =
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
82
|
+
const workerPermissionContext = buildCoordinatorWorkerPermissionContext(
|
|
83
|
+
appState.toolPermissionContext,
|
|
84
|
+
selectedAgent.permissionMode,
|
|
85
|
+
)
|
|
162
86
|
const workerTools = isResumedFork
|
|
163
87
|
? toolUseContext.options.tools
|
|
164
88
|
: assembleToolPool(workerPermissionContext, appState.mcp.tools)
|
|
@@ -211,6 +135,7 @@ export async function resumeAgentBackground({
|
|
|
211
135
|
startTime,
|
|
212
136
|
agentType: selectedAgent.agentType,
|
|
213
137
|
isAsync: true,
|
|
138
|
+
parentToolUseId: toolUseContext.toolUseId,
|
|
214
139
|
}
|
|
215
140
|
|
|
216
141
|
const asyncAgentContext = {
|
|
@@ -227,18 +152,25 @@ export async function resumeAgentBackground({
|
|
|
227
152
|
const wrapWithCwd = <T>(fn: () => T): T =>
|
|
228
153
|
resumedWorktreePath ? runWithCwdOverride(resumedWorktreePath, fn) : fn()
|
|
229
154
|
|
|
155
|
+
const abortController = agentBackgroundTask.abortController
|
|
156
|
+
if (!abortController) {
|
|
157
|
+
throw new Error(
|
|
158
|
+
`Cannot resume agent ${agentBackgroundTask.agentId}: missing abort controller`,
|
|
159
|
+
)
|
|
160
|
+
}
|
|
161
|
+
|
|
230
162
|
void runWithAgentContext(asyncAgentContext, () =>
|
|
231
163
|
wrapWithCwd(() =>
|
|
232
164
|
runAsyncAgentLifecycle({
|
|
233
165
|
taskId: agentBackgroundTask.agentId,
|
|
234
|
-
abortController
|
|
166
|
+
abortController,
|
|
235
167
|
makeStream: onCacheSafeParams =>
|
|
236
168
|
runAgent({
|
|
237
169
|
...runAgentParams,
|
|
238
170
|
override: {
|
|
239
171
|
...runAgentParams.override,
|
|
240
172
|
agentId: asAgentId(agentBackgroundTask.agentId),
|
|
241
|
-
abortController
|
|
173
|
+
abortController,
|
|
242
174
|
},
|
|
243
175
|
onCacheSafeParams,
|
|
244
176
|
}),
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { promises as fsp } from 'fs'
|
|
2
|
+
import { getSystemPrompt } from '../../constants/prompts.js'
|
|
3
|
+
import type { AppState } from '../../state/AppState.js'
|
|
4
|
+
import type { ToolUseContext } from '../../Tool.js'
|
|
5
|
+
import type { AgentId } from '../../types/ids.js'
|
|
6
|
+
import type { Message as MessageType } from '../../types/message.js'
|
|
7
|
+
import { logForDebugging } from '../../utils/debug.js'
|
|
8
|
+
import {
|
|
9
|
+
filterOrphanedThinkingOnlyMessages,
|
|
10
|
+
filterUnresolvedToolUses,
|
|
11
|
+
filterWhitespaceOnlyAssistantMessages,
|
|
12
|
+
} from '../../utils/messages.js'
|
|
13
|
+
import {
|
|
14
|
+
getAgentTranscript,
|
|
15
|
+
readAgentMetadata,
|
|
16
|
+
type AgentMetadata,
|
|
17
|
+
} from '../../utils/sessionStorage.js'
|
|
18
|
+
import { buildEffectiveSystemPrompt } from '../../utils/systemPrompt.js'
|
|
19
|
+
import type { SystemPrompt } from '../../utils/systemPromptType.js'
|
|
20
|
+
import type { ContentReplacementState } from '../../utils/toolResultStorage.js'
|
|
21
|
+
import { reconstructForSubagentResume } from '../../utils/toolResultStorage.js'
|
|
22
|
+
import { GENERAL_PURPOSE_AGENT } from './built-in/generalPurposeAgent.js'
|
|
23
|
+
import { FORK_AGENT } from './forkSubagent.js'
|
|
24
|
+
import type { AgentDefinition } from './loadAgentsDir.js'
|
|
25
|
+
|
|
26
|
+
export type ResumeTranscriptState = {
|
|
27
|
+
readonly resumedMessages: MessageType[]
|
|
28
|
+
readonly resumedReplacementState: ContentReplacementState | undefined
|
|
29
|
+
readonly meta: AgentMetadata | null
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export type ResumeAgentSelection = {
|
|
33
|
+
readonly selectedAgent: AgentDefinition
|
|
34
|
+
readonly isResumedFork: boolean
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export async function loadResumeTranscriptState(
|
|
38
|
+
agentId: AgentId,
|
|
39
|
+
parentReplacementState: ContentReplacementState | undefined,
|
|
40
|
+
): Promise<ResumeTranscriptState> {
|
|
41
|
+
const [transcript, meta] = await Promise.all([
|
|
42
|
+
getAgentTranscript(agentId),
|
|
43
|
+
readAgentMetadata(agentId),
|
|
44
|
+
])
|
|
45
|
+
if (!transcript) {
|
|
46
|
+
throw new Error(`No transcript found for agent ID: ${agentId}`)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const resumedMessages = filterWhitespaceOnlyAssistantMessages(
|
|
50
|
+
filterOrphanedThinkingOnlyMessages(
|
|
51
|
+
filterUnresolvedToolUses(transcript.messages),
|
|
52
|
+
),
|
|
53
|
+
)
|
|
54
|
+
const resumedReplacementState = reconstructForSubagentResume(
|
|
55
|
+
parentReplacementState,
|
|
56
|
+
resumedMessages,
|
|
57
|
+
transcript.contentReplacements,
|
|
58
|
+
)
|
|
59
|
+
return { resumedMessages, resumedReplacementState, meta }
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export async function resolveResumedWorktreePath(
|
|
63
|
+
worktreePath: string | undefined,
|
|
64
|
+
): Promise<string | undefined> {
|
|
65
|
+
if (!worktreePath) return undefined
|
|
66
|
+
const stat = await fsp.stat(worktreePath).then(
|
|
67
|
+
value => value,
|
|
68
|
+
() => undefined,
|
|
69
|
+
)
|
|
70
|
+
if (!stat?.isDirectory()) {
|
|
71
|
+
logForDebugging(
|
|
72
|
+
`Resumed worktree ${worktreePath} no longer exists; falling back to parent cwd`,
|
|
73
|
+
)
|
|
74
|
+
return undefined
|
|
75
|
+
}
|
|
76
|
+
const now = new Date()
|
|
77
|
+
await fsp.utimes(worktreePath, now, now)
|
|
78
|
+
return worktreePath
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function selectResumeAgentDefinition({
|
|
82
|
+
agentType,
|
|
83
|
+
activeAgents,
|
|
84
|
+
}: {
|
|
85
|
+
agentType: string | undefined
|
|
86
|
+
activeAgents: readonly AgentDefinition[]
|
|
87
|
+
}): ResumeAgentSelection {
|
|
88
|
+
if (agentType === FORK_AGENT.agentType) {
|
|
89
|
+
return { selectedAgent: FORK_AGENT, isResumedFork: true }
|
|
90
|
+
}
|
|
91
|
+
const selectedAgent = agentType
|
|
92
|
+
? (activeAgents.find(agent => agent.agentType === agentType) ??
|
|
93
|
+
GENERAL_PURPOSE_AGENT)
|
|
94
|
+
: GENERAL_PURPOSE_AGENT
|
|
95
|
+
return { selectedAgent, isResumedFork: false }
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export async function buildForkParentSystemPrompt({
|
|
99
|
+
toolUseContext,
|
|
100
|
+
appState,
|
|
101
|
+
}: {
|
|
102
|
+
toolUseContext: ToolUseContext
|
|
103
|
+
appState: AppState
|
|
104
|
+
}): Promise<SystemPrompt> {
|
|
105
|
+
if (toolUseContext.renderedSystemPrompt) {
|
|
106
|
+
return toolUseContext.renderedSystemPrompt
|
|
107
|
+
}
|
|
108
|
+
const mainThreadAgentDefinition = appState.agent
|
|
109
|
+
? appState.agentDefinitions.activeAgents.find(
|
|
110
|
+
agent => agent.agentType === appState.agent,
|
|
111
|
+
)
|
|
112
|
+
: undefined
|
|
113
|
+
const defaultSystemPrompt = await getSystemPrompt(
|
|
114
|
+
toolUseContext.options.tools,
|
|
115
|
+
toolUseContext.options.mainLoopModel,
|
|
116
|
+
additionalWorkingDirectoryPaths(toolUseContext),
|
|
117
|
+
toolUseContext.options.mcpClients,
|
|
118
|
+
)
|
|
119
|
+
const forkParentSystemPrompt = buildEffectiveSystemPrompt({
|
|
120
|
+
mainThreadAgentDefinition,
|
|
121
|
+
toolUseContext,
|
|
122
|
+
customSystemPrompt: toolUseContext.options.customSystemPrompt,
|
|
123
|
+
defaultSystemPrompt,
|
|
124
|
+
appendSystemPrompt: toolUseContext.options.appendSystemPrompt,
|
|
125
|
+
})
|
|
126
|
+
if (!forkParentSystemPrompt) {
|
|
127
|
+
throw new Error(
|
|
128
|
+
'Cannot resume fork agent: unable to reconstruct parent system prompt',
|
|
129
|
+
)
|
|
130
|
+
}
|
|
131
|
+
return forkParentSystemPrompt
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function additionalWorkingDirectoryPaths(
|
|
135
|
+
toolUseContext: Pick<ToolUseContext, 'getAppState'>,
|
|
136
|
+
): string[] {
|
|
137
|
+
return Array.from(
|
|
138
|
+
toolUseContext.getAppState().toolPermissionContext.additionalWorkingDirectories.keys(),
|
|
139
|
+
).filter(path => typeof path === 'string')
|
|
140
|
+
}
|
|
@@ -887,7 +887,7 @@ export function filterIncompleteToolCalls(messages: Message[]): Message[] {
|
|
|
887
887
|
const assistantMessage = message as AssistantMessage
|
|
888
888
|
const content = assistantMessage.message.content
|
|
889
889
|
if (Array.isArray(content)) {
|
|
890
|
-
// Check if this assistant message
|
|
890
|
+
// Check if this assistant message includes tool uses without results
|
|
891
891
|
const hasIncompleteToolCall = content.some(
|
|
892
892
|
block =>
|
|
893
893
|
block.type === 'tool_use' &&
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { feature } from 'bun:bundle'
|
|
2
|
+
import type { ToolUseContext } from '../../Tool.js'
|
|
3
|
+
import { getFeatureValue_CACHED_MAY_BE_STALE } from '../../services/analytics/growthbook.js'
|
|
4
|
+
import { isEnvTruthy } from '../../utils/envUtils.js'
|
|
5
|
+
|
|
6
|
+
type ProactiveModule = {
|
|
7
|
+
readonly isProactiveActive: () => boolean
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const BUILD_FLAVOR = 'external'
|
|
11
|
+
|
|
12
|
+
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
13
|
+
const proactiveModule: ProactiveModule | null =
|
|
14
|
+
feature('PROACTIVE') || feature('KAIROS')
|
|
15
|
+
? require('../../proactive/index.js')
|
|
16
|
+
: null
|
|
17
|
+
/* eslint-enable @typescript-eslint/no-require-imports */
|
|
18
|
+
|
|
19
|
+
export const isBackgroundTasksDisabled =
|
|
20
|
+
// eslint-disable-next-line custom-rules/no-process-env-top-level -- Intentional: schema must be defined at module load
|
|
21
|
+
isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_BACKGROUND_TASKS)
|
|
22
|
+
|
|
23
|
+
export const PROGRESS_THRESHOLD_MS = 2000
|
|
24
|
+
|
|
25
|
+
export function isAntBuild(): boolean {
|
|
26
|
+
return BUILD_FLAVOR === 'ant'
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function getAutoBackgroundMs(): number {
|
|
30
|
+
if (
|
|
31
|
+
isEnvTruthy(process.env.CLAUDE_AUTO_BACKGROUND_TASKS) ||
|
|
32
|
+
getFeatureValue_CACHED_MAY_BE_STALE('tengu_auto_background_agents', false)
|
|
33
|
+
) {
|
|
34
|
+
return 120_000
|
|
35
|
+
}
|
|
36
|
+
return 0
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function isCoordinatorEnvMode(): boolean {
|
|
40
|
+
return feature('COORDINATOR_MODE')
|
|
41
|
+
? isEnvTruthy(process.env.CLAUDE_CODE_COORDINATOR_MODE)
|
|
42
|
+
: false
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function isProactiveAgentActive(): boolean {
|
|
46
|
+
return proactiveModule?.isProactiveActive() ?? false
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function additionalWorkingDirectoryPaths(
|
|
50
|
+
toolUseContext: Pick<ToolUseContext, 'getAppState'>,
|
|
51
|
+
): string[] {
|
|
52
|
+
return Array.from(
|
|
53
|
+
toolUseContext
|
|
54
|
+
.getAppState()
|
|
55
|
+
.toolPermissionContext.additionalWorkingDirectories.keys(),
|
|
56
|
+
).filter(path => typeof path === 'string')
|
|
57
|
+
}
|