feat: finalize mindspace service extraction phase a
This commit is contained in:
@@ -0,0 +1,121 @@
|
||||
import path from 'node:path';
|
||||
import { DEFAULT_MAX_FILE_BYTES } from './mindspace.mjs';
|
||||
import { createMindSpaceServiceFacade } from './mindspace-service.mjs';
|
||||
import { createLocalMindSpaceStorageAdapter } from './mindspace-storage-adapter.mjs';
|
||||
import {
|
||||
buildPublicUrl,
|
||||
PUBLISH_ROOT_DIR,
|
||||
resolveGoosedSandboxRoot,
|
||||
resolvePublicBaseUrl,
|
||||
resolvePublishDir,
|
||||
} from './user-publish.mjs';
|
||||
|
||||
export function resolveMindSpaceStorageRoot(h5Root, env = process.env) {
|
||||
return path.resolve(env.MINDSPACE_STORAGE_ROOT ?? path.join(h5Root, 'data', 'mindspace'));
|
||||
}
|
||||
|
||||
export function resolveMindSpaceRuntimeConfig(h5Root, env = process.env) {
|
||||
return {
|
||||
storageRoot: resolveMindSpaceStorageRoot(h5Root, env),
|
||||
publicBaseUrl: resolvePublicBaseUrl(env),
|
||||
};
|
||||
}
|
||||
|
||||
export function resolveMindSpaceServerRuntimeOptions(h5Root, env = process.env) {
|
||||
const runtime = resolveMindSpaceRuntimeConfig(h5Root, env);
|
||||
return {
|
||||
...runtime,
|
||||
adapterKind: String(env.MINDSPACE_SERVER_ADAPTER ?? 'local').trim().toLowerCase() || 'local',
|
||||
publishRoot: resolveMindSpacePublishRoot(h5Root),
|
||||
maxFileBytes: Number(env.MINDSPACE_MAX_FILE_BYTES ?? DEFAULT_MAX_FILE_BYTES),
|
||||
aiDailyLimit: Number(env.MINDSPACE_FREE_AI_DAILY_LIMIT ?? 10),
|
||||
publicPageLimit: Number(env.MINDSPACE_FREE_PUBLIC_PAGE_LIMIT ?? 5),
|
||||
monthlyViewLimit: Number(env.MINDSPACE_FREE_MONTHLY_VIEW_LIMIT ?? 1000),
|
||||
experienceEnabled: env.MINDSPACE_EXPERIENCE_ENABLED !== 'false',
|
||||
agentWorker: {
|
||||
enabled: env.MINDSPACE_AGENT_WORKER_ENABLED === 'true',
|
||||
concurrency: Math.max(1, Number(env.MINDSPACE_AGENT_WORKER_CONCURRENCY ?? 2)),
|
||||
pollMs: Math.max(200, Number(env.MINDSPACE_AGENT_WORKER_POLL_MS ?? 1000)),
|
||||
staleMs: Math.max(10_000, Number(env.MINDSPACE_AGENT_WORKER_STALE_MS ?? 5 * 60 * 1000)),
|
||||
ssePollMs: Math.max(500, Number(env.MINDSPACE_AGENT_SSE_POLL_MS ?? 1000)),
|
||||
},
|
||||
remote: {
|
||||
baseUrl: String(env.MINDSPACE_REMOTE_BASE_URL ?? '').trim(),
|
||||
authToken: String(env.MINDSPACE_REMOTE_AUTH_TOKEN ?? '').trim(),
|
||||
operationBasePath: String(env.MINDSPACE_REMOTE_OPERATION_BASE_PATH ?? '/mindspace/v1/adapter')
|
||||
.trim(),
|
||||
timeoutMs: Math.max(1000, Number(env.MINDSPACE_REMOTE_TIMEOUT_MS ?? 15_000)),
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export function resolveMindSpacePublishRoot(h5Root) {
|
||||
return path.resolve(h5Root, PUBLISH_ROOT_DIR);
|
||||
}
|
||||
|
||||
export function resolveMindSpaceUserPublishDir(h5Root, user) {
|
||||
return path.resolve(resolvePublishDir(h5Root, user));
|
||||
}
|
||||
|
||||
export function buildMindSpacePublicRoutePath(ownerKey, segments = []) {
|
||||
const userId = String(ownerKey ?? '').trim();
|
||||
if (!userId) {
|
||||
throw new Error('MindSpace public route requires an owner key');
|
||||
}
|
||||
const cleanSegments = Array.isArray(segments)
|
||||
? segments.map((segment) => encodeURIComponent(String(segment ?? '')))
|
||||
: [];
|
||||
return `/${PUBLISH_ROOT_DIR}/${encodeURIComponent(userId)}${cleanSegments.length ? `/${cleanSegments.join('/')}` : '/'}`;
|
||||
}
|
||||
|
||||
export function buildMindSpacePublicUrlForUser({ h5Root, env = process.env, user, relativePath = '' } = {}) {
|
||||
const ownerKey =
|
||||
typeof user === 'string' || typeof user === 'number'
|
||||
? String(user)
|
||||
: String(user?.id ?? '').trim();
|
||||
if (!ownerKey) {
|
||||
throw new Error('MindSpace public URL requires a user id');
|
||||
}
|
||||
const { publicBaseUrl } = resolveMindSpaceRuntimeConfig(h5Root, env);
|
||||
return buildPublicUrl(publicBaseUrl, ownerKey, relativePath);
|
||||
}
|
||||
|
||||
export function buildMindSpaceWorkspaceRef(user) {
|
||||
const ownerKey =
|
||||
typeof user === 'string' || typeof user === 'number'
|
||||
? String(user)
|
||||
: String(user?.id ?? '').trim();
|
||||
if (!ownerKey) {
|
||||
throw new Error('MindSpace workspace ref requires a user id');
|
||||
}
|
||||
return `mindspace://users/${encodeURIComponent(ownerKey)}/workspace`;
|
||||
}
|
||||
|
||||
export function resolveMindSpaceAgentWorkspaceCapability({ h5Root, env = process.env, user } = {}) {
|
||||
return {
|
||||
workspaceRoot: resolveMindSpaceUserPublishDir(h5Root, user),
|
||||
sandboxRoot: resolveGoosedSandboxRoot(h5Root, user, env),
|
||||
workspaceRef: buildMindSpaceWorkspaceRef(user),
|
||||
};
|
||||
}
|
||||
|
||||
export function createMindSpaceLocalRuntime({
|
||||
h5Root,
|
||||
env = process.env,
|
||||
conversationPackageBackfill,
|
||||
conversationPackagePublicHtmlHydrator,
|
||||
logger = console,
|
||||
} = {}) {
|
||||
const config = resolveMindSpaceRuntimeConfig(h5Root, env);
|
||||
return {
|
||||
...config,
|
||||
storageAdapter: createLocalMindSpaceStorageAdapter(config.storageRoot),
|
||||
serviceFacade: createMindSpaceServiceFacade({
|
||||
storageAdapter: createLocalMindSpaceStorageAdapter(config.storageRoot),
|
||||
publicBaseUrl: config.publicBaseUrl,
|
||||
conversationPackageBackfill,
|
||||
conversationPackagePublicHtmlHydrator,
|
||||
logger,
|
||||
}),
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user