@cuylabs/agent-physical-capx 5.0.2
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/LICENSE +201 -0
- package/README.md +161 -0
- package/dist/agent.d.ts +57 -0
- package/dist/agent.js +14 -0
- package/dist/agent.js.map +1 -0
- package/dist/chunk-C53NNB7T.js +107 -0
- package/dist/chunk-C53NNB7T.js.map +1 -0
- package/dist/chunk-MYO63CWO.js +869 -0
- package/dist/chunk-MYO63CWO.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -0
- package/dist/session-BxaROlXW.d.ts +202 -0
- package/dist/session.d.ts +3 -0
- package/dist/session.js +11 -0
- package/dist/session.js.map +1 -0
- package/docs/README.md +16 -0
- package/docs/agent-core-integration.md +73 -0
- package/docs/how-it-works.md +151 -0
- package/docs/limitations.md +25 -0
- package/examples/.env.example +36 -0
- package/examples/01-capx-runtime-solver.ts +162 -0
- package/examples/02-capx-runtime-autosolve.ts +307 -0
- package/examples/README.md +387 -0
- package/examples/_setup.ts +61 -0
- package/package.json +76 -0
- package/skills/capx-code-as-policy/SKILL.md +22 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/session.ts","../src/live-runtime/index.ts","../src/live-runtime/http-client.ts","../src/live-runtime/utils.ts","../src/live-runtime/mappers.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { Tool } from \"@cuylabs/agent-core/tool\";\nimport {\n createPhysicalSessionTools,\n type PhysicalArtifact,\n type PhysicalCapability,\n type PhysicalExecutionRequest,\n type PhysicalExecutionTrace,\n type PhysicalListArtifactsOptions,\n type PhysicalObservation,\n type PhysicalObserveOptions,\n type PhysicalSession,\n type PhysicalSessionStartOptions,\n type PhysicalSessionState,\n type PhysicalToolOptions,\n} from \"@cuylabs/agent-physical\";\nimport { z } from \"zod\";\nimport { CapxLiveRuntime } from \"./live-runtime/index.js\";\nimport type { CapxSessionOptions } from \"./types.js\";\n\nconst RUNTIME_DEFAULT_TASK_ID = \"capx-agent-runtime-defaults\";\nconst RUNTIME_DEFAULT_TASK_DESCRIPTION =\n \"CaP-X config managed by capx-agent-runtime\";\n\nexport class CapxSession implements PhysicalSession {\n readonly id: string;\n readonly options: CapxSessionOptions;\n readonly capabilities?: readonly PhysicalCapability[];\n readonly executeCode?: (\n request: PhysicalExecutionRequest,\n ) => Promise<PhysicalExecutionTrace>;\n\n #status: PhysicalSessionState[\"status\"] = \"idle\";\n #startedAt: number | undefined;\n #updatedAt = Date.now();\n #message: string | undefined;\n #liveRuntime: CapxLiveRuntime | undefined;\n\n constructor(options: CapxSessionOptions, id = `capx-${randomUUID()}`) {\n this.options = {\n mode: \"runtime\",\n physicalMode: \"unknown\",\n policyExecutionMode: \"live-runtime\",\n ...options,\n };\n this.id = id;\n if (this.options.enablePolicyCodeExecution) {\n this.capabilities = [\n {\n name: \"capx_live_runtime_policy_code\",\n description:\n \"Execute supplied Python policy code through capx-agent-runtime in a live CaP-X environment.\",\n safety: {\n riskLevel: \"dangerous\",\n requiresApproval: true,\n requiresHumanPresence: this.options.physicalMode === \"hardware\",\n allowedModes:\n this.options.physicalMode === \"hardware\"\n ? [\"hardware\"]\n : [\"simulation\", \"hybrid\", \"unknown\"],\n },\n metadata: {\n capx: {\n executionMode: \"live-runtime\",\n activeProcessInjection: false,\n activeRuntimeSession: true,\n runtimeServer: \"capx-agent-runtime\",\n loopOwner: \"agent-core\",\n },\n },\n },\n ];\n this.executeCode = (request) => this.#executePolicyCode(request);\n }\n }\n\n #runtime(): CapxLiveRuntime {\n if (!this.#liveRuntime) {\n this.#liveRuntime = new CapxLiveRuntime(\n this.options,\n `${this.id}-runtime`,\n );\n }\n return this.#liveRuntime;\n }\n\n async #ensureLiveRuntime(): Promise<CapxLiveRuntime> {\n const runtime = this.#runtime();\n await runtime.start();\n return runtime;\n }\n\n async #executePolicyCode(\n request: PhysicalExecutionRequest,\n ): Promise<PhysicalExecutionTrace> {\n this.#status = \"running\";\n this.#updatedAt = Date.now();\n try {\n return await this.#runtime().execute(request);\n } finally {\n this.#status = \"ready\";\n this.#updatedAt = Date.now();\n }\n }\n\n getState(): PhysicalSessionState {\n return {\n sessionId: this.id,\n status: this.#status,\n task: this.options.task ?? {\n id: RUNTIME_DEFAULT_TASK_ID,\n description: RUNTIME_DEFAULT_TASK_DESCRIPTION,\n environment: \"capx\",\n mode: this.options.physicalMode,\n },\n mode: this.options.physicalMode,\n startedAt: this.#startedAt,\n updatedAt: this.#updatedAt,\n message: this.#message,\n metadata: {\n capx: {\n mode: this.options.mode,\n runtimeServerUrl: this.options.runtimeServerUrl,\n policyExecution: {\n enabled: this.options.enablePolicyCodeExecution ?? false,\n mode: this.options.enablePolicyCodeExecution\n ? \"live-runtime\"\n : \"none\",\n activeProcessInjection: false,\n activeRuntimeSession: true,\n runtimeServer: \"capx-agent-runtime\",\n loopOwner: \"agent-core\",\n },\n },\n },\n };\n }\n\n async start(\n options?: PhysicalSessionStartOptions,\n ): Promise<PhysicalSessionState> {\n if (this.#status === \"running\" || this.#status === \"ready\") {\n return this.getState();\n }\n\n this.#startedAt = Date.now();\n this.#updatedAt = this.#startedAt;\n this.#message = undefined;\n\n if (options?.task) {\n this.options.task = options.task;\n }\n\n this.#status = \"starting\";\n await this.#ensureLiveRuntime();\n this.#status = \"ready\";\n this.#message =\n \"Connected to capx-agent-runtime live session; agent-core owns the trial loop.\";\n this.#updatedAt = Date.now();\n return this.getState();\n }\n\n async observe(\n options: PhysicalObserveOptions = {},\n ): Promise<PhysicalObservation> {\n const items: PhysicalObservation[\"items\"] = [];\n const state = this.getState();\n if (this.#liveRuntime) {\n const observation = await this.#liveRuntime.observe();\n if (observation.taskPrompt) {\n items.push({\n kind: \"text\",\n source: \"capx:runtime:task-prompt\",\n text: observation.taskPrompt,\n timestamp: Date.now(),\n });\n }\n if (observation.multiTurnPrompt) {\n items.push({\n kind: \"text\",\n source: \"capx:runtime:multi-turn-prompt\",\n text: observation.multiTurnPrompt,\n timestamp: Date.now(),\n });\n }\n if (observation.fullPrompt) {\n items.push({\n kind: \"text\",\n source: \"capx:runtime:full-prompt\",\n text: JSON.stringify(observation.fullPrompt, null, 2),\n timestamp: Date.now(),\n });\n }\n if (observation.runtimeConfig) {\n items.push({\n kind: \"text\",\n source: \"capx:runtime:config\",\n text: JSON.stringify(observation.runtimeConfig, null, 2),\n timestamp: Date.now(),\n });\n }\n if (observation.codeContext) {\n items.push({\n kind: \"text\",\n source: \"capx:runtime:code-context\",\n text: JSON.stringify(observation.codeContext, null, 2),\n timestamp: Date.now(),\n });\n }\n if (observation.lastStep) {\n items.push({\n kind: \"text\",\n source: \"capx:runtime:last-step\",\n text: JSON.stringify(observation.lastStep, null, 2),\n timestamp: Date.now(),\n });\n }\n if (options.includeImages) {\n try {\n const frame = await this.#liveRuntime.renderFrame(\"main\");\n if (frame.dataUrl) {\n items.push({\n kind: \"rgb\",\n source: \"capx:runtime:main-camera\",\n dataUrl: frame.dataUrl,\n width: frame.width,\n height: frame.height,\n mimeType: frame.mimeType,\n frame: \"camera\",\n timestamp: frame.timestamp ? frame.timestamp * 1000 : Date.now(),\n });\n }\n } catch (error) {\n items.push({\n kind: \"text\",\n source: \"capx:runtime:render-error\",\n text: error instanceof Error ? error.message : String(error),\n timestamp: Date.now(),\n });\n }\n }\n } else {\n items.push({\n kind: \"text\",\n source: \"capx:runtime:session\",\n text:\n \"No live CaP-X runtime session has started. The host application must call session.start() or createCapxAgent({ startSession: true }) before the agent can observe or solve the current CaP-X trial.\",\n timestamp: Date.now(),\n });\n }\n if (this.#liveRuntime?.stdoutTail) {\n items.push({\n kind: \"text\",\n source: \"capx:runtime:stdout\",\n text: this.#liveRuntime.stdoutTail,\n timestamp: this.#updatedAt,\n });\n }\n if (this.#liveRuntime?.stderrTail) {\n items.push({\n kind: \"text\",\n source: \"capx:runtime:stderr\",\n text: this.#liveRuntime.stderrTail,\n timestamp: this.#updatedAt,\n });\n }\n\n if (options.includeArtifacts && this.listArtifacts) {\n const artifacts = await this.listArtifacts({ limit: options.maxItems });\n for (const artifact of artifacts) {\n items.push({\n kind: \"artifact\",\n source: \"capx:outputs\",\n data: artifact,\n timestamp: this.#updatedAt,\n });\n }\n }\n\n const maxItems = options.maxItems ?? items.length;\n const selected = items.slice(0, maxItems);\n return {\n sessionId: this.id,\n status: state.status,\n taskId: state.task?.id,\n summary:\n selected.length === 0\n ? \"No CaP-X output has been captured yet.\"\n : `${selected.length} CaP-X observation item(s) captured.`,\n items: selected,\n metadata: state.metadata,\n timestamp: Date.now(),\n };\n }\n\n async reset(\n options?: PhysicalSessionStartOptions,\n ): Promise<PhysicalSessionState> {\n if (options?.task) {\n this.options.task = options.task;\n }\n this.#status = \"starting\";\n const runtime = await this.#ensureLiveRuntime();\n await runtime.reset(this.options.policyExecutionTrial);\n this.#status = \"ready\";\n this.#message = \"Reset capx-agent-runtime live session.\";\n this.#updatedAt = Date.now();\n return this.getState();\n }\n\n async listArtifacts(\n options: PhysicalListArtifactsOptions = {},\n ): Promise<PhysicalArtifact[]> {\n const runtime = await this.#ensureLiveRuntime();\n const artifacts = await runtime.listArtifacts(options.limit ?? 50);\n return options.kind\n ? artifacts.filter((artifact) => artifact.kind === options.kind)\n : artifacts;\n }\n\n async getRuntimeTurnHistory(): Promise<unknown[]> {\n if (!this.#liveRuntime) {\n return [];\n }\n return this.#liveRuntime.turnHistory();\n }\n\n async getRuntimeSkillLibrary() {\n if (!this.#liveRuntime) {\n return {\n summary: \"No live CaP-X runtime session has started.\",\n total: 0,\n promoted: 0,\n skills: [],\n };\n }\n return this.#liveRuntime.skillLibrary();\n }\n\n async extractRuntimeSkills(\n options: {\n code?: string;\n taskName?: string;\n } = {},\n ) {\n const runtime = await this.#ensureLiveRuntime();\n return runtime.extractSkills(options);\n }\n\n async injectRuntimeSkillLibrary(minOccurrences = 2) {\n const runtime = await this.#ensureLiveRuntime();\n return runtime.injectSkillLibrary(minOccurrences);\n }\n\n async stop(reason?: string): Promise<PhysicalSessionState> {\n this.#message = reason ?? \"Stop requested.\";\n this.#updatedAt = Date.now();\n\n if (this.#liveRuntime) {\n this.#status = \"stopping\";\n await this.#liveRuntime.stop();\n this.#liveRuntime = undefined;\n this.#status = \"stopped\";\n this.#updatedAt = Date.now();\n return this.getState();\n }\n\n this.#status = \"stopped\";\n return this.getState();\n }\n}\n\nexport function createCapxSession(options: CapxSessionOptions): CapxSession {\n return new CapxSession(options);\n}\n\nexport function createCapxPhysicalTools(\n session: PhysicalSession | CapxSession,\n options: PhysicalToolOptions = {},\n) {\n const tools = createPhysicalSessionTools(session, {\n prefix: \"capx\",\n ...options,\n });\n if (\n session instanceof CapxSession &&\n session.options.policyExecutionMode === \"live-runtime\"\n ) {\n tools.push(createCapxTurnHistoryTool(session, options));\n }\n return tools;\n}\n\nfunction capxToolName(name: string, options?: PhysicalToolOptions): string {\n return `${options?.prefix ?? \"capx\"}_${name}`;\n}\n\nfunction createCapxTurnHistoryTool(\n session: CapxSession,\n options?: PhysicalToolOptions,\n) {\n return Tool.define(\n capxToolName(\"turn_history\", options),\n {\n description:\n \"List policy-code turns executed through the live CaP-X runtime session.\",\n parameters: z.object({}),\n capabilities: {\n parallelSafe: true,\n readOnly: true,\n riskLevel: \"safe\",\n },\n execute: async () => {\n const turns = await session.getRuntimeTurnHistory();\n return {\n title: \"CaP-X Turn History\",\n output:\n turns.length === 0\n ? \"No CaP-X runtime turns have executed yet.\"\n : `${turns.length} CaP-X runtime turn(s).`,\n metadata: {\n physical: {\n sessionId: session.id,\n },\n capx: {\n turns,\n },\n },\n };\n },\n },\n {\n capabilitiesHint: {\n parallelSafe: true,\n readOnly: true,\n riskLevel: \"safe\",\n },\n },\n );\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n PhysicalArtifact,\n PhysicalExecutionRequest,\n PhysicalExecutionTrace,\n} from \"@cuylabs/agent-physical\";\nimport { CapxRuntimeHttpClient } from \"./http-client.js\";\nimport {\n mapExecutionResult,\n mapFrame,\n mapObservation,\n mapRuntimeArtifact,\n mapSkillExtraction,\n mapSkillInjection,\n} from \"./mappers.js\";\nexport type {\n RuntimeCodeAffordance,\n RuntimeCodeContext,\n RuntimeExecutionResult,\n RuntimeFrame,\n RuntimeObservation,\n RuntimeSkillExtraction,\n RuntimeSkillInjection,\n RuntimeSkillLibrary,\n RuntimeTurn,\n} from \"./schema.js\";\nimport type {\n RuntimeArtifactsResponse,\n RuntimeCreateSessionResponse,\n RuntimeExecutionResponse,\n RuntimeFrame,\n RuntimeFrameResponse,\n RuntimeObservation,\n RuntimeObservationResponse,\n RuntimeSkillExtraction,\n RuntimeSkillExtractionResponse,\n RuntimeSkillInjection,\n RuntimeSkillInjectionResponse,\n RuntimeSkillLibrary,\n RuntimeSkillLibraryResponse,\n RuntimeTurn,\n RuntimeTurnHistoryResponse,\n} from \"./schema.js\";\nimport { failedTrace, resolveOutputDir, withoutUndefined } from \"./utils.js\";\nimport type { CapxSessionOptions } from \"../types.js\";\n\nconst DEFAULT_OUTPUT_DIR = \"outputs/agent-physical-capx-live\";\n\nexport class CapxLiveRuntime {\n readonly id: string;\n readonly outputDir: string;\n\n #client: CapxRuntimeHttpClient;\n #sessionId: string | undefined;\n #lastObservation: RuntimeObservation | undefined;\n\n constructor(\n readonly options: CapxSessionOptions,\n id = `capx-live-${randomUUID()}`,\n ) {\n this.id = id;\n this.outputDir = resolveOutputDir(options, DEFAULT_OUTPUT_DIR);\n this.#client = new CapxRuntimeHttpClient(options);\n }\n\n get stdoutTail(): string {\n return this.#client.stdoutTail;\n }\n\n get stderrTail(): string {\n return this.#client.stderrTail;\n }\n\n get running(): boolean {\n return this.#sessionId !== undefined && this.#client.ready;\n }\n\n async start(): Promise<RuntimeObservation> {\n if (this.#sessionId && this.#lastObservation) {\n return this.#lastObservation;\n }\n\n try {\n await this.#client.ensureStarted();\n const response = await this.#client.request<RuntimeCreateSessionResponse>(\n \"POST\",\n \"/sessions\",\n this.#sessionOptionsPayload(),\n );\n const sessionId = response.sessionId ?? response.session_id;\n if (!sessionId) {\n throw new Error(\"capx-agent-runtime did not return a session id.\");\n }\n this.#sessionId = sessionId;\n this.#lastObservation = mapObservation(response.observation);\n return this.#lastObservation;\n } catch (error) {\n await this.stop();\n throw error;\n }\n }\n\n async observe(): Promise<RuntimeObservation> {\n await this.start();\n const response = await this.#client.request<RuntimeObservationResponse>(\n \"GET\",\n `/sessions/${this.#requireSessionId()}/observe`,\n undefined,\n this.options.runtimeServerRequestTimeoutMs,\n );\n const observation = mapObservation(response.observation);\n this.#lastObservation = observation;\n return observation;\n }\n\n async renderFrame(camera = \"main\"): Promise<RuntimeFrame> {\n await this.start();\n const response = await this.#client.request<RuntimeFrameResponse>(\n \"GET\",\n `/sessions/${this.#requireSessionId()}/render?camera=${encodeURIComponent(camera)}`,\n undefined,\n this.options.runtimeServerRequestTimeoutMs,\n );\n return mapFrame(response);\n }\n\n async turnHistory(): Promise<RuntimeTurn[]> {\n await this.start();\n const response = await this.#client.request<RuntimeTurnHistoryResponse>(\n \"GET\",\n `/sessions/${this.#requireSessionId()}/turns`,\n undefined,\n this.options.runtimeServerRequestTimeoutMs,\n );\n return response.turns ?? [];\n }\n\n async skillLibrary(): Promise<RuntimeSkillLibrary> {\n await this.start();\n return await this.#client.request<RuntimeSkillLibraryResponse>(\n \"GET\",\n `/sessions/${this.#requireSessionId()}/skill-library`,\n undefined,\n this.options.runtimeServerRequestTimeoutMs,\n );\n }\n\n async extractSkills(\n options: {\n code?: string;\n taskName?: string;\n } = {},\n ): Promise<RuntimeSkillExtraction> {\n await this.start();\n const response = await this.#client.request<RuntimeSkillExtractionResponse>(\n \"POST\",\n `/sessions/${this.#requireSessionId()}/skill-library/extract`,\n withoutUndefined({\n code: options.code,\n task_name: options.taskName,\n }),\n this.options.runtimeServerRequestTimeoutMs,\n );\n return mapSkillExtraction(response);\n }\n\n async injectSkillLibrary(minOccurrences = 2): Promise<RuntimeSkillInjection> {\n await this.start();\n const response = await this.#client.request<RuntimeSkillInjectionResponse>(\n \"POST\",\n `/sessions/${this.#requireSessionId()}/skill-library/inject`,\n {\n min_occurrences: minOccurrences,\n },\n this.options.runtimeServerRequestTimeoutMs,\n );\n return mapSkillInjection(response);\n }\n\n async listArtifacts(limit = 50): Promise<PhysicalArtifact[]> {\n await this.start();\n const response = await this.#client.request<RuntimeArtifactsResponse>(\n \"GET\",\n `/sessions/${this.#requireSessionId()}/artifacts`,\n undefined,\n this.options.runtimeServerRequestTimeoutMs,\n );\n const artifacts = response.artifacts ?? [];\n const baseUrl = this.#client.requireBaseUrl();\n return artifacts\n .slice(0, limit)\n .map((artifact) => mapRuntimeArtifact(artifact, baseUrl));\n }\n\n async reset(trial?: number): Promise<RuntimeObservation> {\n await this.start();\n const response = await this.#client.request<RuntimeObservationResponse>(\n \"POST\",\n `/sessions/${this.#requireSessionId()}/reset`,\n withoutUndefined({ trial }),\n this.options.runtimeServerRequestTimeoutMs,\n );\n const observation = mapObservation(response.observation);\n this.#lastObservation = observation;\n return observation;\n }\n\n async execute(\n request: PhysicalExecutionRequest,\n ): Promise<PhysicalExecutionTrace> {\n const preflightFailure = this.#validateExecutionRequest(request);\n if (preflightFailure) {\n return preflightFailure;\n }\n if (request.dryRun) {\n return dryRunTrace(request);\n }\n\n await this.start();\n const startedAt = Date.now();\n const traceId = `capx-live-${randomUUID()}`;\n const response = await this.#client.request<RuntimeExecutionResponse>(\n \"POST\",\n `/sessions/${this.#requireSessionId()}/execute-code`,\n { code: request.code },\n request.timeoutMs ??\n this.options.policyExecutionTimeoutMs ??\n this.options.runtimeServerRequestTimeoutMs,\n );\n const result = mapExecutionResult(response.result) ?? {\n success: false,\n stderr: \"capx-agent-runtime returned no execution result.\",\n };\n this.#lastObservation = {\n ...this.#lastObservation,\n lastStep: result,\n };\n\n return {\n id: traceId,\n startedAt,\n completedAt: Date.now(),\n request,\n stdout: result.stdout ?? \"\",\n stderr: result.stderr ?? \"\",\n artifacts: await this.#listExecutionArtifacts(),\n outcome: {\n success: result.success,\n reward: result.reward,\n taskCompleted: result.taskCompleted ?? undefined,\n terminated: result.terminated,\n truncated: result.truncated,\n metadata: {\n sandboxRc: result.sandboxRc,\n elapsedMs: result.elapsedMs,\n codePath: result.codePath,\n diagnostics: result.diagnostics,\n runtimeServer: \"capx-agent-runtime\",\n },\n },\n metadata: {\n capx: {\n executionMode: \"live-runtime\",\n runtimeServer: \"capx-agent-runtime\",\n runtimeServerUrl: this.#client.baseUrl,\n outputDir: this.outputDir,\n },\n },\n };\n }\n\n async stop(): Promise<void> {\n const sessionId = this.#sessionId;\n this.#sessionId = undefined;\n this.#lastObservation = undefined;\n await this.#client.stop(sessionId);\n }\n\n #sessionOptionsPayload(): Record<string, unknown> {\n return withoutUndefined({\n trial: this.options.policyExecutionTrial,\n output_dir: this.options.outputDir,\n record_video: this.options.policyExecutionRecordVideo,\n start_api_servers: this.options.policyExecutionStartApiServers,\n skill_library_path: this.options.skillLibraryPath,\n });\n }\n\n #validateExecutionRequest(\n request: PhysicalExecutionRequest,\n ): PhysicalExecutionTrace | undefined {\n if (request.language && request.language !== \"python\") {\n return failedTrace(\n request,\n `CaP-X live runtime only supports Python, got ${request.language}.`,\n );\n }\n if (\n this.options.physicalMode === \"hardware\" &&\n !this.options.allowHardwarePolicyExecution\n ) {\n return failedTrace(\n request,\n \"Hardware policy execution is blocked. Set allowHardwarePolicyExecution to opt in.\",\n { physicalMode: this.options.physicalMode },\n );\n }\n return undefined;\n }\n\n async #listExecutionArtifacts(): Promise<PhysicalArtifact[]> {\n try {\n return await this.listArtifacts(50);\n } catch {\n return [];\n }\n }\n\n #requireSessionId(): string {\n if (!this.#sessionId) {\n throw new Error(\"capx-agent-runtime session is not started.\");\n }\n return this.#sessionId;\n }\n}\n\nfunction dryRunTrace(\n request: PhysicalExecutionRequest,\n): PhysicalExecutionTrace {\n const now = Date.now();\n return {\n id: `capx-live-${randomUUID()}`,\n startedAt: now,\n completedAt: now,\n request,\n stdout: \"Dry run accepted; code was not executed.\",\n outcome: {\n success: true,\n metadata: {\n dryRun: true,\n },\n },\n metadata: {\n capx: {\n executionMode: \"live-runtime\",\n runtimeServer: \"capx-agent-runtime\",\n },\n },\n };\n}\n","import { setTimeout as sleep } from \"node:timers/promises\";\nimport type { CapxSessionOptions } from \"../types.js\";\nimport {\n DEFAULT_RUNTIME_REQUEST_TIMEOUT_MS,\n normalizeBaseUrl,\n} from \"./utils.js\";\n\nexport class CapxRuntimeHttpClient {\n #baseUrl: string | undefined;\n\n constructor(readonly options: CapxSessionOptions) {}\n\n get baseUrl(): string | undefined {\n return this.#baseUrl;\n }\n\n get stdoutTail(): string {\n return \"\";\n }\n\n get stderrTail(): string {\n return \"\";\n }\n\n get ready(): boolean {\n return this.#baseUrl !== undefined;\n }\n\n async ensureStarted(): Promise<void> {\n if (this.#baseUrl) {\n return;\n }\n\n this.#baseUrl = normalizeBaseUrl(this.options.runtimeServerUrl);\n await this.#waitForHealth(\n this.options.runtimeServerStartupTimeoutMs ?? 5_000,\n );\n }\n\n async request<T = unknown>(\n method: \"GET\" | \"POST\",\n route: string,\n body?: Record<string, unknown>,\n timeoutMs = this.options.runtimeServerRequestTimeoutMs ??\n this.options.policyExecutionTimeoutMs ??\n DEFAULT_RUNTIME_REQUEST_TIMEOUT_MS,\n ): Promise<T> {\n const baseUrl = this.requireBaseUrl();\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n timer.unref();\n try {\n const response = await fetch(`${baseUrl}${route}`, {\n method,\n headers: body\n ? {\n \"content-type\": \"application/json\",\n }\n : undefined,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n if (!response.ok) {\n const text = await response.text();\n throw new Error(\n `capx-agent-runtime ${method} ${route} failed with ${response.status}: ${text}`,\n );\n }\n return (await response.json()) as T;\n } finally {\n clearTimeout(timer);\n }\n }\n\n async stop(sessionId?: string): Promise<void> {\n if (!sessionId || !this.#baseUrl) {\n return;\n }\n try {\n await this.request(\"POST\", `/sessions/${sessionId}/stop`, {}, 5_000);\n } catch {\n // A local stop request should not mask the caller's original shutdown path.\n }\n }\n\n requireBaseUrl(): string {\n if (!this.#baseUrl) {\n throw new Error(\"capx-agent-runtime base URL is not configured.\");\n }\n return this.#baseUrl;\n }\n\n async #waitForHealth(timeoutMs: number): Promise<void> {\n const started = Date.now();\n let lastError: unknown;\n while (Date.now() - started < timeoutMs) {\n try {\n await this.request(\"GET\", \"/health\", undefined, 1_000);\n return;\n } catch (error) {\n lastError = error;\n await sleep(250);\n }\n }\n\n throw new Error(\n `Timed out waiting for capx-agent-runtime health after ${timeoutMs}ms. ${String(\n lastError,\n )}`,\n );\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n PhysicalExecutionRequest,\n PhysicalExecutionTrace,\n} from \"@cuylabs/agent-physical\";\nimport type { CapxSessionOptions } from \"../types.js\";\n\nexport const DEFAULT_RUNTIME_REQUEST_TIMEOUT_MS = 1_000_000;\n\nexport function normalizeBaseUrl(value: string): string {\n return value.replace(/\\/+$/, \"\");\n}\n\nexport function resolveOutputDir(\n options: CapxSessionOptions,\n fallback: string,\n): string {\n return options.outputDir ?? fallback;\n}\n\nexport function withoutUndefined(\n value: Record<string, unknown>,\n): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(value).filter(([, item]) => item !== undefined),\n );\n}\n\nexport function failedTrace(\n request: PhysicalExecutionRequest,\n reason: string,\n metadata: Record<string, unknown> = {},\n): PhysicalExecutionTrace {\n const now = Date.now();\n return {\n id: `capx-live-${randomUUID()}`,\n startedAt: now,\n completedAt: now,\n request,\n stderr: reason,\n outcome: {\n success: false,\n reason,\n },\n metadata,\n };\n}\n","import type { PhysicalArtifact } from \"@cuylabs/agent-physical\";\nimport type {\n RuntimeApiExecutionResult,\n RuntimeApiObservation,\n RuntimeApiCodeAffordance,\n RuntimeApiCodeContext,\n RuntimeArtifactResponse,\n RuntimeCodeAffordance,\n RuntimeCodeContext,\n RuntimeExecutionResult,\n RuntimeFrame,\n RuntimeFrameResponse,\n RuntimeObservation,\n RuntimeSkillExtraction,\n RuntimeSkillExtractionResponse,\n RuntimeSkillInjection,\n RuntimeSkillInjectionResponse,\n} from \"./schema.js\";\n\nexport function mapExecutionResult(\n result: RuntimeApiExecutionResult | null | undefined,\n): RuntimeExecutionResult | null {\n if (!result) {\n return null;\n }\n return {\n success: result.success ?? false,\n reward: result.reward ?? undefined,\n terminated: result.terminated,\n truncated: result.truncated,\n sandboxRc: result.sandboxRc ?? result.sandbox_rc,\n stdout: result.stdout,\n stderr: result.stderr,\n taskCompleted: result.taskCompleted ?? result.task_completed,\n codePath: result.codePath ?? result.code_path,\n elapsedMs: result.elapsedMs ?? result.elapsed_ms,\n error: result.error,\n diagnostics: result.diagnostics,\n };\n}\n\nexport function mapObservation(\n observation: RuntimeApiObservation | undefined,\n): RuntimeObservation {\n if (!observation) {\n return {};\n }\n return {\n trial: observation.trial,\n taskPrompt: observation.taskPrompt ?? observation.task_prompt ?? undefined,\n multiTurnPrompt:\n observation.multiTurnPrompt ?? observation.multi_turn_prompt ?? undefined,\n fullPrompt: observation.fullPrompt ?? observation.full_prompt,\n resetInfo: observation.resetInfo ?? observation.reset_info,\n lastStep: mapExecutionResult(observation.lastStep ?? observation.last_step),\n runtimeConfig:\n observation.runtimeConfig ?? observation.runtime_config ?? undefined,\n codeContext: mapCodeContext(\n observation.codeContext ?? observation.code_context,\n ),\n };\n}\n\nfunction mapCodeContext(\n context: RuntimeApiCodeContext | null | undefined,\n): RuntimeCodeContext | undefined {\n if (!context) {\n return undefined;\n }\n return {\n policyLanguage: context.policyLanguage ?? context.policy_language,\n executionModel: context.executionModel ?? context.execution_model,\n submitVia: context.submitVia ?? context.submit_via,\n affordances: context.affordances?.map(mapCodeAffordance),\n skillLibrarySummary:\n context.skillLibrarySummary ?? context.skill_library_summary,\n skillLibraryDocs: context.skillLibraryDocs ?? context.skill_library_docs,\n };\n}\n\nfunction mapCodeAffordance(\n affordance: RuntimeApiCodeAffordance,\n): RuntimeCodeAffordance {\n return {\n name: affordance.name,\n description: affordance.description,\n inputSchema: affordance.inputSchema ?? affordance.input_schema,\n source: affordance.source,\n symbol: affordance.symbol,\n tags: affordance.tags,\n metadata: affordance.metadata,\n };\n}\n\nexport function mapFrame(\n frame: RuntimeFrameResponse | undefined,\n): RuntimeFrame {\n if (!frame) {\n return {};\n }\n return {\n source: frame.source,\n mimeType: frame.mimeType ?? frame.mime_type,\n encoding: frame.encoding,\n data: frame.data,\n dataUrl: frame.dataUrl ?? frame.data_url,\n width: frame.width ?? undefined,\n height: frame.height ?? undefined,\n timestamp: frame.timestamp,\n };\n}\n\nexport function mapRuntimeArtifact(\n artifact: RuntimeArtifactResponse,\n baseUrl: string,\n): PhysicalArtifact {\n const relativePath = artifact.path ?? \"artifact\";\n const relativeUrl = artifact.url ?? \"\";\n return {\n id: `capx-runtime:${relativePath}`,\n kind: mapArtifactKind(artifact.kind),\n uri: relativeUrl.startsWith(\"http\")\n ? relativeUrl\n : `${baseUrl}${relativeUrl}`,\n label: relativePath,\n metadata: {\n capx: {\n path: relativePath,\n sizeBytes: artifact.sizeBytes ?? artifact.size_bytes,\n modifiedTime: artifact.modifiedTime ?? artifact.modified_time,\n kind: artifact.kind,\n },\n },\n };\n}\n\nexport function mapSkillExtraction(\n response: RuntimeSkillExtractionResponse,\n): RuntimeSkillExtraction {\n return {\n path: response.path,\n taskName: response.taskName ?? response.task_name,\n newSkills: response.newSkills ?? response.new_skills ?? [],\n total: response.total,\n };\n}\n\nexport function mapSkillInjection(\n response: RuntimeSkillInjectionResponse,\n): RuntimeSkillInjection {\n return {\n path: response.path,\n injected: response.injected ?? 0,\n promotedSkills: response.promotedSkills ?? response.promoted_skills ?? [],\n };\n}\n\nfunction mapArtifactKind(kind: string | undefined): PhysicalArtifact[\"kind\"] {\n if (kind === \"image\" || kind === \"video\" || kind === \"json\") {\n return kind;\n }\n if (kind === \"text\") {\n return \"log\";\n }\n return \"other\";\n}\n"],"mappings":"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","names":["randomUUID","randomUUID","randomUUID","randomUUID"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { PhysicalArtifact, PhysicalExecutionRequest, PhysicalExecutionTrace } from '@cuylabs/agent-physical';
|
|
2
|
+
import { C as CapxArtifactDiscoveryOptions, a as CapxSessionOptions, R as RuntimeObservation, b as RuntimeFrame, c as RuntimeTurn, d as RuntimeSkillLibrary, e as RuntimeSkillExtraction, f as RuntimeSkillInjection } from './session-BxaROlXW.js';
|
|
3
|
+
export { g as CapxPolicyExecutionMode, h as CapxRunMode, i as CapxSession, j as RuntimeCodeAffordance, k as RuntimeCodeContext, l as RuntimeExecutionResult, m as createCapxPhysicalTools, n as createCapxSession } from './session-BxaROlXW.js';
|
|
4
|
+
export { CapxAgent, CreateCapxAgentOptions, capxAgentSkillRoot, createCapxAgent, defaultCapxAgentApproval, defaultCapxAgentSystemPrompt } from './agent.js';
|
|
5
|
+
import '@cuylabs/agent-core/tool';
|
|
6
|
+
import '@cuylabs/agent-core';
|
|
7
|
+
|
|
8
|
+
declare function discoverCapxArtifacts(rootDir: string, options?: CapxArtifactDiscoveryOptions): Promise<PhysicalArtifact[]>;
|
|
9
|
+
|
|
10
|
+
declare class CapxLiveRuntime {
|
|
11
|
+
#private;
|
|
12
|
+
readonly options: CapxSessionOptions;
|
|
13
|
+
readonly id: string;
|
|
14
|
+
readonly outputDir: string;
|
|
15
|
+
constructor(options: CapxSessionOptions, id?: string);
|
|
16
|
+
get stdoutTail(): string;
|
|
17
|
+
get stderrTail(): string;
|
|
18
|
+
get running(): boolean;
|
|
19
|
+
start(): Promise<RuntimeObservation>;
|
|
20
|
+
observe(): Promise<RuntimeObservation>;
|
|
21
|
+
renderFrame(camera?: string): Promise<RuntimeFrame>;
|
|
22
|
+
turnHistory(): Promise<RuntimeTurn[]>;
|
|
23
|
+
skillLibrary(): Promise<RuntimeSkillLibrary>;
|
|
24
|
+
extractSkills(options?: {
|
|
25
|
+
code?: string;
|
|
26
|
+
taskName?: string;
|
|
27
|
+
}): Promise<RuntimeSkillExtraction>;
|
|
28
|
+
injectSkillLibrary(minOccurrences?: number): Promise<RuntimeSkillInjection>;
|
|
29
|
+
listArtifacts(limit?: number): Promise<PhysicalArtifact[]>;
|
|
30
|
+
reset(trial?: number): Promise<RuntimeObservation>;
|
|
31
|
+
execute(request: PhysicalExecutionRequest): Promise<PhysicalExecutionTrace>;
|
|
32
|
+
stop(): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export { CapxArtifactDiscoveryOptions, CapxLiveRuntime, CapxSessionOptions, RuntimeFrame, RuntimeObservation, RuntimeSkillExtraction, RuntimeSkillInjection, RuntimeSkillLibrary, RuntimeTurn, discoverCapxArtifacts };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import {
|
|
2
|
+
capxAgentSkillRoot,
|
|
3
|
+
createCapxAgent,
|
|
4
|
+
defaultCapxAgentApproval,
|
|
5
|
+
defaultCapxAgentSystemPrompt
|
|
6
|
+
} from "./chunk-C53NNB7T.js";
|
|
7
|
+
import {
|
|
8
|
+
CapxLiveRuntime,
|
|
9
|
+
CapxSession,
|
|
10
|
+
createCapxPhysicalTools,
|
|
11
|
+
createCapxSession
|
|
12
|
+
} from "./chunk-MYO63CWO.js";
|
|
13
|
+
|
|
14
|
+
// src/artifacts.ts
|
|
15
|
+
import { readdir, stat } from "fs/promises";
|
|
16
|
+
import path from "path";
|
|
17
|
+
var ARTIFACT_EXTENSIONS = {
|
|
18
|
+
".py": "code",
|
|
19
|
+
".txt": "log",
|
|
20
|
+
".log": "log",
|
|
21
|
+
".json": "json",
|
|
22
|
+
".png": "image",
|
|
23
|
+
".jpg": "image",
|
|
24
|
+
".jpeg": "image",
|
|
25
|
+
".mp4": "video",
|
|
26
|
+
".webm": "video"
|
|
27
|
+
};
|
|
28
|
+
function artifactKind(filePath, isDirectory) {
|
|
29
|
+
if (isDirectory) {
|
|
30
|
+
return "directory";
|
|
31
|
+
}
|
|
32
|
+
return ARTIFACT_EXTENSIONS[path.extname(filePath).toLowerCase()] ?? "other";
|
|
33
|
+
}
|
|
34
|
+
async function discoverCapxArtifacts(rootDir, options = {}) {
|
|
35
|
+
const baseDir = path.resolve(rootDir, options.outputDir ?? "outputs");
|
|
36
|
+
const limit = options.limit ?? 100;
|
|
37
|
+
const artifacts = [];
|
|
38
|
+
async function visit(dir) {
|
|
39
|
+
if (artifacts.length >= limit) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
let entries;
|
|
43
|
+
try {
|
|
44
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
45
|
+
} catch {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
49
|
+
for (const entry of entries) {
|
|
50
|
+
if (artifacts.length >= limit) {
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
const fullPath = path.join(dir, entry.name);
|
|
54
|
+
const isDirectory = entry.isDirectory();
|
|
55
|
+
const kind = artifactKind(fullPath, isDirectory);
|
|
56
|
+
if (!options.kind || options.kind === kind) {
|
|
57
|
+
let size;
|
|
58
|
+
try {
|
|
59
|
+
size = (await stat(fullPath)).size;
|
|
60
|
+
} catch {
|
|
61
|
+
size = void 0;
|
|
62
|
+
}
|
|
63
|
+
artifacts.push({
|
|
64
|
+
id: path.relative(baseDir, fullPath) || fullPath,
|
|
65
|
+
kind,
|
|
66
|
+
uri: fullPath,
|
|
67
|
+
label: entry.name,
|
|
68
|
+
metadata: {
|
|
69
|
+
size
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
if (isDirectory) {
|
|
74
|
+
await visit(fullPath);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
await visit(baseDir);
|
|
79
|
+
return artifacts;
|
|
80
|
+
}
|
|
81
|
+
export {
|
|
82
|
+
CapxLiveRuntime,
|
|
83
|
+
CapxSession,
|
|
84
|
+
capxAgentSkillRoot,
|
|
85
|
+
createCapxAgent,
|
|
86
|
+
createCapxPhysicalTools,
|
|
87
|
+
createCapxSession,
|
|
88
|
+
defaultCapxAgentApproval,
|
|
89
|
+
defaultCapxAgentSystemPrompt,
|
|
90
|
+
discoverCapxArtifacts
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/artifacts.ts"],"sourcesContent":["import { readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { PhysicalArtifact } from \"@cuylabs/agent-physical\";\nimport type { CapxArtifactDiscoveryOptions } from \"./types.js\";\n\nconst ARTIFACT_EXTENSIONS: Record<string, PhysicalArtifact[\"kind\"]> = {\n \".py\": \"code\",\n \".txt\": \"log\",\n \".log\": \"log\",\n \".json\": \"json\",\n \".png\": \"image\",\n \".jpg\": \"image\",\n \".jpeg\": \"image\",\n \".mp4\": \"video\",\n \".webm\": \"video\",\n};\n\nfunction artifactKind(\n filePath: string,\n isDirectory: boolean,\n): PhysicalArtifact[\"kind\"] {\n if (isDirectory) {\n return \"directory\";\n }\n return ARTIFACT_EXTENSIONS[path.extname(filePath).toLowerCase()] ?? \"other\";\n}\n\nexport async function discoverCapxArtifacts(\n rootDir: string,\n options: CapxArtifactDiscoveryOptions = {},\n): Promise<PhysicalArtifact[]> {\n const baseDir = path.resolve(rootDir, options.outputDir ?? \"outputs\");\n const limit = options.limit ?? 100;\n const artifacts: PhysicalArtifact[] = [];\n\n async function visit(dir: string): Promise<void> {\n if (artifacts.length >= limit) {\n return;\n }\n\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n entries.sort((a, b) => a.name.localeCompare(b.name));\n for (const entry of entries) {\n if (artifacts.length >= limit) {\n break;\n }\n\n const fullPath = path.join(dir, entry.name);\n const isDirectory = entry.isDirectory();\n const kind = artifactKind(fullPath, isDirectory);\n if (!options.kind || options.kind === kind) {\n let size: number | undefined;\n try {\n size = (await stat(fullPath)).size;\n } catch {\n size = undefined;\n }\n artifacts.push({\n id: path.relative(baseDir, fullPath) || fullPath,\n kind,\n uri: fullPath,\n label: entry.name,\n metadata: {\n size,\n },\n });\n }\n if (isDirectory) {\n await visit(fullPath);\n }\n }\n }\n\n await visit(baseDir);\n return artifacts;\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,SAAS,YAAY;AAC9B,OAAO,UAAU;AAIjB,IAAM,sBAAgE;AAAA,EACpE,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AACX;AAEA,SAAS,aACP,UACA,aAC0B;AAC1B,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AACA,SAAO,oBAAoB,KAAK,QAAQ,QAAQ,EAAE,YAAY,CAAC,KAAK;AACtE;AAEA,eAAsB,sBACpB,SACA,UAAwC,CAAC,GACZ;AAC7B,QAAM,UAAU,KAAK,QAAQ,SAAS,QAAQ,aAAa,SAAS;AACpE,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,YAAgC,CAAC;AAEvC,iBAAe,MAAM,KAA4B;AAC/C,QAAI,UAAU,UAAU,OAAO;AAC7B;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,IACtD,QAAQ;AACN;AAAA,IACF;AAEA,YAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AACnD,eAAW,SAAS,SAAS;AAC3B,UAAI,UAAU,UAAU,OAAO;AAC7B;AAAA,MACF;AAEA,YAAM,WAAW,KAAK,KAAK,KAAK,MAAM,IAAI;AAC1C,YAAM,cAAc,MAAM,YAAY;AACtC,YAAM,OAAO,aAAa,UAAU,WAAW;AAC/C,UAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,MAAM;AAC1C,YAAI;AACJ,YAAI;AACF,kBAAQ,MAAM,KAAK,QAAQ,GAAG;AAAA,QAChC,QAAQ;AACN,iBAAO;AAAA,QACT;AACA,kBAAU,KAAK;AAAA,UACb,IAAI,KAAK,SAAS,SAAS,QAAQ,KAAK;AAAA,UACxC;AAAA,UACA,KAAK;AAAA,UACL,OAAO,MAAM;AAAA,UACb,UAAU;AAAA,YACR;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AACA,UAAI,aAAa;AACf,cAAM,MAAM,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,MAAM,OAAO;AACnB,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { Tool } from '@cuylabs/agent-core/tool';
|
|
2
|
+
import { PhysicalTaskSpec, PhysicalExecutionMode, PhysicalArtifact, PhysicalSession, PhysicalCapability, PhysicalExecutionRequest, PhysicalExecutionTrace, PhysicalSessionState, PhysicalSessionStartOptions, PhysicalObserveOptions, PhysicalObservation, PhysicalListArtifactsOptions, PhysicalToolOptions } from '@cuylabs/agent-physical';
|
|
3
|
+
|
|
4
|
+
interface RuntimeApiExecutionResult {
|
|
5
|
+
success?: boolean;
|
|
6
|
+
reward?: number | null;
|
|
7
|
+
terminated?: boolean;
|
|
8
|
+
truncated?: boolean;
|
|
9
|
+
sandbox_rc?: number;
|
|
10
|
+
sandboxRc?: number;
|
|
11
|
+
stdout?: string;
|
|
12
|
+
stderr?: string;
|
|
13
|
+
task_completed?: boolean | null;
|
|
14
|
+
taskCompleted?: boolean | null;
|
|
15
|
+
code_path?: string | null;
|
|
16
|
+
codePath?: string | null;
|
|
17
|
+
elapsed_ms?: number;
|
|
18
|
+
elapsedMs?: number;
|
|
19
|
+
error?: string | null;
|
|
20
|
+
diagnostics?: Record<string, unknown> | null;
|
|
21
|
+
}
|
|
22
|
+
interface RuntimeObservation {
|
|
23
|
+
trial?: number;
|
|
24
|
+
taskPrompt?: string;
|
|
25
|
+
multiTurnPrompt?: string;
|
|
26
|
+
fullPrompt?: unknown;
|
|
27
|
+
resetInfo?: unknown;
|
|
28
|
+
lastStep?: RuntimeExecutionResult | null;
|
|
29
|
+
runtimeConfig?: Record<string, unknown>;
|
|
30
|
+
codeContext?: RuntimeCodeContext;
|
|
31
|
+
}
|
|
32
|
+
interface RuntimeCodeAffordance {
|
|
33
|
+
name?: string;
|
|
34
|
+
description?: string;
|
|
35
|
+
inputSchema?: Record<string, unknown>;
|
|
36
|
+
source?: string;
|
|
37
|
+
symbol?: string | null;
|
|
38
|
+
tags?: string[] | null;
|
|
39
|
+
metadata?: Record<string, unknown> | null;
|
|
40
|
+
}
|
|
41
|
+
interface RuntimeCodeContext {
|
|
42
|
+
policyLanguage?: string;
|
|
43
|
+
executionModel?: string;
|
|
44
|
+
submitVia?: string;
|
|
45
|
+
affordances?: RuntimeCodeAffordance[];
|
|
46
|
+
skillLibrarySummary?: string | null;
|
|
47
|
+
skillLibraryDocs?: string | null;
|
|
48
|
+
}
|
|
49
|
+
interface RuntimeExecutionResult {
|
|
50
|
+
success: boolean;
|
|
51
|
+
reward?: number;
|
|
52
|
+
terminated?: boolean;
|
|
53
|
+
truncated?: boolean;
|
|
54
|
+
sandboxRc?: number;
|
|
55
|
+
stdout?: string;
|
|
56
|
+
stderr?: string;
|
|
57
|
+
taskCompleted?: boolean | null;
|
|
58
|
+
codePath?: string | null;
|
|
59
|
+
elapsedMs?: number;
|
|
60
|
+
error?: string | null;
|
|
61
|
+
diagnostics?: Record<string, unknown> | null;
|
|
62
|
+
}
|
|
63
|
+
interface RuntimeFrame {
|
|
64
|
+
source?: string;
|
|
65
|
+
mimeType?: string;
|
|
66
|
+
encoding?: string;
|
|
67
|
+
data?: string;
|
|
68
|
+
dataUrl?: string;
|
|
69
|
+
width?: number;
|
|
70
|
+
height?: number;
|
|
71
|
+
timestamp?: number;
|
|
72
|
+
}
|
|
73
|
+
interface RuntimeTurn {
|
|
74
|
+
index?: number;
|
|
75
|
+
trial?: number;
|
|
76
|
+
code?: string;
|
|
77
|
+
result?: RuntimeApiExecutionResult;
|
|
78
|
+
started_at?: number;
|
|
79
|
+
completed_at?: number;
|
|
80
|
+
}
|
|
81
|
+
interface RuntimeSkillLibrary {
|
|
82
|
+
path?: string;
|
|
83
|
+
summary?: string;
|
|
84
|
+
docs?: string;
|
|
85
|
+
total?: number;
|
|
86
|
+
promoted?: number;
|
|
87
|
+
skills?: unknown[];
|
|
88
|
+
}
|
|
89
|
+
interface RuntimeSkillExtraction {
|
|
90
|
+
path?: string;
|
|
91
|
+
taskName?: string;
|
|
92
|
+
newSkills: string[];
|
|
93
|
+
total?: number;
|
|
94
|
+
}
|
|
95
|
+
interface RuntimeSkillInjection {
|
|
96
|
+
path?: string;
|
|
97
|
+
injected: number;
|
|
98
|
+
promotedSkills: string[];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
type CapxRunMode = "runtime";
|
|
102
|
+
type CapxPolicyExecutionMode = "live-runtime";
|
|
103
|
+
interface CapxSessionOptions {
|
|
104
|
+
/**
|
|
105
|
+
* Runtime mode connects to capx-agent-runtime for an agent-owned live loop.
|
|
106
|
+
*/
|
|
107
|
+
mode?: CapxRunMode;
|
|
108
|
+
/**
|
|
109
|
+
* Existing capx-agent-runtime server URL. Runtime mode always connects to
|
|
110
|
+
* this service; the Python runtime server owns the CaP-X checkout and YAML
|
|
111
|
+
* config.
|
|
112
|
+
*/
|
|
113
|
+
runtimeServerUrl: string;
|
|
114
|
+
/**
|
|
115
|
+
* Timeout while waiting for capx-agent-runtime to become healthy.
|
|
116
|
+
*/
|
|
117
|
+
runtimeServerStartupTimeoutMs?: number;
|
|
118
|
+
/**
|
|
119
|
+
* Default timeout for capx-agent-runtime HTTP requests.
|
|
120
|
+
*/
|
|
121
|
+
runtimeServerRequestTimeoutMs?: number;
|
|
122
|
+
/**
|
|
123
|
+
* Override CaP-X output directory.
|
|
124
|
+
*/
|
|
125
|
+
outputDir?: string;
|
|
126
|
+
/**
|
|
127
|
+
* Task metadata surfaced through the PhysicalSession state.
|
|
128
|
+
*/
|
|
129
|
+
task?: PhysicalTaskSpec;
|
|
130
|
+
/**
|
|
131
|
+
* Physical execution mode. Defaults to "unknown"; use "hardware" for real robot configs.
|
|
132
|
+
*/
|
|
133
|
+
physicalMode?: PhysicalExecutionMode;
|
|
134
|
+
/**
|
|
135
|
+
* Opt in to the generic capx_run_policy_code tool.
|
|
136
|
+
*/
|
|
137
|
+
enablePolicyCodeExecution?: boolean;
|
|
138
|
+
/**
|
|
139
|
+
* Policy execution backend. Runtime mode always uses capx-agent-runtime to
|
|
140
|
+
* keep one CaP-X environment alive so agent-core can own the
|
|
141
|
+
* reset/observe/execute loop.
|
|
142
|
+
*/
|
|
143
|
+
policyExecutionMode?: CapxPolicyExecutionMode;
|
|
144
|
+
/**
|
|
145
|
+
* Required opt-in for policy execution when physicalMode is "hardware".
|
|
146
|
+
*/
|
|
147
|
+
allowHardwarePolicyExecution?: boolean;
|
|
148
|
+
/**
|
|
149
|
+
* Default timeout for live policy execution.
|
|
150
|
+
*/
|
|
151
|
+
policyExecutionTimeoutMs?: number;
|
|
152
|
+
/**
|
|
153
|
+
* Trial id/seed forwarded to capx-agent-runtime when creating/resetting a session.
|
|
154
|
+
*/
|
|
155
|
+
policyExecutionTrial?: number;
|
|
156
|
+
/**
|
|
157
|
+
* Whether capx-agent-runtime should start api_servers from YAML. Defaults to
|
|
158
|
+
* true.
|
|
159
|
+
*/
|
|
160
|
+
policyExecutionStartApiServers?: boolean;
|
|
161
|
+
/**
|
|
162
|
+
* Optional CaP-X skill library path. Relative paths are resolved by the
|
|
163
|
+
* runtime server.
|
|
164
|
+
*/
|
|
165
|
+
skillLibraryPath?: string;
|
|
166
|
+
/**
|
|
167
|
+
* Whether policy execution should record video when the environment
|
|
168
|
+
* supports it. Defaults to false.
|
|
169
|
+
*/
|
|
170
|
+
policyExecutionRecordVideo?: boolean;
|
|
171
|
+
}
|
|
172
|
+
interface CapxArtifactDiscoveryOptions {
|
|
173
|
+
outputDir?: string;
|
|
174
|
+
limit?: number;
|
|
175
|
+
kind?: PhysicalArtifact["kind"];
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
declare class CapxSession implements PhysicalSession {
|
|
179
|
+
#private;
|
|
180
|
+
readonly id: string;
|
|
181
|
+
readonly options: CapxSessionOptions;
|
|
182
|
+
readonly capabilities?: readonly PhysicalCapability[];
|
|
183
|
+
readonly executeCode?: (request: PhysicalExecutionRequest) => Promise<PhysicalExecutionTrace>;
|
|
184
|
+
constructor(options: CapxSessionOptions, id?: string);
|
|
185
|
+
getState(): PhysicalSessionState;
|
|
186
|
+
start(options?: PhysicalSessionStartOptions): Promise<PhysicalSessionState>;
|
|
187
|
+
observe(options?: PhysicalObserveOptions): Promise<PhysicalObservation>;
|
|
188
|
+
reset(options?: PhysicalSessionStartOptions): Promise<PhysicalSessionState>;
|
|
189
|
+
listArtifacts(options?: PhysicalListArtifactsOptions): Promise<PhysicalArtifact[]>;
|
|
190
|
+
getRuntimeTurnHistory(): Promise<unknown[]>;
|
|
191
|
+
getRuntimeSkillLibrary(): Promise<RuntimeSkillLibrary>;
|
|
192
|
+
extractRuntimeSkills(options?: {
|
|
193
|
+
code?: string;
|
|
194
|
+
taskName?: string;
|
|
195
|
+
}): Promise<RuntimeSkillExtraction>;
|
|
196
|
+
injectRuntimeSkillLibrary(minOccurrences?: number): Promise<RuntimeSkillInjection>;
|
|
197
|
+
stop(reason?: string): Promise<PhysicalSessionState>;
|
|
198
|
+
}
|
|
199
|
+
declare function createCapxSession(options: CapxSessionOptions): CapxSession;
|
|
200
|
+
declare function createCapxPhysicalTools(session: PhysicalSession | CapxSession, options?: PhysicalToolOptions): Tool.AnyInfo[];
|
|
201
|
+
|
|
202
|
+
export { type CapxArtifactDiscoveryOptions as C, type RuntimeObservation as R, type CapxSessionOptions as a, type RuntimeFrame as b, type RuntimeTurn as c, type RuntimeSkillLibrary as d, type RuntimeSkillExtraction as e, type RuntimeSkillInjection as f, type CapxPolicyExecutionMode as g, type CapxRunMode as h, CapxSession as i, type RuntimeCodeAffordance as j, type RuntimeCodeContext as k, type RuntimeExecutionResult as l, createCapxPhysicalTools as m, createCapxSession as n };
|
package/dist/session.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/docs/README.md
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# @cuylabs/agent-physical-capx Docs
|
|
2
|
+
|
|
3
|
+
Start here:
|
|
4
|
+
|
|
5
|
+
- [Agent-Core Integration](./agent-core-integration.md) explains how
|
|
6
|
+
`agent-core` supervises a CaP-X session or owns the live runtime loop.
|
|
7
|
+
- [How It Works](./how-it-works.md) explains the launcher/session/runtime
|
|
8
|
+
adapter.
|
|
9
|
+
- [Limitations](./limitations.md) documents what this package deliberately does
|
|
10
|
+
not do yet.
|
|
11
|
+
- [../examples/README.md](../examples/README.md) is the operational runbook for
|
|
12
|
+
starting the service, running the single-turn and autosolve examples, reading
|
|
13
|
+
success output, and finding video artifacts.
|
|
14
|
+
|
|
15
|
+
This adapter exists to integrate CaP-X, a Python robotics Code-as-Policy
|
|
16
|
+
framework, with `agents-ts`. It is not a fork or TypeScript port of CaP-X.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Agent-Core Integration
|
|
2
|
+
|
|
3
|
+
`agent-physical-capx` uses `agent-core` as the application-level harness for a
|
|
4
|
+
running `capx-agent-runtime` service.
|
|
5
|
+
|
|
6
|
+
## Ownership
|
|
7
|
+
|
|
8
|
+
`agent-core` owns conversation turns, tool choice, approvals, tracing, policy
|
|
9
|
+
code authoring, and the live observe/execute/reset loop.
|
|
10
|
+
|
|
11
|
+
`capx-agent-runtime` owns the CaP-X checkout, YAML config, simulator/API server
|
|
12
|
+
lifecycle, Python execution namespace, rewards, task completion, and artifacts.
|
|
13
|
+
|
|
14
|
+
The TypeScript adapter does not launch CaP-X and does not pass `repoPath` or
|
|
15
|
+
`configPath`. Those are runtime-service startup concerns.
|
|
16
|
+
|
|
17
|
+
## Recommended Wiring
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { createCapxAgent } from "@cuylabs/agent-physical-capx";
|
|
21
|
+
|
|
22
|
+
const { agent, session } = await createCapxAgent({
|
|
23
|
+
model,
|
|
24
|
+
startSession: true,
|
|
25
|
+
toolExecutionMode: "plan",
|
|
26
|
+
sessionOptions: {
|
|
27
|
+
mode: "runtime",
|
|
28
|
+
runtimeServerUrl: "http://127.0.0.1:8210",
|
|
29
|
+
physicalMode: "simulation",
|
|
30
|
+
enablePolicyCodeExecution: true,
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
The helper defaults to `toolExecutionMode: "plan"` so `agent-core` executes tool
|
|
36
|
+
batches through its capability-aware runner. This is not a prompt-level plan or
|
|
37
|
+
a plan-only agent. The model still reasons and chooses tools, but the tool call
|
|
38
|
+
is deferred to `agent-core`, which then applies approval policy, capability
|
|
39
|
+
metadata, and safe dispatch before committing the tool result back into the
|
|
40
|
+
conversation.
|
|
41
|
+
|
|
42
|
+
`toolExecutionMode: "auto"` is the simpler AI SDK path: executable tools are
|
|
43
|
+
given directly to the SDK and execute inline while the model stream is running.
|
|
44
|
+
That is fine for many text tools. For physical sessions, `plan` is the safer
|
|
45
|
+
default because tools like `capx_run_policy_code`, `capx_stop`, and
|
|
46
|
+
any programmatic runtime skill-library mutation are side-effecting and should
|
|
47
|
+
stay under the host harness' approval and scheduling policy.
|
|
48
|
+
|
|
49
|
+
The helper also installs a default approval policy with `defaultAction: "deny"`.
|
|
50
|
+
Read-only tools can pass through host policy; mutating tools such as policy
|
|
51
|
+
execution and stop should remain approval-gated. Runtime skill-library
|
|
52
|
+
mutation is available through programmatic APIs for deliberate workflows, but
|
|
53
|
+
it is not part of the default agent tool surface.
|
|
54
|
+
|
|
55
|
+
## Runtime Tools
|
|
56
|
+
|
|
57
|
+
`capx_run_policy_code` sends Python code to the active runtime session and
|
|
58
|
+
returns stdout, stderr, reward, task-completion metadata, and artifacts.
|
|
59
|
+
|
|
60
|
+
`capx_observe` returns prompt, observation, and policy-code context. That
|
|
61
|
+
context can include reusable Python helper summaries and typed affordances from
|
|
62
|
+
the runtime skill library.
|
|
63
|
+
|
|
64
|
+
The active runtime session is durable across tool calls. The agent should use
|
|
65
|
+
`capx_observe`, then submit one selected Python policy step with
|
|
66
|
+
`capx_run_policy_code`, then observe again in the same session. Starting,
|
|
67
|
+
resetting, and replacing sessions are host/runtime orchestration decisions, not
|
|
68
|
+
default model-facing actions.
|
|
69
|
+
|
|
70
|
+
That gives an external agent the core Code-as-Policies boundary: prompt/API
|
|
71
|
+
context comes from CaP-X, generated code runs in CaP-X's Python namespace, and
|
|
72
|
+
reusable helper functions stay inside that runtime instead of being copied into
|
|
73
|
+
TypeScript.
|