@lotagate/cli 0.1.25 → 0.1.26
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 +5 -4
- package/bin/lotagate.mjs +50 -8
- package/dist/application/agent/agent-constants.d.ts +6 -0
- package/dist/application/agent/agent-constants.js +1 -0
- package/dist/application/agent/agent-session-store-registry.d.ts +16 -0
- package/dist/application/agent/agent-session-store-registry.js +1 -0
- package/dist/application/agent/agent-session-store.d.ts +4 -0
- package/dist/application/agent/agent-session-store.js +5 -5
- package/dist/application/agent/capability-profile.d.ts +0 -38
- package/dist/application/agent/capability-profile.js +0 -1
- package/dist/application/agent/cli-agent-execution-service.d.ts +22 -12
- package/dist/application/agent/cli-agent-execution-service.js +1 -1
- package/dist/application/agent/cli-agent-preparation-cache.d.ts +39 -0
- package/dist/application/agent/cli-agent-preparation-cache.js +1 -0
- package/dist/application/agent/context-compaction.d.ts +1 -0
- package/dist/application/agent/context-compaction.js +7 -6
- package/dist/application/agent/context-token-cache.d.ts +21 -0
- package/dist/application/agent/context-token-cache.js +4 -0
- package/dist/application/agent/context-usage-service.d.ts +52 -0
- package/dist/application/agent/context-usage-service.js +1 -0
- package/dist/application/agent/continuation-checkpoint.d.ts +15 -0
- package/dist/application/agent/continuation-checkpoint.js +2 -0
- package/dist/application/agent/interactive-agent-guidance.d.ts +3 -3
- package/dist/application/agent/interactive-agent-guidance.js +2 -2
- package/dist/application/chat/pending-attachment-store.d.ts +5 -2
- package/dist/application/chat/pending-attachment-store.js +1 -1
- package/dist/application/commands/application-command-executor.js +1 -1
- package/dist/application/commands/command-catalog.js +1 -1
- package/dist/application/commands/goal-command-handlers.js +6 -6
- package/dist/application/commands/media-command-handlers.js +7 -6
- package/dist/application/commands/runtime-command-handlers.js +9 -9
- package/dist/application/intent/completion-gate.d.ts +2 -5
- package/dist/application/intent/completion-gate.js +1 -1
- package/dist/application/intent/evidence-ledger.d.ts +2 -1
- package/dist/application/intent/evidence-recording-tool-executor.js +1 -1
- package/dist/application/intent/intent-compiler.js +2 -2
- package/dist/application/memory/memory-extractor.js +2 -2
- package/dist/application/model/cached-model-catalog.d.ts +7 -1
- package/dist/application/model/cached-model-catalog.js +1 -1
- package/dist/application/model/model-catalog-service.js +1 -1
- package/dist/application/model/model-context-window.js +1 -1
- package/dist/application/model/model-response-retry.d.ts +7 -1
- package/dist/application/model/model-response-retry.js +1 -1
- package/dist/application/orchestration/cli-subagent-service.d.ts +4 -0
- package/dist/application/orchestration/cli-subagent-service.js +3 -3
- package/dist/application/orchestration/cli-turn-event-projector.js +1 -1
- package/dist/application/orchestration/cli-turn-events.d.ts +0 -7
- package/dist/application/orchestration/goal-input.d.ts +1 -1
- package/dist/application/orchestration/goal-input.js +1 -1
- package/dist/application/orchestration/headless-agent-turn.d.ts +1 -0
- package/dist/application/orchestration/headless-agent-turn.js +3 -3
- package/dist/application/orchestration/orchestration-constants.d.ts +3 -0
- package/dist/application/orchestration/orchestration-constants.js +1 -0
- package/dist/application/orchestration/subagent-handoff.js +3 -3
- package/dist/application/project-intelligence/project-intelligence-constants.d.ts +56 -0
- package/dist/application/project-intelligence/project-intelligence-constants.js +1 -0
- package/dist/application/project-intelligence/project-intelligence-service.js +1 -1
- package/dist/application/protocol/browser-host-tool-executor.d.ts +13 -3
- package/dist/application/protocol/browser-host-tool-executor.js +2 -2
- package/dist/application/protocol/computer-host-tool-executor.d.ts +3 -0
- package/dist/application/protocol/computer-host-tool-executor.js +2 -2
- package/dist/application/protocol/desktop-agent-command.d.ts +2 -2
- package/dist/application/protocol/desktop-agent-command.js +2 -2
- package/dist/application/protocol/desktop-agent-contracts.d.ts +34 -0
- package/dist/application/protocol/desktop-agent-contracts.js +1 -0
- package/dist/application/protocol/desktop-agent-helpers.d.ts +5 -0
- package/dist/application/protocol/desktop-agent-helpers.js +1 -0
- package/dist/application/protocol/desktop-agent-request-parser.d.ts +31 -6
- package/dist/application/protocol/desktop-agent-request-parser.js +1 -1
- package/dist/application/protocol/desktop-approval-broker.d.ts +14 -4
- package/dist/application/protocol/desktop-approval-broker.js +1 -1
- package/dist/application/protocol/desktop-attachment-store.d.ts +19 -2
- package/dist/application/protocol/desktop-attachment-store.js +1 -1
- package/dist/application/protocol/desktop-execution-policy.d.ts +2 -0
- package/dist/application/protocol/desktop-execution-policy.js +1 -1
- package/dist/application/protocol/desktop-host-bridge.d.ts +33 -0
- package/dist/application/protocol/desktop-host-bridge.js +1 -0
- package/dist/application/protocol/desktop-host-capabilities.d.ts +12 -0
- package/dist/application/protocol/desktop-host-capabilities.js +1 -0
- package/dist/application/protocol/desktop-host-tool-executor.d.ts +15 -2
- package/dist/application/protocol/desktop-host-tool-executor.js +2 -2
- package/dist/application/protocol/desktop-intent-event-writer.js +1 -1
- package/dist/application/protocol/desktop-protocol-helpers.js +1 -1
- package/dist/application/protocol/json-line-writer.d.ts +24 -2
- package/dist/application/protocol/json-line-writer.js +2 -2
- package/dist/application/protocol/jsonl-agent-command.d.ts +1 -1
- package/dist/application/protocol/jsonl-agent-command.js +2 -2
- package/dist/application/protocol/jsonl-protocol.d.ts +1 -1
- package/dist/application/protocol/jsonl-protocol.js +2 -2
- package/dist/application/security/desktop-tool-scope-policy.js +1 -1
- package/dist/application/security/tool-action-risk-analyzer.js +1 -1
- package/dist/application/security/tool-approval-service.d.ts +9 -3
- package/dist/application/security/tool-approval-service.js +1 -1
- package/dist/application/security/tool-policy-registry.d.ts +20 -0
- package/dist/application/security/tool-policy-registry.js +1 -0
- package/dist/application/security/tool-risk-classifier.d.ts +2 -1
- package/dist/application/security/tool-risk-classifier.js +1 -1
- package/dist/application/security/workspace-permission-policy.js +1 -1
- package/dist/application/workspace/session-execution-workspace.d.ts +2 -2
- package/dist/application/workspace/session-execution-workspace.js +3 -3
- package/dist/application/workspace/workspace-constants.d.ts +17 -0
- package/dist/application/workspace/workspace-constants.js +1 -0
- package/dist/application/workspace/workspace-file-index.d.ts +0 -1
- package/dist/application/workspace/workspace-file-index.js +1 -1
- package/dist/application/workspace/workspace-instruction-loader.js +1 -1
- package/dist/bootstrap/composition-root.d.ts +1 -0
- package/dist/bootstrap/runtime-factory.d.ts +5 -0
- package/dist/bootstrap/runtime-factory.js +1 -1
- package/dist/domain/errors/cli-error.js +1 -1
- package/dist/domain/extensions/extension-constants.d.ts +1 -0
- package/dist/domain/extensions/extension-constants.js +1 -0
- package/dist/domain/extensions/host-tool-plugin-ids.d.ts +0 -4
- package/dist/domain/extensions/host-tool-plugin-ids.js +1 -1
- package/dist/domain/extensions/plugin-manifest.js +1 -1
- package/dist/domain/intent/intent-contract.d.ts +0 -8
- package/dist/domain/intent/intent-contract.js +1 -1
- package/dist/domain/media/gateway-media-contract.js +1 -1
- package/dist/domain/media/media-constants.d.ts +3 -0
- package/dist/domain/media/media-constants.js +1 -0
- package/dist/domain/media/media-execution-policy.js +1 -1
- package/dist/domain/memory/memory-constants.d.ts +3 -0
- package/dist/domain/memory/memory-constants.js +1 -0
- package/dist/domain/memory/memory-search.js +2 -2
- package/dist/domain/orchestration/goal.d.ts +0 -1
- package/dist/domain/orchestration/goal.js +1 -1
- package/dist/domain/orchestration/work-plan.d.ts +0 -62
- package/dist/domain/orchestration/work-plan.js +0 -1
- package/dist/domain/runtime/assistant-stream-text.d.ts +11 -0
- package/dist/domain/runtime/assistant-stream-text.js +1 -0
- package/dist/domain/runtime/gateway-request-budget.d.ts +19 -0
- package/dist/domain/runtime/gateway-request-budget.js +1 -0
- package/dist/domain/runtime/resource-limits.d.ts +17 -0
- package/dist/domain/runtime/resource-limits.js +1 -1
- package/dist/domain/session/attachment.d.ts +2 -0
- package/dist/domain/workspace/workspace-settings.d.ts +2 -0
- package/dist/domain/workspace/workspace-settings.js +1 -1
- package/dist/infrastructure/agent-sdk/model-response-metrics.d.ts +7 -0
- package/dist/infrastructure/agent-sdk/model-response-metrics.js +1 -0
- package/dist/infrastructure/agent-sdk/model-tool-name-mapper.js +1 -1
- package/dist/infrastructure/agent-sdk/sdk-constants.d.ts +2 -0
- package/dist/infrastructure/agent-sdk/sdk-constants.js +1 -0
- package/dist/infrastructure/agent-sdk/tool-calling-model-client.js +1 -1
- package/dist/infrastructure/cache/cache-policy.d.ts +2 -0
- package/dist/infrastructure/cache/cache-policy.js +1 -1
- package/dist/infrastructure/cache/file-cache-store.d.ts +8 -0
- package/dist/infrastructure/cache/file-cache-store.js +2 -2
- package/dist/infrastructure/clipboard/clipboard-constants.d.ts +1 -0
- package/dist/infrastructure/clipboard/clipboard-constants.js +1 -0
- package/dist/infrastructure/clipboard/image-normalizer.js +1 -1
- package/dist/infrastructure/extensions/extensions-constants.d.ts +6 -0
- package/dist/infrastructure/extensions/extensions-constants.js +1 -0
- package/dist/infrastructure/extensions/mcp-runtime.d.ts +7 -0
- package/dist/infrastructure/extensions/mcp-runtime.js +1 -1
- package/dist/infrastructure/extensions/plugin-manager.js +2 -2
- package/dist/infrastructure/extensions/skill-tool-executor.d.ts +3 -1
- package/dist/infrastructure/extensions/skill-tool-executor.js +2 -2
- package/dist/infrastructure/filesystem/atomic-file-store.d.ts +11 -0
- package/dist/infrastructure/filesystem/atomic-file-store.js +1 -1
- package/dist/infrastructure/filesystem/filesystem-constants.d.ts +8 -0
- package/dist/infrastructure/filesystem/filesystem-constants.js +1 -0
- package/dist/infrastructure/filesystem/local-filesystem-tool-executor.d.ts +3 -0
- package/dist/infrastructure/filesystem/local-filesystem-tool-executor.js +3 -3
- package/dist/infrastructure/logging/daily-rotating-file-writer.d.ts +1 -1
- package/dist/infrastructure/logging/daily-rotating-file-writer.js +2 -2
- package/dist/infrastructure/logging/log-redactor.js +1 -1
- package/dist/infrastructure/logging/logging-constants.d.ts +3 -0
- package/dist/infrastructure/logging/logging-constants.js +1 -0
- package/dist/infrastructure/logging/structured-logger.d.ts +1 -1
- package/dist/infrastructure/logging/structured-logger.js +2 -2
- package/dist/infrastructure/observability/tool-execution-logger.d.ts +11 -0
- package/dist/infrastructure/observability/tool-execution-logger.js +1 -0
- package/dist/infrastructure/platform/host-platform.d.ts +2 -0
- package/dist/infrastructure/platform/host-platform.js +1 -1
- package/dist/infrastructure/platform/host-process.d.ts +3 -1
- package/dist/infrastructure/platform/host-process.js +1 -1
- package/dist/infrastructure/platform/platform-constants.d.ts +4 -0
- package/dist/infrastructure/platform/platform-constants.js +1 -0
- package/dist/infrastructure/platform/process-identity.d.ts +8 -0
- package/dist/infrastructure/platform/process-identity.js +1 -0
- package/dist/infrastructure/platform/read-only-executable.d.ts +2 -1
- package/dist/infrastructure/platform/read-only-executable.js +1 -1
- package/dist/infrastructure/sdk/lotagate-client-factory.js +1 -1
- package/dist/infrastructure/sdk/sdk-media-gateway-client.d.ts +4 -0
- package/dist/infrastructure/sdk/sdk-media-gateway-client.js +1 -1
- package/dist/infrastructure/sessions/file-session-store.d.ts +3 -0
- package/dist/infrastructure/sessions/file-session-store.js +4 -4
- package/dist/infrastructure/sessions/session-constants.d.ts +3 -0
- package/dist/infrastructure/sessions/session-constants.js +1 -0
- package/dist/infrastructure/sessions/session-index.js +3 -3
- package/dist/infrastructure/sessions/session-journal-health.d.ts +7 -0
- package/dist/infrastructure/sessions/session-journal-health.js +1 -0
- package/dist/infrastructure/shell/shell-tool-executor.d.ts +5 -1
- package/dist/infrastructure/shell/shell-tool-executor.js +2 -2
- package/dist/infrastructure/tokens/tiktoken-token-estimator.js +1 -1
- package/dist/infrastructure/tokens/token-constants.d.ts +1 -0
- package/dist/infrastructure/tokens/token-constants.js +1 -0
- package/dist/infrastructure/workspace/workspace-settings-store.d.ts +1 -0
- package/dist/infrastructure/workspace/workspace-settings-store.js +4 -4
- package/dist/main.js +3 -3
- package/dist/ports/media-gateway-client.d.ts +6 -0
- package/dist/ports/session-store.d.ts +1 -0
- package/dist/presentation/tui/ink/components/composer.js +4 -4
- package/dist/presentation/tui/ink/components/transcript.d.ts +1 -0
- package/dist/presentation/tui/ink/components/transcript.js +5 -5
- package/dist/presentation/tui/ink/tui-bridge.d.ts +2 -2
- package/dist/presentation/tui/ink/tui-bridge.js +1 -1
- package/dist/presentation/tui/tui-agent-turn-controller.d.ts +45 -0
- package/dist/presentation/tui/tui-agent-turn-controller.js +1 -0
- package/dist/presentation/tui/tui-application-contract.d.ts +1 -0
- package/dist/presentation/tui/tui-application.d.ts +1 -4
- package/dist/presentation/tui/tui-application.js +3 -3
- package/dist/presentation/tui/tui-clipboard-paste-handlers.d.ts +2 -2
- package/dist/presentation/tui/tui-clipboard-paste-handlers.js +1 -1
- package/dist/presentation/tui/tui-command-executor.js +3 -3
- package/dist/presentation/tui/tui-context-compaction.d.ts +4 -1
- package/dist/presentation/tui/tui-context-compaction.js +1 -1
- package/dist/presentation/tui/tui-context-service.d.ts +2 -34
- package/dist/presentation/tui/tui-context-service.js +1 -2
- package/dist/presentation/tui/tui-initial-model.js +1 -1
- package/dist/presentation/tui/tui-tool-approval.d.ts +1 -1
- package/dist/presentation/tui/tui-tool-approval.js +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/native-targets.mjs +1 -1
- package/package.json +9 -10
- package/scripts/install-native.mjs +5 -13
- package/bin/lotagate.exe +0 -1
- package/dist/application/protocol/document-host-tool-definitions.d.ts +0 -4
- package/dist/application/protocol/document-host-tool-definitions.js +0 -1
- package/dist/application/protocol/document-host-tool-executor.d.ts +0 -49
- package/dist/application/protocol/document-host-tool-executor.js +0 -2
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{createElement as
|
|
2
|
-
${
|
|
3
|
-
`)}}async processPrompt(n){if(this.activeForegroundRun!==void 0)return this.renderer.notice("An operation is already running. Stop it before starting another one."),!1;const t=Se(n,{renderer:this.renderer,logger:this.runtime.logger,commandHost:ce({runtime:this.runtime,cwd:this.cwd,renderer:this.renderer,pendingAttachments:this.pendingAttachments,getHooks:()=>this.hooks,getSession:()=>this.session,getActiveAbortController:()=>this.activeAbortController,setActiveAbortController:i=>{this.activeAbortController=i},attachClipboardImage:i=>this.attachClipboardImage(i),runPrompt:(i,r)=>this.sendPrompt(i,this.pendingAttachments.list(),r),runGoal:(i,r,s)=>this.runGoal(i,r,s),resumeGoal:i=>this.resumeGoal(i),runSkill:(i,r,s,d,o)=>this.runSkill(i,r,s,d,o),refreshExtensions:()=>this.refreshExtensions(),compactSession:()=>this.compactSession(),refreshWelcome:i=>this.refreshWelcome(i),getContextSnapshot:()=>this.getContextSnapshot(),resumeSession:i=>this.resumeSession(i)}),pendingAttachments:this.pendingAttachments,commandContext:()=>this.commandContext(),sendPrompt:(i,r)=>this.sendPrompt(i,r),resetActiveAbortController:()=>{this.activePromptRun===void 0&&(this.activeAbortController=void 0)}});this.activeForegroundRun=t;try{return await t}finally{this.activeForegroundRun===t&&(this.activeForegroundRun=void 0)}}async attachClipboardImage(n,t=!0){if(n===void 0){t&&this.renderer.notice("Clipboard does not contain an image.");return}const i=ee(n.bytes,n.mimeType);this.pendingAttachments.assertCanAdd(i.bytes.byteLength);const r=this.pendingAttachments.nextId(),s=Z(i,"clipboard",r),d=this.session===void 0?s:await this.runtime.sessionStore.saveAttachment(this.session.id,s,i.bytes);this.pendingAttachments.add({attachment:d,bytes:i.bytes}),this.renderer.setPendingAttachments(this.pendingAttachments.list().map(({attachment:o})=>o)),t&&this.renderer.notice(`Attached ${s.name} \xB7 ${s.mimeType} \xB7 ${s.sizeBytes} bytes`)}async runPrompt(n,t,i){return this.sendPrompt(n,this.pendingAttachments.list(),t,i)}async runGoal(n,t,i={}){if(this.activePromptRun!==void 0){t.write("Stop the active response before starting a goal.");return}await Te({runtime:this.runtime,cwd:this.cwd,sessionId:this.session?.id,model:this.activeModel??this.session?.model??null,profile:this.activeProfile??this.session?.profile??null,runPrompt:(r,s)=>this.runPrompt(r,void 0,s),write:r=>t.write(r)},n,i)}async resumeGoal(n){if(this.activePromptRun!==void 0){n.write("Stop the active response before resuming a goal.");return}await ye({runtime:this.runtime,cwd:this.cwd,sessionId:this.session?.id,model:this.activeModel??this.session?.model??null,profile:this.activeProfile??this.session?.profile??null,runPrompt:(t,i)=>this.runPrompt(t,void 0,i),write:t=>n.write(t)})}async sendPrompt(n,t=[],i,r){if(this.activePromptRun!==void 0)return this.renderer.notice("A response is already running. Stop it before sending another prompt."),"";const s=this.executePrompt(n,t,i,r);this.activePromptRun=s,this.renderer.setRunActive(!0);try{return await s}finally{this.activePromptRun===s&&(this.activePromptRun=void 0),this.renderer.setRunActive(!1)}}async executePrompt(n,t=[],i,r){const s=await F(this.runtime,this.cwd),d=this.activeModel??s.config.model;if(d===null)return this.renderer.error(`No model is selected. ${R(he,"tui")}`),"";const o=this.activeProfile??s.config.profile??q.defaultProfileName(),g=await this.runtime.credentialStore.get(o);if(g===void 0)return this.renderer.error(`No API key is configured. ${R(ue,"tui")}`),"";const l=await this.runtime.projectTrust.inspect(this.cwd);this.session!==void 0&&(this.executionWorkspace=await this.executionWorkspaces.prepare({sessionId:this.session.id,projectRoot:l.canonicalPath})),await this.runHookEvent("prompt.before",this.session?.id??"tui"),this.renderer.userPrompt(n,t.map(({attachment:e})=>e));const a=Me();this.session!==void 0&&await We(this.runtime.sessionStore,this.session.id,a,n,t.map(({attachment:e})=>e.id));const w=Date.now();let S,b=!1;this.renderer.status("Thinking");const v=new AbortController;this.activeAbortController=v;const y=V(g.profile,g.apiKey),H=await this.runtime.projectTrust.isTrusted(l),c=this.session===void 0?void 0:await this.runtime.goalStore.get(this.session.id),h=new pe,N={start:e=>this.renderer.startToolActivity(e.key,e.label)},D={onSubagentLifecycle:e=>{e.sessionId===this.session?.id&&this.renderer.subagentLifecycle(e)}},O=await this.contextService.getModelContextWindow(d,o),G=e=>{h.observeModel(e),e.usage!==void 0&&(b=!0,r?.onUsage({usage:e.usage,modelCalls:1})),this.runtime.logger.debug("Model turn completed.",{model:e.model,stream:e.stream,contentLength:e.contentLength,toolCallCount:e.toolCallCount,toolNames:e.toolNames,finishReason:e.finishReason})},C=await fe({runtime:this.runtime,projectRoot:l.canonicalPath,executionCwd:this.executionWorkspace.executionCwd,model:d,reasoningEffort:s.config.effort,client:y,profile:H?"interactive-trusted":"interactive-untrusted",approvalMode:s.config.approvalMode,subagentJobs:this.subagentJobs,...i===void 0?{}:{initialSkill:i},onWrite:e=>this.renderer.fileChange(e),prompt:e=>this.approvals.ask(e),rememberApproval:e=>this.approvals.remember(l.canonicalPath,e),onApprovalPersistenceFailure:(e,f)=>this.approvals.rememberFailure(f),audit:e=>this.approvals.audit(e),onModelComplete:G,onSubagentModelComplete:e=>{e.usage!==void 0&&r?.onUsage({usage:e.usage,modelCalls:1})},contextManagement:xe(y,d,O,e=>this.runtime.logger.warn("Context summarization failed; using fallback summary.",{reason:e instanceof Error?e.message:String(e)})),agentSessionStore:this.agentSessionStore,toolActivity:N,onIntentLifecycle:e=>{e.type==="intent.compiled"?this.renderer.status("Understanding the task"):e.type==="intent.verification.required"?this.renderer.status("Verifying the result"):e.type==="intent.blocked"&&this.renderer.status("Verification is incomplete")},subagentLifecycle:D,...c===void 0?{}:{goal:{objective:c.objective,status:c.status,turns:c.turns,evaluatorRuns:c.evaluatorRuns,tokensUsed:c.usage.totalTokens,...c.tokenBudget===void 0?{}:{tokenBudget:c.tokenBudget},...c.maxTurns===void 0?{}:{maxTurns:c.maxTurns},...c.maxDurationMs===void 0?{}:{maxDurationMs:c.maxDurationMs},...c.lastError===void 0?{}:{lastError:c.lastError},...c.lastEvaluation===void 0?{}:{lastEvaluation:c.lastEvaluation.reason}}}}),p=[];let A=!1;const _=e=>{k(v.signal),p.push(e),this.renderer.assistantDelta(e)},$=e=>{k(v.signal),p.splice(0,p.length,e),this.renderer.replaceAssistant(e)};try{k(v.signal);const e=await C.buildInput(n),f=e.input,u=t.length===0?void 0:X(f,t),T=u?.content===null?void 0:u?.content;if(await Re({prepared:C,input:f,userInput:e.userInput,...e.workspaceContext===void 0?{}:{workspaceContext:e.workspaceContext},...T===void 0?{}:{inputContent:T},model:d,...this.session===void 0?{}:{sessionId:this.session.id},turnId:a,signal:v.signal,agentSessionStore:this.agentSessionStore,tracker:h,runtime:this.runtime,renderer:this.renderer,startedAt:w,getUsage:()=>S,appendAssistantDelta:_,replaceAssistantResponse:$,hasResponse:()=>p.length>0}),p.join("").trim().length===0){const m=h.snapshot();m.toolCalls>0&&h.markStuck();const B=m.toolCalls>0?I.MODEL_EMPTY_FINAL:I.MODEL_PROTOCOL_EMPTY_RESPONSE,E=m.toolCalls>0?"The model completed its tool work without a final text response.":"The model returned neither text nor a tool call.";throw new se(B,E,{category:"model",userMessage:`${E} Check the selected model and gateway tool-calling support, then try again.`,retryable:!0,details:{modelTurns:m.modelTurns,toolCalls:m.toolCalls,toolCompletions:m.toolCompletions,toolFailures:m.toolFailures,toolNames:m.toolNames,finishReason:m.lastFinishReason}})}this.session!==void 0&&(await this.executionWorkspaces.apply(this.session.id),A=!0),r?.onSnapshot(h.snapshot())}catch(e){const f=v.signal.aborted||W(e);if(this.session!==void 0&&!A)try{const u=await this.executionWorkspaces.apply(this.session.id);A=!0,u.appliedPaths.length>0&&this.runtime.logger.info("Applied session workspace changes after turn failure.",{sessionId:this.session.id,turnId:a,appliedPaths:u.appliedPaths})}catch(u){this.runtime.logger.error("Failed to apply session workspace changes after turn failure.",{sessionId:this.session.id,turnId:a,reason:u instanceof Error?u.message:String(u)})}if(this.session!==void 0&&this.agentSessionStore.delete(this.session.id),f?h.markCancelled():h.snapshot().state!=="stuck"&&h.markFailed(),this.session!==void 0&&await je(this.runtime.sessionStore,this.session.id,a,e,f),this.renderer.finishAssistant(),f)this.renderer.notice("Interrupted.");else{const u=ie(e);this.renderer.failed(),this.runtime.logger.error("Agent run failed.",{code:u.code,category:u.category,...u.details??{}}),this.renderer.error(me(u,"tui"))}return r?.onError(e),r?.onSnapshot(h.snapshot()),""}finally{if(this.activeAbortController===v&&(this.activeAbortController=void 0),C!==void 0)try{await C.close()}catch(e){this.runtime.logger.warn("Agent cleanup failed after a completed turn.",{reason:e instanceof Error?e.message:String(e)})}if(this.session!==void 0)try{await this.executionWorkspaces.markReady(this.session.id)}catch(e){this.runtime.logger.warn("Unable to release TUI execution workspace after turn.",{sessionId:this.session.id,reason:e instanceof Error?e.message:String(e)})}}this.renderer.finishAssistant();try{this.session!==void 0&&await Ue(this.runtime.sessionStore,this.session.id,a,p.join(""))}catch(e){this.runtime.logger.warn("Unable to persist the completed turn.",{reason:e instanceof Error?e.message:String(e)}),this.renderer.notice("Response completed, but the session state could not be saved.")}try{await this.runHookEvent("response.after",this.session?.id??"tui")}catch(e){this.runtime.logger.warn("Response hook failed after a completed turn.",{reason:e instanceof Error?e.message:String(e)}),this.renderer.notice("Response completed, but the response hook failed.")}this.pendingAttachments.clear(),this.renderer.setPendingAttachments([]),!b&&S!==void 0&&r?.onUsage({usage:S,modelCalls:1});const P=S?.totalTokens===void 0?oe({model:d,prompt:n,response:p.join("")}):S;return!b&&S===void 0&&P!==void 0&&r?.onUsage({usage:P,modelCalls:1}),this.renderer.complete(Date.now()-w,P),await this.refreshContextUsage(),p.join("")}commandContext(){return{write:n=>this.renderer.commandOutput(n)}}getActiveModel(){return this.activeModel}getActiveProfile(){return this.activeProfile}async refreshExtensions(){const n=await this.runtime.projectTrust.inspect(this.cwd),t=await this.runtime.projectTrust.isTrusted(n),i=await this.runtime.configLoader.load(this.cwd,{includeProject:t});await this.reloadExtensions(t,i.config.approvalMode,n.canonicalPath),await this.refreshContextUsage()}async refreshWelcome(n={}){const t=await this.runtime.projectTrust.inspect(this.cwd),i=await this.runtime.projectTrust.isTrusted(t),r=await this.runtime.configLoader.load(this.cwd,{includeProject:i});this.activeModel=n.model===void 0?this.activeModel??r.config.model:n.model,this.activeProfile=n.profile===void 0?this.activeProfile??r.config.profile:n.profile,this.renderer.setWelcome({version:x,cwd:t.canonicalPath,model:this.activeModel,profile:this.activeProfile,trusted:i}),await this.refreshContextUsage()}async getContextSnapshot(){const n=this.activeModel??this.session?.model??null,t=this.session===void 0?void 0:await this.runtime.goalStore.get(this.session.id),i=await this.contextService.buildForProject({...this.session===void 0?{}:{sessionId:this.session.id},model:n,profileName:this.activeProfile??this.session?.profile??null,pluginNames:this.enabledPluginNames,pluginMcpConfig:this.pluginMcpConfig,pendingAttachments:this.pendingAttachments.size,skillRootScopes:this.skillRootScopes,agentSessionStore:this.agentSessionStore,...t===void 0?{}:{goal:{objective:t.objective,status:t.status,turns:t.turns,evaluatorRuns:t.evaluatorRuns,tokensUsed:t.usage.totalTokens,...t.tokenBudget===void 0?{}:{tokenBudget:t.tokenBudget},...t.maxTurns===void 0?{}:{maxTurns:t.maxTurns},...t.maxDurationMs===void 0?{}:{maxDurationMs:t.maxDurationMs},...t.lastError===void 0?{}:{lastError:t.lastError},...t.lastEvaluation===void 0?{}:{lastEvaluation:t.lastEvaluation.reason}}}});return this.renderer.setContextUsage({usedTokens:i.usedTokens,...i.contextWindow===void 0?{}:{contextWindow:i.contextWindow}}),i}async refreshContextUsage(){try{await this.getContextSnapshot()}catch(n){this.runtime.logger.debug("Unable to refresh context usage.",{reason:n instanceof Error?n.message:String(n)})}}async runSkill(n,t,i,r,s){await Ee({globalConfigDir:this.runtime.paths.globalConfigDir,skillRootScopes:this.skillRootScopes,runPrompt:(d,o)=>this.sendPrompt(d,this.pendingAttachments.list(),o)},n,t,i,s,r)}async reloadExtensions(n,t,i){const r=await Le({runtime:this.runtime,cwd:this.cwd,trusted:n,approvalMode:t,workspaceRoot:i,approvals:this.approvals});this.hookRuntime=r.hookRuntime,this.skillRootScopes=r.skillRootScopes,this.enabledPluginNames=r.enabledPluginNames,this.pluginMcpConfig=r.pluginMcpConfig,this.hooks=r.hooks}async compactSession(){await be({runtime:this.runtime,cwd:this.cwd,session:this.session,activeModel:this.activeModel,activeProfile:this.activeProfile,activeResponse:this.activeAbortController!==void 0,renderer:this.renderer,contextService:this.contextService,agentSessionStore:this.agentSessionStore,refreshContextUsage:()=>this.refreshContextUsage()})}async resumeSession(n){if(this.activePromptRun!==void 0)throw new Error("Stop the active response before resuming another session.");const t=await this.runtime.projectTrust.inspect(this.cwd),i=await new de(this.runtime.sessionStore).require(n,t.fingerprint);if(i.id===this.session?.id){this.renderer.notice(`Already using session: ${i.id}`);return}const r=await this.runtime.sessionStore.readTranscript(i.id),s=this.session;s!==void 0&&(await this.subagentJobs.close(),this.subagentJobs=new L,await this.runHookEvent("session.end",s.id),await this.runtime.sessionStore.updateStatus(s.id,"completed")),this.session=await this.runtime.sessionStore.updateStatus(i.id,"active"),this.executionWorkspace=await this.executionWorkspaces.prepare({sessionId:i.id,projectRoot:t.canonicalPath});const d=await F(this.runtime,this.cwd);this.activeModel=i.model??d.config.model,this.activeProfile=i.profile??d.config.profile,this.renderer.setWelcome({version:x,cwd:t.canonicalPath,model:this.activeModel,profile:this.activeProfile,trusted:await this.runtime.projectTrust.isTrusted(t)}),this.renderer.clearTranscript();for(const o of U(r))o.type==="user"?this.renderer.userPrompt(o.content):o.type==="assistant"&&(this.renderer.beginAssistant(),this.renderer.assistantDelta(o.content),this.renderer.finishAssistant());await this.refreshContextUsage(),await this.runHookEvent("session.start",i.id),M(this.runtime,this.cwd).catch(o=>this.runtime.logger.warn("MCP session warm-up failed.",{reason:o instanceof Error?o.message:String(o)})),this.renderer.notice(`Resumed session: ${i.id}`)}handleInterrupt(){const n=Pe({lastInterruptAt:this.lastInterruptAt,exitArmedUntil:this.exitArmedUntil,printResumeCommandOnExit:this.printResumeCommandOnExit},this.activeAbortController,this.renderer);this.lastInterruptAt=n.lastInterruptAt,this.exitArmedUntil=n.exitArmedUntil,this.printResumeCommandOnExit=n.printResumeCommandOnExit}async awaitActiveForegroundRun(){const n=this.activeForegroundRun;if(n!==void 0)try{await n}catch(t){this.runtime.logger.warn("Foreground TUI operation failed during shutdown.",{reason:t instanceof Error?t.message:String(t)})}}async runHookEvent(n,t){await ke(this.hookRuntime,this.hooks,n,this.executionWorkspace?.executionCwd??this.cwd,t)}}export{At as TuiApplication};
|
|
1
|
+
import{createElement as w}from"react";import{render as v}from"ink";import{detectTerminalCapabilities as S}from"./terminal-capabilities.js";import{enterInteractiveScreen as x,exitInteractiveScreen as C}from"./terminal-screen.js";import{createImageAttachment as b,normalizeImage as A}from"../../infrastructure/clipboard/image-normalizer.js";import{PendingAttachmentStore as P}from"../../application/chat/pending-attachment-store.js";import{CLI_VERSION as l}from"../../version.js";import{InkTuiBridge as k}from"./ink/tui-bridge.js";import{LotaGateTui as y}from"./ink/lotagate-tui.js";import{WorkspaceFileIndex as T}from"../../application/workspace/workspace-file-index.js";import{ProjectSessionAccess as E}from"../../application/session/project-session-access.js";import{createTuiCommandHost as I}from"./tui-command-host-factory.js";import{workspaceFileSuggestions as R}from"./tui-file-suggestions.js";import{warmMcpRuntime as m}from"../../application/agent/cli-agent-execution-service.js";import{TuiToolApprovalCoordinator as M}from"./tui-tool-approval.js";import{TuiContextService as U}from"./tui-context-service.js";import{createTuiClipboardPasteHandlers as W}from"./tui-clipboard-paste-handlers.js";import{dispatchTuiPrompt as j}from"./tui-prompt-dispatcher.js";import{CliAgentSessionStore as H,retainLatestCompaction as p}from"../../application/agent/agent-session-store.js";import{compactManualTuiSession as F}from"./tui-manual-compaction.js";import{resolveInitialModel as g}from"./tui-initial-model.js";import{cancelTuiResponse as G,handleTuiInterrupt as L,isAbortError as N,runTuiHookEvent as O}from"./tui-lifecycle-actions.js";import{loadExecutionConfig as D}from"../../application/config/execution-config.js";import{resumeTuiGoal as $,runTuiGoal as J}from"./tui-goal-controller.js";import{runTuiSkill as z}from"./tui-skill-controller.js";import{SubagentJobRegistry as f}from"../../application/orchestration/cli-subagent-service.js";import{formatResumeCommand as B}from"./tui-application-contract.js";import{SessionExecutionWorkspaceService as q}from"../../application/workspace/session-execution-workspace.js";import{loadTuiExtensions as V}from"./tui-extension-loader.js";import{TuiAgentTurnController as _}from"./tui-agent-turn-controller.js";class ye{runtime;cwd;options;input;output;renderer;pendingAttachments=new P;session;hookRuntime;hooks=[];skillRootScopes=[];enabledPluginNames=[];pluginMcpConfig={};activeForegroundRun;exitArmedUntil=0;lastInterruptAt=0;printResumeCommandOnExit=!1;activeModel=null;activeProfile=null;approvals;contextService;agentSessionStore=new H;subagentJobs=new f;executionWorkspaces;executionWorkspace;turnController;constructor(i,e,t={}){this.runtime=i,this.cwd=e,this.options=t,this.input=t.input??process.stdin,this.output=t.output??process.stdout,this.renderer=new k,this.executionWorkspaces=this.runtime.executionWorkspaces??new q(this.runtime.paths.globalConfigDir,this.runtime.platform),this.contextService=new U(this.runtime,this.cwd),this.approvals=new M({renderer:this.renderer,runtime:this.runtime,getSessionId:()=>this.session?.id,getActiveSignal:()=>this.turnController.getActiveAbortController()?.signal}),this.turnController=new _({runtime:this.runtime,cwd:this.cwd,renderer:this.renderer,pendingAttachments:this.pendingAttachments,approvals:this.approvals,contextService:this.contextService,agentSessionStore:this.agentSessionStore,executionWorkspaces:this.executionWorkspaces,getSession:()=>this.session,getActiveModel:()=>this.activeModel,getActiveProfile:()=>this.activeProfile,getExecutionWorkspace:()=>this.executionWorkspace,setExecutionWorkspace:r=>{this.executionWorkspace=r},getSubagentJobs:()=>this.subagentJobs,runHookEvent:(r,s)=>this.runHookEvent(r,s),refreshContextUsage:()=>this.refreshContextUsage()}),this.renderer.setInterruptHandler(()=>this.handleInterrupt()),this.renderer.setCancelHandler(()=>G(this.turnController.getActiveAbortController(),this.renderer));const n=W({platform:this.runtime.platform,notify:r=>this.renderer.notice(r),attachImage:(r,s)=>this.attachClipboardImage(r,!1,s)});this.renderer.setImagePasteHandler(n.image),this.renderer.setTextPasteHandler(n.text),this.renderer.setClearAttachmentsHandler(()=>{this.pendingAttachments.clear(),this.renderer.setPendingAttachments([])})}async run(){if(!S(this.input,this.output).isInteractive)return this.output.write('Interactive TUI requires a terminal. Use `lotagate chat "prompt"` for non-interactive streaming.\n'),2;x(this.output);const e=v(w(y,{bridge:this.renderer}),{stdin:this.input,stdout:this.output,exitOnCtrlC:!1}),t=()=>this.handleInterrupt(),n=()=>{this.turnController.abortActive(new Error("Interactive session is shutting down.")),this.renderer.requestExit(143)};process.on("SIGINT",t),this.options.signal?.addEventListener("abort",n,{once:!0});let r="completed";try{const s=await this.runtime.projectTrust.inspect(this.cwd);let o=await this.runtime.projectTrust.isTrusted(s),h=await this.runtime.configLoader.load(this.cwd,{includeProject:o}),u=await g(this.runtime,h.config),c={...h,config:{...h.config,model:u}};if(this.activeModel=c.config.model,this.activeProfile=c.config.profile,this.renderer.setWelcome({version:l,cwd:s.canonicalPath,model:c.config.model,profile:c.config.profile,trusted:o}),this.renderer.setFileSuggestions([]),o||(o=await this.renderer.confirmTrust(),o?(await this.runtime.projectTrust.grant(s),h=await this.runtime.configLoader.load(this.cwd),u=await g(this.runtime,h.config),c={...h,config:{...h.config,model:u}},this.activeModel=c.config.model,this.activeProfile=c.config.profile,this.renderer.setWelcome({version:l,cwd:s.canonicalPath,model:this.activeModel,profile:this.activeProfile,trusted:!0}),this.renderer.notice("Project trusted.")):this.renderer.notice("Project remains untrusted; local tools and extensions stay disabled.")),o&&await this.runtime.workspaceSettings.ensureInitialized(s.canonicalPath),await this.reloadExtensions(o,c.config.approvalMode,s.canonicalPath),this.options.sessionId!==void 0){const a=await this.runtime.sessionStore.get(this.options.sessionId);if(a===void 0)throw new Error(`Session not found: ${this.options.sessionId}`);if(a.projectFingerprint!==s.fingerprint)throw new Error("Session belongs to another project.");this.session=a,this.renderer.status(`Resuming session ${a.id}`);for(const d of p(await this.runtime.sessionStore.readTranscript(a.id)))d.type==="user"?this.renderer.userPrompt(d.content):d.type==="assistant"&&(this.renderer.beginAssistant(),this.renderer.assistantDelta(d.content),this.renderer.finishAssistant())}else this.session=await this.runtime.sessionStore.create({projectFingerprint:s.fingerprint,cwd:s.canonicalPath,model:c.config.model,profile:c.config.profile,status:"active"});return this.executionWorkspace=await this.executionWorkspaces.prepare({sessionId:this.session.id,projectRoot:s.canonicalPath}),await this.refreshContextUsage(),await this.runHookEvent("session.start",this.session.id),m(this.runtime,this.cwd).catch(a=>this.runtime.logger.warn("MCP session warm-up failed.",{reason:a instanceof Error?a.message:String(a)})),this.renderer.setSubmitHandler(async a=>{await this.processPrompt(a)&&this.renderer.requestExit()}),this.renderer.clearActivity(),this.renderer.setReady(),new T(s.canonicalPath).listEntries().then(a=>this.renderer.setFileSuggestions(R(a))).catch(a=>this.runtime.logger.debug("Unable to load workspace file suggestions.",{reason:a instanceof Error?a.message:String(a)})),await this.renderer.waitForExit()}catch(s){throw r=N(s)?"cancelled":"failed",s}finally{this.turnController.abortActive(new Error("Interactive session is closing.")),this.renderer.resolveActiveModal(void 0),await this.awaitActiveForegroundRun();try{await this.subagentJobs.close()}catch(s){this.runtime.logger.warn("Unable to close subagent jobs during TUI shutdown.",{reason:s instanceof Error?s.message:String(s)})}if(this.agentSessionStore.clear(),this.session!==void 0){try{await this.runHookEvent("session.end",this.session.id)}catch(s){this.runtime.logger.warn("Session end hook failed during TUI shutdown.",{sessionId:this.session.id,reason:s instanceof Error?s.message:String(s)})}try{await this.runtime.sessionStore.updateStatus(this.session.id,r)}catch(s){this.runtime.logger.warn("Unable to update TUI session status during shutdown.",{sessionId:this.session.id,reason:s instanceof Error?s.message:String(s)})}try{await this.executionWorkspaces.markReady(this.session.id)}catch(s){this.runtime.logger.warn("Unable to release TUI execution workspace.",{sessionId:this.session.id,reason:s instanceof Error?s.message:String(s)})}}process.off("SIGINT",t),this.options.signal?.removeEventListener("abort",n),this.renderer.dispose(),e.unmount(),C(this.output),this.printResumeCommandOnExit&&this.session!==void 0&&this.output.write(`
|
|
2
|
+
${B(this.session.id)}
|
|
3
|
+
`)}}async processPrompt(i){if(this.activeForegroundRun!==void 0)return this.renderer.notice("An operation is already running. Stop it before starting another one."),!1;const e=j(i,{renderer:this.renderer,logger:this.runtime.logger,commandHost:I({runtime:this.runtime,cwd:this.cwd,renderer:this.renderer,pendingAttachments:this.pendingAttachments,getHooks:()=>this.hooks,getSession:()=>this.session,getActiveAbortController:()=>this.turnController.getActiveAbortController(),setActiveAbortController:t=>{this.turnController.setActiveAbortController(t)},attachClipboardImage:t=>this.attachClipboardImage(t),runPrompt:(t,n)=>this.turnController.runPrompt(t,n),runGoal:(t,n,r)=>this.runGoal(t,n,r),resumeGoal:t=>this.resumeGoal(t),runSkill:(t,n,r,s,o)=>this.runSkill(t,n,r,s,o),refreshExtensions:()=>this.refreshExtensions(),compactSession:()=>this.compactSession(),refreshWelcome:t=>this.refreshWelcome(t),getContextSnapshot:()=>this.getContextSnapshot(),resumeSession:t=>this.resumeSession(t)}),pendingAttachments:this.pendingAttachments,commandContext:()=>this.commandContext(),sendPrompt:(t,n)=>this.turnController.sendPrompt(t,n),resetActiveAbortController:()=>{this.turnController.isRunning()||this.turnController.setActiveAbortController(void 0)}});this.activeForegroundRun=e;try{return await e}finally{this.activeForegroundRun===e&&(this.activeForegroundRun=void 0)}}async attachClipboardImage(i,e=!0,t=""){if(i===void 0){e&&this.renderer.notice("Clipboard does not contain an image.");return}const n=A(i.bytes,i.mimeType);this.pendingAttachments.assertCanAdd(n.bytes.byteLength,t,{byteLength:n.bytes.byteLength,mimeType:n.mimeType});const r=this.pendingAttachments.nextId(),s=b(n,"clipboard",r),o=this.session===void 0?s:await this.runtime.sessionStore.saveAttachment(this.session.id,s,n.bytes);this.pendingAttachments.add({attachment:o,bytes:n.bytes},t),this.renderer.setPendingAttachments(this.pendingAttachments.list().map(({attachment:h})=>h)),e&&this.renderer.notice(`Attached ${s.name} \xB7 ${s.mimeType} \xB7 ${s.sizeBytes} bytes`)}async runPrompt(i,e,t){return this.turnController.runPrompt(i,e,t)}async runGoal(i,e,t={}){if(this.turnController.isRunning()){e.write("Stop the active response before starting a goal.");return}await J({runtime:this.runtime,cwd:this.cwd,sessionId:this.session?.id,model:this.activeModel??this.session?.model??null,profile:this.activeProfile??this.session?.profile??null,runPrompt:(n,r)=>this.runPrompt(n,void 0,r),write:n=>e.write(n)},i,t)}async resumeGoal(i){if(this.turnController.isRunning()){i.write("Stop the active response before resuming a goal.");return}await $({runtime:this.runtime,cwd:this.cwd,sessionId:this.session?.id,model:this.activeModel??this.session?.model??null,profile:this.activeProfile??this.session?.profile??null,runPrompt:(e,t)=>this.runPrompt(e,void 0,t),write:e=>i.write(e)})}commandContext(){return{write:i=>this.renderer.commandOutput(i)}}getActiveModel(){return this.activeModel}getActiveProfile(){return this.activeProfile}async refreshExtensions(){const i=await this.runtime.projectTrust.inspect(this.cwd);this.runtime.agentPreparation?.clear(i.canonicalPath);const e=await this.runtime.projectTrust.isTrusted(i),t=await this.runtime.configLoader.load(this.cwd,{includeProject:e});await this.reloadExtensions(e,t.config.approvalMode,i.canonicalPath),await this.refreshContextUsage()}async refreshWelcome(i={}){const e=await this.runtime.projectTrust.inspect(this.cwd);this.runtime.agentPreparation?.clear(e.canonicalPath);const t=await this.runtime.projectTrust.isTrusted(e),n=await this.runtime.configLoader.load(this.cwd,{includeProject:t});this.activeModel=i.model===void 0?this.activeModel??n.config.model:i.model,this.activeProfile=i.profile===void 0?this.activeProfile??n.config.profile:i.profile,this.renderer.setWelcome({version:l,cwd:e.canonicalPath,model:this.activeModel,profile:this.activeProfile,trusted:t}),await this.refreshContextUsage()}async getContextSnapshot(){const i=this.activeModel??this.session?.model??null,e=this.session===void 0?void 0:await this.runtime.goalStore.get(this.session.id),t=await this.contextService.buildForProject({...this.session===void 0?{}:{sessionId:this.session.id},model:i,profileName:this.activeProfile??this.session?.profile??null,pluginNames:this.enabledPluginNames,pluginMcpConfig:this.pluginMcpConfig,pendingAttachments:this.pendingAttachments.size,skillRootScopes:this.skillRootScopes,agentSessionStore:this.agentSessionStore,...e===void 0?{}:{goal:{objective:e.objective,status:e.status,turns:e.turns,evaluatorRuns:e.evaluatorRuns,tokensUsed:e.usage.totalTokens,...e.tokenBudget===void 0?{}:{tokenBudget:e.tokenBudget},...e.maxTurns===void 0?{}:{maxTurns:e.maxTurns},...e.maxDurationMs===void 0?{}:{maxDurationMs:e.maxDurationMs},...e.lastError===void 0?{}:{lastError:e.lastError},...e.lastEvaluation===void 0?{}:{lastEvaluation:e.lastEvaluation.reason}}}});return this.renderer.setContextUsage({usedTokens:t.usedTokens,...t.contextWindow===void 0?{}:{contextWindow:t.contextWindow}}),t}async refreshContextUsage(){try{await this.getContextSnapshot()}catch(i){this.runtime.logger.debug("Unable to refresh context usage.",{reason:i instanceof Error?i.message:String(i)})}}async runSkill(i,e,t,n,r){await z({globalConfigDir:this.runtime.paths.globalConfigDir,skillRootScopes:this.skillRootScopes,runPrompt:(s,o)=>this.turnController.sendPrompt(s,this.pendingAttachments.list(),o)},i,e,t,r,n)}async reloadExtensions(i,e,t){const n=await V({runtime:this.runtime,cwd:this.cwd,trusted:i,approvalMode:e,workspaceRoot:t,approvals:this.approvals});this.hookRuntime=n.hookRuntime,this.skillRootScopes=n.skillRootScopes,this.enabledPluginNames=n.enabledPluginNames,this.pluginMcpConfig=n.pluginMcpConfig,this.hooks=n.hooks}async compactSession(){await F({runtime:this.runtime,cwd:this.cwd,session:this.session,activeModel:this.activeModel,activeProfile:this.activeProfile,activeResponse:this.turnController.getActiveAbortController()!==void 0,renderer:this.renderer,contextService:this.contextService,agentSessionStore:this.agentSessionStore,refreshContextUsage:()=>this.refreshContextUsage()})}async resumeSession(i){if(this.turnController.isRunning())throw new Error("Stop the active response before resuming another session.");const e=await this.runtime.projectTrust.inspect(this.cwd),t=await new E(this.runtime.sessionStore).require(i,e.fingerprint);if(t.id===this.session?.id){this.renderer.notice(`Already using session: ${t.id}`);return}const n=await this.runtime.sessionStore.readTranscript(t.id),r=this.session;r!==void 0&&(await this.subagentJobs.close(),this.subagentJobs=new f,await this.runHookEvent("session.end",r.id),await this.runtime.sessionStore.updateStatus(r.id,"completed"),this.agentSessionStore.delete(r.id)),this.session=await this.runtime.sessionStore.updateStatus(t.id,"active"),this.executionWorkspace=await this.executionWorkspaces.prepare({sessionId:t.id,projectRoot:e.canonicalPath});const s=await D(this.runtime,this.cwd);this.activeModel=t.model??s.config.model,this.activeProfile=t.profile??s.config.profile,this.renderer.setWelcome({version:l,cwd:e.canonicalPath,model:this.activeModel,profile:this.activeProfile,trusted:await this.runtime.projectTrust.isTrusted(e)}),this.renderer.clearTranscript();for(const o of p(n))o.type==="user"?this.renderer.userPrompt(o.content):o.type==="assistant"&&(this.renderer.beginAssistant(),this.renderer.assistantDelta(o.content),this.renderer.finishAssistant());await this.refreshContextUsage(),await this.runHookEvent("session.start",t.id),this.pendingAttachments.clear(),this.renderer.setPendingAttachments([]),m(this.runtime,this.cwd).catch(o=>this.runtime.logger.warn("MCP session warm-up failed.",{reason:o instanceof Error?o.message:String(o)})),this.renderer.notice(`Resumed session: ${t.id}`)}handleInterrupt(){const i=L({lastInterruptAt:this.lastInterruptAt,exitArmedUntil:this.exitArmedUntil,printResumeCommandOnExit:this.printResumeCommandOnExit},this.turnController.getActiveAbortController(),this.renderer);this.lastInterruptAt=i.lastInterruptAt,this.exitArmedUntil=i.exitArmedUntil,this.printResumeCommandOnExit=i.printResumeCommandOnExit}async awaitActiveForegroundRun(){const i=this.activeForegroundRun;if(i!==void 0)try{await i}catch(e){this.runtime.logger.warn("Foreground TUI operation failed during shutdown.",{reason:e instanceof Error?e.message:String(e)})}}async runHookEvent(i,e){await O(this.hookRuntime,this.hooks,i,this.executionWorkspace?.executionCwd??this.cwd,e)}}export{ye as TuiApplication};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { ClipboardImage } from '../../ports/clipboard-adapter.js';
|
|
2
2
|
import type { HostPlatformContext } from '../../infrastructure/platform/host-platform.js';
|
|
3
3
|
export interface TuiClipboardPasteHandlers {
|
|
4
|
-
image: () => Promise<void>;
|
|
4
|
+
image: (prompt: string) => Promise<void>;
|
|
5
5
|
text: () => Promise<string | undefined>;
|
|
6
6
|
}
|
|
7
7
|
export declare function createTuiClipboardPasteHandlers(options: {
|
|
8
8
|
platform: HostPlatformContext;
|
|
9
9
|
notify: (message: string) => void;
|
|
10
|
-
attachImage: (image: ClipboardImage | undefined) => Promise<void>;
|
|
10
|
+
attachImage: (image: ClipboardImage | undefined, prompt: string) => Promise<void>;
|
|
11
11
|
}): TuiClipboardPasteHandlers;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{asCliError as t}from"../../domain/errors/cli-error.js";import{createClipboardAdapter as
|
|
1
|
+
import{asCliError as t}from"../../domain/errors/cli-error.js";import{createClipboardAdapter as m}from"../../infrastructure/clipboard/clipboard-adapter-factory.js";import{createClipboardTextAdapter as o}from"../../infrastructure/clipboard/clipboard-text-adapter-factory.js";import{formatCliErrorMessage as e}from"../../application/commands/command-hints.js";function n(r){return{image:async a=>{try{await r.attachImage(await m(r.platform).readImage(),a)}catch(i){r.notify(e(t(i),"tui"))}},text:async()=>{try{return await o(r.platform).readText()}catch(a){r.notify(e(t(a),"tui"));return}}}}export{n as createTuiClipboardPasteHandlers};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{AuthenticationService as
|
|
2
|
-
`)?t.slice(0,-1):t)},selectScope:t=>e.renderer.selectScope(t),activity:{start:(t,r)=>e.renderer.startToolActivity(t,r)},signal:a}}async function
|
|
1
|
+
import{AuthenticationService as d}from"../../application/auth/authentication-service.js";import{executeApplicationCommand as c}from"../../application/commands/application-command-executor.js";import{runEffortCommand as f,runModelCommand as m}from"../../application/commands/cli-command-services.js";import{REASONING_EFFORTS as p}from"../../domain/config/config-schema.js";import{loadModelCatalog as u}from"../../application/model/model-catalog-service.js";import{formatContextSnapshot as w}from"./context-display.js";import{createClipboardAdapter as g}from"../../infrastructure/clipboard/clipboard-adapter-factory.js";import{formatCompactTable as y}from"../../application/formatting/compact-table.js";import{formatGoalStatus as A}from"../../application/orchestration/goal-output.js";import{parseGoalLimits as b}from"../../application/orchestration/goal-input.js";import{prepareTuiMediaInvocation as S}from"./tui-media-model-selection.js";import{isCliAgentPreparationMutation as C}from"../../application/agent/cli-agent-preparation-cache.js";async function V(e,i,a){switch(e.action.executor){case"tui-exit":return!0;case"tui-clear":return i.renderer.clearTranscript(),!1;case"tui-stop":return L(i,a),!1;case"tui-details":return a.write(`Action details: ${i.renderer.toggleActionDetails()?"on":"off"}`),!1;case"tui-context":return await T(i,a),!1;case"tui-auth-login":return await E(i,e,a),!1;case"tui-model-select":return await P(i,a),!1;case"tui-effort-select":return await W(i,a),!1;case"tui-skill-run":return await k(i,e,a),!1;case"tui-session-resume":return await i.resumeSession(o(e,0,"session id")),!1;case"tui-session-compact":return await i.compactSession(),!1;case"tui-session-rename":return await $(i,e,a),!1;case"tui-goal":return await I(i,e,a),!1;case"tui-attachments":return await j(i,e,a),!1;case"tui-prompt":return await i.runPrompt(e.positionals.join(" ")),!1;case"tui-agent-info":return a.write("The JSONL agent protocol owns stdin/stdout and must be run directly: lotagate agent stdio."),!1;default:{const t=await S(e,{loadModels:()=>u(i.runtime,i.cwd),selectModel:(r,n)=>i.renderer.selectModel(r,n)});return t===void 0?(a.write("Model selection cancelled."),!1):(await M(t,i,a),C(t.action.id,t.action.desktop?.mutationKey)&&i.runtime.agentPreparation?.clear(),await G(i,t),!1)}}}async function M(e,i,a){const t=new AbortController;i.activeAbortController=t;try{await c(e,N(i,a,t.signal))}finally{i.activeAbortController===t&&(i.activeAbortController=void 0)}}function N(e,i,a){return{runtime:e.runtime,cwd:e.cwd,output:{write:t=>i.write(t.endsWith(`
|
|
2
|
+
`)?t.slice(0,-1):t)},selectScope:t=>e.renderer.selectScope(t),activity:{start:(t,r)=>e.renderer.startToolActivity(t,r)},signal:a}}async function G(e,i){i.action.id==="model.use"&&await e.refreshWelcome({model:i.positionals[0]??null}),(i.action.id==="trust.grant"||i.action.id==="trust.revoke")&&(await e.refreshExtensions(),await e.refreshWelcome()),i.action.id.startsWith("plugin.")&&i.action.id!=="plugin.list"&&i.action.id!=="plugin.list.default"&&await e.refreshExtensions()}function L(e,i){e.activeAbortController===void 0?i.write("No response is currently running."):(e.activeAbortController.abort(),i.write("Stopping the active response."))}async function T(e,i){i.write(e.session===void 0?"No active session.":w(await e.getContextSnapshot()))}async function E(e,i,a){const t=await e.runtime.configLoader.load(e.cwd,{includeProject:!1}),r=String(i.options.get("profile")??t.config.profile??d.defaultProfileName()),n=String(i.options.get("base-url")??t.config.baseUrl),l=await e.renderer.requestSecret("LotaGate API key");if(l===void 0){a.write("Login cancelled.");return}const s=await e.runtime.auth.login({profileName:r,baseUrl:n,apiKey:l});await e.runtime.configLoader.setGlobal("profile",s.name),await e.refreshWelcome({profile:s.name}),a.write(`Logged in profile: ${s.name}`)}async function P(e,i){const a=await e.runtime.configLoader.load(e.cwd),t=await u(e.runtime,e.cwd);if(t.data.length===0){i.write("No models are available.");return}const r=await e.renderer.selectModel("Select a model",t.data.map(n=>({value:n.id,label:typeof n.display_name=="string"?n.display_name:n.id})),a.config.model??void 0);if(r===void 0){i.write("Model selection cancelled.");return}await m(["use",r],e.runtime,e.cwd,{write:n=>i.write(n.endsWith(`
|
|
3
3
|
`)?n.slice(0,-1):n)}),await e.refreshWelcome({model:r})}async function W(e,i){const a=await e.runtime.configLoader.load(e.cwd),t=await e.renderer.selectModel("Select reasoning effort",p.map(r=>({value:r,label:r})),a.config.effort);if(t===void 0){i.write("Effort selection cancelled.");return}await f(["use",t],e.runtime,e.cwd,{write:r=>i.write(r.endsWith(`
|
|
4
|
-
`)?r.slice(0,-1):r)})}async function
|
|
4
|
+
`)?r.slice(0,-1):r)})}async function k(e,i,a){const t=o(i,0,"skill name");await e.runSkill(t,i.positionals.slice(1),a,void 0,R(i))}async function $(e,i,a){if(e.session===void 0){a.write("No active session.");return}const t=i.positionals.join(" ").trim();e.session=await e.runtime.sessionStore.rename(e.session.id,t),a.write(`Renamed session: ${e.session.name}`)}async function I(e,i,a){if(i.action.id==="goal.start.tui"){await e.runGoal(i.positionals.join(" "),a,b(i.options));return}if(e.session===void 0){a.write("No active session.");return}if(i.action.id==="goal.status.tui"){const t=await e.runtime.goalStore.get(e.session.id);a.write(t===void 0?"No active goal.":A(t));return}if(i.action.id==="goal.pause.tui"){e.activeAbortController?.abort();const t=await e.runtime.goalStore.get(e.session.id);t?.status==="active"&&await e.runtime.goalStore.pause(e.session.id),a.write(t?.status==="paused"?"Goal already paused.":"Goal paused.");return}if(i.action.id==="goal.resume.tui"){await e.resumeGoal(a);return}e.activeAbortController?.abort(),await e.runtime.goalStore.clear(e.session.id),a.write("Goal cleared.")}async function j(e,i,a){const t=i.action.id;if(t==="attachments.paste"){const r=await g(e.runtime.platform).readImage();await e.attachClipboardImage(r),a.write(r===void 0?"Clipboard does not contain an image.":"Attachment added from clipboard.");return}if(t==="attachments.remove"){const r=o(i,0,"attachment id");e.pendingAttachments.remove(r)?(e.renderer.setPendingAttachments(e.pendingAttachments.list().map(({attachment:n})=>n)),a.write(`Removed attachment: ${r}`)):a.write(`Attachment not found: ${r}`);return}a.write(y(e.pendingAttachments.list().map(({attachment:r})=>({name:r.name,status:r.mimeType,detail:`${r.sizeBytes} bytes`})),{empty:"No pending attachments."}))}function o(e,i,a){const t=e.positionals[i];if(t===void 0)throw new Error(`Missing ${a}.`);return t}function R(e){const i=e.options.get("scope");return i==="user"||i==="project"?i:void 0}export{V as executeTuiCommand};
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import type { SessionStore as AgentSessionStore } from '@lotagate/agent-sdk';
|
|
2
2
|
import type { LotaGate } from '@lotagate/sdk';
|
|
3
3
|
import type { CliRuntime } from '../../bootstrap/runtime-factory.js';
|
|
4
|
-
|
|
4
|
+
import type { AgentRunSnapshot } from '../../application/agent/agent-run-tracker.js';
|
|
5
|
+
import { type ContinuationGoal } from '../../application/agent/continuation-checkpoint.js';
|
|
6
|
+
export declare function createTuiContextManagement(client: LotaGate, model: string, contextWindow: number | undefined, onSummaryFailure: (error: unknown) => void, continuationContext?: () => string | undefined): import("@lotagate/agent-sdk").ContextManagementOptions;
|
|
7
|
+
export declare function createTuiContinuationContext(snapshot: AgentRunSnapshot, goal?: ContinuationGoal): string;
|
|
5
8
|
export declare function compactTuiSession(runtime: CliRuntime, agentSessions: AgentSessionStore, sessionId: string, client: LotaGate, model: string, contextWindow?: number, onSummaryFailure?: (error: unknown) => void): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createContextManagement as
|
|
1
|
+
import{createContextManagement as c,redactCompactionSummary as f}from"../../application/agent/context-compaction.js";import{retainLatestCompaction as p,toAgentMessage as d}from"../../application/agent/agent-session-store.js";import{buildAgentHistory as g}from"../../application/agent/agent-history.js";import{compactSessionMessages as y}from"../../application/session/session-compaction-service.js";import{formatContinuationCheckpoint as C}from"../../application/agent/continuation-checkpoint.js";function T(a,e,t,r,n){return c({client:a,model:e,...t===void 0?{}:{contextWindow:t},onSummaryFailure:r,...n===void 0?{}:{continuationContext:n}})}function h(a,e){return C({snapshot:a,...e===void 0?{}:{goal:e}})}async function H(a,e,t,r,n,i,m){const s=await e.get(t),u=s?.messages??await w(a,t),o=await y(u,r,n,i,m);return o.summary===void 0?!1:(s!==void 0&&await e.update(t,{messages:o.messages,status:"completed"}),await a.sessionStore.compact(t,f(o.summary)),!0)}async function w(a,e){const t=await a.sessionStore.readHistory(e);return p(g(t.transcript,t.events)).map(d)}export{H as compactTuiSession,T as createTuiContextManagement,h as createTuiContinuationContext};
|
|
@@ -1,34 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { type CliMcpConfig } from '../../domain/extensions/mcp-config.js';
|
|
4
|
-
import type { SkillRootScope } from '../../infrastructure/extensions/skill-roots.js';
|
|
5
|
-
import type { TuiContextSnapshot } from './context-display.js';
|
|
6
|
-
import type { SessionStore as AgentSessionStore } from '@lotagate/agent-sdk';
|
|
7
|
-
import type { AgentGoalSummary } from '../../application/agent/capability-profile.js';
|
|
8
|
-
export interface TuiContextServiceInput {
|
|
9
|
-
sessionId?: string;
|
|
10
|
-
model: string | null;
|
|
11
|
-
profileName?: string | null;
|
|
12
|
-
trusted: boolean;
|
|
13
|
-
skills: readonly (SkillManifest & {
|
|
14
|
-
enabled: boolean;
|
|
15
|
-
})[];
|
|
16
|
-
pluginNames: readonly string[];
|
|
17
|
-
pluginMcpConfig?: CliMcpConfig;
|
|
18
|
-
pendingAttachments: number;
|
|
19
|
-
skillRootScopes?: readonly SkillRootScope[];
|
|
20
|
-
agentSessionStore?: AgentSessionStore;
|
|
21
|
-
goal?: AgentGoalSummary;
|
|
22
|
-
}
|
|
23
|
-
/** Builds the human-readable context model from durable session data and CLI-owned metadata. */
|
|
24
|
-
export declare class TuiContextService {
|
|
25
|
-
private readonly runtime;
|
|
26
|
-
private readonly cwd;
|
|
27
|
-
private contextWindow;
|
|
28
|
-
private contextWindowModel;
|
|
29
|
-
constructor(runtime: CliRuntime, cwd: string);
|
|
30
|
-
buildForProject(input: Omit<TuiContextServiceInput, 'trusted' | 'skills'>): Promise<TuiContextSnapshot>;
|
|
31
|
-
build(input: TuiContextServiceInput): Promise<TuiContextSnapshot>;
|
|
32
|
-
getModelContextWindow(model: string | null, profileName?: string | null): Promise<number | undefined>;
|
|
33
|
-
private resolveContextWindow;
|
|
34
|
-
}
|
|
1
|
+
export { ContextUsageService as TuiContextService } from '../../application/agent/context-usage-service.js';
|
|
2
|
+
export type { ContextUsageServiceInput as TuiContextServiceInput, ContextUsageSnapshot as TuiContextSnapshot } from '../../application/agent/context-usage-service.js';
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
`)})}export{X as TuiContextService};
|
|
1
|
+
import{ContextUsageService as o}from"../../application/agent/context-usage-service.js";export{o as TuiContextService};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{AuthenticationService as i}from"../../application/auth/authentication-service.js";import{CachedModelCatalog as n,modelCatalogCacheKey as c}from"../../application/model/cached-model-catalog.js";import{ModelCatalogAdapter as d}from"../../infrastructure/sdk/model-catalog-adapter.js";import{createLotaGateClient as s}from"../../infrastructure/sdk/lotagate-client-factory.js";import{selectInitialModel as m}from"../../application/model/initial-model-selection.js";async function
|
|
1
|
+
import{AuthenticationService as i}from"../../application/auth/authentication-service.js";import{CachedModelCatalog as n,modelCatalogCacheKey as c}from"../../application/model/cached-model-catalog.js";import{ModelCatalogAdapter as d}from"../../infrastructure/sdk/model-catalog-adapter.js";import{createLotaGateClient as s}from"../../infrastructure/sdk/lotagate-client-factory.js";import{selectInitialModel as m}from"../../application/model/initial-model-selection.js";async function u(l,t){if(t.model!==null&&t.model.trim().length>0)return t.model;const r=t.profile??i.defaultProfileName();let o;try{o=await l.credentialStore.get(r)}catch(e){return l.logger.warn("Unable to load credentials while selecting the initial model.",{reason:e instanceof Error?e.message:String(e)}),null}if(o===void 0)return null;try{const e=new n(new d(s(o.profile,o.apiKey)),l.cache,c(o.profile.name,o.profile.baseUrl),l.cachePolicy.modelCatalogTtlMs,l.modelCatalogInFlight);return await m(t.model,{list:()=>e.listModels()},a=>l.configLoader.setGlobal("model",a))}catch(e){return l.logger.warn("Unable to select the first model from the catalog.",{reason:e instanceof Error?e.message:String(e)}),null}}export{u as resolveInitialModel};
|
|
@@ -14,7 +14,7 @@ export interface TuiToolApprovalHost {
|
|
|
14
14
|
export declare class TuiToolApprovalCoordinator {
|
|
15
15
|
private readonly host;
|
|
16
16
|
constructor(host: TuiToolApprovalHost);
|
|
17
|
-
ask(request: ToolApprovalRequest): Promise<boolean>;
|
|
17
|
+
ask(request: ToolApprovalRequest, signal?: AbortSignal): Promise<boolean>;
|
|
18
18
|
create(mode: CliApprovalMode, trustedProject: boolean, workspaceRoot: string, skillScopes?: SkillScopeStore, workspacePermissions?: WorkspacePermissionPolicy): ToolApprovalService;
|
|
19
19
|
remember(workspaceRoot: string, request: ToolApprovalRequest): Promise<void>;
|
|
20
20
|
audit(decision: ToolApprovalDecision): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ToolApprovalService as
|
|
1
|
+
import{ToolApprovalService as f}from"../../application/security/tool-approval-service.js";import{permissionRuleForRequest as h}from"../../application/security/workspace-permission-policy.js";import{formatShellCommandForDisplay as c,formatToolActivityName as g}from"../../application/agent/tool-display.js";class k{host;constructor(e){this.host=e}async ask(e,r){this.host.renderer.status("Waiting for approval");try{const o=this.host.renderer.confirmTool(e.toolName,y(e));return r===void 0?await o:r.aborted?(this.host.renderer.resolveActiveModal(void 0),!1):await I(o,r,this.host.renderer)}finally{const o=this.host.getActiveSignal();o!==void 0&&!o.aborted&&this.host.renderer.status("Thinking")}}create(e,r,o,s,a){return new f({mode:e,trustedProject:r,...s===void 0?{}:{skillScopes:s},...a===void 0?{}:{workspacePermissions:a},prompt:n=>this.ask(n),...r?{rememberApproval:n=>this.remember(o,n)}:{},...r?{onRememberApprovalFailure:(n,i)=>this.rememberFailure(i)}:{},audit:n=>this.audit(n)})}async remember(e,r){await this.host.runtime.workspaceSettings.rememberAllow(e,h(r.toolName,r.input))}async audit(e){this.host.runtime.logger.info("Tool authorization decision.",{toolName:e.toolName,stage:e.stage,sessionId:e.sessionId,runId:e.runId,decision:e.decision,reason:e.reason,...e.source===void 0?{}:{source:e.source},...e.executorId===void 0?{}:{executorId:e.executorId},...e.ruleId===void 0?{}:{ruleId:e.ruleId},...e.skillName===void 0?{}:{skillName:e.skillName},...e.riskCategory===void 0?{}:{riskCategory:e.riskCategory}});const r=this.host.getSessionId();r!==void 0&&await this.host.runtime.sessionStore.appendEvent({type:"tool.approval",timestamp:new Date().toISOString(),sessionId:r,data:{toolName:e.toolName,stage:e.stage,sessionId:e.sessionId,runId:e.runId,...e.source===void 0?{}:{source:e.source},...e.executorId===void 0?{}:{executorId:e.executorId},...e.ruleId===void 0?{}:{ruleId:e.ruleId},...e.skillName===void 0?{}:{skillName:e.skillName},...e.riskCategory===void 0?{}:{riskCategory:e.riskCategory},decision:e.decision,reason:e.reason}})}rememberFailure(e){this.host.runtime.logger.warn("Unable to persist tool approval.",{reason:e instanceof Error?e.message:String(e)}),this.host.renderer.notice("Approval accepted for this action, but could not be remembered.")}}function I(t,e,r){return new Promise((o,s)=>{let a=!1;const n=()=>e.removeEventListener("abort",l),i=u=>{a||(a=!0,n(),o(u))},p=u=>{a||(a=!0,n(),s(u))},l=()=>{r.resolveActiveModal(void 0),i(!1)};e.aborted?l():e.addEventListener("abort",l,{once:!0}),t.then(i,p)})}function y(t){if(t.toolName==="filesystem.write")return`Write workspace file: ${m(t.input.path)}`;if(t.toolName==="shell.exec"){const e=typeof t.input.command=="string"?t.input.command:"",r=Array.isArray(t.input.args)?t.input.args.filter(s=>typeof s=="string"):[],o=typeof t.input.script=="string"?m(t.input.script):void 0;return d(`Run command: ${c(e,o===void 0?r:[...r,"-Command",o],240)}`)}return`This ${g(t.toolName)} operation may change workspace or external state.`}function m(t){const e=typeof t=="string"?t:String(t??"");return d(e.replace(/Bearer\s+[^\s]+/giu,"Bearer [REDACTED]").replace(/sk-[A-Za-z0-9_-]{8,}/gu,"[REDACTED]"))}function d(t){return t.length<=240?t:`${t.slice(0,237)}...`}export{k as TuiToolApprovalCoordinator};
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.1.
|
|
1
|
+
export declare const CLI_VERSION = "0.1.26";
|
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const o="0.1.
|
|
1
|
+
const o="0.1.26";export{o as CLI_VERSION};
|
package/native-targets.mjs
CHANGED
|
@@ -29,7 +29,7 @@ function target(id, platforms, arch, libc) {
|
|
|
29
29
|
platforms: Object.freeze(platforms),
|
|
30
30
|
arch,
|
|
31
31
|
packageName: `@lotagate/cli-native-${id}`,
|
|
32
|
-
binaryName: 'lotagate.exe',
|
|
32
|
+
binaryName: platforms.includes('win32') || platforms.includes('cygwin') ? 'lotagate.exe' : 'lotagate',
|
|
33
33
|
libc,
|
|
34
34
|
});
|
|
35
35
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lotagate/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.26",
|
|
4
4
|
"description": "Enterprise-grade terminal client for LotaGate AI agents.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -26,11 +26,10 @@
|
|
|
26
26
|
},
|
|
27
27
|
"packageManager": "npm@11.8.0",
|
|
28
28
|
"bin": {
|
|
29
|
-
"lotagate": "./bin/lotagate.
|
|
29
|
+
"lotagate": "./bin/lotagate.mjs"
|
|
30
30
|
},
|
|
31
31
|
"sideEffects": false,
|
|
32
32
|
"files": [
|
|
33
|
-
"bin/lotagate.exe",
|
|
34
33
|
"bin/lotagate.mjs",
|
|
35
34
|
"dist",
|
|
36
35
|
"scripts/install-native.mjs",
|
|
@@ -65,19 +64,19 @@
|
|
|
65
64
|
"prepack": "npm run build"
|
|
66
65
|
},
|
|
67
66
|
"dependencies": {
|
|
68
|
-
"@lotagate/agent-sdk": "^0.1.
|
|
67
|
+
"@lotagate/agent-sdk": "^0.1.8",
|
|
69
68
|
"@lotagate/sdk": "^0.1.3",
|
|
70
69
|
"ink": "^7.1.1",
|
|
71
70
|
"react": "^19.2.4",
|
|
72
71
|
"tiktoken": "^1.0.22"
|
|
73
72
|
},
|
|
74
73
|
"optionalDependencies": {
|
|
75
|
-
"@lotagate/cli-native-linux-arm64-gnu": "0.1.
|
|
76
|
-
"@lotagate/cli-native-linux-x64-gnu": "0.1.
|
|
77
|
-
"@lotagate/cli-native-macos-arm64": "0.1.
|
|
78
|
-
"@lotagate/cli-native-macos-x64": "0.1.
|
|
79
|
-
"@lotagate/cli-native-windows-arm64": "0.1.
|
|
80
|
-
"@lotagate/cli-native-windows-x64": "0.1.
|
|
74
|
+
"@lotagate/cli-native-linux-arm64-gnu": "0.1.26",
|
|
75
|
+
"@lotagate/cli-native-linux-x64-gnu": "0.1.26",
|
|
76
|
+
"@lotagate/cli-native-macos-arm64": "0.1.26",
|
|
77
|
+
"@lotagate/cli-native-macos-x64": "0.1.26",
|
|
78
|
+
"@lotagate/cli-native-windows-arm64": "0.1.26",
|
|
79
|
+
"@lotagate/cli-native-windows-x64": "0.1.26"
|
|
81
80
|
},
|
|
82
81
|
"devDependencies": {
|
|
83
82
|
"@eslint/js": "9.39.5",
|
|
@@ -10,8 +10,11 @@ const target = targetForRuntime(process.platform, process.arch);
|
|
|
10
10
|
|
|
11
11
|
if (existsSync(resolve(packageRoot, '.git'))) process.exit(0);
|
|
12
12
|
|
|
13
|
-
if (target === undefined)
|
|
14
|
-
|
|
13
|
+
if (target === undefined) {
|
|
14
|
+
if (process.platform === 'win32' || process.platform === 'cygwin') fail(`No native LotaGate CLI artifact is available for ${process.platform}/${process.arch}.`);
|
|
15
|
+
} else {
|
|
16
|
+
await installNativeTarget(target);
|
|
17
|
+
}
|
|
15
18
|
|
|
16
19
|
function findInstalledNativePackageRoot(packageName) {
|
|
17
20
|
const segments = packageName.split('/');
|
|
@@ -45,17 +48,6 @@ async function installNativeTarget(nativeTarget) {
|
|
|
45
48
|
}
|
|
46
49
|
}
|
|
47
50
|
|
|
48
|
-
async function installNodeFallback() {
|
|
49
|
-
if (process.platform === 'win32' || process.platform === 'cygwin') fail(`No native LotaGate CLI artifact is available for ${process.platform}/${process.arch}.`);
|
|
50
|
-
const destination = resolve(packageRoot, 'bin', 'lotagate.exe');
|
|
51
|
-
try {
|
|
52
|
-
await installExecutable(resolve(packageRoot, 'bin', 'lotagate.mjs'), destination);
|
|
53
|
-
} catch (error) {
|
|
54
|
-
await rm(destination, { force: true }).catch(() => undefined);
|
|
55
|
-
fail(`Node launcher installation failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
51
|
async function installExecutable(source, destination) {
|
|
60
52
|
const temporary = `${destination}.install-${process.pid}-${Date.now()}`;
|
|
61
53
|
await mkdir(dirname(destination), { recursive: true });
|
package/bin/lotagate.exe
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Native executable installation did not complete. Reinstall @lotagate/cli without --ignore-scripts or --omit=optional.
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { ToolDefinition } from '@lotagate/sdk';
|
|
2
|
-
export declare const DOCUMENT_FORMATS: readonly ["pdf", "pptx", "excel", "docs"];
|
|
3
|
-
export type DocumentFormat = typeof DOCUMENT_FORMATS[number];
|
|
4
|
-
export declare const DOCUMENT_TOOL_DEFINITIONS: readonly ToolDefinition[];
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const k=["pdf","pptx","excel","docs"],t={path:n("Workspace-relative or absolute document path."),handleId:n("Document handle returned by the open tool."),outputPath:n("Optional workspace-relative output path.")},m=[a("pdf.open","Open a PDF document and return a governed document handle.",{path:t.path},["path"]),a("pdf.create","Create a new PDF document at the requested path.",{path:t.path,title:n("Optional document title.")},["path"]),a("pdf.inspect","Inspect PDF metadata and page count.",{handleId:t.handleId},["handleId"]),a("pdf.validate","Validate the PDF signature and readable structure.",{path:t.path},["path"]),a("pdf.readText","Extract bounded text from selected PDF pages.",{handleId:t.handleId,pages:o("Optional zero-based page numbers.")},["handleId"]),a("pdf.render","Render selected PDF pages to image artifacts.",{handleId:t.handleId,pages:o("Optional zero-based page numbers."),outputPath:t.outputPath},["handleId"]),a("pdf.extractTables","Extract table-like text from selected PDF pages.",{handleId:t.handleId,pages:o("Optional zero-based page numbers.")},["handleId"]),a("pdf.recognizeText","Recognize text from selected PDF pages with bounded line metadata.",{handleId:t.handleId,pages:o("Optional zero-based page numbers."),language:n("Optional BCP-47 OCR language tag.")},["handleId"]),a("pdf.search","Search PDF text and return bounded page matches.",{handleId:t.handleId,query:n("Text to find."),pages:o("Optional zero-based page numbers."),maxResults:d("Maximum matches to return.")},["handleId","query"]),a("pdf.extractImages","Extract embedded PDF images to a workspace directory.",{handleId:t.handleId,outputPath:t.outputPath,pages:o("Optional zero-based page numbers.")},["handleId","outputPath"]),a("pdf.manageBookmarks","Read or update PDF outline bookmarks.",{handleId:t.handleId,operation:l(["list","add","update","delete"],"Bookmark operation."),bookmark:i("Bookmark definition for add, update, or delete.")},["handleId","operation"]),a("pdf.extractLinks","Extract links from selected PDF pages.",{handleId:t.handleId,pages:o("Optional zero-based page numbers.")},["handleId"]),a("pdf.extractAnnotations","Extract annotations from a PDF.",{handleId:t.handleId,pages:o("Optional zero-based page numbers.")},["handleId"]),a("pdf.manageAttachments","List, extract, attach, or remove PDF file attachments.",{handleId:t.handleId,operation:l(["list","extract","attach","delete"],"Attachment operation."),outputPath:t.outputPath,sourcePath:t.path,name:n("Attachment name.")},["handleId","operation"]),a("pdf.flattenForms","Flatten PDF form fields into page content.",{handleId:t.handleId,outputPath:t.outputPath},["handleId"]),a("pdf.optimize","Optimize a PDF into a separate output artifact.",{handleId:t.handleId,outputPath:t.outputPath,options:i("Optimization options.")},["handleId","outputPath"]),a("pdf.addPageNumbers","Add page numbers to a PDF into a separate output artifact.",{handleId:t.handleId,outputPath:t.outputPath,options:i("Page number placement and formatting options.")},["handleId","outputPath"]),a("pdf.insertPages","Insert pages from another PDF before a page index.",{handleId:t.handleId,sourcePath:t.path,beforePage:d("Zero-based insertion page.")},["handleId","sourcePath","beforePage"]),a("pdf.deletePages","Delete selected pages from a PDF.",{handleId:t.handleId,pages:o("Zero-based page numbers.")},["handleId","pages"]),a("pdf.reorderPages","Reorder all PDF pages using a zero-based permutation.",{handleId:t.handleId,order:o("Complete zero-based page permutation.")},["handleId","order"]),a("pdf.rotatePages","Rotate selected PDF pages.",{handleId:t.handleId,pages:o("Zero-based page numbers."),degrees:l(["90","180","270"],"Clockwise rotation.")},["handleId","pages","degrees"]),a("pdf.merge","Merge PDFs into a new output document.",{paths:h("Input PDF paths."),outputPath:t.outputPath},["paths","outputPath"]),a("pdf.split","Split selected PDF pages into a new output document.",{handleId:t.handleId,pages:o("Zero-based page numbers."),outputPath:t.outputPath},["handleId","pages","outputPath"]),a("pdf.addText","Add positioned text to a PDF page.",{handleId:t.handleId,page:d("Zero-based page number."),text:n("Text to add."),x:d("Horizontal PDF coordinate."),y:d("Vertical PDF coordinate.")},["handleId","page","text","x","y"]),a("pdf.addImage","Add an image to a PDF page.",{handleId:t.handleId,page:d("Zero-based page number."),imagePath:t.path,x:d("Horizontal PDF coordinate."),y:d("Vertical PDF coordinate."),width:d("Image width."),height:d("Image height.")},["handleId","page","imagePath","x","y","width","height"]),a("pdf.annotate","Add a PDF annotation.",{handleId:t.handleId,page:d("Zero-based page number."),text:n("Annotation text."),x:d("Horizontal PDF coordinate."),y:d("Vertical PDF coordinate.")},["handleId","page","text","x","y"]),a("pdf.readForm","Read PDF form fields.",{handleId:t.handleId},["handleId"]),a("pdf.fillForm","Fill PDF form fields.",{handleId:t.handleId,values:i("Field names and values.")},["handleId","values"]),a("pdf.redact","Redact selected rectangular areas in a PDF.",{handleId:t.handleId,areas:x("Page and rectangle definitions.")},["handleId","areas"]),a("pdf.save","Save changes to an opened PDF document.",{handleId:t.handleId,outputPath:t.outputPath},["handleId"]),a("pdf.close","Close an opened PDF document handle.",{handleId:t.handleId},["handleId"])],g=u("pptx","slide",[["duplicateSlide","Duplicate a presentation slide."],["importSlides","Import slides from another presentation."],["arrangeElements","Align, distribute, group, or reorder slide elements."],["findReplace","Find and replace text across presentation slides."],["extractText","Extract bounded text from selected presentation slides."],["manageMedia","List, insert, update, or delete presentation media."],["manageHyperlinks","List, set, or clear presentation hyperlinks."],["manageTransitions","Inspect or update slide transitions."],["manageLayouts","List or apply presentation slide layouts."],["readSlide","Read slide text and element metadata."],["addSlide","Add a slide."],["deleteSlide","Delete a slide."],["reorderSlides","Reorder slides."],["updateSlide","Update slide metadata."],["addElement","Add a slide element."],["updateElement","Update a slide element."],["deleteElement","Delete a slide element."],["setTheme","Set the presentation theme."],["setNotes","Set speaker notes."],["render","Render slides to image artifacts."],["exportPdf","Export the presentation as PDF."]]),I=u("excel","range",[["find","Find text or values in a workbook."],["manageNamedRange","Create, inspect, update, or delete a workbook named range."],["setDataValidation","Set or clear data validation on a worksheet range."],["managePivotTable","Create, refresh, inspect, or delete a pivot table."],["readFormulas","Read formulas and calculated values from a worksheet range."],["manageConditionalFormatting","List, set, or clear conditional formatting rules."],["manageSheetView","Inspect or update worksheet view settings."],["manageComments","List, add, update, or delete cell comments."],["manageProtection","Inspect, protect, or unprotect workbook or worksheet protection."],["readRange","Read a worksheet range."],["writeRange","Write values to a worksheet range."],["clearRange","Clear a worksheet range."],["addSheet","Add a worksheet."],["updateSheet","Rename or update a worksheet."],["deleteSheet","Delete a worksheet."],["editRows","Insert or delete worksheet rows."],["editColumns","Insert or delete worksheet columns."],["formatRange","Format a worksheet range."],["manageTable","Create or update a table."],["manageChart","Create or update a chart."],["sortRange","Sort a worksheet range."],["filterRange","Apply or clear a worksheet filter."],["recalculate","Recalculate workbook formulas."],["render","Render a worksheet to an image artifact."],["importCsv","Import CSV data into a worksheet."],["exportCsv","Export a worksheet as CSV."],["exportPdf","Export a workbook or worksheet as PDF."]]),f=u("docs","content",[["manageTable","Create, inspect, update, or delete a document table."],["manageImage","Insert, inspect, update, or delete a document image."],["fillTemplate","Fill tagged document content controls from structured values."],["updateFields","Update document fields."],["inspectStructure","Read document paragraphs, headings, tables, and sections."],["manageBookmarks","List, add, update, or delete document bookmarks."],["manageHyperlinks","List, add, update, or delete document hyperlinks."],["manageLists","Inspect or apply document list formatting."],["manageFootnotes","List, add, or delete document footnotes."],["readContent","Read document content and structure."],["insertContent","Insert content at a document position."],["updateContent","Update a document range."],["deleteContent","Delete a document range."],["findReplace","Find and replace document text."],["setStyles","Apply document styles."],["setSection","Update section settings."],["setHeaderFooter","Update a header or footer."],["manageComments","Create or update document comments."],["manageRevisions","Inspect or manage document revisions."],["render","Render document pages to image artifacts."],["exportPdf","Export the document as PDF."]]),F=[...m,...g,...I,...f];function u(e,s,p){return[a(`${e}.open`,`Open a ${e.toUpperCase()} document and return a governed document handle.`,{path:t.path},["path"]),a(`${e}.create`,`Create a new ${e.toUpperCase()} document at the requested path.`,{path:t.path,title:n("Optional document title.")},["path"]),a(`${e}.inspect`,`Inspect ${e.toUpperCase()} metadata.`,{handleId:t.handleId},["handleId"]),a(`${e}.validate`,`Validate ${e.toUpperCase()} structure.`,{path:t.path},["path"]),...p.map(([r,c])=>a(`${e}.${r}`,c,P(e,r,s),b(r))),a(`${e}.save`,`Save changes to an opened ${e.toUpperCase()} document.`,{handleId:t.handleId,outputPath:t.outputPath},["handleId"]),a(`${e}.close`,`Close an opened ${e.toUpperCase()} document handle.`,{handleId:t.handleId},["handleId"])]}function P(e,s,p){const r={handleId:t.handleId,outputPath:t.outputPath,sourcePath:t.path,sheet:n("Worksheet name."),sheetName:n("New worksheet name."),slide:d("Zero-based slide number."),pages:o("Optional zero-based item indexes."),range:n(`Target ${p} reference.`),start:d("Document character start."),end:d("Document character end."),find:n("Text to find."),replace:n("Replacement text."),content:n("Text or serialized content."),text:n("Text value."),values:i("Structured values."),options:i("Format-specific options."),operation:n("Format-specific operation."),name:n("Named item identifier."),formula:n("Formula or source expression."),formula1:n("Primary validation formula."),formula2:n("Secondary validation formula."),index:d("Zero-based item index."),position:d("Zero-based destination position."),elementIds:h("Element identifiers."),alignment:l(["left","center","right","top","middle","bottom"],"Alignment operation."),distribution:l(["horizontal","vertical"],"Distribution direction."),imagePath:t.path,mediaPath:t.path,width:d("Width in document units."),height:d("Height in document units."),altText:n("Alternative text."),tableName:n("Table or pivot table name."),sourceRange:n("Source worksheet range."),query:n("Search query."),maxResults:d("Maximum result count."),rowStart:d("Zero-based first row."),rowCount:d("Maximum rows."),columnStart:d("Zero-based first column."),columnCount:d("Maximum columns."),bookmark:i("Bookmark definition."),property:n("Property name."),expected:n("Expected value."),level:d("List or outline level."),target:n("Bookmark, hyperlink, or list target."),address:n("Hyperlink destination."),password:n("Protection password when required."),kind:n("Protection target kind."),style:n("Document style name."),listType:l(["bullet","number"],"List type."),effect:d("PowerPoint transition effect code.")};return e==="pptx"&&(r.elementId=n("Slide element identifier.")),r}function b(e){return e==="readSlide"?["handleId","slide"]:e==="readRange"||e==="writeRange"||e==="clearRange"||e==="formatRange"?["handleId","range"]:e==="duplicateSlide"?["handleId","slide"]:e==="importSlides"?["handleId","sourcePath"]:e==="arrangeElements"?["handleId","slide","elementIds","operation"]:e==="findReplace"?["handleId","find","replace"]:e==="find"?["handleId","query"]:e==="setDataValidation"?["handleId","range","operation"]:e==="manageNamedRange"||e==="setDataValidation"||e==="managePivotTable"||e==="manageTable"||e==="manageImage"?["handleId","operation"]:e==="fillTemplate"?["handleId","values"]:e==="updateFields"?["handleId"]:e==="extractText"?["handleId"]:e==="readFormulas"?["handleId","range"]:e==="manageMedia"||e==="manageHyperlinks"||e==="manageTransitions"||e==="manageLayouts"||e==="manageConditionalFormatting"||e==="manageSheetView"||e==="manageComments"||e==="manageProtection"||e==="manageBookmarks"||e==="manageLists"||e==="manageFootnotes"||e==="inspectStructure"?["handleId","operation"]:e==="exportCsv"||e==="exportPdf"||e==="render"?["handleId"]:["handleId"]}function a(e,s,p,r){return{type:"function",function:{name:e,description:s,parameters:{type:"object",properties:p,required:r,additionalProperties:!1}}}}function n(e){return{type:"string",description:e}}function d(e){return{type:"number",description:e}}function l(e,s){return{type:"string",enum:[...e],description:s}}function o(e){return{type:"array",items:{type:"integer"},description:e}}function h(e){return{type:"array",items:{type:"string"},description:e}}function i(e){return{type:"object",additionalProperties:!0,description:e}}function x(e){return{type:"array",items:{type:"object",additionalProperties:!0},description:e}}export{k as DOCUMENT_FORMATS,F as DOCUMENT_TOOL_DEFINITIONS};
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import type { ToolDefinition } from '@lotagate/sdk';
|
|
2
|
-
import type { ToolExecutionContext, ToolExecutor, ToolInfo, ToolResult } from '@lotagate/agent-sdk';
|
|
3
|
-
import type { ToolActivityObserver } from '../../ports/tool-activity.js';
|
|
4
|
-
import { type DocumentFormat } from './document-host-tool-definitions.js';
|
|
5
|
-
export type DocumentHostTool = 'document';
|
|
6
|
-
export interface DocumentHostRequest {
|
|
7
|
-
version: 1;
|
|
8
|
-
type: 'host.request';
|
|
9
|
-
requestId: string;
|
|
10
|
-
tool: DocumentHostTool;
|
|
11
|
-
sessionId: string;
|
|
12
|
-
runId: string;
|
|
13
|
-
action: string;
|
|
14
|
-
params: Record<string, unknown>;
|
|
15
|
-
executionBoundary: 'host';
|
|
16
|
-
hostFallback: 'deny';
|
|
17
|
-
projectRoot?: string;
|
|
18
|
-
executionCwd?: string;
|
|
19
|
-
executionWorkspaceId?: string;
|
|
20
|
-
}
|
|
21
|
-
export interface DocumentHostResponse {
|
|
22
|
-
version: 1;
|
|
23
|
-
type: 'host.response';
|
|
24
|
-
requestId: string;
|
|
25
|
-
tool: DocumentHostTool;
|
|
26
|
-
ok: boolean;
|
|
27
|
-
result?: unknown;
|
|
28
|
-
error?: {
|
|
29
|
-
code: string;
|
|
30
|
-
category: string;
|
|
31
|
-
message: string;
|
|
32
|
-
retryable: boolean;
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
export type DocumentHostInvoker = (request: DocumentHostRequest, signal?: AbortSignal) => Promise<DocumentHostResponse>;
|
|
36
|
-
export declare function documentToolDefinitions(): readonly ToolDefinition[];
|
|
37
|
-
export declare function documentToolDefinitionsForFormats(formats: readonly DocumentFormat[]): readonly ToolDefinition[];
|
|
38
|
-
export declare class DocumentHostToolExecutor implements ToolExecutor {
|
|
39
|
-
private readonly options;
|
|
40
|
-
private readonly definitions;
|
|
41
|
-
constructor(options: {
|
|
42
|
-
request: DocumentHostInvoker;
|
|
43
|
-
formats?: readonly DocumentFormat[];
|
|
44
|
-
onActivity?: ToolActivityObserver;
|
|
45
|
-
});
|
|
46
|
-
listTools(): readonly ToolDefinition[];
|
|
47
|
-
getToolInfo(toolName: string): ToolInfo | undefined;
|
|
48
|
-
execute(toolName: string, input: Record<string, unknown>, context: ToolExecutionContext): Promise<ToolResult>;
|
|
49
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{randomUUID as a}from"node:crypto";import{DOCUMENT_TOOL_DEFINITIONS as i}from"./document-host-tool-definitions.js";function l(){return i}function c(o){const e=new Set(o.map(r=>`${r}.`));return i.filter(r=>[...e].some(t=>u(r)?.startsWith(t)===!0))}class p{options;definitions;constructor(e){this.options=e,this.definitions=e.formats===void 0?i:c(e.formats)}listTools(){return this.definitions}getToolInfo(e){if(!this.definitions.some(t=>u(t)===e))return;const r=/\.(?:open|inspect|validate|readText|readSlide|readRange|readContent|extractTables|recognizeText|search|extractImages|extractLinks|extractAnnotations|readForm|find|readFormulas|inspectStructure|manageRevisions)$/u.test(e);return{toolName:e,source:"custom",executorId:"desktop-document-host",metadata:{risk:r?"read":"unknown"}}}async execute(e,r,t){if(!this.definitions.some(n=>u(n)===e))return{content:`Unknown document tool: ${e}`,isError:!0};const s=this.options.onActivity?.start({key:`${t.runId}:${e}`,toolName:e,source:"custom",label:e.replace(/\./u," ")});try{const n=await this.options.request({version:1,type:"host.request",requestId:a(),tool:"document",sessionId:t.sessionId,runId:t.runId,action:e,params:r,executionBoundary:"host",hostFallback:"deny",...t.workspaceRoot===void 0?{}:{projectRoot:t.workspaceRoot},...t.cwd===void 0?{}:{executionCwd:t.cwd}},t.signal);return n.ok?(s?.complete(!1),{content:d(n.result,t.maxResultBytes),isError:!1,metadata:{document:!0}}):(s?.complete(!0),{content:n.error?.message??"Desktop rejected the document action.",isError:!0,metadata:{code:n.error?.code??"DOCUMENT_HOST_ERROR",retryable:n.error?.retryable??!1}})}catch(n){return s?.complete(!0),{content:n instanceof Error?n.message:"Document host request failed.",isError:!0}}}}function u(o){return"function"in o?o.function.name:void 0}function d(o,e){const r=typeof o=="string"?o:JSON.stringify(o??null);return Buffer.byteLength(r,"utf8")<=e?r:`${r.slice(0,Math.max(0,e-12))}
|
|
2
|
-
[truncated]`}export{p as DocumentHostToolExecutor,l as documentToolDefinitions,c as documentToolDefinitionsForFormats};
|