122 lines
4.6 KiB
JavaScript
122 lines
4.6 KiB
JavaScript
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,
|
|
}),
|
|
};
|
|
}
|