@lossless-claude/lcm 0.2.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/.claude-plugin/commands/lcm-compact.md +31 -0
- package/.claude-plugin/commands/lcm-curate.md +31 -0
- package/.claude-plugin/commands/lcm-diagnose.md +29 -0
- package/.claude-plugin/commands/lcm-doctor.md +23 -0
- package/.claude-plugin/commands/lcm-dogfood.md +101 -0
- package/.claude-plugin/commands/lcm-import.md +48 -0
- package/.claude-plugin/commands/lcm-promote.md +29 -0
- package/.claude-plugin/commands/lcm-sensitive.md +55 -0
- package/.claude-plugin/commands/lcm-stats.md +19 -0
- package/.claude-plugin/commands/lcm-status.md +27 -0
- package/.claude-plugin/hooks/README.md +47 -0
- package/.claude-plugin/marketplace.json +20 -0
- package/.claude-plugin/mcp.mjs +12 -0
- package/.claude-plugin/plugin.json +46 -0
- package/.claude-plugin/skills/lcm-context/SKILL.md +107 -0
- package/.claude-plugin/skills/lcm-dogfood/SKILL.md +102 -0
- package/.claude-plugin/skills/lcm-dogfood/references/checks.md +239 -0
- package/.claude-plugin/skills/lcm-dogfood/references/known-issues.md +11 -0
- package/.claude-plugin/skills/lcm-dogfood/scripts/db-integrity.js +40 -0
- package/.claude-plugin/skills/lcm-dogfood/scripts/prompt-search-test.js +35 -0
- package/.claude-plugin/skills/lcm-e2e/SKILL.md +61 -0
- package/.claude-plugin/skills/lcm-e2e/checklist.md +367 -0
- package/.claude-plugin/skills/lossless-claude-upgrade/SKILL.md +47 -0
- package/LICENSE +21 -0
- package/README.md +231 -0
- package/dist/bin/lcm.d.ts +2 -0
- package/dist/bin/lcm.js +461 -0
- package/dist/bin/lcm.js.map +1 -0
- package/dist/installer/dry-run-deps.d.ts +23 -0
- package/dist/installer/dry-run-deps.js +66 -0
- package/dist/installer/dry-run-deps.js.map +1 -0
- package/dist/installer/install.d.ts +39 -0
- package/dist/installer/install.js +236 -0
- package/dist/installer/install.js.map +1 -0
- package/dist/installer/uninstall.d.ts +11 -0
- package/dist/installer/uninstall.js +80 -0
- package/dist/installer/uninstall.js.map +1 -0
- package/dist/src/batch-compact.d.ts +16 -0
- package/dist/src/batch-compact.js +121 -0
- package/dist/src/batch-compact.js.map +1 -0
- package/dist/src/compaction.d.ts +198 -0
- package/dist/src/compaction.js +964 -0
- package/dist/src/compaction.js.map +1 -0
- package/dist/src/connectors/constants.d.ts +5 -0
- package/dist/src/connectors/constants.js +6 -0
- package/dist/src/connectors/constants.js.map +1 -0
- package/dist/src/connectors/installer.d.ts +16 -0
- package/dist/src/connectors/installer.js +200 -0
- package/dist/src/connectors/installer.js.map +1 -0
- package/dist/src/connectors/registry.d.ts +4 -0
- package/dist/src/connectors/registry.js +264 -0
- package/dist/src/connectors/registry.js.map +1 -0
- package/dist/src/connectors/template-service.d.ts +5 -0
- package/dist/src/connectors/template-service.js +54 -0
- package/dist/src/connectors/template-service.js.map +1 -0
- package/dist/src/connectors/templates/base.md +1 -0
- package/dist/src/connectors/templates/mcp-base.md +1 -0
- package/dist/src/connectors/templates/sections/command-reference.md +15 -0
- package/dist/src/connectors/templates/sections/mcp-workflow.md +18 -0
- package/dist/src/connectors/templates/sections/workflow.md +29 -0
- package/dist/src/connectors/templates/skill/SKILL.md +74 -0
- package/dist/src/connectors/types.d.ts +19 -0
- package/dist/src/connectors/types.js +10 -0
- package/dist/src/connectors/types.js.map +1 -0
- package/dist/src/daemon/client.d.ts +9 -0
- package/dist/src/daemon/client.js +28 -0
- package/dist/src/daemon/client.js.map +1 -0
- package/dist/src/daemon/config.d.ts +48 -0
- package/dist/src/daemon/config.js +67 -0
- package/dist/src/daemon/config.js.map +1 -0
- package/dist/src/daemon/lifecycle.d.ts +19 -0
- package/dist/src/daemon/lifecycle.js +102 -0
- package/dist/src/daemon/lifecycle.js.map +1 -0
- package/dist/src/daemon/orientation.d.ts +1 -0
- package/dist/src/daemon/orientation.js +9 -0
- package/dist/src/daemon/orientation.js.map +1 -0
- package/dist/src/daemon/project-queue.d.ts +1 -0
- package/dist/src/daemon/project-queue.js +17 -0
- package/dist/src/daemon/project-queue.js.map +1 -0
- package/dist/src/daemon/project.d.ts +7 -0
- package/dist/src/daemon/project.js +25 -0
- package/dist/src/daemon/project.js.map +1 -0
- package/dist/src/daemon/proxy-manager.d.ts +21 -0
- package/dist/src/daemon/proxy-manager.js +205 -0
- package/dist/src/daemon/proxy-manager.js.map +1 -0
- package/dist/src/daemon/routes/compact.d.ts +13 -0
- package/dist/src/daemon/routes/compact.js +195 -0
- package/dist/src/daemon/routes/compact.js.map +1 -0
- package/dist/src/daemon/routes/describe.d.ts +3 -0
- package/dist/src/daemon/routes/describe.js +39 -0
- package/dist/src/daemon/routes/describe.js.map +1 -0
- package/dist/src/daemon/routes/expand.d.ts +3 -0
- package/dist/src/daemon/routes/expand.js +41 -0
- package/dist/src/daemon/routes/expand.js.map +1 -0
- package/dist/src/daemon/routes/grep.d.ts +3 -0
- package/dist/src/daemon/routes/grep.js +43 -0
- package/dist/src/daemon/routes/grep.js.map +1 -0
- package/dist/src/daemon/routes/ingest.d.ts +3 -0
- package/dist/src/daemon/routes/ingest.js +101 -0
- package/dist/src/daemon/routes/ingest.js.map +1 -0
- package/dist/src/daemon/routes/promote.d.ts +4 -0
- package/dist/src/daemon/routes/promote.js +104 -0
- package/dist/src/daemon/routes/promote.js.map +1 -0
- package/dist/src/daemon/routes/prompt-search.d.ts +3 -0
- package/dist/src/daemon/routes/prompt-search.js +65 -0
- package/dist/src/daemon/routes/prompt-search.js.map +1 -0
- package/dist/src/daemon/routes/recent.d.ts +3 -0
- package/dist/src/daemon/routes/recent.js +37 -0
- package/dist/src/daemon/routes/recent.js.map +1 -0
- package/dist/src/daemon/routes/restore.d.ts +3 -0
- package/dist/src/daemon/routes/restore.js +120 -0
- package/dist/src/daemon/routes/restore.js.map +1 -0
- package/dist/src/daemon/routes/search.d.ts +2 -0
- package/dist/src/daemon/routes/search.js +66 -0
- package/dist/src/daemon/routes/search.js.map +1 -0
- package/dist/src/daemon/routes/status.d.ts +3 -0
- package/dist/src/daemon/routes/status.js +80 -0
- package/dist/src/daemon/routes/status.js.map +1 -0
- package/dist/src/daemon/routes/store.d.ts +2 -0
- package/dist/src/daemon/routes/store.js +46 -0
- package/dist/src/daemon/routes/store.js.map +1 -0
- package/dist/src/daemon/server.d.ts +19 -0
- package/dist/src/daemon/server.js +183 -0
- package/dist/src/daemon/server.js.map +1 -0
- package/dist/src/daemon/summarizer.d.ts +11 -0
- package/dist/src/daemon/summarizer.js +51 -0
- package/dist/src/daemon/summarizer.js.map +1 -0
- package/dist/src/db/config.d.ts +31 -0
- package/dist/src/db/config.js +83 -0
- package/dist/src/db/config.js.map +1 -0
- package/dist/src/db/connection.d.ts +3 -0
- package/dist/src/db/connection.js +62 -0
- package/dist/src/db/connection.js.map +1 -0
- package/dist/src/db/features.d.ts +11 -0
- package/dist/src/db/features.js +36 -0
- package/dist/src/db/features.js.map +1 -0
- package/dist/src/db/migration.d.ts +4 -0
- package/dist/src/db/migration.js +499 -0
- package/dist/src/db/migration.js.map +1 -0
- package/dist/src/db/promoted.d.ts +47 -0
- package/dist/src/db/promoted.js +96 -0
- package/dist/src/db/promoted.js.map +1 -0
- package/dist/src/db/redaction-stats.d.ts +6 -0
- package/dist/src/db/redaction-stats.js +16 -0
- package/dist/src/db/redaction-stats.js.map +1 -0
- package/dist/src/diagnose.d.ts +39 -0
- package/dist/src/diagnose.js +432 -0
- package/dist/src/diagnose.js.map +1 -0
- package/dist/src/doctor/doctor.d.ts +4 -0
- package/dist/src/doctor/doctor.js +378 -0
- package/dist/src/doctor/doctor.js.map +1 -0
- package/dist/src/doctor/types.d.ts +24 -0
- package/dist/src/doctor/types.js +2 -0
- package/dist/src/doctor/types.js.map +1 -0
- package/dist/src/expansion.d.ts +100 -0
- package/dist/src/expansion.js +268 -0
- package/dist/src/expansion.js.map +1 -0
- package/dist/src/hooks/auto-heal.d.ts +12 -0
- package/dist/src/hooks/auto-heal.js +49 -0
- package/dist/src/hooks/auto-heal.js.map +1 -0
- package/dist/src/hooks/compact.d.ts +5 -0
- package/dist/src/hooks/compact.js +22 -0
- package/dist/src/hooks/compact.js.map +1 -0
- package/dist/src/hooks/dispatch.d.ts +7 -0
- package/dist/src/hooks/dispatch.js +36 -0
- package/dist/src/hooks/dispatch.js.map +1 -0
- package/dist/src/hooks/probe-precompact.d.ts +2 -0
- package/dist/src/hooks/probe-precompact.js +17 -0
- package/dist/src/hooks/probe-precompact.js.map +1 -0
- package/dist/src/hooks/probe-sessionstart.d.ts +2 -0
- package/dist/src/hooks/probe-sessionstart.js +18 -0
- package/dist/src/hooks/probe-sessionstart.js.map +1 -0
- package/dist/src/hooks/restore.d.ts +5 -0
- package/dist/src/hooks/restore.js +19 -0
- package/dist/src/hooks/restore.js.map +1 -0
- package/dist/src/hooks/session-end.d.ts +16 -0
- package/dist/src/hooks/session-end.js +73 -0
- package/dist/src/hooks/session-end.js.map +1 -0
- package/dist/src/hooks/user-prompt.d.ts +5 -0
- package/dist/src/hooks/user-prompt.js +31 -0
- package/dist/src/hooks/user-prompt.js.map +1 -0
- package/dist/src/import.d.ts +24 -0
- package/dist/src/import.js +119 -0
- package/dist/src/import.js.map +1 -0
- package/dist/src/large-files.d.ts +28 -0
- package/dist/src/large-files.js +413 -0
- package/dist/src/large-files.js.map +1 -0
- package/dist/src/llm/anthropic.d.ts +9 -0
- package/dist/src/llm/anthropic.js +54 -0
- package/dist/src/llm/anthropic.js.map +1 -0
- package/dist/src/llm/claude-process.d.ts +2 -0
- package/dist/src/llm/claude-process.js +55 -0
- package/dist/src/llm/claude-process.js.map +1 -0
- package/dist/src/llm/codex-process.d.ts +15 -0
- package/dist/src/llm/codex-process.js +142 -0
- package/dist/src/llm/codex-process.js.map +1 -0
- package/dist/src/llm/mock-summarizer.d.ts +9 -0
- package/dist/src/llm/mock-summarizer.js +17 -0
- package/dist/src/llm/mock-summarizer.js.map +1 -0
- package/dist/src/llm/openai.d.ts +10 -0
- package/dist/src/llm/openai.js +52 -0
- package/dist/src/llm/openai.js.map +1 -0
- package/dist/src/llm/types.d.ts +6 -0
- package/dist/src/llm/types.js +2 -0
- package/dist/src/llm/types.js.map +1 -0
- package/dist/src/mcp/server.d.ts +9 -0
- package/dist/src/mcp/server.js +128 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/tools/lcm-describe.d.ts +14 -0
- package/dist/src/mcp/tools/lcm-describe.js +12 -0
- package/dist/src/mcp/tools/lcm-describe.js.map +1 -0
- package/dist/src/mcp/tools/lcm-doctor.d.ts +8 -0
- package/dist/src/mcp/tools/lcm-doctor.js +9 -0
- package/dist/src/mcp/tools/lcm-doctor.js.map +1 -0
- package/dist/src/mcp/tools/lcm-expand.d.ts +18 -0
- package/dist/src/mcp/tools/lcm-expand.js +13 -0
- package/dist/src/mcp/tools/lcm-expand.js.map +1 -0
- package/dist/src/mcp/tools/lcm-grep.d.ts +27 -0
- package/dist/src/mcp/tools/lcm-grep.js +15 -0
- package/dist/src/mcp/tools/lcm-grep.js.map +1 -0
- package/dist/src/mcp/tools/lcm-search.d.ts +33 -0
- package/dist/src/mcp/tools/lcm-search.js +15 -0
- package/dist/src/mcp/tools/lcm-search.js.map +1 -0
- package/dist/src/mcp/tools/lcm-stats.d.ts +14 -0
- package/dist/src/mcp/tools/lcm-stats.js +11 -0
- package/dist/src/mcp/tools/lcm-stats.js.map +1 -0
- package/dist/src/mcp/tools/lcm-store.d.ts +26 -0
- package/dist/src/mcp/tools/lcm-store.js +22 -0
- package/dist/src/mcp/tools/lcm-store.js.map +1 -0
- package/dist/src/memory/index.d.ts +22 -0
- package/dist/src/memory/index.js +21 -0
- package/dist/src/memory/index.js.map +1 -0
- package/dist/src/promotion/dedup.d.ts +19 -0
- package/dist/src/promotion/dedup.js +42 -0
- package/dist/src/promotion/dedup.js.map +1 -0
- package/dist/src/promotion/detector.d.ts +15 -0
- package/dist/src/promotion/detector.js +31 -0
- package/dist/src/promotion/detector.js.map +1 -0
- package/dist/src/prompts/condensed-d1.yaml +38 -0
- package/dist/src/prompts/condensed-d2.yaml +32 -0
- package/dist/src/prompts/condensed-d3plus.yaml +32 -0
- package/dist/src/prompts/leaf-aggressive.yaml +34 -0
- package/dist/src/prompts/leaf-normal.yaml +34 -0
- package/dist/src/prompts/loader.d.ts +9 -0
- package/dist/src/prompts/loader.js +37 -0
- package/dist/src/prompts/loader.js.map +1 -0
- package/dist/src/prompts/promoted-merge.yaml +18 -0
- package/dist/src/prompts/system.yaml +5 -0
- package/dist/src/retrieval.d.ts +122 -0
- package/dist/src/retrieval.js +214 -0
- package/dist/src/retrieval.js.map +1 -0
- package/dist/src/scrub.d.ts +46 -0
- package/dist/src/scrub.js +184 -0
- package/dist/src/scrub.js.map +1 -0
- package/dist/src/sensitive.d.ts +4 -0
- package/dist/src/sensitive.js +258 -0
- package/dist/src/sensitive.js.map +1 -0
- package/dist/src/stats.d.ts +34 -0
- package/dist/src/stats.js +260 -0
- package/dist/src/stats.js.map +1 -0
- package/dist/src/store/conversation-store.d.ts +115 -0
- package/dist/src/store/conversation-store.js +447 -0
- package/dist/src/store/conversation-store.js.map +1 -0
- package/dist/src/store/fts5-sanitize.d.ts +23 -0
- package/dist/src/store/fts5-sanitize.js +30 -0
- package/dist/src/store/fts5-sanitize.js.map +1 -0
- package/dist/src/store/full-text-fallback.d.ts +16 -0
- package/dist/src/store/full-text-fallback.js +60 -0
- package/dist/src/store/full-text-fallback.js.map +1 -0
- package/dist/src/store/index.d.ts +4 -0
- package/dist/src/store/index.js +3 -0
- package/dist/src/store/index.js.map +1 -0
- package/dist/src/store/summary-store.d.ts +118 -0
- package/dist/src/store/summary-store.js +570 -0
- package/dist/src/store/summary-store.js.map +1 -0
- package/dist/src/summarize.d.ts +59 -0
- package/dist/src/summarize.js +619 -0
- package/dist/src/summarize.js.map +1 -0
- package/dist/src/transcript.d.ts +7 -0
- package/dist/src/transcript.js +51 -0
- package/dist/src/transcript.js.map +1 -0
- package/dist/src/types.d.ts +116 -0
- package/dist/src/types.js +8 -0
- package/dist/src/types.js.map +1 -0
- package/docs/agent-tools.md +187 -0
- package/docs/architecture.md +224 -0
- package/docs/configuration.md +168 -0
- package/docs/fts5.md +161 -0
- package/docs/hook-protocol.md +41 -0
- package/docs/privacy.md +101 -0
- package/mcp.mjs +17 -0
- package/package.json +79 -0
|
@@ -0,0 +1,619 @@
|
|
|
1
|
+
import { loadTemplate, renderTemplate } from "./prompts/loader.js";
|
|
2
|
+
const DEFAULT_CONDENSED_TARGET_TOKENS = 2000;
|
|
3
|
+
export const LCM_SUMMARIZER_SYSTEM_PROMPT = (() => loadTemplate("system").template.trim())();
|
|
4
|
+
const DIAGNOSTIC_MAX_DEPTH = 4;
|
|
5
|
+
const DIAGNOSTIC_MAX_ARRAY_ITEMS = 8;
|
|
6
|
+
const DIAGNOSTIC_MAX_OBJECT_KEYS = 16;
|
|
7
|
+
const DIAGNOSTIC_MAX_CHARS = 1200;
|
|
8
|
+
const DIAGNOSTIC_SENSITIVE_KEY_PATTERN = /(api[-_]?key|authorization|token|secret|password|cookie|set-cookie|private[-_]?key|bearer)/i;
|
|
9
|
+
/** Normalize provider ids for stable config/profile lookup. */
|
|
10
|
+
function normalizeProviderId(provider) {
|
|
11
|
+
return provider.trim().toLowerCase();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Resolve provider API override from legacy Claude Code config.
|
|
15
|
+
*
|
|
16
|
+
* When model ids are custom/forward-compat, this hint allows deps.complete to
|
|
17
|
+
* construct a valid pi-ai Model object even if getModel(provider, model) misses.
|
|
18
|
+
*/
|
|
19
|
+
function resolveProviderApiFromLegacyConfig(config, provider) {
|
|
20
|
+
if (!config || typeof config !== "object") {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const providers = config.models
|
|
24
|
+
?.providers;
|
|
25
|
+
if (!providers || typeof providers !== "object") {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
const direct = providers[provider];
|
|
29
|
+
if (direct && typeof direct === "object") {
|
|
30
|
+
const api = direct.api;
|
|
31
|
+
if (typeof api === "string" && api.trim()) {
|
|
32
|
+
return api.trim();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const normalizedProvider = normalizeProviderId(provider);
|
|
36
|
+
for (const [entryProvider, value] of Object.entries(providers)) {
|
|
37
|
+
if (normalizeProviderId(entryProvider) !== normalizedProvider) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (!value || typeof value !== "object") {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const api = value.api;
|
|
44
|
+
if (typeof api === "string" && api.trim()) {
|
|
45
|
+
return api.trim();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
/** Approximate token estimate used for target-sizing prompts. */
|
|
51
|
+
function estimateTokens(text) {
|
|
52
|
+
return Math.ceil(text.length / 4);
|
|
53
|
+
}
|
|
54
|
+
/** Narrow unknown values to plain object records. */
|
|
55
|
+
function isRecord(value) {
|
|
56
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Normalize text fragments from provider-specific block shapes.
|
|
60
|
+
*
|
|
61
|
+
* Deduplicates exact repeated fragments while preserving first-seen order so
|
|
62
|
+
* providers that mirror output in multiple fields don't duplicate summaries.
|
|
63
|
+
*/
|
|
64
|
+
function normalizeTextFragments(chunks) {
|
|
65
|
+
const normalized = [];
|
|
66
|
+
const seen = new Set();
|
|
67
|
+
for (const chunk of chunks) {
|
|
68
|
+
const trimmed = chunk.trim();
|
|
69
|
+
if (!trimmed || seen.has(trimmed)) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
seen.add(trimmed);
|
|
73
|
+
normalized.push(trimmed);
|
|
74
|
+
}
|
|
75
|
+
return normalized.join("\n").trim();
|
|
76
|
+
}
|
|
77
|
+
/** Collect all nested `type` labels for diagnostics on normalization failures. */
|
|
78
|
+
function collectBlockTypes(value, out) {
|
|
79
|
+
if (Array.isArray(value)) {
|
|
80
|
+
for (const entry of value) {
|
|
81
|
+
collectBlockTypes(entry, out);
|
|
82
|
+
}
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (!isRecord(value)) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (typeof value.type === "string" && value.type.trim()) {
|
|
89
|
+
out.add(value.type.trim());
|
|
90
|
+
}
|
|
91
|
+
for (const nested of Object.values(value)) {
|
|
92
|
+
collectBlockTypes(nested, out);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** Collect text payloads from common provider response shapes. */
|
|
96
|
+
function collectTextLikeFields(value, out) {
|
|
97
|
+
if (Array.isArray(value)) {
|
|
98
|
+
for (const entry of value) {
|
|
99
|
+
collectTextLikeFields(entry, out);
|
|
100
|
+
}
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (!isRecord(value)) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
for (const key of ["text", "output_text", "thinking"]) {
|
|
107
|
+
appendTextValue(value[key], out);
|
|
108
|
+
}
|
|
109
|
+
for (const key of ["content", "summary", "output", "message", "response"]) {
|
|
110
|
+
if (key in value) {
|
|
111
|
+
collectTextLikeFields(value[key], out);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/** Append raw textual values and nested text wrappers (`value`, `text`). */
|
|
116
|
+
function appendTextValue(value, out) {
|
|
117
|
+
if (typeof value === "string") {
|
|
118
|
+
out.push(value);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (Array.isArray(value)) {
|
|
122
|
+
for (const entry of value) {
|
|
123
|
+
appendTextValue(entry, out);
|
|
124
|
+
}
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (!isRecord(value)) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (typeof value.value === "string") {
|
|
131
|
+
out.push(value.value);
|
|
132
|
+
}
|
|
133
|
+
if (typeof value.text === "string") {
|
|
134
|
+
out.push(value.text);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/** Normalize provider completion content into a plain-text summary payload. */
|
|
138
|
+
function normalizeCompletionSummary(content) {
|
|
139
|
+
const chunks = [];
|
|
140
|
+
const blockTypeSet = new Set();
|
|
141
|
+
collectTextLikeFields(content, chunks);
|
|
142
|
+
collectBlockTypes(content, blockTypeSet);
|
|
143
|
+
const blockTypes = [...blockTypeSet].sort((a, b) => a.localeCompare(b));
|
|
144
|
+
return {
|
|
145
|
+
summary: normalizeTextFragments(chunks),
|
|
146
|
+
blockTypes,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/** Format normalized block types for concise diagnostics. */
|
|
150
|
+
function formatBlockTypes(blockTypes) {
|
|
151
|
+
if (blockTypes.length === 0) {
|
|
152
|
+
return "(none)";
|
|
153
|
+
}
|
|
154
|
+
return blockTypes.join(",");
|
|
155
|
+
}
|
|
156
|
+
/** Truncate long diagnostic text values to keep logs bounded and readable. */
|
|
157
|
+
function truncateDiagnosticText(value, maxChars = DIAGNOSTIC_MAX_CHARS) {
|
|
158
|
+
if (value.length <= maxChars) {
|
|
159
|
+
return value;
|
|
160
|
+
}
|
|
161
|
+
return `${value.slice(0, maxChars)}...[truncated:${value.length - maxChars} chars]`;
|
|
162
|
+
}
|
|
163
|
+
/** Build a JSON-safe, redacted, depth-limited clone for diagnostic logging. */
|
|
164
|
+
function sanitizeForDiagnostics(value, depth = 0) {
|
|
165
|
+
if (depth >= DIAGNOSTIC_MAX_DEPTH) {
|
|
166
|
+
return "[max-depth]";
|
|
167
|
+
}
|
|
168
|
+
if (typeof value === "string") {
|
|
169
|
+
return truncateDiagnosticText(value);
|
|
170
|
+
}
|
|
171
|
+
if (value === null ||
|
|
172
|
+
typeof value === "number" ||
|
|
173
|
+
typeof value === "boolean" ||
|
|
174
|
+
typeof value === "bigint") {
|
|
175
|
+
return value;
|
|
176
|
+
}
|
|
177
|
+
if (value === undefined) {
|
|
178
|
+
return "[undefined]";
|
|
179
|
+
}
|
|
180
|
+
if (typeof value === "function") {
|
|
181
|
+
return "[function]";
|
|
182
|
+
}
|
|
183
|
+
if (typeof value === "symbol") {
|
|
184
|
+
return "[symbol]";
|
|
185
|
+
}
|
|
186
|
+
if (Array.isArray(value)) {
|
|
187
|
+
const head = value
|
|
188
|
+
.slice(0, DIAGNOSTIC_MAX_ARRAY_ITEMS)
|
|
189
|
+
.map((entry) => sanitizeForDiagnostics(entry, depth + 1));
|
|
190
|
+
if (value.length > DIAGNOSTIC_MAX_ARRAY_ITEMS) {
|
|
191
|
+
head.push(`[+${value.length - DIAGNOSTIC_MAX_ARRAY_ITEMS} more items]`);
|
|
192
|
+
}
|
|
193
|
+
return head;
|
|
194
|
+
}
|
|
195
|
+
if (!isRecord(value)) {
|
|
196
|
+
return String(value);
|
|
197
|
+
}
|
|
198
|
+
const out = {};
|
|
199
|
+
const entries = Object.entries(value);
|
|
200
|
+
for (const [key, entry] of entries.slice(0, DIAGNOSTIC_MAX_OBJECT_KEYS)) {
|
|
201
|
+
out[key] = DIAGNOSTIC_SENSITIVE_KEY_PATTERN.test(key)
|
|
202
|
+
? "[redacted]"
|
|
203
|
+
: sanitizeForDiagnostics(entry, depth + 1);
|
|
204
|
+
}
|
|
205
|
+
if (entries.length > DIAGNOSTIC_MAX_OBJECT_KEYS) {
|
|
206
|
+
out.__truncated_keys__ = entries.length - DIAGNOSTIC_MAX_OBJECT_KEYS;
|
|
207
|
+
}
|
|
208
|
+
return out;
|
|
209
|
+
}
|
|
210
|
+
/** Encode diagnostic payloads in a compact JSON string with safety guards. */
|
|
211
|
+
function formatDiagnosticPayload(value) {
|
|
212
|
+
try {
|
|
213
|
+
const json = JSON.stringify(sanitizeForDiagnostics(value));
|
|
214
|
+
if (!json) {
|
|
215
|
+
return "\"\"";
|
|
216
|
+
}
|
|
217
|
+
return truncateDiagnosticText(json);
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return "\"[unserializable]\"";
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Extract safe diagnostic metadata from a provider response envelope.
|
|
225
|
+
*
|
|
226
|
+
* Picks common metadata fields (request id, model echo, usage counters) without
|
|
227
|
+
* leaking secrets like API keys or auth tokens. The result object from
|
|
228
|
+
* `deps.complete` is typed narrowly but real provider responses carry extra
|
|
229
|
+
* fields that are useful for debugging empty-summary incidents.
|
|
230
|
+
*/
|
|
231
|
+
function extractResponseDiagnostics(result) {
|
|
232
|
+
if (!isRecord(result)) {
|
|
233
|
+
return "";
|
|
234
|
+
}
|
|
235
|
+
const parts = [];
|
|
236
|
+
// Envelope-shape diagnostics for empty-block incidents.
|
|
237
|
+
const topLevelKeys = Object.keys(result).slice(0, 24);
|
|
238
|
+
if (topLevelKeys.length > 0) {
|
|
239
|
+
parts.push(`keys=${topLevelKeys.join(",")}`);
|
|
240
|
+
}
|
|
241
|
+
if ("content" in result) {
|
|
242
|
+
const contentVal = result.content;
|
|
243
|
+
if (Array.isArray(contentVal)) {
|
|
244
|
+
parts.push(`content_kind=array`);
|
|
245
|
+
parts.push(`content_len=${contentVal.length}`);
|
|
246
|
+
}
|
|
247
|
+
else if (contentVal === null) {
|
|
248
|
+
parts.push(`content_kind=null`);
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
parts.push(`content_kind=${typeof contentVal}`);
|
|
252
|
+
}
|
|
253
|
+
parts.push(`content_preview=${formatDiagnosticPayload(contentVal)}`);
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
parts.push("content_kind=missing");
|
|
257
|
+
}
|
|
258
|
+
// Preview common non-content payload envelopes used by provider SDKs.
|
|
259
|
+
const envelopePayload = {};
|
|
260
|
+
for (const key of ["summary", "output", "message", "response"]) {
|
|
261
|
+
if (key in result) {
|
|
262
|
+
envelopePayload[key] = result[key];
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
if (Object.keys(envelopePayload).length > 0) {
|
|
266
|
+
parts.push(`payload_preview=${formatDiagnosticPayload(envelopePayload)}`);
|
|
267
|
+
}
|
|
268
|
+
// Request / response id — present in most provider envelopes.
|
|
269
|
+
for (const key of ["id", "request_id", "x-request-id"]) {
|
|
270
|
+
const val = result[key];
|
|
271
|
+
if (typeof val === "string" && val.trim()) {
|
|
272
|
+
parts.push(`${key}=${val.trim()}`);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// Model echo — useful when the provider selects a different checkpoint.
|
|
276
|
+
if (typeof result.model === "string" && result.model.trim()) {
|
|
277
|
+
parts.push(`resp_model=${result.model.trim()}`);
|
|
278
|
+
}
|
|
279
|
+
if (typeof result.provider === "string" && result.provider.trim()) {
|
|
280
|
+
parts.push(`resp_provider=${result.provider.trim()}`);
|
|
281
|
+
}
|
|
282
|
+
for (const key of [
|
|
283
|
+
"request_provider",
|
|
284
|
+
"request_model",
|
|
285
|
+
"request_api",
|
|
286
|
+
"request_reasoning",
|
|
287
|
+
"request_has_system",
|
|
288
|
+
"request_temperature",
|
|
289
|
+
"request_temperature_sent",
|
|
290
|
+
]) {
|
|
291
|
+
const val = result[key];
|
|
292
|
+
if (typeof val === "string" && val.trim()) {
|
|
293
|
+
parts.push(`${key}=${val.trim()}`);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// Usage counters — safe numeric diagnostics.
|
|
297
|
+
if (isRecord(result.usage)) {
|
|
298
|
+
const u = result.usage;
|
|
299
|
+
const tokens = [];
|
|
300
|
+
for (const k of [
|
|
301
|
+
"prompt_tokens",
|
|
302
|
+
"completion_tokens",
|
|
303
|
+
"total_tokens",
|
|
304
|
+
"input",
|
|
305
|
+
"output",
|
|
306
|
+
"cacheRead",
|
|
307
|
+
"cacheWrite",
|
|
308
|
+
]) {
|
|
309
|
+
if (typeof u[k] === "number") {
|
|
310
|
+
tokens.push(`${k}=${u[k]}`);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
if (tokens.length > 0) {
|
|
314
|
+
parts.push(tokens.join(","));
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
// Finish reason — helps explain empty content.
|
|
318
|
+
const finishReason = typeof result.finish_reason === "string"
|
|
319
|
+
? result.finish_reason
|
|
320
|
+
: typeof result.stopReason === "string"
|
|
321
|
+
? result.stopReason
|
|
322
|
+
: typeof result.stop_reason === "string"
|
|
323
|
+
? result.stop_reason
|
|
324
|
+
: undefined;
|
|
325
|
+
if (finishReason) {
|
|
326
|
+
parts.push(`finish=${finishReason}`);
|
|
327
|
+
}
|
|
328
|
+
// Provider-level error payloads (most useful when finish=error and content is empty).
|
|
329
|
+
const errorMessage = result.errorMessage;
|
|
330
|
+
if (typeof errorMessage === "string" && errorMessage.trim()) {
|
|
331
|
+
parts.push(`error_message=${truncateDiagnosticText(errorMessage.trim(), 400)}`);
|
|
332
|
+
}
|
|
333
|
+
const errorPayload = result.error;
|
|
334
|
+
if (errorPayload !== undefined) {
|
|
335
|
+
parts.push(`error_preview=${formatDiagnosticPayload(errorPayload)}`);
|
|
336
|
+
}
|
|
337
|
+
return parts.join("; ");
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Resolve a practical target token count for leaf and condensed summaries.
|
|
341
|
+
* Aggressive leaf mode intentionally aims lower so compaction converges faster.
|
|
342
|
+
*/
|
|
343
|
+
export function resolveTargetTokens(params) {
|
|
344
|
+
if (params.isCondensed) {
|
|
345
|
+
return Math.max(512, params.condensedTargetTokens);
|
|
346
|
+
}
|
|
347
|
+
const { inputTokens, mode } = params;
|
|
348
|
+
if (mode === "aggressive") {
|
|
349
|
+
return Math.max(96, Math.min(640, Math.floor(inputTokens * 0.2)));
|
|
350
|
+
}
|
|
351
|
+
return Math.max(192, Math.min(1200, Math.floor(inputTokens * 0.35)));
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Build a leaf (segment) summarization prompt.
|
|
355
|
+
*
|
|
356
|
+
* Normal leaf mode preserves details; aggressive leaf mode keeps only the
|
|
357
|
+
* highest-value facts needed for follow-up turns.
|
|
358
|
+
*/
|
|
359
|
+
export function buildLeafSummaryPrompt(params) {
|
|
360
|
+
const { text, mode, targetTokens, previousSummary, customInstructions } = params;
|
|
361
|
+
const previousContext = previousSummary?.trim() || "(none)";
|
|
362
|
+
const instructionBlock = customInstructions?.trim()
|
|
363
|
+
? `Operator instructions:\n${customInstructions.trim()}`
|
|
364
|
+
: "Operator instructions: (none)";
|
|
365
|
+
const templateName = mode === "aggressive" ? "leaf-aggressive" : "leaf-normal";
|
|
366
|
+
return renderTemplate(templateName, {
|
|
367
|
+
targetTokens: String(targetTokens),
|
|
368
|
+
text,
|
|
369
|
+
previousContext,
|
|
370
|
+
instructionBlock,
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
function buildD1Prompt(params) {
|
|
374
|
+
const { text, targetTokens, previousSummary, customInstructions } = params;
|
|
375
|
+
const instructionBlock = customInstructions?.trim()
|
|
376
|
+
? `Operator instructions:\n${customInstructions.trim()}`
|
|
377
|
+
: "Operator instructions: (none)";
|
|
378
|
+
const previousContext = previousSummary?.trim();
|
|
379
|
+
const previousContextBlock = previousContext
|
|
380
|
+
? [
|
|
381
|
+
"It already has this preceding summary as context. Do not repeat information",
|
|
382
|
+
"that appears there unchanged. Focus on what is new, changed, or resolved:",
|
|
383
|
+
"",
|
|
384
|
+
`<previous_context>\n${previousContext}\n</previous_context>`,
|
|
385
|
+
].join("\n")
|
|
386
|
+
: "Focus on what matters for continuation:";
|
|
387
|
+
return renderTemplate("condensed-d1", {
|
|
388
|
+
targetTokens: String(targetTokens),
|
|
389
|
+
text,
|
|
390
|
+
previousContextBlock,
|
|
391
|
+
instructionBlock,
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
function buildD2Prompt(params) {
|
|
395
|
+
const { text, targetTokens, customInstructions } = params;
|
|
396
|
+
const instructionBlock = customInstructions?.trim()
|
|
397
|
+
? `Operator instructions:\n${customInstructions.trim()}`
|
|
398
|
+
: "Operator instructions: (none)";
|
|
399
|
+
return renderTemplate("condensed-d2", {
|
|
400
|
+
targetTokens: String(targetTokens),
|
|
401
|
+
text,
|
|
402
|
+
instructionBlock,
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
function buildD3PlusPrompt(params) {
|
|
406
|
+
const { text, targetTokens, customInstructions } = params;
|
|
407
|
+
const instructionBlock = customInstructions?.trim()
|
|
408
|
+
? `Operator instructions:\n${customInstructions.trim()}`
|
|
409
|
+
: "Operator instructions: (none)";
|
|
410
|
+
return renderTemplate("condensed-d3plus", {
|
|
411
|
+
targetTokens: String(targetTokens),
|
|
412
|
+
text,
|
|
413
|
+
instructionBlock,
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
/** Build a condensed prompt variant based on the output node depth. */
|
|
417
|
+
export function buildCondensedSummaryPrompt(params) {
|
|
418
|
+
if (params.depth <= 1) {
|
|
419
|
+
return buildD1Prompt(params);
|
|
420
|
+
}
|
|
421
|
+
if (params.depth === 2) {
|
|
422
|
+
return buildD2Prompt(params);
|
|
423
|
+
}
|
|
424
|
+
return buildD3PlusPrompt(params);
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Deterministic fallback summary when model output is empty.
|
|
428
|
+
*
|
|
429
|
+
* Keeps compaction progress monotonic instead of throwing and aborting the
|
|
430
|
+
* whole compaction pass.
|
|
431
|
+
*/
|
|
432
|
+
function buildDeterministicFallbackSummary(text, targetTokens) {
|
|
433
|
+
const trimmed = text.trim();
|
|
434
|
+
if (!trimmed) {
|
|
435
|
+
return "";
|
|
436
|
+
}
|
|
437
|
+
const maxChars = Math.max(256, targetTokens * 4);
|
|
438
|
+
if (trimmed.length <= maxChars) {
|
|
439
|
+
return trimmed;
|
|
440
|
+
}
|
|
441
|
+
return `${trimmed.slice(0, maxChars)}\n[LCM fallback summary; truncated for context management]`;
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Builds a model-backed LCM summarize callback from runtime legacy params.
|
|
445
|
+
*
|
|
446
|
+
* Returns `undefined` when model/provider context is unavailable so callers can
|
|
447
|
+
* choose a fallback summarizer.
|
|
448
|
+
*/
|
|
449
|
+
export async function createLcmSummarizeFromLegacyParams(params) {
|
|
450
|
+
const providerHint = typeof params.legacyParams.provider === "string" ? params.legacyParams.provider.trim() : "";
|
|
451
|
+
const modelHint = typeof params.legacyParams.model === "string" ? params.legacyParams.model.trim() : "";
|
|
452
|
+
const modelRef = modelHint || undefined;
|
|
453
|
+
let resolved;
|
|
454
|
+
try {
|
|
455
|
+
resolved = params.deps.resolveModel(modelRef, providerHint || undefined);
|
|
456
|
+
}
|
|
457
|
+
catch (err) {
|
|
458
|
+
console.error(`[lcm] createLcmSummarize: resolveModel FAILED:`, err instanceof Error ? err.message : err);
|
|
459
|
+
return undefined;
|
|
460
|
+
}
|
|
461
|
+
const { provider, model } = resolved;
|
|
462
|
+
if (!provider || !model) {
|
|
463
|
+
console.error(`[lcm] createLcmSummarize: empty provider="${provider}" or model="${model}"`);
|
|
464
|
+
return undefined;
|
|
465
|
+
}
|
|
466
|
+
const authProfileId = typeof params.legacyParams.authProfileId === "string" &&
|
|
467
|
+
params.legacyParams.authProfileId.trim()
|
|
468
|
+
? params.legacyParams.authProfileId.trim()
|
|
469
|
+
: undefined;
|
|
470
|
+
const agentDir = typeof params.legacyParams.agentDir === "string" && params.legacyParams.agentDir.trim()
|
|
471
|
+
? params.legacyParams.agentDir.trim()
|
|
472
|
+
: undefined;
|
|
473
|
+
const providerApi = resolveProviderApiFromLegacyConfig(params.legacyParams.config, provider);
|
|
474
|
+
const condensedTargetTokens = Number.isFinite(params.deps.config.condensedTargetTokens) &&
|
|
475
|
+
params.deps.config.condensedTargetTokens > 0
|
|
476
|
+
? params.deps.config.condensedTargetTokens
|
|
477
|
+
: DEFAULT_CONDENSED_TARGET_TOKENS;
|
|
478
|
+
return async (text, aggressive, options) => {
|
|
479
|
+
if (!text.trim()) {
|
|
480
|
+
return "";
|
|
481
|
+
}
|
|
482
|
+
const mode = aggressive ? "aggressive" : "normal";
|
|
483
|
+
const isCondensed = options?.isCondensed === true;
|
|
484
|
+
const apiKey = await params.deps.getApiKey(provider, model, {
|
|
485
|
+
profileId: authProfileId,
|
|
486
|
+
});
|
|
487
|
+
const targetTokens = resolveTargetTokens({
|
|
488
|
+
inputTokens: estimateTokens(text),
|
|
489
|
+
mode,
|
|
490
|
+
isCondensed,
|
|
491
|
+
condensedTargetTokens,
|
|
492
|
+
});
|
|
493
|
+
const prompt = isCondensed
|
|
494
|
+
? buildCondensedSummaryPrompt({
|
|
495
|
+
text,
|
|
496
|
+
targetTokens,
|
|
497
|
+
depth: typeof options?.depth === "number" && Number.isFinite(options.depth)
|
|
498
|
+
? Math.max(1, Math.floor(options.depth))
|
|
499
|
+
: 1,
|
|
500
|
+
previousSummary: options?.previousSummary,
|
|
501
|
+
customInstructions: params.customInstructions,
|
|
502
|
+
})
|
|
503
|
+
: buildLeafSummaryPrompt({
|
|
504
|
+
text,
|
|
505
|
+
mode,
|
|
506
|
+
targetTokens,
|
|
507
|
+
previousSummary: options?.previousSummary,
|
|
508
|
+
customInstructions: params.customInstructions,
|
|
509
|
+
});
|
|
510
|
+
const result = await params.deps.complete({
|
|
511
|
+
provider,
|
|
512
|
+
model,
|
|
513
|
+
apiKey,
|
|
514
|
+
providerApi,
|
|
515
|
+
authProfileId,
|
|
516
|
+
agentDir,
|
|
517
|
+
runtimeConfig: params.legacyParams.config,
|
|
518
|
+
system: LCM_SUMMARIZER_SYSTEM_PROMPT,
|
|
519
|
+
messages: [
|
|
520
|
+
{
|
|
521
|
+
role: "user",
|
|
522
|
+
content: prompt,
|
|
523
|
+
},
|
|
524
|
+
],
|
|
525
|
+
maxTokens: targetTokens,
|
|
526
|
+
temperature: aggressive ? 0.1 : 0.2,
|
|
527
|
+
});
|
|
528
|
+
const normalized = normalizeCompletionSummary(result.content);
|
|
529
|
+
let summary = normalized.summary;
|
|
530
|
+
let summarySource = "content";
|
|
531
|
+
// --- Empty-summary hardening: envelope → retry → deterministic fallback ---
|
|
532
|
+
if (!summary) {
|
|
533
|
+
// Envelope-aware extraction: some providers place summary text in
|
|
534
|
+
// top-level response fields (output, message, response) rather than
|
|
535
|
+
// inside the content array. Re-run normalization against the full
|
|
536
|
+
// response envelope before spending an API call on a retry.
|
|
537
|
+
const envelopeNormalized = normalizeCompletionSummary(result);
|
|
538
|
+
if (envelopeNormalized.summary) {
|
|
539
|
+
summary = envelopeNormalized.summary;
|
|
540
|
+
summarySource = "envelope";
|
|
541
|
+
console.error(`[lcm] recovered summary from response envelope; provider=${provider}; model=${model}; ` +
|
|
542
|
+
`block_types=${formatBlockTypes(envelopeNormalized.blockTypes)}; source=envelope`);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
if (!summary) {
|
|
546
|
+
const responseDiag = extractResponseDiagnostics(result);
|
|
547
|
+
const diagParts = [
|
|
548
|
+
`[lcm] empty normalized summary on first attempt`,
|
|
549
|
+
`provider=${provider}`,
|
|
550
|
+
`model=${model}`,
|
|
551
|
+
`block_types=${formatBlockTypes(normalized.blockTypes)}`,
|
|
552
|
+
`response_blocks=${result.content.length}`,
|
|
553
|
+
];
|
|
554
|
+
if (responseDiag) {
|
|
555
|
+
diagParts.push(responseDiag);
|
|
556
|
+
}
|
|
557
|
+
console.error(`${diagParts.join("; ")}; retrying with conservative settings`);
|
|
558
|
+
// Single retry with conservative parameters: low temperature and low
|
|
559
|
+
// reasoning budget to coax a textual response from providers that
|
|
560
|
+
// sometimes return reasoning-only or empty blocks on the first pass.
|
|
561
|
+
try {
|
|
562
|
+
const retryResult = await params.deps.complete({
|
|
563
|
+
provider,
|
|
564
|
+
model,
|
|
565
|
+
apiKey,
|
|
566
|
+
providerApi,
|
|
567
|
+
authProfileId,
|
|
568
|
+
agentDir,
|
|
569
|
+
runtimeConfig: params.legacyParams.config,
|
|
570
|
+
system: LCM_SUMMARIZER_SYSTEM_PROMPT,
|
|
571
|
+
messages: [
|
|
572
|
+
{
|
|
573
|
+
role: "user",
|
|
574
|
+
content: prompt,
|
|
575
|
+
},
|
|
576
|
+
],
|
|
577
|
+
maxTokens: targetTokens,
|
|
578
|
+
temperature: 0.05,
|
|
579
|
+
reasoning: "low",
|
|
580
|
+
});
|
|
581
|
+
const retryNormalized = normalizeCompletionSummary(retryResult.content);
|
|
582
|
+
summary = retryNormalized.summary;
|
|
583
|
+
if (summary) {
|
|
584
|
+
summarySource = "retry";
|
|
585
|
+
console.error(`[lcm] retry succeeded; provider=${provider}; model=${model}; ` +
|
|
586
|
+
`block_types=${formatBlockTypes(retryNormalized.blockTypes)}; source=retry`);
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
const retryDiag = extractResponseDiagnostics(retryResult);
|
|
590
|
+
const retryParts = [
|
|
591
|
+
`[lcm] retry also returned empty summary`,
|
|
592
|
+
`provider=${provider}`,
|
|
593
|
+
`model=${model}`,
|
|
594
|
+
`block_types=${formatBlockTypes(retryNormalized.blockTypes)}`,
|
|
595
|
+
`response_blocks=${retryResult.content.length}`,
|
|
596
|
+
];
|
|
597
|
+
if (retryDiag) {
|
|
598
|
+
retryParts.push(retryDiag);
|
|
599
|
+
}
|
|
600
|
+
console.error(`${retryParts.join("; ")}; falling back to truncation`);
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
catch (retryErr) {
|
|
604
|
+
// Retry is best-effort; log and proceed to deterministic fallback.
|
|
605
|
+
console.error(`[lcm] retry failed; provider=${provider} model=${model}; error=${retryErr instanceof Error ? retryErr.message : String(retryErr)}; falling back to truncation`);
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
if (!summary) {
|
|
609
|
+
summarySource = "fallback";
|
|
610
|
+
console.error(`[lcm] all extraction attempts exhausted; provider=${provider}; model=${model}; source=fallback`);
|
|
611
|
+
return buildDeterministicFallbackSummary(text, targetTokens);
|
|
612
|
+
}
|
|
613
|
+
if (summarySource !== "content") {
|
|
614
|
+
console.error(`[lcm] summary resolved via non-content path; provider=${provider}; model=${model}; source=${summarySource}`);
|
|
615
|
+
}
|
|
616
|
+
return summary;
|
|
617
|
+
};
|
|
618
|
+
}
|
|
619
|
+
//# sourceMappingURL=summarize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarize.js","sourceRoot":"","sources":["../../src/summarize.ts"],"names":[],"mappings":"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"}
|