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
105 lines
3.7 KiB
TypeScript
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 }
|
|
}
|
|
}
|