@xemahq/platform-common 0.12.6 → 0.12.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/lib/advisory-lock.d.ts +10 -0
  2. package/dist/lib/advisory-lock.d.ts.map +1 -0
  3. package/dist/lib/advisory-lock.js +32 -0
  4. package/dist/lib/advisory-lock.js.map +1 -0
  5. package/dist/lib/biome-database.d.ts +14 -0
  6. package/dist/lib/biome-database.d.ts.map +1 -0
  7. package/dist/lib/biome-database.js +88 -0
  8. package/dist/lib/biome-database.js.map +1 -0
  9. package/dist/lib/llm-stream/anthropic-adapter.d.ts +25 -0
  10. package/dist/lib/llm-stream/anthropic-adapter.d.ts.map +1 -0
  11. package/dist/lib/llm-stream/anthropic-adapter.js +278 -0
  12. package/dist/lib/llm-stream/anthropic-adapter.js.map +1 -0
  13. package/dist/lib/redaction/redaction.interceptor.d.ts +11 -0
  14. package/dist/lib/redaction/redaction.interceptor.d.ts.map +1 -0
  15. package/dist/lib/redaction/redaction.interceptor.js +41 -0
  16. package/dist/lib/redaction/redaction.interceptor.js.map +1 -0
  17. package/dist/lib/redaction/redaction.service.d.ts +9 -0
  18. package/dist/lib/redaction/redaction.service.d.ts.map +1 -0
  19. package/dist/lib/redaction/redaction.service.js +110 -0
  20. package/dist/lib/redaction/redaction.service.js.map +1 -0
  21. package/dist/lib/session-event-payloads/error-codes.d.ts +4 -2
  22. package/dist/lib/session-event-payloads/error-codes.d.ts.map +1 -1
  23. package/dist/lib/session-event-payloads/error-codes.js +4 -0
  24. package/dist/lib/session-event-payloads/error-codes.js.map +1 -1
  25. package/dist/lib/session-event-payloads/validation.d.ts +2 -2
  26. package/dist/lib/to-prisma-json.d.ts +6 -0
  27. package/dist/lib/to-prisma-json.d.ts.map +1 -0
  28. package/dist/lib/to-prisma-json.js +12 -0
  29. package/dist/lib/to-prisma-json.js.map +1 -0
  30. package/dist/nestjs/auth/org-authority-observations.d.ts +15 -0
  31. package/dist/nestjs/auth/org-authority-observations.d.ts.map +1 -0
  32. package/dist/nestjs/auth/org-authority-observations.js +47 -0
  33. package/dist/nestjs/auth/org-authority-observations.js.map +1 -0
  34. package/dist/nestjs/auth/org-authority.d.ts +32 -0
  35. package/dist/nestjs/auth/org-authority.d.ts.map +1 -0
  36. package/dist/nestjs/auth/org-authority.js +102 -0
  37. package/dist/nestjs/auth/org-authority.js.map +1 -0
  38. package/dist/nestjs/auth/org-claim.d.ts +12 -0
  39. package/dist/nestjs/auth/org-claim.d.ts.map +1 -0
  40. package/dist/nestjs/auth/org-claim.js +25 -0
  41. package/dist/nestjs/auth/org-claim.js.map +1 -0
  42. package/dist/nestjs/auth/org-role.d.ts +13 -0
  43. package/dist/nestjs/auth/org-role.d.ts.map +1 -0
  44. package/dist/nestjs/auth/org-role.js +75 -0
  45. package/dist/nestjs/auth/org-role.js.map +1 -0
  46. package/dist/nestjs/cors.config.d.ts.map +1 -1
  47. package/dist/nestjs/cors.config.js +1 -0
  48. package/dist/nestjs/cors.config.js.map +1 -1
  49. package/dist/nestjs/idempotency/prisma-idempotency.service.d.ts +20 -0
  50. package/dist/nestjs/idempotency/prisma-idempotency.service.d.ts.map +1 -0
  51. package/dist/nestjs/idempotency/prisma-idempotency.service.js +58 -0
  52. package/dist/nestjs/idempotency/prisma-idempotency.service.js.map +1 -0
  53. package/package.json +2 -2
