openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
196 lines (195 loc) • 8.94 kB
JavaScript
import { r as resolveStateDir } from "./state-dir-CfAW6S2K.mjs";
import { c as resolveOpenClawAgentSqlitePath, i as isIncognitoOpenClawAgentSqlitePath } from "./openclaw-agent-db.paths-DiWMV5LG.mjs";
import { C as resolveUnsuffixedSqliteTargetFromSessionStorePath } from "./openclaw-state-db-VZFEEleX.mjs";
import { d as runOpenClawAgentWriteTransaction, p as withOpenClawAgentDatabaseAsync } from "./openclaw-agent-db-CFSa_Qik.mjs";
import { r as runOpenClawAgentWriteAdmission } from "./openclaw-agent-write-admission-xWSWPO-q.mjs";
import { _r as validateProgressCardGetParams, vr as validateProgressCardPutParams, yr as validateProgressCardRefreshParams } from "./src-D2gvuSyP.mjs";
import { t as captureSessionTranscriptStorageEnvironment } from "./transcript-target-binding-BdvfKc43.mjs";
import { t as ErrorCodes } from "./gateway-error-details-DIefe7Zy.mjs";
import { f as errorShape } from "./error-codes-DI20vDEB.mjs";
import { n as withOpenClawAgentDatabaseReadOnly } from "./openclaw-agent-db-readonly-C4g5X1l9.mjs";
import { i as prepareSqliteTargetFromSessionStorePath } from "./session-sqlite-target-BGognaPy.mjs";
import { n as resolveRequestedSessionAgentId } from "./session-request-agent-D8Xj-iBG.mjs";
import { i as resolveSessionStoreKey } from "./session-store-key-11PJMhso.mjs";
import { o as withSessionHistoryWorkerDatabase } from "./session-transcript-worker-runtime-BPDJyRf8.mjs";
import { n as readSessionProgressCard, r as writeSessionProgressCard } from "./progress-card-store-CcxKPjr1.mjs";
import { r as normalizeProgressCardInput, t as ProgressCardInputError } from "./progress-card-input-DMCFSstS.mjs";
import { t as SessionMutationAuthorizationChangedError } from "./session-mutation-authorization-error-CCz8QGWh.mjs";
import { t as assertValidParams } from "./validation-B7TobU6-.mjs";
import { n as captureGatewaySessionStoreScope, r as resolveGatewaySessionDatabase } from "./board-store-BjgI0VKP.mjs";
import { h as sessionObserverScopeKey } from "./session-observer-model-BBOMKcH9.mjs";
import { t as retainSessionScopedRead } from "./session-scoped-read-B27gd_RO.mjs";
//#region src/gateway/progress-card-store.ts
const progressCardStore = {
async get(sessionKey, agentId) {
const env = captureSessionTranscriptStorageEnvironment(process.env);
const scope = captureGatewaySessionStoreScope(sessionKey, agentId);
const unsuffixed = resolveUnsuffixedSqliteTargetFromSessionStorePath(scope.storePath);
if (isIncognitoOpenClawAgentSqlitePath(unsuffixed.path, {
agentId: scope.agentId,
env
})) {
const result = withOpenClawAgentDatabaseReadOnly((database) => readSessionProgressCard(database.db, scope.sessionKey), {
agentId: scope.agentId,
path: unsuffixed.path,
env
});
return result.found ? result.value : null;
}
const target = await prepareSqliteTargetFromSessionStorePath(scope.storePath, {
agentId: scope.agentId,
env
});
return await withSessionHistoryWorkerDatabase({
agentId: target.agentId ?? scope.agentId,
path: target.path,
env
}, (owner) => owner.readProgressCard({
sessionKey: scope.sessionKey,
env
}));
},
async put(sessionKey, input, agentId) {
const resolved = resolveGatewaySessionDatabase(sessionKey, agentId);
const env = { ...process.env };
env.OPENCLAW_STATE_DIR = resolveStateDir(env);
const databaseOptions = {
...resolved,
env,
path: resolveOpenClawAgentSqlitePath({
...resolved,
env
})
};
const assertCurrent = () => {
input.assertCurrent?.();
const current = resolveGatewaySessionDatabase(sessionKey, agentId);
if (current.agentId !== resolved.agentId || current.path !== resolved.path || current.sessionKey !== resolved.sessionKey) throw new Error("progress-card session changed; retry");
};
assertCurrent();
const result = await runOpenClawAgentWriteAdmission(databaseOptions, () => withOpenClawAgentDatabaseAsync(databaseOptions, () => runOpenClawAgentWriteTransaction((database) => {
assertCurrent();
return writeSessionProgressCard(database.db, resolved.sessionKey, input);
}, databaseOptions, { operationLabel: "progress-card.put" }), assertCurrent), true);
return "card" in result ? result : { card: null };
}
};
//#endregion
//#region src/gateway/server-methods/progress-card.ts
function resolveProgressCardSession(params, context, respond) {
const cfg = context.getRuntimeConfig();
const requested = resolveRequestedSessionAgentId(cfg, params.sessionKey, params.agentId);
if (!requested.ok) {
respond(false, void 0, requested.error);
return;
}
const canonicalKey = resolveSessionStoreKey({
cfg,
sessionKey: params.sessionKey,
storeAgentId: requested.agentId
});
return {
sessionKey: canonicalKey,
agentId: requested.agentId,
scopeKey: sessionObserverScopeKey(canonicalKey, requested.agentId)
};
}
function projectProgressCard(card, scopeKey) {
return card ? {
...card,
sessionKey: scopeKey
} : null;
}
function createProgressCardHandlers(store = progressCardStore) {
return {
"progressCard.refresh": async (invocation) => {
const { params, respond, context, sessionMutationAuthorization } = invocation;
if (!assertValidParams(params, validateProgressCardRefreshParams, "progressCard.refresh", respond)) return;
const session = resolveProgressCardSession(params, context, respond);
if (!session) return;
const readCard = async () => {
sessionMutationAuthorization?.assertCurrent();
const card = await store.get(session.sessionKey, session.agentId);
sessionMutationAuthorization?.assertCurrent();
return card;
};
const card = await readCard();
if (!card) {
respond(false, void 0, errorShape(ErrorCodes.INVALID_REQUEST, "There is no progress card to refresh."));
return;
}
const { requestProgressCardRefresh } = await import("./progress-card-refresh-C_gkrhya.mjs");
invocation.sessionMutationCommitGuard?.();
sessionMutationAuthorization?.assertCurrent();
await requestProgressCardRefresh(invocation, session, card, params.idempotencyKey, readCard);
},
"progressCard.get": async (options) => {
const { params, respond, context, sessionMutationAuthorization } = options;
if (!assertValidParams(params, validateProgressCardGetParams, "progressCard.get", respond)) return;
const session = resolveProgressCardSession(params, context, respond);
if (!session) return;
sessionMutationAuthorization?.assertCurrent();
const read = retainSessionScopedRead(options, session.sessionKey, session.agentId);
try {
const card = await store.get(session.sessionKey, session.agentId);
sessionMutationAuthorization?.assertCurrent();
read?.assertCurrent();
respond(true, { card: projectProgressCard(card, session.scopeKey) }, void 0);
} catch (error) {
if (error instanceof SessionMutationAuthorizationChangedError) throw error;
respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, String(error)));
} finally {
read?.release();
}
},
"progressCard.put": async (invocation) => {
const { params, respond, context, sessionMutationAuthorization } = invocation;
if (!assertValidParams(params, validateProgressCardPutParams, "progressCard.put", respond)) return;
let input;
try {
input = normalizeProgressCardInput({
markdown: params.markdown,
plan: params.plan
});
} catch (error) {
if (!(error instanceof ProgressCardInputError)) throw error;
respond(false, void 0, errorShape(ErrorCodes.INVALID_REQUEST, error.message));
return;
}
if (params.expectedRevision !== void 0 && (input.markdown || input.steps?.length)) {
respond(false, void 0, errorShape(ErrorCodes.INVALID_REQUEST, "expectedRevision is only valid when clearing a card"));
return;
}
const session = resolveProgressCardSession(params, context, respond);
if (!session) return;
sessionMutationAuthorization?.assertCurrent();
const assertCurrent = () => {
invocation.signal?.throwIfAborted();
invocation.sessionMutationCommitGuard?.();
sessionMutationAuthorization?.assertCurrent();
};
try {
const result = await store.put(session.sessionKey, {
...input,
expectedRevision: params.expectedRevision,
assertCurrent
}, session.agentId);
assertCurrent();
if (params.expectedRevision === void 0 || result.card === null) context.broadcast("progressCard.changed", {
sessionKey: session.scopeKey,
revision: result.card?.revision ?? null
}, {
sessionKeys: [session.sessionKey],
agentId: session.agentId
});
respond(true, { card: projectProgressCard(result.card, session.scopeKey) }, void 0);
} catch (error) {
if (error instanceof SessionMutationAuthorizationChangedError) throw error;
respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, String(error)));
}
}
};
}
const progressCardHandlers = createProgressCardHandlers();
//#endregion
export { progressCardHandlers };