feat: integrate automatic game resource delivery

This commit is contained in:
2026-09-06 09:50:49 +08:00
parent f721966f3c
commit 4df4bc9624
20 changed files with 1667 additions and 191 deletions

View File

@@ -11,6 +11,7 @@ import {
} from '../coding-projects/project-store';
import { CodingConversationService } from '../coding-runtime/conversation-service';
import { PiManagedExtensionHost } from '../coding-runtime/pi/extension-host';
import { PiProjectWriteLeaseCoordinator } from '../coding-runtime/pi/write-lease';
import { PiAgentServerProcess } from '../coding-runtime/pi/agent-server-process';
import { PiManagedInputRevisionCoordinator } from '../coding-runtime/pi/managed-input-revision';
import { PiProductTools } from '../coding-runtime/pi/product-tools';
@@ -46,6 +47,10 @@ import {
import { createDataServicePluginAdapter } from '../coding-plugins/adapters/data-service';
import { createGameResourcePluginAdapter } from '../coding-plugins/adapters/game-resource';
import { GameResourceClient } from '../services/game-resource-client';
import {
GameResourceDeliveryCoordinator,
GameResourceDeliveryReceiptStore,
} from '../services/game-resource-delivery';
import { AccountPluginCache } from '../coding-plugins/account-plugin-cache';
import {
createMarketplaceClient,
@@ -229,6 +234,7 @@ export function createCodingComposition(
onGenerationChanged: async () => await invalidateDeviceResources(),
});
const devicePackageTools = new DevicePackageTools(devicePackageManager);
const projectWriteLeases = new PiProjectWriteLeaseCoordinator();
const productTools = new PiProductTools({
browser: options.browser,
attachments,
@@ -245,7 +251,7 @@ export function createCodingComposition(
}))
: [],
});
const extensionHost = new PiManagedExtensionHost();
const extensionHost = new PiManagedExtensionHost(projectWriteLeases);
extensionHost.configureProductTools(productTools);
const conversationStores = new Map<string, ReturnType<typeof createCodingConversationStore>>();
const conversationStoreForProject = (projectPath: string) => {
@@ -302,8 +308,26 @@ export function createCodingComposition(
});
const dataService = createDataServiceOperations({ projects });
const dataServiceAdapter = createDataServicePluginAdapter(dataService);
const gameResourceClient = new GameResourceClient();
const gameResourceDelivery = new GameResourceDeliveryCoordinator({
client: gameResourceClient,
receipts: new GameResourceDeliveryReceiptStore(path.join(
options.paths.userDataDir,
'coding-runtime',
'game-resource',
'receipts.json',
)),
leases: projectWriteLeases,
recordTouchedPaths: async (conversationId, runId, paths) => {
await productTools.recordTouchedPaths(conversationId, runId, paths);
},
...(options.acquireBackgroundLease
? { acquireBackgroundLease: options.acquireBackgroundLease }
: {}),
});
const gameResourceAdapter = createGameResourcePluginAdapter({
client: new GameResourceClient(),
client: gameResourceClient,
delivery: gameResourceDelivery,
marketplace: marketplaceClient,
packageStore,
makeloreVersion: options.clientVersion ?? '2.0.0',
@@ -474,8 +498,10 @@ export function createCodingComposition(
await invalidateManagedResources();
},
});
void gameResourceDelivery.resumePending().catch(() => undefined);
const unsubscribeMarketplaceSession = subscribeWorksSquareSession(() => {
void invalidateManagedResources();
void gameResourceDelivery.resumePending().catch(() => undefined);
});
const host = createCodingProductHost({
projects,
@@ -520,6 +546,7 @@ export function createCodingComposition(
await agentServer.stop();
},
async shutdown() {
gameResourceDelivery.dispose();
previewDataSession?.dispose();
if (typeof options.browser.configurePreviewDataSession === 'function') {
options.browser.configurePreviewDataSession(undefined);