@@ -0,0 +1,10 @@
1
+ export interface AdvisoryLockClient {
2
+ readonly $queryRaw: <T = unknown>(strings: TemplateStringsArray, ...values: unknown[]) => Promise<T>;
3
+ readonly $executeRaw: (strings: TemplateStringsArray, ...values: unknown[]) => Promise<number>;
4
+ }
5
+ export type AdvisoryLockKey = string | bigint;
6
+ export declare function acquireXactAdvisoryLock(db: AdvisoryLockClient, key: AdvisoryLockKey): Promise<void>;
7
+ export declare function tryAcquireXactAdvisoryLock(db: AdvisoryLockClient, key: AdvisoryLockKey): Promise<boolean>;
8
+ export declare function tryAcquireAdvisoryLock(db: AdvisoryLockClient, key: AdvisoryLockKey): Promise<boolean>;
9
+ export declare function releaseAdvisoryLock(db: AdvisoryLockClient, key: AdvisoryLockKey): Promise<boolean>;
10
+ //# sourceMappingURL=advisory-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advisory-lock.d.ts","sourceRoot":"","sources":["../../src/lib/advisory-lock.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,OAAO,EAC9B,OAAO,EAAE,oBAAoB,EAC7B,GAAG,MAAM,EAAE,OAAO,EAAE,KACjB,OAAO,CAAC,CAAC,CAAC,CAAC;IAChB,QAAQ,CAAC,WAAW,EAAE,CACpB,OAAO,EAAE,oBAAoB,EAC7B,GAAG,MAAM,EAAE,OAAO,EAAE,KACjB,OAAO,CAAC,MAAM,CAAC,CAAC;CACtB;AASD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,CAAC;AAa9C,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,kBAAkB,EACtB,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,IAAI,CAAC,CAMf;AAqBD,wBAAsB,0BAA0B,CAC9C,EAAE,EAAE,kBAAkB,EACtB,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,OAAO,CAAC,CAUlB;AAoBD,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,kBAAkB,EACtB,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,OAAO,CAAC,CAUlB;AAWD,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,kBAAkB,EACtB,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,OAAO,CAAC,CAUlB"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.acquireXactAdvisoryLock = acquireXactAdvisoryLock;
4
+ exports.tryAcquireXactAdvisoryLock = tryAcquireXactAdvisoryLock;
5
+ exports.tryAcquireAdvisoryLock = tryAcquireAdvisoryLock;
6
+ exports.releaseAdvisoryLock = releaseAdvisoryLock;
7
+ async function acquireXactAdvisoryLock(db, key) {
8
+ if (typeof key === 'bigint') {
9
+ await db.$executeRaw `SELECT pg_advisory_xact_lock(${key}::bigint)`;
10
+ return;
11
+ }
12
+ await db.$executeRaw `SELECT pg_advisory_xact_lock(hashtext(${key}))`;
13
+ }
14
+ async function tryAcquireXactAdvisoryLock(db, key) {
15
+ const rows = typeof key === 'bigint'
16
+ ? await db.$queryRaw `SELECT pg_try_advisory_xact_lock(${key}::bigint) AS acquired`
17
+ : await db.$queryRaw `SELECT pg_try_advisory_xact_lock(hashtext(${key})) AS acquired`;
18
+ return rows[0]?.acquired === true;
19
+ }
20
+ async function tryAcquireAdvisoryLock(db, key) {
21
+ const rows = typeof key === 'bigint'
22
+ ? await db.$queryRaw `SELECT pg_try_advisory_lock(${key}::bigint) AS acquired`
23
+ : await db.$queryRaw `SELECT pg_try_advisory_lock(hashtext(${key})) AS acquired`;
24
+ return rows[0]?.acquired === true;
25
+ }
26
+ async function releaseAdvisoryLock(db, key) {
27
+ const rows = typeof key === 'bigint'
28
+ ? await db.$queryRaw `SELECT pg_advisory_unlock(${key}::bigint) AS released`
29
+ : await db.$queryRaw `SELECT pg_advisory_unlock(hashtext(${key})) AS released`;
30
+ return rows[0]?.released === true;
31
+ }
32
+ //# sourceMappingURL=advisory-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advisory-lock.js","sourceRoot":"","sources":["../../src/lib/advisory-lock.ts"],"names":[],"mappings":";;AAgEA,0DASC;AAqBD,gEAaC;AAoBD,wDAaC;AAWD,kDAaC;AApGM,KAAK,UAAU,uBAAuB,CAC3C,EAAsB,EACtB,GAAoB;IAEpB,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,EAAE,CAAC,WAAW,CAAA,gCAAgC,GAAG,WAAW,CAAC;QACnE,OAAO;IACT,CAAC;IACD,MAAM,EAAE,CAAC,WAAW,CAAA,yCAAyC,GAAG,IAAI,CAAC;AACvE,CAAC;AAqBM,KAAK,UAAU,0BAA0B,CAC9C,EAAsB,EACtB,GAAoB;IAEpB,MAAM,IAAI,GACR,OAAO,GAAG,KAAK,QAAQ;QACrB,CAAC,CAAC,MAAM,EAAE,CAAC,SAAS,CAEjB,oCAAoC,GAAG,uBAAuB;QACjE,CAAC,CAAC,MAAM,EAAE,CAAC,SAAS,CAEjB,6CAA6C,GAAG,gBAAgB,CAAC;IACxE,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,CAAC;AACpC,CAAC;AAoBM,KAAK,UAAU,sBAAsB,CAC1C,EAAsB,EACtB,GAAoB;IAEpB,MAAM,IAAI,GACR,OAAO,GAAG,KAAK,QAAQ;QACrB,CAAC,CAAC,MAAM,EAAE,CAAC,SAAS,CAEjB,+BAA+B,GAAG,uBAAuB;QAC5D,CAAC,CAAC,MAAM,EAAE,CAAC,SAAS,CAEjB,wCAAwC,GAAG,gBAAgB,CAAC;IACnE,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,CAAC;AACpC,CAAC;AAWM,KAAK,UAAU,mBAAmB,CACvC,EAAsB,EACtB,GAAoB;IAEpB,MAAM,IAAI,GACR,OAAO,GAAG,KAAK,QAAQ;QACrB,CAAC,CAAC,MAAM,EAAE,CAAC,SAAS,CAEjB,6BAA6B,GAAG,uBAAuB;QAC1D,CAAC,CAAC,MAAM,EAAE,CAAC,SAAS,CAEjB,sCAAsC,GAAG,gBAAgB,CAAC;IACjE,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,CAAC;AACpC,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface BiomeDatabaseUrlParts {
2
+ readonly user?: string;
3
+ readonly password?: string;
4
+ readonly host?: string;
5
+ readonly port?: string;
6
+ readonly database?: string;
7
+ readonly schema?: string;
8
+ readonly sslParams?: string;
9
+ }
10
+ export declare function composeBiomeDatabaseUrl(parts: BiomeDatabaseUrlParts): string | null;
11
+ export declare function composeBiomeDatabaseUrlFromEnv(env?: NodeJS.ProcessEnv): string | null;
12
+ export declare const BIOME_DB_SESSION_TIMEZONE = "UTC";
13
+ export declare function ensureBiomeDbSearchPath(connectionString: string): string;
14
+ //# sourceMappingURL=biome-database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"biome-database.d.ts","sourceRoot":"","sources":["../../src/lib/biome-database.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAQD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,qBAAqB,GAC3B,MAAM,GAAG,IAAI,CAWf;AAMD,wBAAgB,8BAA8B,CAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,IAAI,CAUf;AAUD,eAAO,MAAM,yBAAyB,QAAQ,CAAC;AAgI/C,wBAAgB,uBAAuB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAyCxE"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BIOME_DB_SESSION_TIMEZONE = void 0;
4
+ exports.composeBiomeDatabaseUrl = composeBiomeDatabaseUrl;
5
+ exports.composeBiomeDatabaseUrlFromEnv = composeBiomeDatabaseUrlFromEnv;
6
+ exports.ensureBiomeDbSearchPath = ensureBiomeDbSearchPath;
7
+ function composeBiomeDatabaseUrl(parts) {
8
+ const { user, password, host, port, database, schema, sslParams } = parts;
9
+ if (!user || !password || !host || !port || !database) {
10
+ return null;
11
+ }
12
+ const base = `postgresql://${user}:${encodeURIComponent(password)}@${host}:${port}/${database}`;
13
+ const schemaPart = schema ? `schema=${schema}` : null;
14
+ const query = [schemaPart, sslParams].filter(Boolean).join('&');
15
+ return query ? `${base}?${query}` : base;
16
+ }
17
+ function composeBiomeDatabaseUrlFromEnv(env = process.env) {
18
+ return composeBiomeDatabaseUrl({
19
+ user: env.DB_USER,
20
+ password: env.DB_PASSWORD,
21
+ host: env.DB_HOST,
22
+ port: env.DB_PORT,
23
+ database: env.DB_NAME,
24
+ schema: env.DB_SCHEMA,
25
+ sslParams: env.DB_SSL_PARAMS,
26
+ });
27
+ }
28
+ exports.BIOME_DB_SESSION_TIMEZONE = 'UTC';
29
+ function parseLibpqSettings(options) {
30
+ const settings = new Map();
31
+ const tokens = options.split(/(?<!\\)\s+/u).filter((t) => t.length > 0);
32
+ for (let i = 0; i < tokens.length; i += 1) {
33
+ const token = tokens[i];
34
+ let declaration;
35
+ if (token === '-c') {
36
+ declaration = tokens[i + 1];
37
+ i += 1;
38
+ }
39
+ else if (token.startsWith('-c') && token.length > 2) {
40
+ declaration = token.slice(2);
41
+ }
42
+ if (declaration === undefined) {
43
+ continue;
44
+ }
45
+ const equals = declaration.indexOf('=');
46
+ if (equals <= 0) {
47
+ continue;
48
+ }
49
+ settings.set(declaration.slice(0, equals).toLowerCase(), declaration.slice(equals + 1));
50
+ }
51
+ return settings;
52
+ }
53
+ function serializeWithEncodedOptionSeparators(url) {
54
+ return url
55
+ .toString()
56
+ .replace(/([?&]options=)([^&#]*)/u, (_match, prefix, value) => `${prefix}${value.replace(/\+/gu, '%20')}`);
57
+ }
58
+ function ensureBiomeDbSearchPath(connectionString) {
59
+ const url = new URL(connectionString);
60
+ const schema = url.searchParams.get('schema');
61
+ const existingOptions = url.searchParams.get('options') ?? '';
62
+ const declared = parseLibpqSettings(existingOptions);
63
+ const declaredTimezone = declared.get('timezone');
64
+ if (declaredTimezone !== undefined &&
65
+ declaredTimezone.toUpperCase() !== exports.BIOME_DB_SESSION_TIMEZONE) {
66
+ throw new Error(`Biome database connection declares options "-c timezone=${declaredTimezone}", ` +
67
+ `but a biome database session must run in ${exports.BIOME_DB_SESSION_TIMEZONE}: ` +
68
+ `@prisma/adapter-pg puts no offset on the wire, so under any other zone ` +
69
+ `Prisma and Postgres disagree about every instant by that offset. Remove ` +
70
+ `the timezone option from the connection string.`);
71
+ }
72
+ const additions = [];
73
+ if (!declared.has('search_path') &&
74
+ schema !== null &&
75
+ schema !== '' &&
76
+ schema !== 'public') {
77
+ additions.push(`-c search_path=${schema},public`);
78
+ }
79
+ if (declaredTimezone === undefined) {
80
+ additions.push(`-c timezone=${exports.BIOME_DB_SESSION_TIMEZONE}`);
81
+ }
82
+ if (additions.length === 0) {
83
+ return connectionString;
84
+ }
85
+ url.searchParams.set('options', [existingOptions, ...additions].filter((part) => part.length > 0).join(' '));
86
+ return serializeWithEncodedOptionSeparators(url);
87
+ }
88
+ //# sourceMappingURL=biome-database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"biome-database.js","sourceRoot":"","sources":["../../src/lib/biome-database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { AssistantToolCall, ChatMessage, ToolDefinition } from './types';
2
+ export declare function buildAnthropicMessages(messages: ChatMessage[]): {
3
+ system: string | undefined;
4
+ messages: Array<Record<string, unknown>>;
5
+ };
6
+ export declare function buildAnthropicTools(tools: ToolDefinition[]): Array<Record<string, unknown>>;
7
+ export interface ParsedAnthropicResponse {
8
+ content: string;
9
+ toolCalls?: AssistantToolCall[];
10
+ finishReason: string;
11
+ }
12
+ export declare function parseAnthropicResponse(body: {
13
+ content?: Array<{
14
+ type: 'text';
15
+ text: string;
16
+ } | {
17
+ type: 'tool_use';
18
+ id: string;
19
+ name: string;
20
+ input: unknown;
21
+ }>;
22
+ stop_reason?: string;
23
+ }): ParsedAnthropicResponse;
24
+ export declare function normalizeAnthropicStream(input: ReadableStream<Uint8Array>): ReadableStream<Uint8Array>;
25
+ //# sourceMappingURL=anthropic-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-adapter.d.ts","sourceRoot":"","sources":["../../../src/lib/llm-stream/anthropic-adapter.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,cAAc,EACf,MAAM,SAAS,CAAC;AAYjB,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG;IAC/D,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC1C,CA4DA;AAGD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,cAAc,EAAE,GACtB,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAMhC;AAID,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,OAAO,CAAC,EAAE,KAAK,CACX;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAC9B;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CACjE,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,uBAAuB,CAgC1B;AAYD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,cAAc,CAAC,UAAU,CAAC,GAChC,cAAc,CAAC,UAAU,CAAC,CA4M5B"}
@@ -0,0 +1,278 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildAnthropicMessages = buildAnthropicMessages;
4
+ exports.buildAnthropicTools = buildAnthropicTools;
5
+ exports.parseAnthropicResponse = parseAnthropicResponse;
6
+ exports.normalizeAnthropicStream = normalizeAnthropicStream;
7
+ const common_1 = require("@nestjs/common");
8
+ const logger = new common_1.Logger('AnthropicAdapter');
9
+ function buildAnthropicMessages(messages) {
10
+ const systemParts = [];
11
+ const anthropicMessages = [];
12
+ let toolResultBuffer = [];
13
+ for (const m of messages) {
14
+ if (m.role === 'system') {
15
+ if (m.content)
16
+ systemParts.push(m.content);
17
+ continue;
18
+ }
19
+ if (m.role !== 'tool' && toolResultBuffer.length > 0) {
20
+ anthropicMessages.push({ role: 'user', content: toolResultBuffer });
21
+ toolResultBuffer = [];
22
+ }
23
+ if (m.role === 'assistant' && m.tool_calls?.length) {
24
+ const content = [];
25
+ if (m.content) {
26
+ content.push({ type: 'text', text: m.content });
27
+ }
28
+ for (const tc of m.tool_calls) {
29
+ let input;
30
+ try {
31
+ input = JSON.parse(tc.function.arguments);
32
+ }
33
+ catch {
34
+ input = tc.function.arguments;
35
+ }
36
+ content.push({
37
+ type: 'tool_use',
38
+ id: tc.id,
39
+ name: tc.function.name,
40
+ input,
41
+ });
42
+ }
43
+ anthropicMessages.push({ role: 'assistant', content });
44
+ }
45
+ else if (m.role === 'tool' && m.tool_call_id) {
46
+ toolResultBuffer.push({
47
+ type: 'tool_result',
48
+ tool_use_id: m.tool_call_id,
49
+ content: m.content ?? '',
50
+ });
51
+ }
52
+ else if (m.role === 'assistant') {
53
+ anthropicMessages.push({ role: 'assistant', content: m.content ?? '' });
54
+ }
55
+ else {
56
+ anthropicMessages.push({ role: 'user', content: m.content ?? '' });
57
+ }
58
+ }
59
+ if (toolResultBuffer.length > 0) {
60
+ anthropicMessages.push({ role: 'user', content: toolResultBuffer });
61
+ }
62
+ return {
63
+ system: systemParts.length > 0 ? systemParts.join('\n') : undefined,
64
+ messages: anthropicMessages,
65
+ };
66
+ }
67
+ function buildAnthropicTools(tools) {
68
+ return tools.map((t) => ({
69
+ name: t.function.name,
70
+ description: t.function.description,
71
+ input_schema: t.function.parameters,
72
+ }));
73
+ }
74
+ function parseAnthropicResponse(body) {
75
+ const blocks = body.content ?? [];
76
+ let textContent = '';
77
+ const toolCalls = [];
78
+ for (const block of blocks) {
79
+ if (block.type === 'text') {
80
+ textContent += block.text;
81
+ }
82
+ else {
83
+ toolCalls.push({
84
+ id: block.id,
85
+ type: 'function',
86
+ function: {
87
+ name: block.name,
88
+ arguments: typeof block.input === 'string'
89
+ ? block.input
90
+ : JSON.stringify(block.input),
91
+ },
92
+ });
93
+ }
94
+ }
95
+ let finishReason = 'stop';
96
+ if (body.stop_reason === 'tool_use')
97
+ finishReason = 'tool_calls';
98
+ else if (body.stop_reason === 'max_tokens')
99
+ finishReason = 'length';
100
+ return {
101
+ content: textContent,
102
+ ...(toolCalls.length > 0 ? { toolCalls } : {}),
103
+ finishReason,
104
+ };
105
+ }
106
+ function normalizeAnthropicStream(input) {
107
+ const reader = input.getReader();
108
+ const decoder = new TextDecoder();
109
+ const encoder = new TextEncoder();
110
+ let messageId = '';
111
+ let model = '';
112
+ let nextToolCallIndex = 0;
113
+ const toolCallIndexMap = new Map();
114
+ const toolBlockHasInput = new Map();
115
+ const makeChunk = (delta, finishReason = null) => `data: ${JSON.stringify({
116
+ id: messageId,
117
+ object: 'chat.completion.chunk',
118
+ model,
119
+ choices: [{ index: 0, delta, finish_reason: finishReason }],
120
+ })}\n\n`;
121
+ const processEvent = (parsed) => {
122
+ switch (parsed.type) {
123
+ case 'message_start': {
124
+ const msg = parsed.message;
125
+ messageId = msg.id || `msg_${Date.now()}`;
126
+ model = msg.model || '';
127
+ return [makeChunk({ role: 'assistant', content: '' })];
128
+ }
129
+ case 'content_block_start': {
130
+ const block = parsed.content_block;
131
+ const index = parsed.index;
132
+ if (block.type === 'tool_use') {
133
+ const tcIdx = nextToolCallIndex++;
134
+ toolCallIndexMap.set(index, tcIdx);
135
+ toolBlockHasInput.set(index, false);
136
+ logger.debug(`Tool call started: index=${index} tcIdx=${tcIdx} id=${block.id} name=${block.name}`);
137
+ return [
138
+ makeChunk({
139
+ tool_calls: [
140
+ {
141
+ index: tcIdx,
142
+ id: block.id,
143
+ type: 'function',
144
+ function: { name: block.name, arguments: '' },
145
+ },
146
+ ],
147
+ }),
148
+ ];
149
+ }
150
+ return [];
151
+ }
152
+ case 'content_block_delta': {
153
+ const delta = parsed.delta;
154
+ const index = parsed.index;
155
+ if (delta.type === 'text_delta') {
156
+ return [makeChunk({ content: delta.text })];
157
+ }
158
+ if (delta.type === 'thinking_delta') {
159
+ return [makeChunk({ reasoning_content: delta.thinking })];
160
+ }
161
+ if (delta.type === 'input_json_delta') {
162
+ const partialJson = delta.partial_json;
163
+ if (!partialJson)
164
+ return [];
165
+ const tcIdx = toolCallIndexMap.get(index) ?? 0;
166
+ toolBlockHasInput.set(index, true);
167
+ logger.debug(`Tool call args delta: index=${index} tcIdx=${tcIdx} partial_json=${JSON.stringify(partialJson)}`);
168
+ return [
169
+ makeChunk({
170
+ tool_calls: [
171
+ {
172
+ index: tcIdx,
173
+ function: { arguments: partialJson },
174
+ },
175
+ ],
176
+ }),
177
+ ];
178
+ }
179
+ return [];
180
+ }
181
+ case 'content_block_stop': {
182
+ const index = parsed.index;
183
+ if (toolCallIndexMap.has(index) && !toolBlockHasInput.get(index)) {
184
+ const tcIdx = toolCallIndexMap.get(index);
185
+ logger.debug(`Tool call block stopped with no input — emitting empty args: index=${index} tcIdx=${tcIdx}`);
186
+ return [
187
+ makeChunk({
188
+ tool_calls: [
189
+ {
190
+ index: tcIdx,
191
+ function: { arguments: '{}' },
192
+ },
193
+ ],
194
+ }),
195
+ ];
196
+ }
197
+ return [];
198
+ }
199
+ case 'message_delta': {
200
+ const d = parsed.delta;
201
+ let fr = 'stop';
202
+ if (d.stop_reason === 'tool_use')
203
+ fr = 'tool_calls';
204
+ else if (d.stop_reason === 'max_tokens')
205
+ fr = 'length';
206
+ return [makeChunk({}, fr)];
207
+ }
208
+ case 'message_stop':
209
+ return ['data: [DONE]\n\n'];
210
+ default:
211
+ return [];
212
+ }
213
+ };
214
+ return new ReadableStream({
215
+ async start(controller) {
216
+ let buffer = '';
217
+ try {
218
+ for (;;) {
219
+ const { done, value } = await reader.read();
220
+ if (done)
221
+ break;
222
+ buffer += decoder.decode(value, { stream: true });
223
+ const lines = buffer.split('\n');
224
+ buffer = lines.pop() ?? '';
225
+ for (const line of lines) {
226
+ const trimmed = line.trim();
227
+ if (!trimmed.startsWith('data: '))
228
+ continue;
229
+ const dataStr = trimmed.slice(6).trim();
230
+ if (dataStr === '[DONE]') {
231
+ controller.enqueue(encoder.encode('data: [DONE]\n\n'));
232
+ continue;
233
+ }
234
+ let parsed;
235
+ try {
236
+ parsed = JSON.parse(dataStr);
237
+ }
238
+ catch {
239
+ logger.warn(`Skipping unparseable SSE line: ${dataStr.slice(0, 200)}`);
240
+ continue;
241
+ }
242
+ for (const chunk of processEvent(parsed)) {
243
+ controller.enqueue(encoder.encode(chunk));
244
+ }
245
+ }
246
+ }
247
+ if (buffer.trim()) {
248
+ const trimmed = buffer.trim();
249
+ if (trimmed.startsWith('data: ')) {
250
+ const dataStr = trimmed.slice(6).trim();
251
+ if (dataStr === '[DONE]') {
252
+ controller.enqueue(encoder.encode('data: [DONE]\n\n'));
253
+ }
254
+ else {
255
+ try {
256
+ const parsed = JSON.parse(dataStr);
257
+ for (const chunk of processEvent(parsed)) {
258
+ controller.enqueue(encoder.encode(chunk));
259
+ }
260
+ }
261
+ catch {
262
+ logger.warn(`Skipping unparseable final SSE buffer: ${dataStr.slice(0, 200)}`);
263
+ }
264
+ }
265
+ }
266
+ }
267
+ controller.close();
268
+ }
269
+ catch (err) {
270
+ controller.error(err);
271
+ }
272
+ finally {
273
+ reader.releaseLock();
274
+ }
275
+ },
276
+ });
277
+ }
278
+ //# sourceMappingURL=anthropic-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-adapter.js","sourceRoot":"","sources":["../../../src/lib/llm-stream/anthropic-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
2
+ import { Observable } from 'rxjs';
3
+ import { RedactionService } from './redaction.service';
4
+ export declare const REDACT_RESPONSE_KEY = "xema:redact-response";
5
+ export declare const RedactResponse: () => ClassDecorator & MethodDecorator;
6
+ export declare class RedactionInterceptor implements NestInterceptor {
7
+ private readonly redaction;
8
+ constructor(redaction: RedactionService);
9
+ intercept(context: ExecutionContext, next: CallHandler): Observable<unknown>;
10
+ }
11
+ //# sourceMappingURL=redaction.interceptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.interceptor.d.ts","sourceRoot":"","sources":["../../../src/lib/redaction/redaction.interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,gBAAgB,EAEhB,eAAe,EAEhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAO,MAAM,MAAM,CAAC;AAGvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAavD,eAAO,MAAM,mBAAmB,yBAAyB,CAAC;AAC1D,eAAO,MAAM,cAAc,QAAO,cAAc,GAAG,eACX,CAAC;AAEzC,qBACa,oBAAqB,YAAW,eAAe;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,gBAAgB;IAExD,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC;CAU7E"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.RedactionInterceptor = exports.RedactResponse = exports.REDACT_RESPONSE_KEY = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const rxjs_1 = require("rxjs");
15
+ const decorator_metadata_1 = require("../../nestjs/decorator-metadata");
16
+ const redaction_service_1 = require("./redaction.service");
17
+ exports.REDACT_RESPONSE_KEY = 'xema:redact-response';
18
+ const RedactResponse = () => (0, common_1.SetMetadata)(exports.REDACT_RESPONSE_KEY, true);
19
+ exports.RedactResponse = RedactResponse;
20
+ let RedactionInterceptor = class RedactionInterceptor {
21
+ redaction;
22
+ constructor(redaction) {
23
+ this.redaction = redaction;
24
+ }
25
+ intercept(context, next) {
26
+ const enabled = (0, decorator_metadata_1.readDecoratorOverride)(exports.REDACT_RESPONSE_KEY, [
27
+ context.getHandler(),
28
+ context.getClass(),
29
+ ]);
30
+ if (!enabled) {
31
+ return next.handle();
32
+ }
33
+ return next.handle().pipe((0, rxjs_1.map)((value) => this.redaction.redact(value)));
34
+ }
35
+ };
36
+ exports.RedactionInterceptor = RedactionInterceptor;
37
+ exports.RedactionInterceptor = RedactionInterceptor = __decorate([
38
+ (0, common_1.Injectable)(),
39
+ __metadata("design:paramtypes", [redaction_service_1.RedactionService])
40
+ ], RedactionInterceptor);
41
+ //# sourceMappingURL=redaction.interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.interceptor.js","sourceRoot":"","sources":["../../../src/lib/redaction/redaction.interceptor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAMwB;AACxB,+BAAuC;AAEvC,wEAAwE;AACxE,2DAAuD;AAa1C,QAAA,mBAAmB,GAAG,sBAAsB,CAAC;AACnD,MAAM,cAAc,GAAG,GAAqC,EAAE,CACnE,IAAA,oBAAW,EAAC,2BAAmB,EAAE,IAAI,CAAC,CAAC;AAD5B,QAAA,cAAc,kBACc;AAGlC,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IACF;IAA7B,YAA6B,SAA2B;QAA3B,cAAS,GAAT,SAAS,CAAkB;IAAG,CAAC;IAE5D,SAAS,CAAC,OAAyB,EAAE,IAAiB;QACpD,MAAM,OAAO,GAAG,IAAA,0CAAqB,EAAU,2BAAmB,EAAE;YAClE,OAAO,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,QAAQ,EAAE;SACnB,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAA,UAAG,EAAC,CAAC,KAAc,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC;CACF,CAAA;AAbY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;qCAE6B,oCAAgB;GAD7C,oBAAoB,CAahC"}
@@ -0,0 +1,9 @@
1
+ import type { RedactionRule } from './redaction-rule';
2
+ export declare class RedactionService {
3
+ private readonly rules;
4
+ constructor();
5
+ static withRules(rules: readonly RedactionRule[]): RedactionService;
6
+ redact<T>(value: T): T;
7
+ private walk;
8
+ }
9
+ //# sourceMappingURL=redaction.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.service.d.ts","sourceRoot":"","sources":["../../../src/lib/redaction/redaction.service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAsBtD,qBACa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;;IAajD,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,GAAG,gBAAgB;IAUnE,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC;IAItB,OAAO,CAAC,IAAI;CAqDb"}