Skip to content

Commit 7dea283

Browse files
authored
refactor: expand acp core package (#88618)
* refactor: expand acp core package * chore: drop acp core package symlink * fix: keep acp core dependency graph stable * fix: add acp core tsconfig subpaths * fix: sync acp core boundary path artifacts * fix: use kysely for cron run-log queries * fix: resolve acp core subpaths in loaders
1 parent cc29005 commit 7dea283

93 files changed

Lines changed: 1848 additions & 386 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

extensions/tsconfig.package-boundary.paths.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,9 @@
257257
"@openclaw/acp-core/record-shared": [
258258
"../dist/plugin-sdk/packages/acp-core/src/record-shared.d.ts"
259259
],
260+
"@openclaw/acp-core/runtime/errors": [
261+
"../dist/plugin-sdk/packages/acp-core/src/runtime/errors.d.ts"
262+
],
260263
"@openclaw/acp-core/runtime/types": [
261264
"../dist/plugin-sdk/packages/acp-core/src/runtime/types.d.ts"
262265
],

extensions/xai/tsconfig.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,9 @@
243243
"@openclaw/acp-core/record-shared": [
244244
"../../dist/plugin-sdk/packages/acp-core/src/record-shared.d.ts"
245245
],
246+
"@openclaw/acp-core/runtime/errors": [
247+
"../../dist/plugin-sdk/packages/acp-core/src/runtime/errors.d.ts"
248+
],
246249
"@openclaw/acp-core/runtime/types": [
247250
"../../dist/plugin-sdk/packages/acp-core/src/runtime/types.d.ts"
248251
],
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//#region src/error-format.d.ts
2+
declare function configureAcpErrorRedactor(redactor: ((value: string) => string) | undefined): void;
3+
declare function redactSensitiveText(value: string): string;
4+
/**
5+
* Render a non-Error `cause` value without leaking `[object Object]` or throwing
6+
* while formatting nested ACP runtime failures.
7+
*/
8+
declare function stringifyNonErrorCause(value: unknown): string;
9+
//#endregion
10+
export { configureAcpErrorRedactor, redactSensitiveText, stringifyNonErrorCause };
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
//#region src/error-format.ts
2+
const SECRET_PATTERNS = [
3+
/\b[A-Z0-9_]*(?:KEY|TOKEN|SECRET|PASSWORD|PASSWD|CARD[_-]?NUMBER|CARD[_-]?CVC|CARD[_-]?CVV|CVC|CVV|SECURITY[_-]?CODE|PAYMENT[_-]?CREDENTIAL|SHARED[_-]?PAYMENT[_-]?TOKEN)\b\s*[=:]\s*(["']?)([^\s"'\\]+)\1/g,
4+
/\b[A-Z0-9_]*(?:KEY|TOKEN|SECRET|PASSWORD|PASSWD|CARD[_-]?NUMBER|CARD[_-]?CVC|CARD[_-]?CVV|CVC|CVV|SECURITY[_-]?CODE|PAYMENT[_-]?CREDENTIAL|SHARED[_-]?PAYMENT[_-]?TOKEN)\b\s*[=:]\s*\\+(["'])([^\s"'\\]+)\\+\1/g,
5+
/[?&](?:access[-_]?token|auth[-_]?token|hook[-_]?token|refresh[-_]?token|api[-_]?key|client[-_]?secret|token|key|secret|password|pass|passwd|auth|signature|card[-_]?number|card[-_]?cvc|card[-_]?cvv|cvc|cvv|security[-_]?code|payment[-_]?credential|shared[-_]?payment[-_]?token)=([^&\s"'<>]+)/gi,
6+
/"(?:apiKey|token|secret|password|passwd|accessToken|refreshToken|cardNumber|card_number|cardCvc|card_cvc|cardCvv|card_cvv|cvc|cvv|securityCode|security_code|paymentCredential|payment_credential|sharedPaymentToken|shared_payment_token)"\s*:\s*"([^"]+)"/g,
7+
/(^|[\s,{])["']?(?:api[-_]key|access[-_]token|refresh[-_]token|authToken|auth[-_]token|clientSecret|client[-_]secret|appSecret|app[-_]secret)["']?\s*[:=]\s*(["'])([^"'\r\n]+)\2/gi,
8+
/(^|[\s,{])["']?(?:authorization|proxy-authorization|cookie|set-cookie|x-api-key|x-auth-token)["']?\s*[:=]\s*(["'])([^"'\r\n]+)\2/gi,
9+
/--(?:api[-_]?key|hook[-_]?token|token|secret|password|passwd|card[-_]?number|card[-_]?cvc|card[-_]?cvv|cvc|cvv|security[-_]?code|payment[-_]?credential|shared[-_]?payment[-_]?token)\s+(["']?)([^\s"']+)\1/gi,
10+
/Authorization\s*[:=]\s*Bearer\s+([A-Za-z0-9._\-+=]+)/gi,
11+
/Authorization\s*[:=]\s*Basic\s+([A-Za-z0-9+/=]+)/gi,
12+
/(?:X-OpenClaw-Token|x-pomerium-jwt-assertion|X-Api-Key|X-Auth-Token)\s*[:=]\s*([^\s"',;]+)/gi,
13+
/\bBearer\s+([A-Za-z0-9._\-+=]{18,})\b/g,
14+
/(^|[\s,;])(?:access_token|refresh_token|auth[-_]?token|api[-_]?key|client[-_]?secret|app[-_]?secret|token|secret|password|passwd|card[-_]?number|card[-_]?cvc|card[-_]?cvv|cvc|cvv|security[-_]?code|payment[-_]?credential|shared[-_]?payment[-_]?token)=([^\s&#]+)/gi,
15+
/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]+?-----END [A-Z ]*PRIVATE KEY-----/g,
16+
/\b(sk-[A-Za-z0-9_-]{8,})\b/g,
17+
/(ghp_[A-Za-z0-9]{20,})/g,
18+
/(github_pat_[A-Za-z0-9_]{20,})/g,
19+
/(xox[baprs]-[A-Za-z0-9-]{10,})/g,
20+
/(xapp-[A-Za-z0-9-]{10,})/g,
21+
/(gsk_[A-Za-z0-9_-]{10,})/g,
22+
/(AIza[0-9A-Za-z\-_]{20,})/g,
23+
/(ya29\.[0-9A-Za-z_\-./+=]{10,})/g,
24+
/(1\/\/0[0-9A-Za-z_\-./+=]{10,})/g,
25+
/(eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,})/g,
26+
/(pplx-[A-Za-z0-9_-]{10,})/g,
27+
/(npm_[A-Za-z0-9]{10,})/g,
28+
/(AKID[A-Za-z0-9]{10,})/g,
29+
/(LTAI[A-Za-z0-9]{10,})/g,
30+
/(hf_[A-Za-z0-9]{10,})/g,
31+
/(r8_[A-Za-z0-9]{10,})/g,
32+
/\bbot(\d{6,}:[A-Za-z0-9_-]{20,})\b/g,
33+
/\b(\d{6,}:[A-Za-z0-9_-]{20,})\b/g
34+
];
35+
let configuredRedactor;
36+
function configureAcpErrorRedactor(redactor) {
37+
configuredRedactor = redactor;
38+
}
39+
function redactSensitiveText(value) {
40+
if (configuredRedactor) return configuredRedactor(value);
41+
let redacted = value;
42+
for (const pattern of SECRET_PATTERNS) redacted = redacted.replace(pattern, (match, ...args) => {
43+
if (match.includes("PRIVATE KEY-----")) return "[REDACTED_PRIVATE_KEY]";
44+
const token = args.slice(0, -2).findLast((group) => typeof group === "string" && group.length > 0);
45+
return token ? match.replace(token, "[REDACTED]") : "[REDACTED]";
46+
});
47+
return redacted;
48+
}
49+
/**
50+
* Render a non-Error `cause` value without leaking `[object Object]` or throwing
51+
* while formatting nested ACP runtime failures.
52+
*/
53+
function stringifyNonErrorCause(value) {
54+
if (value === null) return "null";
55+
if (typeof value === "string") return value;
56+
if (typeof value === "number" || typeof value === "boolean" || typeof value === "bigint") return String(value);
57+
try {
58+
return JSON.stringify(value);
59+
} catch {
60+
return Object.prototype.toString.call(value);
61+
}
62+
}
63+
//#endregion
64+
export { configureAcpErrorRedactor, redactSensitiveText, stringifyNonErrorCause };

packages/acp-core/dist/index.d.mts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { configureAcpErrorRedactor, redactSensitiveText, stringifyNonErrorCause } from "./error-format.mjs";
2+
import { readBool, readNonNegativeInteger, readNumber, readString } from "./meta.mjs";
3+
import { normalizeText } from "./normalize-text.mjs";
4+
import { resolveIntegerOption } from "./numeric-options.mjs";
5+
import { asRecord } from "./record-shared.mjs";
6+
import { isParentOwnedBackgroundAcpSession, isRequesterParentOfBackgroundAcpSession } from "./session-interaction-mode.mjs";
7+
import { AcpSessionLineageMeta, AcpSessionLineageRow, toAcpSessionLineageMeta } from "./session-lineage-meta.mjs";
8+
import { AcpProvenanceMode, AcpServerOptions, AcpSession, AcpSessionRuntimeOptions, SessionAcpIdentity, SessionAcpIdentitySource, SessionAcpIdentityState, SessionAcpMeta, SessionId, normalizeAcpProvenanceMode } from "./types.mjs";
9+
import { AcpSessionStore, createInMemorySessionStore, defaultAcpSessionStore } from "./session.mjs";
10+
import { ACP_ERROR_CODES, AcpRuntimeError, AcpRuntimeErrorCode, formatAcpErrorChain, isAcpRuntimeError, toAcpRuntimeError, withAcpRuntimeErrorBoundary } from "./runtime/errors.mjs";
11+
import { formatAcpRuntimeErrorText, toAcpRuntimeErrorText } from "./runtime/error-text.mjs";
12+
import { ACP_SESSION_IDENTITY_RENDERER_VERSION, AcpSessionIdentifierRenderMode, resolveAcpSessionCwd, resolveAcpSessionIdentifierLines, resolveAcpSessionIdentifierLinesFromIdentity, resolveAcpThreadSessionDetailLines } from "./runtime/session-identifiers.mjs";
13+
import { AcpRuntime, AcpRuntimeCapabilities, AcpRuntimeControl, AcpRuntimeDoctorReport, AcpRuntimeEnsureInput, AcpRuntimeEvent, AcpRuntimeHandle, AcpRuntimePromptMode, AcpRuntimeSessionMode, AcpRuntimeStatus, AcpRuntimeTurn, AcpRuntimeTurnAttachment, AcpRuntimeTurnInput, AcpRuntimeTurnResult, AcpRuntimeTurnResultError, AcpSessionUpdateTag } from "./runtime/types.mjs";
14+
import { createIdentityFromEnsure, createIdentityFromHandleEvent, createIdentityFromStatus, identityEquals, identityHasStableSessionId, isSessionIdentityPending, mergeSessionIdentity, resolveRuntimeHandleIdentifiersFromIdentity, resolveRuntimeResumeSessionId, resolveSessionIdentityFromMeta } from "./runtime/session-identity.mjs";
15+
export { ACP_ERROR_CODES, ACP_SESSION_IDENTITY_RENDERER_VERSION, AcpProvenanceMode, AcpRuntime, AcpRuntimeCapabilities, AcpRuntimeControl, AcpRuntimeDoctorReport, AcpRuntimeEnsureInput, AcpRuntimeError, AcpRuntimeErrorCode, AcpRuntimeEvent, AcpRuntimeHandle, AcpRuntimePromptMode, AcpRuntimeSessionMode, AcpRuntimeStatus, AcpRuntimeTurn, AcpRuntimeTurnAttachment, AcpRuntimeTurnInput, AcpRuntimeTurnResult, AcpRuntimeTurnResultError, AcpServerOptions, AcpSession, AcpSessionIdentifierRenderMode, AcpSessionLineageMeta, AcpSessionLineageRow, AcpSessionRuntimeOptions, AcpSessionStore, AcpSessionUpdateTag, SessionAcpIdentity, SessionAcpIdentitySource, SessionAcpIdentityState, SessionAcpMeta, SessionId, asRecord, configureAcpErrorRedactor, createIdentityFromEnsure, createIdentityFromHandleEvent, createIdentityFromStatus, createInMemorySessionStore, defaultAcpSessionStore, formatAcpErrorChain, formatAcpRuntimeErrorText, identityEquals, identityHasStableSessionId, isAcpRuntimeError, isParentOwnedBackgroundAcpSession, isRequesterParentOfBackgroundAcpSession, isSessionIdentityPending, mergeSessionIdentity, normalizeAcpProvenanceMode, normalizeText, readBool, readNonNegativeInteger, readNumber, readString, redactSensitiveText, resolveAcpSessionCwd, resolveAcpSessionIdentifierLines, resolveAcpSessionIdentifierLinesFromIdentity, resolveAcpThreadSessionDetailLines, resolveIntegerOption, resolveRuntimeHandleIdentifiersFromIdentity, resolveRuntimeResumeSessionId, resolveSessionIdentityFromMeta, stringifyNonErrorCause, toAcpRuntimeError, toAcpRuntimeErrorText, toAcpSessionLineageMeta, withAcpRuntimeErrorBoundary };

packages/acp-core/dist/index.mjs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { configureAcpErrorRedactor, redactSensitiveText, stringifyNonErrorCause } from "./error-format.mjs";
2+
import { readBool, readNonNegativeInteger, readNumber, readString } from "./meta.mjs";
3+
import { normalizeText } from "./normalize-text.mjs";
4+
import { resolveIntegerOption } from "./numeric-options.mjs";
5+
import { asRecord } from "./record-shared.mjs";
6+
import { isParentOwnedBackgroundAcpSession, isRequesterParentOfBackgroundAcpSession } from "./session-interaction-mode.mjs";
7+
import { toAcpSessionLineageMeta } from "./session-lineage-meta.mjs";
8+
import { createInMemorySessionStore, defaultAcpSessionStore } from "./session.mjs";
9+
import { normalizeAcpProvenanceMode } from "./types.mjs";
10+
import { ACP_ERROR_CODES, AcpRuntimeError, formatAcpErrorChain, isAcpRuntimeError, toAcpRuntimeError, withAcpRuntimeErrorBoundary } from "./runtime/errors.mjs";
11+
import { formatAcpRuntimeErrorText, toAcpRuntimeErrorText } from "./runtime/error-text.mjs";
12+
import { createIdentityFromEnsure, createIdentityFromHandleEvent, createIdentityFromStatus, identityEquals, identityHasStableSessionId, isSessionIdentityPending, mergeSessionIdentity, resolveRuntimeHandleIdentifiersFromIdentity, resolveRuntimeResumeSessionId, resolveSessionIdentityFromMeta } from "./runtime/session-identity.mjs";
13+
import { ACP_SESSION_IDENTITY_RENDERER_VERSION, resolveAcpSessionCwd, resolveAcpSessionIdentifierLines, resolveAcpSessionIdentifierLinesFromIdentity, resolveAcpThreadSessionDetailLines } from "./runtime/session-identifiers.mjs";
14+
import "./runtime/types.mjs";
15+
export { ACP_ERROR_CODES, ACP_SESSION_IDENTITY_RENDERER_VERSION, AcpRuntimeError, asRecord, configureAcpErrorRedactor, createIdentityFromEnsure, createIdentityFromHandleEvent, createIdentityFromStatus, createInMemorySessionStore, defaultAcpSessionStore, formatAcpErrorChain, formatAcpRuntimeErrorText, identityEquals, identityHasStableSessionId, isAcpRuntimeError, isParentOwnedBackgroundAcpSession, isRequesterParentOfBackgroundAcpSession, isSessionIdentityPending, mergeSessionIdentity, normalizeAcpProvenanceMode, normalizeText, readBool, readNonNegativeInteger, readNumber, readString, redactSensitiveText, resolveAcpSessionCwd, resolveAcpSessionIdentifierLines, resolveAcpSessionIdentifierLinesFromIdentity, resolveAcpThreadSessionDetailLines, resolveIntegerOption, resolveRuntimeHandleIdentifiersFromIdentity, resolveRuntimeResumeSessionId, resolveSessionIdentityFromMeta, stringifyNonErrorCause, toAcpRuntimeError, toAcpRuntimeErrorText, toAcpSessionLineageMeta, withAcpRuntimeErrorBoundary };

packages/acp-core/dist/meta.d.mts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
//#region src/meta.d.ts
2+
declare function readString(meta: Record<string, unknown> | null | undefined, keys: string[]): string | undefined;
3+
declare function readBool(meta: Record<string, unknown> | null | undefined, keys: string[]): boolean | undefined;
4+
declare function readNumber(meta: Record<string, unknown> | null | undefined, keys: string[]): number | undefined;
5+
declare function readNonNegativeInteger(meta: Record<string, unknown> | null | undefined, keys: string[]): number | undefined;
6+
//#endregion
7+
export { readBool, readNonNegativeInteger, readNumber, readString };

packages/acp-core/dist/meta.mjs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { normalizeOptionalString } from "@openclaw/normalization-core/string-coerce";
2+
//#region src/meta.ts
3+
function readMetaValue(meta, keys, normalize) {
4+
if (!meta) return;
5+
for (const key of keys) {
6+
const normalized = normalize(meta[key]);
7+
if (normalized !== void 0) return normalized;
8+
}
9+
}
10+
function readString(meta, keys) {
11+
return readMetaValue(meta, keys, normalizeOptionalString);
12+
}
13+
function readBool(meta, keys) {
14+
return readMetaValue(meta, keys, (value) => typeof value === "boolean" ? value : void 0);
15+
}
16+
function readNumber(meta, keys) {
17+
return readMetaValue(meta, keys, (value) => typeof value === "number" && Number.isFinite(value) ? value : void 0);
18+
}
19+
function readNonNegativeInteger(meta, keys) {
20+
return readMetaValue(meta, keys, (value) => typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : void 0);
21+
}
22+
//#endregion
23+
export { readBool, readNonNegativeInteger, readNumber, readString };
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import { normalizeOptionalString as normalizeText } from "@openclaw/normalization-core/string-coerce";
2+
export { normalizeText };
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import { normalizeOptionalString as normalizeText } from "@openclaw/normalization-core/string-coerce";
2+
export { normalizeText };

0 commit comments

Comments
 (0)