Files
WeHub Mirror 6bf8bebf51
CI / Test and Build (push) Failing after 1s
CI / Migrate Dev DB (push) Has been skipped
CI / Migrate DB (push) Has been skipped
CodeQL / Analyze actions (push) Has been cancelled
CodeQL / Analyze javascript-typescript (push) Has been cancelled
CI / Detect Version (push) Has been cancelled
CI / Detect Desktop Changes (push) Has been cancelled
CI / Build AMD64 (blacksmith-2vcpu-ubuntu-2404, ./docker/cron.Dockerfile, ubuntu-latest, ghcr.io/simstudioai/cron) (push) Has been cancelled
CI / Build AMD64 (blacksmith-2vcpu-ubuntu-2404, ./docker/db.Dockerfile, ECR_MIGRATIONS, ubuntu-latest, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build AMD64 (blacksmith-4vcpu-ubuntu-2404, ./docker/pii.Dockerfile, ECR_PII, ubuntu-latest, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build AMD64 (blacksmith-4vcpu-ubuntu-2404, ./docker/realtime.Dockerfile, ECR_REALTIME, ubuntu-latest, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Build AMD64 (blacksmith-8vcpu-ubuntu-2404, ./docker/app.Dockerfile, ECR_APP, linux-x64-8-core, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (blacksmith-4vcpu-ubuntu-2404-arm, ./docker/cron.Dockerfile, ubuntu-24.04-arm, ghcr.io/simstudioai/cron) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (blacksmith-4vcpu-ubuntu-2404-arm, ./docker/db.Dockerfile, ubuntu-24.04-arm, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (blacksmith-4vcpu-ubuntu-2404-arm, ./docker/pii.Dockerfile, ubuntu-24.04-arm, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (blacksmith-4vcpu-ubuntu-2404-arm, ./docker/realtime.Dockerfile, ubuntu-24.04-arm, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (blacksmith-8vcpu-ubuntu-2404-arm, ./docker/app.Dockerfile, linux-arm64-8-core, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Check Docs Changes (push) Has been cancelled
Publish CLI Package / publish-npm (push) Has been cancelled
Publish Python SDK / publish-pypi (push) Has been cancelled
CI / Deploy Trigger.dev (Dev) (push) Has been cancelled
Helm Chart / Lint, test, and validate chart (push) Has been cancelled
Helm Chart / Chart version bumped (push) Has been cancelled
Publish TypeScript SDK / publish-npm (push) Has been cancelled
CI / Build Dev ECR (blacksmith-8vcpu-ubuntu-2404, ./docker/app.Dockerfile, ECR_APP, linux-x64-8-core) (push) Has been cancelled
CI / Promote Images (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/cron) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Build Dev ECR (blacksmith-2vcpu-ubuntu-2404, ./docker/db.Dockerfile, ECR_MIGRATIONS, ubuntu-latest) (push) Has been cancelled
CI / Build Dev ECR (blacksmith-4vcpu-ubuntu-2404, ./docker/pii.Dockerfile, ECR_PII, ubuntu-latest) (push) Has been cancelled
CI / Build Dev ECR (blacksmith-4vcpu-ubuntu-2404, ./docker/realtime.Dockerfile, ECR_REALTIME, ubuntu-latest) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Process Docs (push) Has been cancelled
CI / Create GitHub Release (push) Has been cancelled
CI / Check Desktop Signing Secrets (push) Has been cancelled
CI / Desktop Release (push) Has been cancelled
CI / Create Desktop Prerelease (push) Has been cancelled
CI / Desktop Prerelease Build (push) Has been cancelled
CI / Publish Desktop Prerelease (push) Has been cancelled
CI / Prune Desktop Prereleases (push) Has been cancelled
Helm Chart / Install on kind and run helm test (push) Has been cancelled
WeHub snapshot of cb28d14c6f2c081de7a0d8729a8c816c9adef67a
2026-08-10 11:17:50 +08:00

105 lines
3.7 KiB
TypeScript

import { AsyncLocalStorage } from 'node:async_hooks'
import { getErrorMessage } from '@sim/utils/errors'
import { projectToolResultForCopilot } from '@/lib/copilot/request/tools/resolved-secret-result'
import type { ToolExecutionResult } from '@/lib/copilot/tool-executor/types'
import type { ResolvedSecretTraceRegistry } from '@/executor/utils/resolved-secret-trace-registry'
import { getPreparedProviderToolInputProvenance } from '@/providers/tool-input-provenance'
import { type ExecuteToolOptions, executeTool } from '@/tools'
import type { ToolResponse } from '@/tools/types'
export interface ProviderRuntimeContext {
resolvedSecretTraceRegistry?: ResolvedSecretTraceRegistry
}
export type ExecuteProviderToolOptions = ExecuteToolOptions
export interface ProviderToolExecutionResult {
/** Original tool response retained for workflow outputs, traces, costs, files, and resources. */
rawResponse: ToolResponse
/** Copy safe to serialize into the next model request. */
modelResponse: ToolResponse
}
const providerRuntimeContext = new AsyncLocalStorage<ProviderRuntimeContext | undefined>()
export function runWithProviderRuntimeContext<T>(
context: ProviderRuntimeContext | undefined,
callback: () => T
): T {
return providerRuntimeContext.run(context, callback)
}
function toProviderModelResponse(
rawResponse: ToolResponse,
projectedResponse: ToolExecutionResult
): ToolResponse {
const { output: _output, error: _error, ...functionalFields } = rawResponse
return {
...functionalFields,
output: Object.hasOwn(projectedResponse, 'output')
? (projectedResponse.output as ToolResponse['output'])
: {},
...(projectedResponse.error !== undefined ? { error: projectedResponse.error } : {}),
}
}
export async function executeProviderTool(
toolId: string,
params: Parameters<typeof executeTool>[1],
options: ExecuteProviderToolOptions = {}
): Promise<ProviderToolExecutionResult> {
const runtimeContext = providerRuntimeContext.getStore()
const registry =
options.resolvedSecretTraceRegistry ?? runtimeContext?.resolvedSecretTraceRegistry
if (runtimeContext && !registry) {
const response: ToolResponse = { success: false, output: {} }
return { rawResponse: response, modelResponse: response }
}
const preparedInputProvenance = getPreparedProviderToolInputProvenance(params)
const toolCallRegistry = registry
? preparedInputProvenance
? preparedInputProvenance.registry.forkForInputPaths(preparedInputProvenance.inputPaths, {
propagated: true,
})
: runtimeContext
? registry.forkForInputPaths([])
: registry.forkForToolCall()
: undefined
try {
const result = await executeTool(toolId, params, {
...options,
resolvedSecretTraceRegistry: toolCallRegistry,
})
if (!registry || !toolCallRegistry) {
return { rawResponse: result, modelResponse: result }
}
const modelResponse = toProviderModelResponse(
result,
projectToolResultForCopilot(result, toolCallRegistry)
)
registry.mergeToolCallRegistry(toolCallRegistry)
return { rawResponse: result, modelResponse }
} catch (error) {
if (!registry || !toolCallRegistry) throw error
const errorName =
error && typeof error === 'object' && 'name' in error ? String(error.name) : undefined
registry.mergeToolCallRegistry(toolCallRegistry)
if (errorName === 'AbortError' || errorName === 'APIUserAbortError') {
throw error
}
const rawResponse: ToolResponse = {
success: false,
output: {},
error: getErrorMessage(error),
}
const modelResponse = toProviderModelResponse(
rawResponse,
projectToolResultForCopilot(rawResponse, toolCallRegistry)
)
return { rawResponse, modelResponse }
}
}