ai-memory-layer 2.0.0
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.
- package/CHANGELOG.md +26 -0
- package/LICENSE +21 -0
- package/README.md +765 -0
- package/bin/memory-server.mjs +157 -0
- package/dist/adapters/memory/embeddings.d.ts +4 -0
- package/dist/adapters/memory/embeddings.d.ts.map +1 -0
- package/dist/adapters/memory/embeddings.js +53 -0
- package/dist/adapters/memory/embeddings.js.map +1 -0
- package/dist/adapters/memory/index.d.ts +7 -0
- package/dist/adapters/memory/index.d.ts.map +1 -0
- package/dist/adapters/memory/index.js +650 -0
- package/dist/adapters/memory/index.js.map +1 -0
- package/dist/adapters/postgres/index.d.ts +38 -0
- package/dist/adapters/postgres/index.d.ts.map +1 -0
- package/dist/adapters/postgres/index.js +982 -0
- package/dist/adapters/postgres/index.js.map +1 -0
- package/dist/adapters/sqlite/embeddings.d.ts +5 -0
- package/dist/adapters/sqlite/embeddings.d.ts.map +1 -0
- package/dist/adapters/sqlite/embeddings.js +122 -0
- package/dist/adapters/sqlite/embeddings.js.map +1 -0
- package/dist/adapters/sqlite/index.d.ts +8 -0
- package/dist/adapters/sqlite/index.d.ts.map +1 -0
- package/dist/adapters/sqlite/index.js +839 -0
- package/dist/adapters/sqlite/index.js.map +1 -0
- package/dist/adapters/sqlite/mappers.d.ts +40 -0
- package/dist/adapters/sqlite/mappers.d.ts.map +1 -0
- package/dist/adapters/sqlite/mappers.js +95 -0
- package/dist/adapters/sqlite/mappers.js.map +1 -0
- package/dist/adapters/sqlite/schema.d.ts +4 -0
- package/dist/adapters/sqlite/schema.d.ts.map +1 -0
- package/dist/adapters/sqlite/schema.js +394 -0
- package/dist/adapters/sqlite/schema.js.map +1 -0
- package/dist/adapters/sync-to-async.d.ts +15 -0
- package/dist/adapters/sync-to-async.d.ts.map +1 -0
- package/dist/adapters/sync-to-async.js +95 -0
- package/dist/adapters/sync-to-async.js.map +1 -0
- package/dist/cli/inspect.d.ts +34 -0
- package/dist/cli/inspect.d.ts.map +1 -0
- package/dist/cli/inspect.js +190 -0
- package/dist/cli/inspect.js.map +1 -0
- package/dist/contracts/async-storage.d.ts +86 -0
- package/dist/contracts/async-storage.d.ts.map +1 -0
- package/dist/contracts/async-storage.js +2 -0
- package/dist/contracts/async-storage.js.map +1 -0
- package/dist/contracts/embedding.d.ts +22 -0
- package/dist/contracts/embedding.d.ts.map +1 -0
- package/dist/contracts/embedding.js +2 -0
- package/dist/contracts/embedding.js.map +1 -0
- package/dist/contracts/identity.d.ts +29 -0
- package/dist/contracts/identity.d.ts.map +1 -0
- package/dist/contracts/identity.js +34 -0
- package/dist/contracts/identity.js.map +1 -0
- package/dist/contracts/observability.d.ts +18 -0
- package/dist/contracts/observability.d.ts.map +1 -0
- package/dist/contracts/observability.js +7 -0
- package/dist/contracts/observability.js.map +1 -0
- package/dist/contracts/policy.d.ts +108 -0
- package/dist/contracts/policy.d.ts.map +1 -0
- package/dist/contracts/policy.js +107 -0
- package/dist/contracts/policy.js.map +1 -0
- package/dist/contracts/storage.d.ts +78 -0
- package/dist/contracts/storage.d.ts.map +1 -0
- package/dist/contracts/storage.js +2 -0
- package/dist/contracts/storage.js.map +1 -0
- package/dist/contracts/types.d.ts +381 -0
- package/dist/contracts/types.d.ts.map +1 -0
- package/dist/contracts/types.js +94 -0
- package/dist/contracts/types.js.map +1 -0
- package/dist/core/circuit-breaker.d.ts +11 -0
- package/dist/core/circuit-breaker.d.ts.map +1 -0
- package/dist/core/circuit-breaker.js +38 -0
- package/dist/core/circuit-breaker.js.map +1 -0
- package/dist/core/context.d.ts +56 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +345 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/events.d.ts +8 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +25 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/extractor.d.ts +37 -0
- package/dist/core/extractor.d.ts.map +1 -0
- package/dist/core/extractor.js +448 -0
- package/dist/core/extractor.js.map +1 -0
- package/dist/core/formatter.d.ts +25 -0
- package/dist/core/formatter.d.ts.map +1 -0
- package/dist/core/formatter.js +97 -0
- package/dist/core/formatter.js.map +1 -0
- package/dist/core/knowledge-lifecycle.d.ts +15 -0
- package/dist/core/knowledge-lifecycle.d.ts.map +1 -0
- package/dist/core/knowledge-lifecycle.js +103 -0
- package/dist/core/knowledge-lifecycle.js.map +1 -0
- package/dist/core/maintenance.d.ts +13 -0
- package/dist/core/maintenance.d.ts.map +1 -0
- package/dist/core/maintenance.js +102 -0
- package/dist/core/maintenance.js.map +1 -0
- package/dist/core/manager.d.ts +110 -0
- package/dist/core/manager.d.ts.map +1 -0
- package/dist/core/manager.js +640 -0
- package/dist/core/manager.js.map +1 -0
- package/dist/core/monitor.d.ts +73 -0
- package/dist/core/monitor.d.ts.map +1 -0
- package/dist/core/monitor.js +395 -0
- package/dist/core/monitor.js.map +1 -0
- package/dist/core/orchestrator.d.ts +64 -0
- package/dist/core/orchestrator.d.ts.map +1 -0
- package/dist/core/orchestrator.js +916 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/presets.d.ts +15 -0
- package/dist/core/presets.d.ts.map +1 -0
- package/dist/core/presets.js +99 -0
- package/dist/core/presets.js.map +1 -0
- package/dist/core/provider-managers.d.ts +47 -0
- package/dist/core/provider-managers.d.ts.map +1 -0
- package/dist/core/provider-managers.js +112 -0
- package/dist/core/provider-managers.js.map +1 -0
- package/dist/core/quick.d.ts +62 -0
- package/dist/core/quick.d.ts.map +1 -0
- package/dist/core/quick.js +300 -0
- package/dist/core/quick.js.map +1 -0
- package/dist/core/retrieval.d.ts +29 -0
- package/dist/core/retrieval.d.ts.map +1 -0
- package/dist/core/retrieval.js +150 -0
- package/dist/core/retrieval.js.map +1 -0
- package/dist/core/runtime.d.ts +67 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +84 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/streaming.d.ts +37 -0
- package/dist/core/streaming.d.ts.map +1 -0
- package/dist/core/streaming.js +51 -0
- package/dist/core/streaming.js.map +1 -0
- package/dist/core/sync.d.ts +13 -0
- package/dist/core/sync.d.ts.map +1 -0
- package/dist/core/sync.js +46 -0
- package/dist/core/sync.js.map +1 -0
- package/dist/core/telemetry.d.ts +8 -0
- package/dist/core/telemetry.d.ts.map +1 -0
- package/dist/core/telemetry.js +14 -0
- package/dist/core/telemetry.js.map +1 -0
- package/dist/core/tokens.d.ts +8 -0
- package/dist/core/tokens.d.ts.map +1 -0
- package/dist/core/tokens.js +59 -0
- package/dist/core/tokens.js.map +1 -0
- package/dist/core/trust.d.ts +23 -0
- package/dist/core/trust.d.ts.map +1 -0
- package/dist/core/trust.js +164 -0
- package/dist/core/trust.js.map +1 -0
- package/dist/core/validation.d.ts +36 -0
- package/dist/core/validation.d.ts.map +1 -0
- package/dist/core/validation.js +185 -0
- package/dist/core/validation.js.map +1 -0
- package/dist/embeddings/local.d.ts +5 -0
- package/dist/embeddings/local.d.ts.map +1 -0
- package/dist/embeddings/local.js +128 -0
- package/dist/embeddings/local.js.map +1 -0
- package/dist/embeddings/openai.d.ts +26 -0
- package/dist/embeddings/openai.d.ts.map +1 -0
- package/dist/embeddings/openai.js +48 -0
- package/dist/embeddings/openai.js.map +1 -0
- package/dist/embeddings/resilience.d.ts +5 -0
- package/dist/embeddings/resilience.d.ts.map +1 -0
- package/dist/embeddings/resilience.js +53 -0
- package/dist/embeddings/resilience.js.map +1 -0
- package/dist/embeddings/voyage.d.ts +30 -0
- package/dist/embeddings/voyage.d.ts.map +1 -0
- package/dist/embeddings/voyage.js +53 -0
- package/dist/embeddings/voyage.js.map +1 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/claude-agent.d.ts +21 -0
- package/dist/integrations/claude-agent.d.ts.map +1 -0
- package/dist/integrations/claude-agent.js +44 -0
- package/dist/integrations/claude-agent.js.map +1 -0
- package/dist/integrations/claude-tools.d.ts +18 -0
- package/dist/integrations/claude-tools.d.ts.map +1 -0
- package/dist/integrations/claude-tools.js +60 -0
- package/dist/integrations/claude-tools.js.map +1 -0
- package/dist/integrations/langchain.d.ts +24 -0
- package/dist/integrations/langchain.d.ts.map +1 -0
- package/dist/integrations/langchain.js +48 -0
- package/dist/integrations/langchain.js.map +1 -0
- package/dist/integrations/mcp.d.ts +23 -0
- package/dist/integrations/mcp.d.ts.map +1 -0
- package/dist/integrations/mcp.js +60 -0
- package/dist/integrations/mcp.js.map +1 -0
- package/dist/integrations/middleware.d.ts +15 -0
- package/dist/integrations/middleware.d.ts.map +1 -0
- package/dist/integrations/middleware.js +27 -0
- package/dist/integrations/middleware.js.map +1 -0
- package/dist/integrations/openai-tools.d.ts +21 -0
- package/dist/integrations/openai-tools.d.ts.map +1 -0
- package/dist/integrations/openai-tools.js +69 -0
- package/dist/integrations/openai-tools.js.map +1 -0
- package/dist/integrations/vercel-ai.d.ts +19 -0
- package/dist/integrations/vercel-ai.d.ts.map +1 -0
- package/dist/integrations/vercel-ai.js +41 -0
- package/dist/integrations/vercel-ai.js.map +1 -0
- package/dist/server/http-server.d.ts +61 -0
- package/dist/server/http-server.d.ts.map +1 -0
- package/dist/server/http-server.js +684 -0
- package/dist/server/http-server.js.map +1 -0
- package/dist/server/index.d.ts +5 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +3 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/mcp-server.d.ts +61 -0
- package/dist/server/mcp-server.d.ts.map +1 -0
- package/dist/server/mcp-server.js +465 -0
- package/dist/server/mcp-server.js.map +1 -0
- package/dist/summarizers/claude.d.ts +11 -0
- package/dist/summarizers/claude.d.ts.map +1 -0
- package/dist/summarizers/claude.js +39 -0
- package/dist/summarizers/claude.js.map +1 -0
- package/dist/summarizers/client.d.ts +23 -0
- package/dist/summarizers/client.d.ts.map +1 -0
- package/dist/summarizers/client.js +24 -0
- package/dist/summarizers/client.js.map +1 -0
- package/dist/summarizers/extractive.d.ts +6 -0
- package/dist/summarizers/extractive.d.ts.map +1 -0
- package/dist/summarizers/extractive.js +204 -0
- package/dist/summarizers/extractive.js.map +1 -0
- package/dist/summarizers/extractor.d.ts +12 -0
- package/dist/summarizers/extractor.d.ts.map +1 -0
- package/dist/summarizers/extractor.js +75 -0
- package/dist/summarizers/extractor.js.map +1 -0
- package/dist/summarizers/openai.d.ts +11 -0
- package/dist/summarizers/openai.d.ts.map +1 -0
- package/dist/summarizers/openai.js +41 -0
- package/dist/summarizers/openai.js.map +1 -0
- package/dist/summarizers/prompts.d.ts +11 -0
- package/dist/summarizers/prompts.d.ts.map +1 -0
- package/dist/summarizers/prompts.js +104 -0
- package/dist/summarizers/prompts.js.map +1 -0
- package/docs/DEPLOYMENT.md +84 -0
- package/docs/INTEGRATIONS.md +64 -0
- package/docs/MEMORY_QUALITY_BASELINE.md +55 -0
- package/docs/MEMORY_QUALITY_RELEASE_GATE.md +63 -0
- package/docs/MEMORY_QUALITY_RUBRIC.md +249 -0
- package/docs/OPERATIONS.md +49 -0
- package/docs/SECURITY.md +25 -0
- package/openapi.yaml +843 -0
- package/package.json +157 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/summarizers/claude.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAA0B,KAAK,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAEtF,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,0BAA0B,CAAC;CACrC;AAED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,uBAA4B,GACpC,UAAU,CA2CZ"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createClientSummarizer } from './client.js';
|
|
2
|
+
export function createClaudeSummarizer(options = {}) {
|
|
3
|
+
if (options.client) {
|
|
4
|
+
return createClientSummarizer(options.client, options);
|
|
5
|
+
}
|
|
6
|
+
return async (...args) => {
|
|
7
|
+
const moduleName = '@anthropic-ai/sdk';
|
|
8
|
+
let sdkModule;
|
|
9
|
+
try {
|
|
10
|
+
sdkModule = await import(moduleName);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
throw new Error("memory-layer: install '@anthropic-ai/sdk' to use createClaudeSummarizer()");
|
|
14
|
+
}
|
|
15
|
+
const Anthropic = sdkModule.default ?? sdkModule.Anthropic ?? sdkModule;
|
|
16
|
+
const client = new Anthropic({
|
|
17
|
+
apiKey: options.apiKey ?? process.env.ANTHROPIC_API_KEY,
|
|
18
|
+
});
|
|
19
|
+
return createClientSummarizer({
|
|
20
|
+
async generate(request) {
|
|
21
|
+
const response = await client.messages.create({
|
|
22
|
+
model: request.model ?? 'claude-sonnet-4-20250514',
|
|
23
|
+
max_tokens: request.maxTokens ?? 1024,
|
|
24
|
+
system: request.systemPrompt,
|
|
25
|
+
messages: [
|
|
26
|
+
{
|
|
27
|
+
role: 'user',
|
|
28
|
+
content: request.userPrompt,
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
});
|
|
32
|
+
return Array.isArray(response.content)
|
|
33
|
+
? response.content.map((part) => part.text ?? '').join('\n')
|
|
34
|
+
: String(response.content ?? '');
|
|
35
|
+
},
|
|
36
|
+
}, options)(...args);
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/summarizers/claude.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAmC,MAAM,aAAa,CAAC;AAUtF,MAAM,UAAU,sBAAsB,CACpC,UAAmC,EAAE;IAErC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,sBAAsB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE;QACvB,MAAM,UAAU,GAAG,mBAAmB,CAAC;QACvC,IAAI,SAAc,CAAC;QACnB,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC;QACxE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;YAC3B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB;SACxD,CAAC,CAAC;QACH,OAAO,sBAAsB,CAC3B;YACE,KAAK,CAAC,QAAQ,CAAC,OAAO;gBACpB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAC5C,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,0BAA0B;oBAClD,UAAU,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;oBACrC,MAAM,EAAE,OAAO,CAAC,YAAY;oBAC5B,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,MAAM;4BACZ,OAAO,EAAE,OAAO,CAAC,UAAU;yBAC5B;qBACF;iBACF,CAAC,CAAC;gBAEH,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;oBACpC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;oBACjE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YACrC,CAAC;SACF,EACD,OAAO,CACR,CAAC,GAAG,IAAI,CAAC,CAAC;IACb,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Extractor } from '../core/extractor.js';
|
|
2
|
+
import type { Summarizer } from '../core/orchestrator.js';
|
|
3
|
+
export interface StructuredGenerationRequest {
|
|
4
|
+
systemPrompt: string;
|
|
5
|
+
userPrompt: string;
|
|
6
|
+
model?: string;
|
|
7
|
+
maxTokens?: number;
|
|
8
|
+
expectedFormat: 'object' | 'array';
|
|
9
|
+
}
|
|
10
|
+
export interface StructuredGenerationClient {
|
|
11
|
+
generate(request: StructuredGenerationRequest): Promise<string>;
|
|
12
|
+
}
|
|
13
|
+
export declare function createClientSummarizer(client: StructuredGenerationClient, options?: {
|
|
14
|
+
model?: string;
|
|
15
|
+
maxTokens?: number;
|
|
16
|
+
prompt?: string;
|
|
17
|
+
}): Summarizer;
|
|
18
|
+
export declare function createClientExtractor(client: StructuredGenerationClient, options?: {
|
|
19
|
+
model?: string;
|
|
20
|
+
maxTokens?: number;
|
|
21
|
+
prompt?: string;
|
|
22
|
+
}): Extractor;
|
|
23
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/summarizers/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAS1D,MAAM,WAAW,2BAA2B;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,QAAQ,GAAG,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACjE;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,0BAA0B,EAClC,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE,UAAU,CAWZ;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,0BAA0B,EAClC,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE,SAAS,CAeX"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { EXTRACTION_SYSTEM_PROMPT, formatTurnsForSummarization, parseExtractionResponse, parseSummarizerResponse, SUMMARIZATION_SYSTEM_PROMPT, } from './prompts.js';
|
|
2
|
+
export function createClientSummarizer(client, options) {
|
|
3
|
+
return async (turns) => parseSummarizerResponse(await client.generate({
|
|
4
|
+
systemPrompt: options?.prompt ?? SUMMARIZATION_SYSTEM_PROMPT,
|
|
5
|
+
userPrompt: formatTurnsForSummarization(turns),
|
|
6
|
+
model: options?.model,
|
|
7
|
+
maxTokens: options?.maxTokens,
|
|
8
|
+
expectedFormat: 'object',
|
|
9
|
+
}));
|
|
10
|
+
}
|
|
11
|
+
export function createClientExtractor(client, options) {
|
|
12
|
+
return async (summary, keyEntities, topicTags) => parseExtractionResponse(await client.generate({
|
|
13
|
+
systemPrompt: options?.prompt ?? EXTRACTION_SYSTEM_PROMPT,
|
|
14
|
+
userPrompt: [
|
|
15
|
+
`Summary: ${summary}`,
|
|
16
|
+
`Key entities: ${keyEntities.join(', ') || 'none'}`,
|
|
17
|
+
`Topic tags: ${topicTags.join(', ') || 'none'}`,
|
|
18
|
+
].join('\n'),
|
|
19
|
+
model: options?.model,
|
|
20
|
+
maxTokens: options?.maxTokens,
|
|
21
|
+
expectedFormat: 'array',
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/summarizers/client.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AActB,MAAM,UAAU,sBAAsB,CACpC,MAAkC,EAClC,OAAiE;IAEjE,OAAO,KAAK,EAAE,KAAK,EAAE,EAAE,CACrB,uBAAuB,CACrB,MAAM,MAAM,CAAC,QAAQ,CAAC;QACpB,YAAY,EAAE,OAAO,EAAE,MAAM,IAAI,2BAA2B;QAC5D,UAAU,EAAE,2BAA2B,CAAC,KAAK,CAAC;QAC9C,KAAK,EAAE,OAAO,EAAE,KAAK;QACrB,SAAS,EAAE,OAAO,EAAE,SAAS;QAC7B,cAAc,EAAE,QAAQ;KACzB,CAAC,CACH,CAAC;AACN,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAAkC,EAClC,OAAiE;IAEjE,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,CAC/C,uBAAuB,CACrB,MAAM,MAAM,CAAC,QAAQ,CAAC;QACpB,YAAY,EAAE,OAAO,EAAE,MAAM,IAAI,wBAAwB;QACzD,UAAU,EAAE;YACV,YAAY,OAAO,EAAE;YACrB,iBAAiB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE;YACnD,eAAe,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE;SAChD,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,KAAK,EAAE,OAAO,EAAE,KAAK;QACrB,SAAS,EAAE,OAAO,EAAE,SAAS;QAC7B,cAAc,EAAE,OAAO;KACxB,CAAC,CACH,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractive.d.ts","sourceRoot":"","sources":["../../src/summarizers/extractive.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,yBAAyB,CAAC;AA8J5E,wBAAgB,0BAA0B,CACxC,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GACxD,UAAU,CAyEZ"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { estimateTokens } from '../core/tokens.js';
|
|
2
|
+
const KEYWORD_HINTS = [
|
|
3
|
+
'prefer',
|
|
4
|
+
'preference',
|
|
5
|
+
'decide',
|
|
6
|
+
'decision',
|
|
7
|
+
'must',
|
|
8
|
+
'should',
|
|
9
|
+
'cannot',
|
|
10
|
+
'require',
|
|
11
|
+
'constraint',
|
|
12
|
+
'remember',
|
|
13
|
+
'important',
|
|
14
|
+
'goal',
|
|
15
|
+
'objective',
|
|
16
|
+
'blocker',
|
|
17
|
+
];
|
|
18
|
+
const PRIORITY_PATTERNS = [
|
|
19
|
+
{ pattern: /\b(prefers?|likes?|wants?|avoid|does not like|doesn't like)\b/i, weight: 1.3 },
|
|
20
|
+
{ pattern: /\b(decided|decision|selected|chose)\b/i, weight: 1.5 },
|
|
21
|
+
{ pattern: /\b(must|must not|cannot|can't|requires?|constraint)\b/i, weight: 1.6 },
|
|
22
|
+
{ pattern: /\b(goal|objective|todo|next|follow up|blocked|pending)\b/i, weight: 1.35 },
|
|
23
|
+
{ pattern: /["'@#]|[A-Z][a-z0-9]+(?:\s+[A-Z][a-z0-9]+)+/, weight: 1.15 },
|
|
24
|
+
];
|
|
25
|
+
const STOP_WORDS = new Set([
|
|
26
|
+
'a',
|
|
27
|
+
'an',
|
|
28
|
+
'and',
|
|
29
|
+
'are',
|
|
30
|
+
'as',
|
|
31
|
+
'at',
|
|
32
|
+
'be',
|
|
33
|
+
'but',
|
|
34
|
+
'by',
|
|
35
|
+
'for',
|
|
36
|
+
'from',
|
|
37
|
+
'has',
|
|
38
|
+
'have',
|
|
39
|
+
'i',
|
|
40
|
+
'in',
|
|
41
|
+
'is',
|
|
42
|
+
'it',
|
|
43
|
+
'of',
|
|
44
|
+
'on',
|
|
45
|
+
'or',
|
|
46
|
+
'that',
|
|
47
|
+
'the',
|
|
48
|
+
'their',
|
|
49
|
+
'this',
|
|
50
|
+
'to',
|
|
51
|
+
'was',
|
|
52
|
+
'we',
|
|
53
|
+
'with',
|
|
54
|
+
'you',
|
|
55
|
+
]);
|
|
56
|
+
function splitSentences(content) {
|
|
57
|
+
return content
|
|
58
|
+
.split(/(?<=[.!?])\s+|\n+/g)
|
|
59
|
+
.map((sentence) => sentence.trim())
|
|
60
|
+
.filter((sentence) => sentence.length > 0);
|
|
61
|
+
}
|
|
62
|
+
function tokenize(text) {
|
|
63
|
+
return text
|
|
64
|
+
.toLowerCase()
|
|
65
|
+
.split(/[^a-z0-9@#'-]+/g)
|
|
66
|
+
.filter((token) => token.length > 1 && !STOP_WORDS.has(token));
|
|
67
|
+
}
|
|
68
|
+
function jaccardOverlap(a, b) {
|
|
69
|
+
const left = new Set(tokenize(a));
|
|
70
|
+
const right = new Set(tokenize(b));
|
|
71
|
+
if (left.size === 0 || right.size === 0)
|
|
72
|
+
return 0;
|
|
73
|
+
let intersection = 0;
|
|
74
|
+
for (const token of left) {
|
|
75
|
+
if (right.has(token))
|
|
76
|
+
intersection += 1;
|
|
77
|
+
}
|
|
78
|
+
return intersection / (left.size + right.size - intersection);
|
|
79
|
+
}
|
|
80
|
+
function keywordDensity(sentence) {
|
|
81
|
+
const lowered = sentence.toLowerCase();
|
|
82
|
+
let density = 0;
|
|
83
|
+
for (const keyword of KEYWORD_HINTS) {
|
|
84
|
+
if (lowered.includes(keyword)) {
|
|
85
|
+
density += 1;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return density;
|
|
89
|
+
}
|
|
90
|
+
function priorityWeight(sentence) {
|
|
91
|
+
return PRIORITY_PATTERNS.reduce((weight, entry) => (entry.pattern.test(sentence) ? weight + entry.weight : weight), 1);
|
|
92
|
+
}
|
|
93
|
+
function extractQuotedStrings(text) {
|
|
94
|
+
return [...text.matchAll(/"([^"]+)"|'([^']+)'/g)]
|
|
95
|
+
.map((match) => (match[1] ?? match[2] ?? '').trim())
|
|
96
|
+
.filter(Boolean);
|
|
97
|
+
}
|
|
98
|
+
function extractMentions(text) {
|
|
99
|
+
return [...text.matchAll(/@\w[\w/-]*/g)].map((match) => match[0]);
|
|
100
|
+
}
|
|
101
|
+
function extractCapitalizedPhrases(text) {
|
|
102
|
+
return [...text.matchAll(/\b[A-Z][a-z0-9]+(?:\s+[A-Z][a-z0-9]+)+\b/g)].map((match) => match[0]);
|
|
103
|
+
}
|
|
104
|
+
function uniqueValues(values, limit) {
|
|
105
|
+
const seen = new Set();
|
|
106
|
+
const results = [];
|
|
107
|
+
for (const value of values) {
|
|
108
|
+
const normalized = value.trim().toLowerCase();
|
|
109
|
+
if (!normalized || seen.has(normalized))
|
|
110
|
+
continue;
|
|
111
|
+
seen.add(normalized);
|
|
112
|
+
results.push(value.trim());
|
|
113
|
+
if (results.length >= limit)
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
return results;
|
|
117
|
+
}
|
|
118
|
+
function buildTopicTags(turns) {
|
|
119
|
+
const counts = new Map();
|
|
120
|
+
for (const turn of turns) {
|
|
121
|
+
for (const token of tokenize(turn.content)) {
|
|
122
|
+
if (token.startsWith('@') || token.length < 4)
|
|
123
|
+
continue;
|
|
124
|
+
counts.set(token, (counts.get(token) ?? 0) + 1);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return [...counts.entries()]
|
|
128
|
+
.sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
|
|
129
|
+
.slice(0, 5)
|
|
130
|
+
.map(([token]) => token);
|
|
131
|
+
}
|
|
132
|
+
function buildKeyEntities(turns) {
|
|
133
|
+
const values = turns.flatMap((turn) => [
|
|
134
|
+
...extractCapitalizedPhrases(turn.content),
|
|
135
|
+
...extractQuotedStrings(turn.content),
|
|
136
|
+
...extractMentions(turn.content),
|
|
137
|
+
]);
|
|
138
|
+
return uniqueValues(values, 10);
|
|
139
|
+
}
|
|
140
|
+
export function createExtractiveSummarizer(options) {
|
|
141
|
+
const tokenBudget = options?.tokenBudget ?? 500;
|
|
142
|
+
const maxSentences = options?.maxSentences ?? 6;
|
|
143
|
+
return async (turns) => {
|
|
144
|
+
if (turns.length === 0) {
|
|
145
|
+
return {
|
|
146
|
+
summary: 'No conversation history yet.',
|
|
147
|
+
key_entities: [],
|
|
148
|
+
topic_tags: [],
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
const scored = [];
|
|
152
|
+
let sentenceIndex = 0;
|
|
153
|
+
for (const turn of turns) {
|
|
154
|
+
const sentences = splitSentences(turn.content);
|
|
155
|
+
sentences.forEach((sentence, index) => {
|
|
156
|
+
const tokens = tokenize(sentence);
|
|
157
|
+
const positionWeight = index === 0 || index === sentences.length - 1 ? 1.5 : 1;
|
|
158
|
+
const uniquenessPenalty = scored.some((existing) => jaccardOverlap(existing.text, sentence) > 0.7)
|
|
159
|
+
? 0.35
|
|
160
|
+
: 1;
|
|
161
|
+
const score = positionWeight *
|
|
162
|
+
uniquenessPenalty *
|
|
163
|
+
priorityWeight(sentence) *
|
|
164
|
+
(1 + keywordDensity(sentence) + tokens.length / 20);
|
|
165
|
+
scored.push({
|
|
166
|
+
text: sentence,
|
|
167
|
+
score,
|
|
168
|
+
originalIndex: sentenceIndex,
|
|
169
|
+
});
|
|
170
|
+
sentenceIndex += 1;
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
const selected = scored
|
|
174
|
+
.sort((a, b) => b.score - a.score || a.originalIndex - b.originalIndex)
|
|
175
|
+
.reduce((state, candidate) => {
|
|
176
|
+
if (state.items.length >= maxSentences)
|
|
177
|
+
return state;
|
|
178
|
+
if (state.items.some((item) => jaccardOverlap(item.text, candidate.text) > 0.8)) {
|
|
179
|
+
return state;
|
|
180
|
+
}
|
|
181
|
+
const tokenEstimate = estimateTokens(candidate.text);
|
|
182
|
+
if (state.tokens + tokenEstimate > tokenBudget && state.items.length > 0) {
|
|
183
|
+
return state;
|
|
184
|
+
}
|
|
185
|
+
state.items.push(candidate);
|
|
186
|
+
state.tokens += tokenEstimate;
|
|
187
|
+
return state;
|
|
188
|
+
}, { items: [], tokens: 0 })
|
|
189
|
+
.items
|
|
190
|
+
.sort((a, b) => a.originalIndex - b.originalIndex);
|
|
191
|
+
const summary = selected.map((item) => item.text).join(' ') ||
|
|
192
|
+
turns
|
|
193
|
+
.map((turn) => turn.content.trim())
|
|
194
|
+
.filter(Boolean)
|
|
195
|
+
.join(' ')
|
|
196
|
+
.slice(0, 400);
|
|
197
|
+
return {
|
|
198
|
+
summary,
|
|
199
|
+
key_entities: buildKeyEntities(turns),
|
|
200
|
+
topic_tags: buildTopicTags(turns),
|
|
201
|
+
};
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=extractive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractive.js","sourceRoot":"","sources":["../../src/summarizers/extractive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Extractor } from '../core/extractor.js';
|
|
2
|
+
import { type StructuredGenerationClient } from './client.js';
|
|
3
|
+
export interface ProviderExtractorOptions {
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
model?: string;
|
|
6
|
+
maxTokens?: number;
|
|
7
|
+
prompt?: string;
|
|
8
|
+
client?: StructuredGenerationClient;
|
|
9
|
+
}
|
|
10
|
+
export declare function createClaudeExtractor(options?: ProviderExtractorOptions): Extractor;
|
|
11
|
+
export declare function createOpenAIExtractor(options?: ProviderExtractorOptions): Extractor;
|
|
12
|
+
//# sourceMappingURL=extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/summarizers/extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAyB,KAAK,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAErF,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,0BAA0B,CAAC;CACrC;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,wBAA6B,GAAG,SAAS,CA2CvF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,wBAA6B,GAAG,SAAS,CAwCvF"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { createClientExtractor } from './client.js';
|
|
2
|
+
export function createClaudeExtractor(options = {}) {
|
|
3
|
+
if (options.client) {
|
|
4
|
+
return createClientExtractor(options.client, options);
|
|
5
|
+
}
|
|
6
|
+
return async (...args) => {
|
|
7
|
+
const moduleName = '@anthropic-ai/sdk';
|
|
8
|
+
let sdkModule;
|
|
9
|
+
try {
|
|
10
|
+
sdkModule = await import(moduleName);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
throw new Error("memory-layer: install '@anthropic-ai/sdk' to use createClaudeExtractor()");
|
|
14
|
+
}
|
|
15
|
+
const Anthropic = sdkModule.default ?? sdkModule.Anthropic ?? sdkModule;
|
|
16
|
+
const client = new Anthropic({
|
|
17
|
+
apiKey: options.apiKey ?? process.env.ANTHROPIC_API_KEY,
|
|
18
|
+
});
|
|
19
|
+
return createClientExtractor({
|
|
20
|
+
async generate(request) {
|
|
21
|
+
const response = await client.messages.create({
|
|
22
|
+
model: request.model ?? 'claude-sonnet-4-20250514',
|
|
23
|
+
max_tokens: request.maxTokens ?? 1024,
|
|
24
|
+
system: request.systemPrompt,
|
|
25
|
+
messages: [
|
|
26
|
+
{
|
|
27
|
+
role: 'user',
|
|
28
|
+
content: request.userPrompt,
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
});
|
|
32
|
+
return Array.isArray(response.content)
|
|
33
|
+
? response.content.map((part) => part.text ?? '').join('\n')
|
|
34
|
+
: String(response.content ?? '');
|
|
35
|
+
},
|
|
36
|
+
}, options)(...args);
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export function createOpenAIExtractor(options = {}) {
|
|
40
|
+
if (options.client) {
|
|
41
|
+
return createClientExtractor(options.client, options);
|
|
42
|
+
}
|
|
43
|
+
return async (...args) => {
|
|
44
|
+
const moduleName = 'openai';
|
|
45
|
+
let sdkModule;
|
|
46
|
+
try {
|
|
47
|
+
sdkModule = await import(moduleName);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
throw new Error("memory-layer: install 'openai' to use createOpenAIExtractor()");
|
|
51
|
+
}
|
|
52
|
+
const OpenAI = sdkModule.default ?? sdkModule.OpenAI ?? sdkModule;
|
|
53
|
+
const client = new OpenAI({
|
|
54
|
+
apiKey: options.apiKey ?? process.env.OPENAI_API_KEY,
|
|
55
|
+
});
|
|
56
|
+
return createClientExtractor({
|
|
57
|
+
async generate(request) {
|
|
58
|
+
const response = await client.chat.completions.create({
|
|
59
|
+
model: request.model ?? 'gpt-4.1-mini',
|
|
60
|
+
max_tokens: request.maxTokens ?? 1024,
|
|
61
|
+
messages: [
|
|
62
|
+
{ role: 'system', content: request.systemPrompt },
|
|
63
|
+
{
|
|
64
|
+
role: 'user',
|
|
65
|
+
content: request.userPrompt,
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
response_format: { type: 'json_object' },
|
|
69
|
+
});
|
|
70
|
+
return response.choices?.[0]?.message?.content ?? '[]';
|
|
71
|
+
},
|
|
72
|
+
}, options)(...args);
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/summarizers/extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Summarizer } from '../core/orchestrator.js';
|
|
2
|
+
import { type StructuredGenerationClient } from './client.js';
|
|
3
|
+
export interface OpenAISummarizerOptions {
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
model?: string;
|
|
6
|
+
maxTokens?: number;
|
|
7
|
+
prompt?: string;
|
|
8
|
+
client?: StructuredGenerationClient;
|
|
9
|
+
}
|
|
10
|
+
export declare function createOpenAISummarizer(options?: OpenAISummarizerOptions): Summarizer;
|
|
11
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/summarizers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAA0B,KAAK,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAEtF,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,0BAA0B,CAAC;CACrC;AAED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,uBAA4B,GACpC,UAAU,CA2CZ"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { createClientSummarizer } from './client.js';
|
|
2
|
+
export function createOpenAISummarizer(options = {}) {
|
|
3
|
+
if (options.client) {
|
|
4
|
+
return createClientSummarizer(options.client, options);
|
|
5
|
+
}
|
|
6
|
+
return async (...args) => {
|
|
7
|
+
const moduleName = 'openai';
|
|
8
|
+
let sdkModule;
|
|
9
|
+
try {
|
|
10
|
+
sdkModule = await import(moduleName);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
throw new Error("memory-layer: install 'openai' to use createOpenAISummarizer()");
|
|
14
|
+
}
|
|
15
|
+
const OpenAI = sdkModule.default ?? sdkModule.OpenAI ?? sdkModule;
|
|
16
|
+
const client = new OpenAI({
|
|
17
|
+
apiKey: options.apiKey ?? process.env.OPENAI_API_KEY,
|
|
18
|
+
});
|
|
19
|
+
return createClientSummarizer({
|
|
20
|
+
async generate(request) {
|
|
21
|
+
const response = await client.chat.completions.create({
|
|
22
|
+
model: request.model ?? 'gpt-4.1-mini',
|
|
23
|
+
max_tokens: request.maxTokens ?? 1024,
|
|
24
|
+
messages: [
|
|
25
|
+
{
|
|
26
|
+
role: 'system',
|
|
27
|
+
content: request.systemPrompt,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
role: 'user',
|
|
31
|
+
content: request.userPrompt,
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
response_format: { type: 'json_object' },
|
|
35
|
+
});
|
|
36
|
+
return response.choices?.[0]?.message?.content ?? '';
|
|
37
|
+
},
|
|
38
|
+
}, options)(...args);
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/summarizers/openai.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAmC,MAAM,aAAa,CAAC;AAUtF,MAAM,UAAU,sBAAsB,CACpC,UAAmC,EAAE;IAErC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,sBAAsB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE;QACvB,MAAM,UAAU,GAAG,QAAQ,CAAC;QAC5B,IAAI,SAAc,CAAC;QACnB,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACpF,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC;QAClE,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;SACrD,CAAC,CAAC;QACH,OAAO,sBAAsB,CAC3B;YACE,KAAK,CAAC,QAAQ,CAAC,OAAO;gBACpB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;oBACpD,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,cAAc;oBACtC,UAAU,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;oBACrC,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,QAAQ;4BACd,OAAO,EAAE,OAAO,CAAC,YAAY;yBAC9B;wBACD;4BACE,IAAI,EAAE,MAAM;4BACZ,OAAO,EAAE,OAAO,CAAC,UAAU;yBAC5B;qBACF;oBACD,eAAe,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;iBACzC,CAAC,CAAC;gBAEH,OAAO,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;YACvD,CAAC;SACF,EACD,OAAO,CACR,CAAC,GAAG,IAAI,CAAC,CAAC;IACb,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Turn } from '../contracts/types.js';
|
|
2
|
+
import type { ExtractedFact } from '../core/extractor.js';
|
|
3
|
+
import type { SummarizerOutput } from '../core/orchestrator.js';
|
|
4
|
+
export declare const SUMMARIZATION_PROMPT_VERSION = "v2";
|
|
5
|
+
export declare const EXTRACTION_PROMPT_VERSION = "v2";
|
|
6
|
+
export declare const SUMMARIZATION_SYSTEM_PROMPT = "Prompt version: v2\nYou summarize AI conversation history into compact working memory.\nReturn strict JSON with this shape:\n{\n \"summary\": \"short factual summary\",\n \"key_entities\": [\"important people, systems, files, projects, concepts\"],\n \"topic_tags\": [\"up to five short topic tags\"]\n}\nRules:\n- Preserve important constraints, decisions, preferences, and unresolved work.\n- Keep the summary concise and factual.\n- key_entities must be short strings.\n- topic_tags must contain at most 5 strings.\n- Return JSON only.";
|
|
7
|
+
export declare const EXTRACTION_SYSTEM_PROMPT = "Prompt version: v2\nYou extract durable facts that should become long-term memory.\nReturn strict JSON array with items shaped like:\n{\n \"fact\": \"durable fact text\",\n \"factType\": \"preference | entity | decision | constraint | reference\",\n \"confidence\": \"high | medium\"\n}\nRules:\n- Only return facts that are likely to stay useful beyond the immediate turn.\n- Prefer explicit user preferences, durable project facts, important decisions, and constraints.\n- Return JSON only.";
|
|
8
|
+
export declare function formatTurnsForSummarization(turns: Turn[]): string;
|
|
9
|
+
export declare function parseSummarizerResponse(text: string): SummarizerOutput;
|
|
10
|
+
export declare function parseExtractionResponse(text: string): ExtractedFact[];
|
|
11
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/summarizers/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,eAAO,MAAM,4BAA4B,OAAO,CAAC;AACjD,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,eAAO,MAAM,2BAA2B,kiBAapB,CAAC;AAErB,eAAO,MAAM,wBAAwB,ofAWjB,CAAC;AAErB,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAOjE;AAiCD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAgBtE;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAwBrE"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
export const SUMMARIZATION_PROMPT_VERSION = 'v2';
|
|
2
|
+
export const EXTRACTION_PROMPT_VERSION = 'v2';
|
|
3
|
+
export const SUMMARIZATION_SYSTEM_PROMPT = `Prompt version: ${SUMMARIZATION_PROMPT_VERSION}
|
|
4
|
+
You summarize AI conversation history into compact working memory.
|
|
5
|
+
Return strict JSON with this shape:
|
|
6
|
+
{
|
|
7
|
+
"summary": "short factual summary",
|
|
8
|
+
"key_entities": ["important people, systems, files, projects, concepts"],
|
|
9
|
+
"topic_tags": ["up to five short topic tags"]
|
|
10
|
+
}
|
|
11
|
+
Rules:
|
|
12
|
+
- Preserve important constraints, decisions, preferences, and unresolved work.
|
|
13
|
+
- Keep the summary concise and factual.
|
|
14
|
+
- key_entities must be short strings.
|
|
15
|
+
- topic_tags must contain at most 5 strings.
|
|
16
|
+
- Return JSON only.`;
|
|
17
|
+
export const EXTRACTION_SYSTEM_PROMPT = `Prompt version: ${EXTRACTION_PROMPT_VERSION}
|
|
18
|
+
You extract durable facts that should become long-term memory.
|
|
19
|
+
Return strict JSON array with items shaped like:
|
|
20
|
+
{
|
|
21
|
+
"fact": "durable fact text",
|
|
22
|
+
"factType": "preference | entity | decision | constraint | reference",
|
|
23
|
+
"confidence": "high | medium"
|
|
24
|
+
}
|
|
25
|
+
Rules:
|
|
26
|
+
- Only return facts that are likely to stay useful beyond the immediate turn.
|
|
27
|
+
- Prefer explicit user preferences, durable project facts, important decisions, and constraints.
|
|
28
|
+
- Return JSON only.`;
|
|
29
|
+
export function formatTurnsForSummarization(turns) {
|
|
30
|
+
return turns
|
|
31
|
+
.map((turn) => `[${turn.role}] ${turn.actor}: ${turn.content}`)
|
|
32
|
+
.join('\n');
|
|
33
|
+
}
|
|
34
|
+
function extractJsonPayload(text) {
|
|
35
|
+
const trimmed = text.trim().replace(/^```(?:json)?\s*/i, '').replace(/\s*```$/i, '');
|
|
36
|
+
if (trimmed.startsWith('{')) {
|
|
37
|
+
return trimmed;
|
|
38
|
+
}
|
|
39
|
+
if (trimmed.startsWith('[')) {
|
|
40
|
+
return trimmed;
|
|
41
|
+
}
|
|
42
|
+
const objectStart = text.indexOf('{');
|
|
43
|
+
const objectEnd = text.lastIndexOf('}');
|
|
44
|
+
const arrayStart = text.indexOf('[');
|
|
45
|
+
const arrayEnd = text.lastIndexOf(']');
|
|
46
|
+
if (objectStart !== -1 && objectEnd > objectStart) {
|
|
47
|
+
return text.slice(objectStart, objectEnd + 1);
|
|
48
|
+
}
|
|
49
|
+
if (arrayStart !== -1 && arrayEnd > arrayStart) {
|
|
50
|
+
return text.slice(arrayStart, arrayEnd + 1);
|
|
51
|
+
}
|
|
52
|
+
throw new Error('Memory summarizer: response did not contain JSON');
|
|
53
|
+
}
|
|
54
|
+
function parseJson(text) {
|
|
55
|
+
try {
|
|
56
|
+
return JSON.parse(extractJsonPayload(text));
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
throw new Error(`Memory summarizer: failed to parse JSON response (${String(error)})`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export function parseSummarizerResponse(text) {
|
|
63
|
+
const payload = parseJson(text);
|
|
64
|
+
if (typeof payload.summary !== 'string') {
|
|
65
|
+
throw new Error('Memory summarizer: missing summary');
|
|
66
|
+
}
|
|
67
|
+
if (!Array.isArray(payload.key_entities) || !payload.key_entities.every((item) => typeof item === 'string')) {
|
|
68
|
+
throw new Error('Memory summarizer: invalid key_entities');
|
|
69
|
+
}
|
|
70
|
+
if (!Array.isArray(payload.topic_tags) || !payload.topic_tags.every((item) => typeof item === 'string')) {
|
|
71
|
+
throw new Error('Memory summarizer: invalid topic_tags');
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
summary: payload.summary,
|
|
75
|
+
key_entities: payload.key_entities,
|
|
76
|
+
topic_tags: payload.topic_tags,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export function parseExtractionResponse(text) {
|
|
80
|
+
const parsed = parseJson(text);
|
|
81
|
+
const payload = Array.isArray(parsed) ? parsed : parsed.items ?? parsed.facts ?? [];
|
|
82
|
+
if (!Array.isArray(payload)) {
|
|
83
|
+
throw new Error('Memory extractor: response must be a JSON array');
|
|
84
|
+
}
|
|
85
|
+
return payload
|
|
86
|
+
.filter((item) => Boolean(item))
|
|
87
|
+
.map((item) => {
|
|
88
|
+
if (typeof item.fact !== 'string' || typeof item.factType !== 'string') {
|
|
89
|
+
throw new Error('Memory extractor: invalid extracted fact');
|
|
90
|
+
}
|
|
91
|
+
if (!['preference', 'entity', 'decision', 'constraint', 'reference'].includes(item.factType)) {
|
|
92
|
+
throw new Error(`Memory extractor: invalid factType '${item.factType}'`);
|
|
93
|
+
}
|
|
94
|
+
if (item.confidence && !['high', 'medium'].includes(item.confidence)) {
|
|
95
|
+
throw new Error(`Memory extractor: invalid confidence '${item.confidence}'`);
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
fact: item.fact,
|
|
99
|
+
factType: item.factType,
|
|
100
|
+
confidence: (item.confidence ?? 'medium'),
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/summarizers/prompts.ts"],"names":[],"mappings":"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"}
|