@caupulican/pi-agent-core 0.90.7 → 0.90.11
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/dist/agent-loop.d.ts +1 -1
- package/dist/agent-loop.d.ts.map +1 -1
- package/dist/agent-loop.js +1 -1
- package/dist/agent-loop.js.map +1 -1
- package/dist/agent.d.ts +2 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +4 -0
- package/dist/agent.js.map +1 -1
- package/dist/compaction/compaction.d.ts.map +1 -1
- package/dist/compaction/compaction.js +1 -34
- package/dist/compaction/compaction.js.map +1 -1
- package/dist/compaction/extraction.d.ts +1 -0
- package/dist/compaction/extraction.d.ts.map +1 -1
- package/dist/compaction/extraction.js +1 -1
- package/dist/compaction/extraction.js.map +1 -1
- package/dist/compaction/utils.d.ts +13 -1
- package/dist/compaction/utils.d.ts.map +1 -1
- package/dist/compaction/utils.js +49 -1
- package/dist/compaction/utils.js.map +1 -1
- package/dist/compaction/verification.d.ts.map +1 -1
- package/dist/compaction/verification.js +154 -6
- package/dist/compaction/verification.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/provider-request-planner.d.ts +8 -0
- package/dist/provider-request-planner.d.ts.map +1 -1
- package/dist/provider-request-planner.js +8 -1
- package/dist/provider-request-planner.js.map +1 -1
- package/dist/provider-tool-projection.d.ts.map +1 -1
- package/dist/provider-tool-projection.js +4 -11
- package/dist/provider-tool-projection.js.map +1 -1
- package/dist/tool-failure-memory.d.ts.map +1 -1
- package/dist/tool-failure-memory.js +27 -3
- package/dist/tool-failure-memory.js.map +1 -1
- package/dist/tool-protocol-residue.d.ts.map +1 -1
- package/dist/tool-protocol-residue.js +58 -18
- package/dist/tool-protocol-residue.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification.js","sourceRoot":"","sources":["../../src/compaction/verification.ts"],"names":[],"mappings":"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","sourcesContent":["import { ACTIVE_TASK_SOURCE_MAX_CHARS, type CompactionFacts } from \"./extraction.ts\";\n\nexport interface VerificationFailure {\n\tcheck: string;\n\tdetail: string;\n\tscore?: number;\n\tthreshold?: number;\n\tcomparator?: \"minimum\" | \"maximum\";\n\tmatched?: number;\n\tdemanded?: number;\n}\n\nexport interface VerificationReport {\n\tok: boolean;\n\tfailures: VerificationFailure[];\n}\n\n/** A failed verification attempt with its structured reports preserved for the retry ladder. */\nexport class CompactionVerificationError extends Error {\n\treadonly reports: VerificationReport[];\n\n\tconstructor(reports: readonly VerificationReport[]) {\n\t\tsuper(`gate-failed: ${formatVerificationReports(reports)}`);\n\t\tthis.name = \"CompactionVerificationError\";\n\t\tthis.reports = reports.map((report) => ({\n\t\t\tok: report.ok,\n\t\t\tfailures: report.failures.map((failure) => ({ ...failure })),\n\t\t}));\n\t}\n}\n\nexport interface DeterministicGapFillResult {\n\tsummary: string;\n\tverification: VerificationReport;\n\tchanged: boolean;\n}\n\nexport const FILES_READ_RECALL_THRESHOLD = 0.8;\nexport const ACTIVE_TASK_CONTAINMENT_THRESHOLD = 1;\nexport const MANDATORY_RULES_RECALL_THRESHOLD = 0.7;\nexport const CANCELLED_WORK_DROPPED_THRESHOLD = 0.1;\nexport const ACTIONS_RECALL_THRESHOLD = 0.6;\nexport const OPEN_ERRORS_RECALL_THRESHOLD = 0.7;\n\nconst SECTION_FILES = \"files\";\nconst SECTION_WORKING_SET = \"working set\";\nconst SECTION_OPEN_PROBLEMS = \"open problems\";\nconst SECTION_DONE = \"done\";\nconst SECTION_ACTIVE_TASK = \"active task\";\nconst SECTION_MANDATORY_RULES = \"mandatory rules\";\nconst SECTION_KEY_DECISIONS = \"key decisions\";\nconst SECTION_CONSTRAINTS = \"constraints & preferences\";\nconst SECTION_CRITICAL_CONTEXT = \"critical context\";\n\ninterface ParsedSummarySection {\n\theading: string;\n\tnormalized: string;\n\tlevel: \"##\" | \"###\";\n\tlines: string[];\n}\n\nconst REQUIRED_SUMMARY_SECTIONS: Array<{ heading: string; normalized: string; level: \"##\" | \"###\" }> = [\n\t{ heading: \"Active Task\", normalized: SECTION_ACTIVE_TASK, level: \"##\" },\n\t{ heading: \"Mandatory Rules\", normalized: SECTION_MANDATORY_RULES, level: \"###\" },\n\t{ heading: \"Working Set\", normalized: SECTION_WORKING_SET, level: \"##\" },\n\t{ heading: \"Files\", normalized: SECTION_FILES, level: \"##\" },\n\t{ heading: \"Open Problems\", normalized: SECTION_OPEN_PROBLEMS, level: \"##\" },\n\t{ heading: \"Done\", normalized: SECTION_DONE, level: \"##\" },\n\t{ heading: \"Key Decisions\", normalized: SECTION_KEY_DECISIONS, level: \"##\" },\n\t{ heading: \"Constraints & Preferences\", normalized: SECTION_CONSTRAINTS, level: \"##\" },\n\t{ heading: \"Critical Context\", normalized: SECTION_CRITICAL_CONTEXT, level: \"##\" },\n];\n\nexport function verifySummary(summary: string, facts: CompactionFacts): VerificationReport {\n\tconst failures: VerificationFailure[] = [];\n\tif (!isCompactionSummaryStructurallyUsable(summary)) {\n\t\tfailures.push({\n\t\t\tcheck: \"summary-structure\",\n\t\t\tdetail: \"Checkpoint must contain at least one recognized checkpoint section\",\n\t\t\tscore: 0,\n\t\t\tthreshold: 1,\n\t\t\tcomparator: \"minimum\",\n\t\t});\n\t}\n\tif (factsAreEmpty(facts)) {\n\t\treturn { ok: failures.length === 0, failures };\n\t}\n\n\tconst sections = extractSections(summary);\n\tconst filesSection = sections[SECTION_FILES] ?? \"\";\n\tconst workingSetSection = sections[SECTION_WORKING_SET] ?? \"\";\n\tconst openProblemsSection = sections[SECTION_OPEN_PROBLEMS] ?? \"\";\n\tconst doneSection = sections[SECTION_DONE] ?? \"\";\n\tconst activeTaskSection = sections[SECTION_ACTIVE_TASK] ?? \"\";\n\tconst mandatoryRulesSection = sections[SECTION_MANDATORY_RULES] ?? \"\";\n\n\tconst modifiedFiles = facts.files.filter((file) => file.kind !== \"read\");\n\tconst missingModifiedFiles = modifiedFiles\n\t\t.map((file) => file.path)\n\t\t.filter((path) => !sectionContainsExactPath(filesSection, path));\n\tif (missingModifiedFiles.length > 0) {\n\t\tconst matched = modifiedFiles.length - missingModifiedFiles.length;\n\t\tfailures.push({\n\t\t\tcheck: \"files-modified-recall\",\n\t\t\tdetail: `Modified/created file recall ${formatScore(matched / modifiedFiles.length)} (${matched}/${modifiedFiles.length} exact paths); missing: ${formatMissingValues(missingModifiedFiles)}`,\n\t\t\tscore: matched / modifiedFiles.length,\n\t\t\tthreshold: 1,\n\t\t\tcomparator: \"minimum\",\n\t\t\tmatched,\n\t\t\tdemanded: modifiedFiles.length,\n\t\t});\n\t}\n\n\tconst workingSetPaths = facts.workingSet.map((file) => file.path);\n\tconst missingWorkingSetPaths = workingSetPaths.filter((path) => !sectionContainsExactPath(workingSetSection, path));\n\tif (missingWorkingSetPaths.length > 0) {\n\t\tconst matched = workingSetPaths.length - missingWorkingSetPaths.length;\n\t\tfailures.push({\n\t\t\tcheck: \"working-set-recall\",\n\t\t\tdetail: `Working-set recall ${formatScore(matched / workingSetPaths.length)} (${matched}/${workingSetPaths.length} exact paths); missing: ${formatMissingValues(missingWorkingSetPaths)}`,\n\t\t\tscore: matched / workingSetPaths.length,\n\t\t\tthreshold: 1,\n\t\t\tcomparator: \"minimum\",\n\t\t\tmatched,\n\t\t\tdemanded: workingSetPaths.length,\n\t\t});\n\t}\n\n\tconst readPaths = facts.files.filter((file) => file.kind === \"read\").map((file) => file.path);\n\tif (readPaths.length > 0) {\n\t\t// Paths are atomic identities. A global token bag over-credits shared directory prefixes and\n\t\t// makes the score impossible to interpret as \"how many files survived\".\n\t\tconst missingReadPaths = readPaths.filter((path) => !sectionContainsExactPath(filesSection, path));\n\t\tconst matched = readPaths.length - missingReadPaths.length;\n\t\tconst score = matched / readPaths.length;\n\t\tif (score < FILES_READ_RECALL_THRESHOLD) {\n\t\t\tfailures.push({\n\t\t\t\tcheck: \"files-read-recall\",\n\t\t\t\tdetail: `Read file recall ${formatScore(score)} (${matched}/${readPaths.length} exact paths) below ${FILES_READ_RECALL_THRESHOLD}; missing: ${formatMissingValues(missingReadPaths)}`,\n\t\t\t\tscore,\n\t\t\t\tthreshold: FILES_READ_RECALL_THRESHOLD,\n\t\t\t\tcomparator: \"minimum\",\n\t\t\t\tmatched,\n\t\t\t\tdemanded: readPaths.length,\n\t\t\t});\n\t\t}\n\t}\n\n\tif (facts.activeTaskSource) {\n\t\tconst source = facts.activeTaskSource.slice(0, ACTIVE_TASK_SOURCE_MAX_CHARS);\n\t\tconst score = activeTaskMatchesVerbatim(activeTaskSection, source) ? 1 : 0;\n\t\tif (score < ACTIVE_TASK_CONTAINMENT_THRESHOLD) {\n\t\t\tfailures.push({\n\t\t\t\tcheck: \"active-task-containment\",\n\t\t\t\tdetail: \"Active task must copy the latest user request verbatim without added intent\",\n\t\t\t\tscore,\n\t\t\t\tthreshold: ACTIVE_TASK_CONTAINMENT_THRESHOLD,\n\t\t\t\tcomparator: \"minimum\",\n\t\t\t});\n\t\t}\n\t}\n\n\tfor (const prohibition of facts.prohibitions) {\n\t\tconst score = containment(tokenSet(prohibition), tokenSet(mandatoryRulesSection));\n\t\tif (score < MANDATORY_RULES_RECALL_THRESHOLD) {\n\t\t\tfailures.push({\n\t\t\t\tcheck: \"mandatory-rules-recall\",\n\t\t\t\tdetail: `Mandatory rule recall ${formatScore(score)} below ${MANDATORY_RULES_RECALL_THRESHOLD}: ${prohibition}`,\n\t\t\t\tscore,\n\t\t\t\tthreshold: MANDATORY_RULES_RECALL_THRESHOLD,\n\t\t\t\tcomparator: \"minimum\",\n\t\t\t});\n\t\t}\n\t}\n\n\tif (facts.cancelledText) {\n\t\tconst summaryOutsideMandatoryRules = removeSection(summary, SECTION_MANDATORY_RULES);\n\t\t// File paths from the facts are REQUIRED elsewhere (files-modified/read-recall demand them\n\t\t// in ## Files), so counting them as cancelled-work leakage would make the two gates\n\t\t// unsatisfiable together whenever a reversal message references a touched file.\n\t\tconst cancelledTokens = cancelledWorkTokens(facts);\n\t\tconst score = containment(cancelledTokens, tokenSet(summaryOutsideMandatoryRules));\n\t\tif (score > CANCELLED_WORK_DROPPED_THRESHOLD) {\n\t\t\tfailures.push({\n\t\t\t\tcheck: \"cancelled-work-dropped\",\n\t\t\t\tdetail: `Cancelled work leakage ${formatScore(score)} above ${CANCELLED_WORK_DROPPED_THRESHOLD}`,\n\t\t\t\tscore,\n\t\t\t\tthreshold: CANCELLED_WORK_DROPPED_THRESHOLD,\n\t\t\t\tcomparator: \"maximum\",\n\t\t\t});\n\t\t}\n\t}\n\n\tfor (const error of facts.errorFacts) {\n\t\t// Command strings can be much longer than their failure signal. Weight the operation and the\n\t\t// error identity equally so command flags cannot drown out a faithfully preserved failure (or\n\t\t// let a generic error phrase hide a missing operation).\n\t\tconst openProblemTokens = tokenSet(openProblemsSection);\n\t\tconst operationScore = containment(tokenSet(error.operation), openProblemTokens);\n\t\tconst errorScore = containment(tokenSet(error.error), openProblemTokens);\n\t\tconst score = (operationScore + errorScore) / 2;\n\t\tif (score < OPEN_ERRORS_RECALL_THRESHOLD) {\n\t\t\tfailures.push({\n\t\t\t\tcheck: \"open-errors-recall\",\n\t\t\t\tdetail: `Open error recall ${formatScore(score)} (operation ${formatScore(operationScore)}, error ${formatScore(errorScore)}) below ${OPEN_ERRORS_RECALL_THRESHOLD}: ${error.operation}`,\n\t\t\t\tscore,\n\t\t\t\tthreshold: OPEN_ERRORS_RECALL_THRESHOLD,\n\t\t\t\tcomparator: \"minimum\",\n\t\t\t});\n\t\t}\n\t}\n\n\tif (facts.actions.length > 0) {\n\t\t// Asymmetric on purpose: the update path carries prior ## Done items forward (bounded), so a\n\t\t// symmetric overlap metric would punish faithful carry-over — the gate demands only that the\n\t\t// NEW span's actions are recalled in ## Done, however much history rides alongside them.\n\t\tconst score = containment(tokenSet(facts.actions.join(\"\\n\")), tokenSet(doneSection));\n\t\tif (score < ACTIONS_RECALL_THRESHOLD) {\n\t\t\tfailures.push({\n\t\t\t\tcheck: \"actions-recall\",\n\t\t\t\tdetail: `New-action recall in ## Done ${formatScore(score)} below ${ACTIONS_RECALL_THRESHOLD}`,\n\t\t\t\tscore,\n\t\t\t\tthreshold: ACTIONS_RECALL_THRESHOLD,\n\t\t\t\tcomparator: \"minimum\",\n\t\t\t});\n\t\t}\n\t}\n\n\treturn { ok: failures.length === 0, failures };\n}\n\nexport function isCompactionSummaryStructurallyUsable(summary: string): boolean {\n\tif (summary.trim().length === 0) return false;\n\tconst sections = extractSections(summary);\n\treturn (\n\t\tsections[SECTION_ACTIVE_TASK] !== undefined ||\n\t\tsections[SECTION_FILES] !== undefined ||\n\t\tsections[SECTION_DONE] !== undefined ||\n\t\tsections[SECTION_WORKING_SET] !== undefined ||\n\t\tsections[SECTION_OPEN_PROBLEMS] !== undefined\n\t);\n}\n\nexport function deterministicallyFillSummaryGaps(summary: string, facts: CompactionFacts): DeterministicGapFillResult {\n\tif (!isCompactionSummaryStructurallyUsable(summary)) {\n\t\treturn { summary, verification: verifySummary(summary, facts), changed: false };\n\t}\n\n\tconst sections = parseSummarySections(summary);\n\tconst sectionByName = new Map<string, ParsedSummarySection>();\n\tconst extraSections: ParsedSummarySection[] = [];\n\tfor (const section of sections) {\n\t\tif (REQUIRED_SUMMARY_SECTIONS.some((required) => required.normalized === section.normalized)) {\n\t\t\tconst existing = sectionByName.get(section.normalized);\n\t\t\tif (existing) {\n\t\t\t\texisting.lines.push(...section.lines);\n\t\t\t} else {\n\t\t\t\tsectionByName.set(section.normalized, section);\n\t\t\t}\n\t\t} else {\n\t\t\textraSections.push(section);\n\t\t}\n\t}\n\n\tfor (const required of REQUIRED_SUMMARY_SECTIONS) {\n\t\tif (!sectionByName.has(required.normalized)) {\n\t\t\tsectionByName.set(required.normalized, {\n\t\t\t\theading: required.heading,\n\t\t\t\tnormalized: required.normalized,\n\t\t\t\tlevel: required.level,\n\t\t\t\tlines: [\"(none)\"],\n\t\t\t});\n\t\t}\n\t}\n\n\tremoveCancelledWorkLines(sectionByName, facts);\n\n\tconst activeTask = sectionByName.get(SECTION_ACTIVE_TASK)!;\n\tactiveTask.lines = facts.activeTaskSource ? [`User: ${facts.activeTaskSource}`] : [\"(none)\"];\n\n\tconst mandatoryRules = sectionByName.get(SECTION_MANDATORY_RULES)!;\n\tmandatoryRules.lines = facts.prohibitions.length > 0 ? facts.prohibitions.map((rule) => `- ${rule}`) : [\"(none)\"];\n\n\tconst workingSet = sectionByName.get(SECTION_WORKING_SET)!;\n\tfor (const file of facts.workingSet) {\n\t\tif (!sectionContainsExactPath(workingSet.lines.join(\"\\n\"), file.path)) {\n\t\t\tappendContentLine(workingSet.lines, `- ${file.path} — ${file.note || file.kind}`);\n\t\t}\n\t}\n\n\tconst files = sectionByName.get(SECTION_FILES)!;\n\tfor (const file of facts.files) {\n\t\tif (!sectionContainsExactPath(files.lines.join(\"\\n\"), file.path)) {\n\t\t\tappendContentLine(files.lines, `- ${file.path}`);\n\t\t}\n\t}\n\n\tconst openProblems = sectionByName.get(SECTION_OPEN_PROBLEMS)!;\n\tfor (const error of facts.errorFacts) {\n\t\tconst required = `${error.operation}: ${error.error}`;\n\t\tif (containment(tokenSet(required), tokenSetFromLines(openProblems.lines)) < OPEN_ERRORS_RECALL_THRESHOLD) {\n\t\t\tappendContentLine(openProblems.lines, `- ${required}`);\n\t\t}\n\t}\n\n\tconst done = sectionByName.get(SECTION_DONE)!;\n\tif (\n\t\tfacts.actions.length > 0 &&\n\t\tcontainment(tokenSet(facts.actions.join(\"\\n\")), tokenSetFromLines(done.lines)) < ACTIONS_RECALL_THRESHOLD\n\t) {\n\t\tlet nextNumber = findNextDoneNumber(done.lines);\n\t\tfor (const action of facts.actions) {\n\t\t\tif (sectionLinesContain(done.lines, action)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tappendContentLine(done.lines, `${nextNumber}. ${action}`);\n\t\t\tnextNumber++;\n\t\t}\n\t}\n\n\tconst filledSummary = renderSummarySections(sectionByName, extraSections);\n\treturn {\n\t\tsummary: filledSummary,\n\t\tverification: verifySummary(filledSummary, facts),\n\t\tchanged: filledSummary !== summary,\n\t};\n}\n\nexport function buildRetryPrompt(report: VerificationReport, previousAttempt?: string): string {\n\tconst failures = report.failures.map((failure) => `${failure.check}: ${failure.detail}`).join(\"; \");\n\tconst previous = previousAttempt ? `\\n\\nPREVIOUS CHECKPOINT\\n${previousAttempt}` : \"\";\n\treturn `Checkpoint failed verification: ${failures}. Fix only listed omissions.${previous}`;\n}\n\nexport function formatVerificationReports(reports: readonly VerificationReport[]): string {\n\treturn reports\n\t\t.flatMap((report) => report.failures)\n\t\t.map((failure) => `${failure.check}: ${failure.detail}`)\n\t\t.join(\", \");\n}\n\nfunction parseSummarySections(summary: string): ParsedSummarySection[] {\n\tconst sections: ParsedSummarySection[] = [];\n\tlet current: ParsedSummarySection | undefined;\n\n\tfor (const line of summary.split(/\\r?\\n/)) {\n\t\tconst match = /^(##|###)\\s+(.+?)\\s*$/.exec(line);\n\t\tif (match) {\n\t\t\tcurrent = {\n\t\t\t\theading: match[2],\n\t\t\t\tnormalized: normalizeHeading(match[2]),\n\t\t\t\tlevel: match[1] as \"##\" | \"###\",\n\t\t\t\tlines: [],\n\t\t\t};\n\t\t\tsections.push(current);\n\t\t\tcontinue;\n\t\t}\n\t\tif (current) {\n\t\t\tcurrent.lines.push(line);\n\t\t}\n\t}\n\n\treturn sections;\n}\n\nfunction renderSummarySections(\n\tsectionByName: Map<string, ParsedSummarySection>,\n\textraSections: ParsedSummarySection[],\n): string {\n\tconst rendered: string[] = [];\n\tfor (const required of REQUIRED_SUMMARY_SECTIONS) {\n\t\tconst section = sectionByName.get(required.normalized)!;\n\t\trendered.push(`${required.level} ${required.heading}`);\n\t\tconst body = normalizeSectionLines(section.lines);\n\t\trendered.push(...body);\n\t\trendered.push(\"\");\n\t}\n\tfor (const section of extraSections) {\n\t\trendered.push(`${section.level} ${section.heading}`);\n\t\trendered.push(...normalizeSectionLines(section.lines));\n\t\trendered.push(\"\");\n\t}\n\treturn rendered.join(\"\\n\").trimEnd();\n}\n\nfunction normalizeSectionLines(lines: string[]): string[] {\n\tlet start = 0;\n\tlet end = lines.length;\n\twhile (start < end && lines[start].trim() === \"\") start++;\n\twhile (end > start && lines[end - 1].trim() === \"\") end--;\n\tif (start === end) return [\"(none)\"];\n\treturn lines.slice(start, end).map((line) => line.trimEnd());\n}\n\nfunction sectionLinesContain(lines: readonly string[], value: string): boolean {\n\treturn lines.some((line) => line.includes(value));\n}\n\nfunction sectionContainsExactPath(section: string, path: string): boolean {\n\tlet fromIndex = 0;\n\twhile (fromIndex <= section.length - path.length) {\n\t\tconst index = section.indexOf(path, fromIndex);\n\t\tif (index < 0) return false;\n\t\tconst before = index > 0 ? section[index - 1] : undefined;\n\t\tconst afterIndex = index + path.length;\n\t\tconst after = afterIndex < section.length ? section[afterIndex] : undefined;\n\t\tconst boundary = (character: string | undefined): boolean =>\n\t\t\tcharacter === undefined || /[\\s`'\"()[\\]{}<>,:;|—]/.test(character);\n\t\tif (boundary(before) && boundary(after)) return true;\n\t\tfromIndex = index + 1;\n\t}\n\treturn false;\n}\n\nfunction tokenSetFromLines(lines: readonly string[]): Set<string> {\n\tconst tokens = new Set<string>();\n\tfor (const line of lines) {\n\t\tfor (const token of tokenSet(line)) tokens.add(token);\n\t}\n\treturn tokens;\n}\n\nfunction appendContentLine(lines: string[], line: string): void {\n\tconst normalized = normalizeSectionLines(lines).filter((existing) => existing.trim() !== \"(none)\");\n\tnormalized.push(line);\n\tlines.length = 0;\n\tlines.push(...normalized);\n}\n\nfunction findNextDoneNumber(lines: string[]): number {\n\tlet max = 0;\n\tfor (const line of lines) {\n\t\tconst match = /^\\s*(\\d+)\\./.exec(line);\n\t\tif (!match) continue;\n\t\tmax = Math.max(max, Number(match[1]));\n\t}\n\treturn max + 1;\n}\n\nfunction removeCancelledWorkLines(sectionByName: Map<string, ParsedSummarySection>, facts: CompactionFacts): void {\n\tif (!facts.cancelledText) return;\n\tconst cancelledTokens = cancelledWorkTokens(facts);\n\tif (cancelledTokens.size === 0) return;\n\n\tfor (const section of sectionByName.values()) {\n\t\tif (section.normalized === SECTION_MANDATORY_RULES) continue;\n\t\tsection.lines = section.lines.filter((line) => !lineShouldBeDroppedAsCancelledWork(line, cancelledTokens));\n\t}\n}\n\nfunction cancelledWorkTokens(facts: CompactionFacts): Set<string> {\n\tconst factPathTokens = tokenSet(facts.files.map((file) => file.path).join(\"\\n\"));\n\treturn new Set([...tokenSet(facts.cancelledText)].filter((token) => !factPathTokens.has(token)));\n}\n\nfunction lineShouldBeDroppedAsCancelledWork(line: string, cancelledTokens: Set<string>): boolean {\n\tconst lineTokens = tokenSet(line);\n\tif (lineTokens.size === 0) return false;\n\tlet overlap = 0;\n\tfor (const token of lineTokens) {\n\t\tif (cancelledTokens.has(token)) overlap++;\n\t}\n\treturn overlap >= 2 && overlap / lineTokens.size >= 0.6;\n}\n\nexport function tokenSet(text: string): Set<string> {\n\treturn new Set(\n\t\ttext\n\t\t\t.toLowerCase()\n\t\t\t.split(/[^a-z0-9_./-]+/)\n\t\t\t.map((token) => token.trim())\n\t\t\t.filter((token) => token.length >= 3),\n\t);\n}\n\nexport function containment(needle: Set<string>, hay: Set<string>): number {\n\tif (needle.size === 0) {\n\t\treturn 1;\n\t}\n\tlet hits = 0;\n\tfor (const token of needle) {\n\t\tif (hay.has(token)) {\n\t\t\thits += 1;\n\t\t}\n\t}\n\treturn hits / needle.size;\n}\n\nexport function jaccard(a: Set<string>, b: Set<string>): number {\n\tif (a.size === 0 && b.size === 0) {\n\t\treturn 1;\n\t}\n\tlet intersection = 0;\n\tfor (const token of a) {\n\t\tif (b.has(token)) {\n\t\t\tintersection += 1;\n\t\t}\n\t}\n\tconst union = new Set([...a, ...b]).size;\n\treturn union === 0 ? 1 : intersection / union;\n}\n\nfunction factsAreEmpty(facts: CompactionFacts): boolean {\n\treturn (\n\t\tfacts.files.length === 0 &&\n\t\tfacts.workingSet.length === 0 &&\n\t\tfacts.actions.length === 0 &&\n\t\tfacts.errorFacts.length === 0 &&\n\t\tfacts.prohibitions.length === 0 &&\n\t\tfacts.cancelledText === \"\" &&\n\t\tfacts.activeTaskSource === \"\"\n\t);\n}\n\nfunction extractSections(summary: string): Record<string, string> {\n\tconst sections: Record<string, string> = {};\n\tlet current: string | undefined;\n\tlet bucket: string[] = [];\n\n\tconst flush = (): void => {\n\t\tif (current) {\n\t\t\tsections[current] = bucket.join(\"\\n\").trim();\n\t\t}\n\t\tbucket = [];\n\t};\n\n\tfor (const line of summary.split(/\\r?\\n/)) {\n\t\tconst match = /^(?:##|###)\\s+(.+?)\\s*$/.exec(line);\n\t\tif (match) {\n\t\t\tflush();\n\t\t\tcurrent = normalizeHeading(match[1]);\n\t\t\tcontinue;\n\t\t}\n\t\tif (current) {\n\t\t\tbucket.push(line);\n\t\t}\n\t}\n\tflush();\n\treturn sections;\n}\n\nfunction removeSection(summary: string, heading: string): string {\n\tconst normalizedHeading = normalizeHeading(heading);\n\tconst kept: string[] = [];\n\tlet skipping = false;\n\tfor (const line of summary.split(/\\r?\\n/)) {\n\t\tconst match = /^(?:##|###)\\s+(.+?)\\s*$/.exec(line);\n\t\tif (match) {\n\t\t\tskipping = normalizeHeading(match[1]) === normalizedHeading;\n\t\t\tif (skipping) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tif (!skipping) {\n\t\t\tkept.push(line);\n\t\t}\n\t}\n\treturn kept.join(\"\\n\");\n}\n\nfunction normalizeHeading(heading: string): string {\n\treturn heading.trim().toLowerCase();\n}\n\nfunction activeTaskMatchesVerbatim(section: string, source: string): boolean {\n\tconst normalizedSection = section.replaceAll(\"\\r\\n\", \"\\n\").trim();\n\tconst normalizedSource = source.replaceAll(\"\\r\\n\", \"\\n\").trim();\n\treturn normalizedSection === normalizedSource || normalizedSection === `User: ${normalizedSource}`;\n}\n\nfunction formatScore(score: number): string {\n\treturn score.toFixed(2);\n}\n\nfunction formatMissingValues(values: readonly string[]): string {\n\tconst visible = values.slice(0, 5).join(\", \");\n\treturn values.length > 5 ? `${visible} (+${values.length - 5} more)` : visible;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"verification.js","sourceRoot":"","sources":["../../src/compaction/verification.ts"],"names":[],"mappings":"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","sourcesContent":["import { ACTIVE_TASK_SOURCE_MAX_CHARS, type CompactionFacts, splitSentenceLines } from \"./extraction.ts\";\nimport {\n\tCOMPACTION_WORKED_EXAMPLE_SENTINEL,\n\tSUMMARIZATION_PROMPT,\n\tSUMMARIZATION_SYSTEM_PROMPT,\n\tUPDATE_SUMMARIZATION_PROMPT,\n} from \"./utils.ts\";\n\nexport interface VerificationFailure {\n\tcheck: string;\n\tdetail: string;\n\tscore?: number;\n\tthreshold?: number;\n\tcomparator?: \"minimum\" | \"maximum\";\n\tmatched?: number;\n\tdemanded?: number;\n}\n\nexport interface VerificationReport {\n\tok: boolean;\n\tfailures: VerificationFailure[];\n}\n\n/** A failed verification attempt with its structured reports preserved for the retry ladder. */\nexport class CompactionVerificationError extends Error {\n\treadonly reports: VerificationReport[];\n\n\tconstructor(reports: readonly VerificationReport[]) {\n\t\tsuper(`gate-failed: ${formatVerificationReports(reports)}`);\n\t\tthis.name = \"CompactionVerificationError\";\n\t\tthis.reports = reports.map((report) => ({\n\t\t\tok: report.ok,\n\t\t\tfailures: report.failures.map((failure) => ({ ...failure })),\n\t\t}));\n\t}\n}\n\nexport interface DeterministicGapFillResult {\n\tsummary: string;\n\tverification: VerificationReport;\n\tchanged: boolean;\n}\n\nexport const FILES_READ_RECALL_THRESHOLD = 0.8;\nexport const ACTIVE_TASK_CONTAINMENT_THRESHOLD = 1;\nexport const MANDATORY_RULES_RECALL_THRESHOLD = 0.7;\nexport const CANCELLED_WORK_DROPPED_THRESHOLD = 0.1;\nexport const ACTIONS_RECALL_THRESHOLD = 0.6;\nexport const OPEN_ERRORS_RECALL_THRESHOLD = 0.7;\n\nconst SECTION_FILES = \"files\";\nconst SECTION_WORKING_SET = \"working set\";\nconst SECTION_OPEN_PROBLEMS = \"open problems\";\nconst SECTION_DONE = \"done\";\nconst SECTION_ACTIVE_TASK = \"active task\";\nconst SECTION_MANDATORY_RULES = \"mandatory rules\";\nconst SECTION_KEY_DECISIONS = \"key decisions\";\nconst SECTION_CONSTRAINTS = \"constraints & preferences\";\nconst SECTION_CRITICAL_CONTEXT = \"critical context\";\n\ninterface ParsedSummarySection {\n\theading: string;\n\tnormalized: string;\n\tlevel: \"##\" | \"###\";\n\tlines: string[];\n}\n\nconst REQUIRED_SUMMARY_SECTIONS: Array<{ heading: string; normalized: string; level: \"##\" | \"###\" }> = [\n\t{ heading: \"Active Task\", normalized: SECTION_ACTIVE_TASK, level: \"##\" },\n\t{ heading: \"Mandatory Rules\", normalized: SECTION_MANDATORY_RULES, level: \"###\" },\n\t{ heading: \"Working Set\", normalized: SECTION_WORKING_SET, level: \"##\" },\n\t{ heading: \"Files\", normalized: SECTION_FILES, level: \"##\" },\n\t{ heading: \"Open Problems\", normalized: SECTION_OPEN_PROBLEMS, level: \"##\" },\n\t{ heading: \"Done\", normalized: SECTION_DONE, level: \"##\" },\n\t{ heading: \"Key Decisions\", normalized: SECTION_KEY_DECISIONS, level: \"##\" },\n\t{ heading: \"Constraints & Preferences\", normalized: SECTION_CONSTRAINTS, level: \"##\" },\n\t{ heading: \"Critical Context\", normalized: SECTION_CRITICAL_CONTEXT, level: \"##\" },\n];\n\nexport function verifySummary(summary: string, facts: CompactionFacts): VerificationReport {\n\tconst failures: VerificationFailure[] = [];\n\tif (!isCompactionSummaryStructurallyUsable(summary)) {\n\t\tfailures.push({\n\t\t\tcheck: \"summary-structure\",\n\t\t\tdetail: \"Checkpoint must contain at least one recognized checkpoint section\",\n\t\t\tscore: 0,\n\t\t\tthreshold: 1,\n\t\t\tcomparator: \"minimum\",\n\t\t});\n\t}\n\t// Mandatory Rules is the one section the deterministic fill unconditionally scrubs of the\n\t// sentinel (reconcileMandatoryRules), so its presence there is self-healing, not a failure. Any\n\t// OTHER section is contamination the fill never touches and cannot safely repair — fail loudly\n\t// rather than silently persist harness instruction/example text as if it were real content.\n\tif (textContainsCompactionSentinel(removeSection(summary, SECTION_MANDATORY_RULES))) {\n\t\tfailures.push({\n\t\t\tcheck: \"compaction-control-sentinel\",\n\t\t\tdetail: `Checkpoint must never carry the harness's own worked-example sentinel \"${COMPACTION_WORKED_EXAMPLE_SENTINEL}\" outside ### Mandatory Rules — the model echoed instruction/example text into a persisted section`,\n\t\t\tscore: 0,\n\t\t\tthreshold: 1,\n\t\t\tcomparator: \"minimum\",\n\t\t});\n\t}\n\tif (factsAreEmpty(facts)) {\n\t\treturn { ok: failures.length === 0, failures };\n\t}\n\n\tconst sections = extractSections(summary);\n\tconst filesSection = sections[SECTION_FILES] ?? \"\";\n\tconst workingSetSection = sections[SECTION_WORKING_SET] ?? \"\";\n\tconst openProblemsSection = sections[SECTION_OPEN_PROBLEMS] ?? \"\";\n\tconst doneSection = sections[SECTION_DONE] ?? \"\";\n\tconst activeTaskSection = sections[SECTION_ACTIVE_TASK] ?? \"\";\n\tconst mandatoryRulesSection = sections[SECTION_MANDATORY_RULES] ?? \"\";\n\n\tconst modifiedFiles = facts.files.filter((file) => file.kind !== \"read\");\n\tconst missingModifiedFiles = modifiedFiles\n\t\t.map((file) => file.path)\n\t\t.filter((path) => !sectionContainsExactPath(filesSection, path));\n\tif (missingModifiedFiles.length > 0) {\n\t\tconst matched = modifiedFiles.length - missingModifiedFiles.length;\n\t\tfailures.push({\n\t\t\tcheck: \"files-modified-recall\",\n\t\t\tdetail: `Modified/created file recall ${formatScore(matched / modifiedFiles.length)} (${matched}/${modifiedFiles.length} exact paths); missing: ${formatMissingValues(missingModifiedFiles)}`,\n\t\t\tscore: matched / modifiedFiles.length,\n\t\t\tthreshold: 1,\n\t\t\tcomparator: \"minimum\",\n\t\t\tmatched,\n\t\t\tdemanded: modifiedFiles.length,\n\t\t});\n\t}\n\n\tconst workingSetPaths = facts.workingSet.map((file) => file.path);\n\tconst missingWorkingSetPaths = workingSetPaths.filter((path) => !sectionContainsExactPath(workingSetSection, path));\n\tif (missingWorkingSetPaths.length > 0) {\n\t\tconst matched = workingSetPaths.length - missingWorkingSetPaths.length;\n\t\tfailures.push({\n\t\t\tcheck: \"working-set-recall\",\n\t\t\tdetail: `Working-set recall ${formatScore(matched / workingSetPaths.length)} (${matched}/${workingSetPaths.length} exact paths); missing: ${formatMissingValues(missingWorkingSetPaths)}`,\n\t\t\tscore: matched / workingSetPaths.length,\n\t\t\tthreshold: 1,\n\t\t\tcomparator: \"minimum\",\n\t\t\tmatched,\n\t\t\tdemanded: workingSetPaths.length,\n\t\t});\n\t}\n\n\tconst readPaths = facts.files.filter((file) => file.kind === \"read\").map((file) => file.path);\n\tif (readPaths.length > 0) {\n\t\t// Paths are atomic identities. A global token bag over-credits shared directory prefixes and\n\t\t// makes the score impossible to interpret as \"how many files survived\".\n\t\tconst missingReadPaths = readPaths.filter((path) => !sectionContainsExactPath(filesSection, path));\n\t\tconst matched = readPaths.length - missingReadPaths.length;\n\t\tconst score = matched / readPaths.length;\n\t\tif (score < FILES_READ_RECALL_THRESHOLD) {\n\t\t\tfailures.push({\n\t\t\t\tcheck: \"files-read-recall\",\n\t\t\t\tdetail: `Read file recall ${formatScore(score)} (${matched}/${readPaths.length} exact paths) below ${FILES_READ_RECALL_THRESHOLD}; missing: ${formatMissingValues(missingReadPaths)}`,\n\t\t\t\tscore,\n\t\t\t\tthreshold: FILES_READ_RECALL_THRESHOLD,\n\t\t\t\tcomparator: \"minimum\",\n\t\t\t\tmatched,\n\t\t\t\tdemanded: readPaths.length,\n\t\t\t});\n\t\t}\n\t}\n\n\tif (facts.activeTaskSource) {\n\t\tconst source = facts.activeTaskSource.slice(0, ACTIVE_TASK_SOURCE_MAX_CHARS);\n\t\tconst score = activeTaskMatchesVerbatim(activeTaskSection, source) ? 1 : 0;\n\t\tif (score < ACTIVE_TASK_CONTAINMENT_THRESHOLD) {\n\t\t\tfailures.push({\n\t\t\t\tcheck: \"active-task-containment\",\n\t\t\t\tdetail: \"Active task must copy the latest user request verbatim without added intent\",\n\t\t\t\tscore,\n\t\t\t\tthreshold: ACTIVE_TASK_CONTAINMENT_THRESHOLD,\n\t\t\t\tcomparator: \"minimum\",\n\t\t\t});\n\t\t}\n\t}\n\n\tfor (const prohibition of facts.prohibitions) {\n\t\tconst score = containment(tokenSet(prohibition), tokenSet(mandatoryRulesSection));\n\t\tif (score < MANDATORY_RULES_RECALL_THRESHOLD) {\n\t\t\tfailures.push({\n\t\t\t\tcheck: \"mandatory-rules-recall\",\n\t\t\t\tdetail: `Mandatory rule recall ${formatScore(score)} below ${MANDATORY_RULES_RECALL_THRESHOLD}: ${prohibition}`,\n\t\t\t\tscore,\n\t\t\t\tthreshold: MANDATORY_RULES_RECALL_THRESHOLD,\n\t\t\t\tcomparator: \"minimum\",\n\t\t\t});\n\t\t}\n\t}\n\n\tif (facts.cancelledText) {\n\t\tconst summaryOutsideMandatoryRules = removeSection(summary, SECTION_MANDATORY_RULES);\n\t\t// File paths from the facts are REQUIRED elsewhere (files-modified/read-recall demand them\n\t\t// in ## Files), so counting them as cancelled-work leakage would make the two gates\n\t\t// unsatisfiable together whenever a reversal message references a touched file.\n\t\tconst cancelledTokens = cancelledWorkTokens(facts);\n\t\tconst score = containment(cancelledTokens, tokenSet(summaryOutsideMandatoryRules));\n\t\tif (score > CANCELLED_WORK_DROPPED_THRESHOLD) {\n\t\t\tfailures.push({\n\t\t\t\tcheck: \"cancelled-work-dropped\",\n\t\t\t\tdetail: `Cancelled work leakage ${formatScore(score)} above ${CANCELLED_WORK_DROPPED_THRESHOLD}`,\n\t\t\t\tscore,\n\t\t\t\tthreshold: CANCELLED_WORK_DROPPED_THRESHOLD,\n\t\t\t\tcomparator: \"maximum\",\n\t\t\t});\n\t\t}\n\t}\n\n\tfor (const error of facts.errorFacts) {\n\t\t// Command strings can be much longer than their failure signal. Weight the operation and the\n\t\t// error identity equally so command flags cannot drown out a faithfully preserved failure (or\n\t\t// let a generic error phrase hide a missing operation).\n\t\tconst openProblemTokens = tokenSet(openProblemsSection);\n\t\tconst operationScore = containment(tokenSet(error.operation), openProblemTokens);\n\t\tconst errorScore = containment(tokenSet(error.error), openProblemTokens);\n\t\tconst score = (operationScore + errorScore) / 2;\n\t\tif (score < OPEN_ERRORS_RECALL_THRESHOLD) {\n\t\t\tfailures.push({\n\t\t\t\tcheck: \"open-errors-recall\",\n\t\t\t\tdetail: `Open error recall ${formatScore(score)} (operation ${formatScore(operationScore)}, error ${formatScore(errorScore)}) below ${OPEN_ERRORS_RECALL_THRESHOLD}: ${error.operation}`,\n\t\t\t\tscore,\n\t\t\t\tthreshold: OPEN_ERRORS_RECALL_THRESHOLD,\n\t\t\t\tcomparator: \"minimum\",\n\t\t\t});\n\t\t}\n\t}\n\n\tif (facts.actions.length > 0) {\n\t\t// Asymmetric on purpose: the update path carries prior ## Done items forward (bounded), so a\n\t\t// symmetric overlap metric would punish faithful carry-over — the gate demands only that the\n\t\t// NEW span's actions are recalled in ## Done, however much history rides alongside them.\n\t\tconst score = containment(tokenSet(facts.actions.join(\"\\n\")), tokenSet(doneSection));\n\t\tif (score < ACTIONS_RECALL_THRESHOLD) {\n\t\t\tfailures.push({\n\t\t\t\tcheck: \"actions-recall\",\n\t\t\t\tdetail: `New-action recall in ## Done ${formatScore(score)} below ${ACTIONS_RECALL_THRESHOLD}`,\n\t\t\t\tscore,\n\t\t\t\tthreshold: ACTIONS_RECALL_THRESHOLD,\n\t\t\t\tcomparator: \"minimum\",\n\t\t\t});\n\t\t}\n\t}\n\n\treturn { ok: failures.length === 0, failures };\n}\n\nexport function isCompactionSummaryStructurallyUsable(summary: string): boolean {\n\tif (summary.trim().length === 0) return false;\n\tconst sections = extractSections(summary);\n\treturn (\n\t\tsections[SECTION_ACTIVE_TASK] !== undefined ||\n\t\tsections[SECTION_FILES] !== undefined ||\n\t\tsections[SECTION_DONE] !== undefined ||\n\t\tsections[SECTION_WORKING_SET] !== undefined ||\n\t\tsections[SECTION_OPEN_PROBLEMS] !== undefined\n\t);\n}\n\nexport function deterministicallyFillSummaryGaps(summary: string, facts: CompactionFacts): DeterministicGapFillResult {\n\tif (!isCompactionSummaryStructurallyUsable(summary)) {\n\t\treturn { summary, verification: verifySummary(summary, facts), changed: false };\n\t}\n\n\tconst sections = parseSummarySections(summary);\n\tconst sectionByName = new Map<string, ParsedSummarySection>();\n\tconst extraSections: ParsedSummarySection[] = [];\n\tfor (const section of sections) {\n\t\tif (REQUIRED_SUMMARY_SECTIONS.some((required) => required.normalized === section.normalized)) {\n\t\t\tconst existing = sectionByName.get(section.normalized);\n\t\t\tif (existing) {\n\t\t\t\texisting.lines.push(...section.lines);\n\t\t\t} else {\n\t\t\t\tsectionByName.set(section.normalized, section);\n\t\t\t}\n\t\t} else {\n\t\t\textraSections.push(section);\n\t\t}\n\t}\n\n\tfor (const required of REQUIRED_SUMMARY_SECTIONS) {\n\t\tif (!sectionByName.has(required.normalized)) {\n\t\t\tsectionByName.set(required.normalized, {\n\t\t\t\theading: required.heading,\n\t\t\t\tnormalized: required.normalized,\n\t\t\t\tlevel: required.level,\n\t\t\t\tlines: [\"(none)\"],\n\t\t\t});\n\t\t}\n\t}\n\n\tremoveCancelledWorkLines(sectionByName, facts);\n\n\tconst activeTask = sectionByName.get(SECTION_ACTIVE_TASK)!;\n\tactiveTask.lines = facts.activeTaskSource ? buildActiveTaskLines(facts.activeTaskSource) : [\"(none)\"];\n\n\tconst mandatoryRules = sectionByName.get(SECTION_MANDATORY_RULES)!;\n\tmandatoryRules.lines = reconcileMandatoryRules(mandatoryRules.lines, facts.prohibitions);\n\n\tconst workingSet = sectionByName.get(SECTION_WORKING_SET)!;\n\tfor (const file of facts.workingSet) {\n\t\tif (!sectionContainsExactPath(workingSet.lines.join(\"\\n\"), file.path)) {\n\t\t\tappendContentLine(workingSet.lines, `- ${file.path} — ${file.note || file.kind}`);\n\t\t}\n\t}\n\n\tconst files = sectionByName.get(SECTION_FILES)!;\n\tfor (const file of facts.files) {\n\t\tif (!sectionContainsExactPath(files.lines.join(\"\\n\"), file.path)) {\n\t\t\tappendContentLine(files.lines, `- ${file.path}`);\n\t\t}\n\t}\n\n\tconst openProblems = sectionByName.get(SECTION_OPEN_PROBLEMS)!;\n\tfor (const error of facts.errorFacts) {\n\t\tconst required = `${error.operation}: ${error.error}`;\n\t\tif (containment(tokenSet(required), tokenSetFromLines(openProblems.lines)) < OPEN_ERRORS_RECALL_THRESHOLD) {\n\t\t\tappendContentLine(openProblems.lines, `- ${required}`);\n\t\t}\n\t}\n\n\tconst done = sectionByName.get(SECTION_DONE)!;\n\tif (\n\t\tfacts.actions.length > 0 &&\n\t\tcontainment(tokenSet(facts.actions.join(\"\\n\")), tokenSetFromLines(done.lines)) < ACTIONS_RECALL_THRESHOLD\n\t) {\n\t\tlet nextNumber = findNextDoneNumber(done.lines);\n\t\tfor (const action of facts.actions) {\n\t\t\tif (sectionLinesContain(done.lines, action)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tappendContentLine(done.lines, `${nextNumber}. ${action}`);\n\t\t\tnextNumber++;\n\t\t}\n\t}\n\n\tconst filledSummary = renderSummarySections(sectionByName, extraSections);\n\treturn {\n\t\tsummary: filledSummary,\n\t\tverification: verifySummary(filledSummary, facts),\n\t\tchanged: filledSummary !== summary,\n\t};\n}\n\nexport function buildRetryPrompt(report: VerificationReport, previousAttempt?: string): string {\n\tconst failures = report.failures.map((failure) => `${failure.check}: ${failure.detail}`).join(\"; \");\n\tconst previous = previousAttempt ? `\\n\\nPREVIOUS CHECKPOINT\\n${previousAttempt}` : \"\";\n\treturn `Checkpoint failed verification: ${failures}. Fix only listed omissions.${previous}`;\n}\n\nexport function formatVerificationReports(reports: readonly VerificationReport[]): string {\n\treturn reports\n\t\t.flatMap((report) => report.failures)\n\t\t.map((failure) => `${failure.check}: ${failure.detail}`)\n\t\t.join(\", \");\n}\n\nfunction parseSummarySections(summary: string): ParsedSummarySection[] {\n\tconst sections: ParsedSummarySection[] = [];\n\tlet current: ParsedSummarySection | undefined;\n\n\tfor (const line of summary.split(/\\r?\\n/)) {\n\t\tconst match = /^(##|###)\\s+(.+?)\\s*$/.exec(line);\n\t\tif (match) {\n\t\t\tcurrent = {\n\t\t\t\theading: match[2],\n\t\t\t\tnormalized: normalizeHeading(match[2]),\n\t\t\t\tlevel: match[1] as \"##\" | \"###\",\n\t\t\t\tlines: [],\n\t\t\t};\n\t\t\tsections.push(current);\n\t\t\tcontinue;\n\t\t}\n\t\tif (current) {\n\t\t\tcurrent.lines.push(line);\n\t\t}\n\t}\n\n\treturn sections;\n}\n\nfunction renderSummarySections(\n\tsectionByName: Map<string, ParsedSummarySection>,\n\textraSections: ParsedSummarySection[],\n): string {\n\tconst rendered: string[] = [];\n\tfor (const required of REQUIRED_SUMMARY_SECTIONS) {\n\t\tconst section = sectionByName.get(required.normalized)!;\n\t\trendered.push(`${required.level} ${required.heading}`);\n\t\tconst body = normalizeSectionLines(section.lines);\n\t\trendered.push(...body);\n\t\trendered.push(\"\");\n\t}\n\tfor (const section of extraSections) {\n\t\trendered.push(`${section.level} ${section.heading}`);\n\t\trendered.push(...normalizeSectionLines(section.lines));\n\t\trendered.push(\"\");\n\t}\n\treturn rendered.join(\"\\n\").trimEnd();\n}\n\nfunction normalizeSectionLines(lines: string[]): string[] {\n\tlet start = 0;\n\tlet end = lines.length;\n\twhile (start < end && lines[start].trim() === \"\") start++;\n\twhile (end > start && lines[end - 1].trim() === \"\") end--;\n\tif (start === end) return [\"(none)\"];\n\treturn lines.slice(start, end).map((line) => line.trimEnd());\n}\n\nfunction sectionLinesContain(lines: readonly string[], value: string): boolean {\n\treturn lines.some((line) => line.includes(value));\n}\n\nfunction sectionContainsExactPath(section: string, path: string): boolean {\n\tlet fromIndex = 0;\n\twhile (fromIndex <= section.length - path.length) {\n\t\tconst index = section.indexOf(path, fromIndex);\n\t\tif (index < 0) return false;\n\t\tconst before = index > 0 ? section[index - 1] : undefined;\n\t\tconst afterIndex = index + path.length;\n\t\tconst after = afterIndex < section.length ? section[afterIndex] : undefined;\n\t\tconst boundary = (character: string | undefined): boolean =>\n\t\t\tcharacter === undefined || /[\\s`'\"()[\\]{}<>,:;|—]/.test(character);\n\t\tif (boundary(before) && boundary(after)) return true;\n\t\tfromIndex = index + 1;\n\t}\n\treturn false;\n}\n\nfunction tokenSetFromLines(lines: readonly string[]): Set<string> {\n\tconst tokens = new Set<string>();\n\tfor (const line of lines) {\n\t\tfor (const token of tokenSet(line)) tokens.add(token);\n\t}\n\treturn tokens;\n}\n\nfunction appendContentLine(lines: string[], line: string): void {\n\tconst normalized = normalizeSectionLines(lines).filter((existing) => existing.trim() !== \"(none)\");\n\tnormalized.push(line);\n\tlines.length = 0;\n\tlines.push(...normalized);\n}\n\n/**\n * The exact instruction sentences the harness itself injects into the summarization prompts —\n * SUMMARIZATION_SYSTEM_PROMPT, SUMMARIZATION_PROMPT, and UPDATE_SUMMARIZATION_PROMPT. All three\n * sources single-sourced from utils.ts so this never drifts from what was actually sent; not a\n * heuristic guess at what \"looks like\" an instruction. Sentences below a minimum length are\n * dropped — a lone heading fragment like \"## Files\" would otherwise sit in the set as a\n * near-universal 1-2 token match.\n *\n * SUMMARIZATION_SYSTEM_PROMPT was previously excluded here: its worked example used to read\n * `Mandatory Rules contains \"DO NOT touch legacy client\"`, generic enough to false-positive-match a\n * real extractor-owned prohibition about a \"legacy client\". The example's subject is now the\n * synthetic COMPACTION_WORKED_EXAMPLE_SENTINEL token instead (see utils.ts), so that specific\n * collision is gone; the isCompactionControlEcho regression tests below (including the canonical \"do\n * not touch the legacy client\" fixture used throughout this file) are the evidence that re-including\n * it is safe.\n */\nconst COMPACTION_CONTROL_ECHO_MIN_SENTENCE_TOKENS = 4;\n/** A line must share at least this many tokens with a single control sentence, not spread thinly\n * across several, before it is treated as an echo — mirrors lineShouldBeDroppedAsCancelledWork's\n * \"overlap >= N and overlap ratio >= threshold\" dual guard below. */\nconst COMPACTION_CONTROL_ECHO_MIN_OVERLAP = 3;\n/** Stricter than MANDATORY_RULES_RECALL_THRESHOLD on purpose: dropping model content is destructive,\n * so the bar for \"this line basically IS the harness's own sentence\" is set high. */\nconst COMPACTION_CONTROL_ECHO_THRESHOLD = 0.8;\n\nconst COMPACTION_CONTROL_SENTENCE_TOKEN_SETS: readonly Set<string>[] = [\n\tSUMMARIZATION_SYSTEM_PROMPT,\n\tSUMMARIZATION_PROMPT,\n\tUPDATE_SUMMARIZATION_PROMPT,\n]\n\t.flatMap((prompt) => splitSentenceLines(prompt))\n\t.map((sentence) => tokenSet(sentence))\n\t.filter((tokens) => tokens.size >= COMPACTION_CONTROL_ECHO_MIN_SENTENCE_TOKENS);\n\n/** True when `line` is substantially reconstructed from a single harness-injected instruction\n * sentence — i.e. the model echoed the prompt back instead of writing a checkpoint fact. Direction\n * matters: containment is measured with the LINE as the needle and one sentence as the haystack, so\n * a short prompt fragment can never \"explain away\" a longer, mostly-unrelated user rule that merely\n * shares a couple of words with it. This is the fuzzy backstop for paraphrased echoes; a line\n * carrying COMPACTION_WORKED_EXAMPLE_SENTINEL is a separate, unconditional (non-heuristic) drop —\n * see textContainsCompactionSentinel below. */\nfunction isCompactionControlEcho(line: string): boolean {\n\tconst lineTokens = tokenSet(line);\n\tif (lineTokens.size === 0) return false;\n\tfor (const sentenceTokens of COMPACTION_CONTROL_SENTENCE_TOKEN_SETS) {\n\t\tlet hits = 0;\n\t\tfor (const token of lineTokens) {\n\t\t\tif (sentenceTokens.has(token)) hits++;\n\t\t}\n\t\tif (hits >= COMPACTION_CONTROL_ECHO_MIN_OVERLAP && hits / lineTokens.size >= COMPACTION_CONTROL_ECHO_THRESHOLD) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n/** True when `text` carries the harness's worked-example sentinel — deterministic, not\n * model-dependent: no containment threshold, no token overlap, just a literal substring check\n * against a token no real content could plausibly contain. */\nfunction textContainsCompactionSentinel(text: string): boolean {\n\treturn text.includes(COMPACTION_WORKED_EXAMPLE_SENTINEL);\n}\n\n/**\n * Force each extractor-owned prohibition to appear verbatim (anti-paraphrase), while preserving every\n * model-carried line the extractor does not own. A rule replaces the first existing line that already\n * paraphrases it (by the same recall threshold the gate uses); otherwise it is appended. The harness owns\n * only the facts it extracted — it must never delete model content it never extracted, and it must never\n * stamp \"(none)\" over a non-empty section (2026-08 incident: unconditional overwrite silently dropped\n * user rules that don't match PROHIBITION_PATTERN, e.g. positive instructions like \"always run tests from\n * packages/coding-agent\", permanently across every later checkpoint). Two things it MUST still drop:\n * a line that echoes the harness's own injected instructions (isCompactionControlEcho), and a line\n * carrying the worked-example sentinel by definition (textContainsCompactionSentinel) — the latter is\n * exact and unconditional, since that token can only ever have come from the harness's own prompt.\n */\nfunction reconcileMandatoryRules(lines: readonly string[], prohibitions: readonly string[]): string[] {\n\tconst result = lines.filter(\n\t\t(line) =>\n\t\t\tline.trim() !== \"(none)\" &&\n\t\t\tline.trim() !== \"\" &&\n\t\t\t!isCompactionControlEcho(line) &&\n\t\t\t!textContainsCompactionSentinel(line),\n\t);\n\tfor (const rule of prohibitions) {\n\t\tconst canonical = `- ${rule}`;\n\t\tconst ruleTokens = tokenSet(rule);\n\t\tlet bestIndex = -1;\n\t\tlet bestScore = 0;\n\t\tfor (let i = 0; i < result.length; i++) {\n\t\t\tconst score = containment(ruleTokens, tokenSet(result[i]));\n\t\t\tif (score > bestScore) {\n\t\t\t\tbestScore = score;\n\t\t\t\tbestIndex = i;\n\t\t\t}\n\t\t}\n\t\tif (bestIndex >= 0 && bestScore >= MANDATORY_RULES_RECALL_THRESHOLD) {\n\t\t\tresult[bestIndex] = canonical;\n\t\t} else {\n\t\t\tresult.push(canonical);\n\t\t}\n\t}\n\treturn result.length > 0 ? result : [\"(none)\"];\n}\n\n/** Markdown-style escape: a line starting with `##`/`###` gains one leading backslash so the harness's\n * own heading parser (`^(?:##|###)\\s`) can never re-split the Active Task section on it. Lines that\n * already start with a backslash before the heading marker gain one more, so decode (below) always\n * strips exactly one and the transform is a bijection — no other line is touched. */\nconst ACTIVE_TASK_HEADING_LIKE = /^\\\\*(?:##|###)\\s/;\nconst ACTIVE_TASK_ESCAPED_HEADING = /^\\\\(?:\\\\*(?:##|###)\\s)/;\n\nfunction escapeActiveTaskHeadingLine(line: string): string {\n\treturn ACTIVE_TASK_HEADING_LIKE.test(line) ? `\\\\${line}` : line;\n}\n\nfunction unescapeActiveTaskHeadingLine(line: string): string {\n\treturn ACTIVE_TASK_ESCAPED_HEADING.test(line) ? line.slice(1) : line;\n}\n\n/**\n * Render the Active Task body so it survives being re-parsed by extractSections/parseSummarySections:\n * a user request that itself contains a `##`/`###` line (e.g. a pasted \"## Steps\" list) must not be\n * mistaken for a checkpoint heading, or the section gets truncated and verbatim verification can never\n * pass (2026-08 incident: permanently broken compaction for any conversation whose request had a\n * markdown heading). Only offending lines are touched, so plain requests render exactly as before.\n */\nfunction buildActiveTaskLines(source: string): string[] {\n\treturn `User: ${source}`.replaceAll(\"\\r\\n\", \"\\n\").split(\"\\n\").map(escapeActiveTaskHeadingLine);\n}\n\nfunction findNextDoneNumber(lines: string[]): number {\n\tlet max = 0;\n\tfor (const line of lines) {\n\t\tconst match = /^\\s*(\\d+)\\./.exec(line);\n\t\tif (!match) continue;\n\t\tmax = Math.max(max, Number(match[1]));\n\t}\n\treturn max + 1;\n}\n\nfunction removeCancelledWorkLines(sectionByName: Map<string, ParsedSummarySection>, facts: CompactionFacts): void {\n\tif (!facts.cancelledText) return;\n\tconst cancelledTokens = cancelledWorkTokens(facts);\n\tif (cancelledTokens.size === 0) return;\n\n\tfor (const section of sectionByName.values()) {\n\t\tif (section.normalized === SECTION_MANDATORY_RULES) continue;\n\t\tsection.lines = section.lines.filter((line) => !lineShouldBeDroppedAsCancelledWork(line, cancelledTokens));\n\t}\n}\n\nfunction cancelledWorkTokens(facts: CompactionFacts): Set<string> {\n\tconst factPathTokens = tokenSet(facts.files.map((file) => file.path).join(\"\\n\"));\n\treturn new Set([...tokenSet(facts.cancelledText)].filter((token) => !factPathTokens.has(token)));\n}\n\nfunction lineShouldBeDroppedAsCancelledWork(line: string, cancelledTokens: Set<string>): boolean {\n\tconst lineTokens = tokenSet(line);\n\tif (lineTokens.size === 0) return false;\n\tlet overlap = 0;\n\tfor (const token of lineTokens) {\n\t\tif (cancelledTokens.has(token)) overlap++;\n\t}\n\treturn overlap >= 2 && overlap / lineTokens.size >= 0.6;\n}\n\nexport function tokenSet(text: string): Set<string> {\n\treturn new Set(\n\t\ttext\n\t\t\t.toLowerCase()\n\t\t\t.split(/[^a-z0-9_./-]+/)\n\t\t\t.map((token) => token.trim())\n\t\t\t.filter((token) => token.length >= 3),\n\t);\n}\n\nexport function containment(needle: Set<string>, hay: Set<string>): number {\n\tif (needle.size === 0) {\n\t\treturn 1;\n\t}\n\tlet hits = 0;\n\tfor (const token of needle) {\n\t\tif (hay.has(token)) {\n\t\t\thits += 1;\n\t\t}\n\t}\n\treturn hits / needle.size;\n}\n\nexport function jaccard(a: Set<string>, b: Set<string>): number {\n\tif (a.size === 0 && b.size === 0) {\n\t\treturn 1;\n\t}\n\tlet intersection = 0;\n\tfor (const token of a) {\n\t\tif (b.has(token)) {\n\t\t\tintersection += 1;\n\t\t}\n\t}\n\tconst union = new Set([...a, ...b]).size;\n\treturn union === 0 ? 1 : intersection / union;\n}\n\nfunction factsAreEmpty(facts: CompactionFacts): boolean {\n\treturn (\n\t\tfacts.files.length === 0 &&\n\t\tfacts.workingSet.length === 0 &&\n\t\tfacts.actions.length === 0 &&\n\t\tfacts.errorFacts.length === 0 &&\n\t\tfacts.prohibitions.length === 0 &&\n\t\tfacts.cancelledText === \"\" &&\n\t\tfacts.activeTaskSource === \"\"\n\t);\n}\n\nfunction extractSections(summary: string): Record<string, string> {\n\tconst sections: Record<string, string> = {};\n\tlet current: string | undefined;\n\tlet bucket: string[] = [];\n\n\tconst flush = (): void => {\n\t\tif (current) {\n\t\t\tsections[current] = bucket.join(\"\\n\").trim();\n\t\t}\n\t\tbucket = [];\n\t};\n\n\tfor (const line of summary.split(/\\r?\\n/)) {\n\t\tconst match = /^(?:##|###)\\s+(.+?)\\s*$/.exec(line);\n\t\tif (match) {\n\t\t\tflush();\n\t\t\tcurrent = normalizeHeading(match[1]);\n\t\t\tcontinue;\n\t\t}\n\t\tif (current) {\n\t\t\tbucket.push(line);\n\t\t}\n\t}\n\tflush();\n\treturn sections;\n}\n\nfunction removeSection(summary: string, heading: string): string {\n\tconst normalizedHeading = normalizeHeading(heading);\n\tconst kept: string[] = [];\n\tlet skipping = false;\n\tfor (const line of summary.split(/\\r?\\n/)) {\n\t\tconst match = /^(?:##|###)\\s+(.+?)\\s*$/.exec(line);\n\t\tif (match) {\n\t\t\tskipping = normalizeHeading(match[1]) === normalizedHeading;\n\t\t\tif (skipping) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tif (!skipping) {\n\t\t\tkept.push(line);\n\t\t}\n\t}\n\treturn kept.join(\"\\n\");\n}\n\nfunction normalizeHeading(heading: string): string {\n\treturn heading.trim().toLowerCase();\n}\n\n/** Trailing whitespace per line and leading/trailing blank lines are lost in the render pipeline\n * (normalizeSectionLines trims both); normalize both sides identically so the comparison is a fixed\n * point regardless of that lossy step, while leading whitespace on interior lines is preserved. */\nfunction normalizeActiveTaskText(text: string): string {\n\treturn text\n\t\t.replaceAll(\"\\r\\n\", \"\\n\")\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.trimEnd())\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\nfunction activeTaskMatchesVerbatim(section: string, source: string): boolean {\n\tconst decodedSection = section.replaceAll(\"\\r\\n\", \"\\n\").split(\"\\n\").map(unescapeActiveTaskHeadingLine).join(\"\\n\");\n\tconst normalizedSection = normalizeActiveTaskText(decodedSection);\n\tconst normalizedSource = normalizeActiveTaskText(source);\n\tconst normalizedWithPrefix = normalizeActiveTaskText(`User: ${source}`);\n\treturn normalizedSection === normalizedSource || normalizedSection === normalizedWithPrefix;\n}\n\nfunction formatScore(score: number): string {\n\treturn score.toFixed(2);\n}\n\nfunction formatMissingValues(values: readonly string[]): string {\n\tconst visible = values.slice(0, 5).join(\", \");\n\treturn values.length > 5 ? `${visible} (+${values.length - 5} more)` : visible;\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export * from "./proxy.ts";
|
|
|
7
7
|
export * from "./reliability/index.ts";
|
|
8
8
|
export * from "./session/message-retention.ts";
|
|
9
9
|
export * from "./tool-failure-memory.ts";
|
|
10
|
+
export * from "./tool-protocol-residue.ts";
|
|
10
11
|
export * from "./types.ts";
|
|
11
12
|
export * from "./usage.ts";
|
|
12
13
|
export * from "./utils/shell-output.ts";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC;AAE3B,cAAc,iBAAiB,CAAC;AAEhC,cAAc,eAAe,CAAC;AAE9B,cAAc,iCAAiC,CAAC;AAEhD,cAAc,+BAA+B,CAAC;AAE9C,cAAc,YAAY,CAAC;AAE3B,cAAc,wBAAwB,CAAC;AAEvC,cAAc,gCAAgC,CAAC;AAE/C,cAAc,0BAA0B,CAAC;AAEzC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAE3B,cAAc,yBAAyB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC;AAE3B,cAAc,iBAAiB,CAAC;AAEhC,cAAc,eAAe,CAAC;AAE9B,cAAc,iCAAiC,CAAC;AAEhD,cAAc,+BAA+B,CAAC;AAE9C,cAAc,YAAY,CAAC;AAE3B,cAAc,wBAAwB,CAAC;AAEvC,cAAc,gCAAgC,CAAC;AAE/C,cAAc,0BAA0B,CAAC;AAEzC,cAAc,4BAA4B,CAAC;AAE3C,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAE3B,cAAc,yBAAyB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -16,6 +16,8 @@ export * from "./reliability/index.js";
|
|
|
16
16
|
export * from "./session/message-retention.js";
|
|
17
17
|
// Provider-neutral failed tool-call context boundary
|
|
18
18
|
export * from "./tool-failure-memory.js";
|
|
19
|
+
// Native tool-call markup that escaped as assistant text
|
|
20
|
+
export * from "./tool-protocol-residue.js";
|
|
19
21
|
// Types
|
|
20
22
|
export * from "./types.js";
|
|
21
23
|
export * from "./usage.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,cAAc,YAAY,CAAC;AAC3B,iBAAiB;AACjB,cAAc,iBAAiB,CAAC;AAChC,yCAAyC;AACzC,cAAc,eAAe,CAAC;AAC9B,+EAA+E;AAC/E,cAAc,iCAAiC,CAAC;AAChD,oFAAoF;AACpF,cAAc,+BAA+B,CAAC;AAC9C,kBAAkB;AAClB,cAAc,YAAY,CAAC;AAC3B,qBAAqB;AACrB,cAAc,wBAAwB,CAAC;AACvC,mCAAmC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,qDAAqD;AACrD,cAAc,0BAA0B,CAAC;AACzC,QAAQ;AACR,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,yBAAyB;AACzB,cAAc,yBAAyB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC","sourcesContent":["// Core Agent\nexport * from \"./agent.ts\";\n// Loop functions\nexport * from \"./agent-loop.ts\";\n// Custom message types + LLM transformer\nexport * from \"./messages.ts\";\n// Complete provider-request budgeting without serializing a duplicate payload.\nexport * from \"./provider-request-estimator.ts\";\n// Provider-only compact tool representation; execution retains authoritative tools.\nexport * from \"./provider-tool-projection.ts\";\n// Proxy utilities\nexport * from \"./proxy.ts\";\n// Reliability kernel\nexport * from \"./reliability/index.ts\";\n// Session message retention (pure)\nexport * from \"./session/message-retention.ts\";\n// Provider-neutral failed tool-call context boundary\nexport * from \"./tool-failure-memory.ts\";\n// Types\nexport * from \"./types.ts\";\nexport * from \"./usage.ts\";\n// Shell output utilities\nexport * from \"./utils/shell-output.ts\";\nexport { uuidv7 } from \"./uuid.ts\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,cAAc,YAAY,CAAC;AAC3B,iBAAiB;AACjB,cAAc,iBAAiB,CAAC;AAChC,yCAAyC;AACzC,cAAc,eAAe,CAAC;AAC9B,+EAA+E;AAC/E,cAAc,iCAAiC,CAAC;AAChD,oFAAoF;AACpF,cAAc,+BAA+B,CAAC;AAC9C,kBAAkB;AAClB,cAAc,YAAY,CAAC;AAC3B,qBAAqB;AACrB,cAAc,wBAAwB,CAAC;AACvC,mCAAmC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,qDAAqD;AACrD,cAAc,0BAA0B,CAAC;AACzC,yDAAyD;AACzD,cAAc,4BAA4B,CAAC;AAC3C,QAAQ;AACR,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,yBAAyB;AACzB,cAAc,yBAAyB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC","sourcesContent":["// Core Agent\nexport * from \"./agent.ts\";\n// Loop functions\nexport * from \"./agent-loop.ts\";\n// Custom message types + LLM transformer\nexport * from \"./messages.ts\";\n// Complete provider-request budgeting without serializing a duplicate payload.\nexport * from \"./provider-request-estimator.ts\";\n// Provider-only compact tool representation; execution retains authoritative tools.\nexport * from \"./provider-tool-projection.ts\";\n// Proxy utilities\nexport * from \"./proxy.ts\";\n// Reliability kernel\nexport * from \"./reliability/index.ts\";\n// Session message retention (pure)\nexport * from \"./session/message-retention.ts\";\n// Provider-neutral failed tool-call context boundary\nexport * from \"./tool-failure-memory.ts\";\n// Native tool-call markup that escaped as assistant text\nexport * from \"./tool-protocol-residue.ts\";\n// Types\nexport * from \"./types.ts\";\nexport * from \"./usage.ts\";\n// Shell output utilities\nexport * from \"./utils/shell-output.ts\";\nexport { uuidv7 } from \"./uuid.ts\";\n"]}
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import type { AgentContext, AgentLoopConfig, RequestPreflightContext, RequestPreflightResult, StreamFn } from "./types.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Narrow an owner-selected output cap by one more requested ceiling and the model's own limit,
|
|
4
|
+
* validating each supplied value is a positive safe integer. Exported so hosts computing their own
|
|
5
|
+
* ceiling (e.g. a goal's remaining token budget) can route it through the SAME validated narrowing
|
|
6
|
+
* this module applies just before transport, instead of hand-rolling an unvalidated min-merge that
|
|
7
|
+
* only fails loudly here, several layers away from where the degenerate value was actually computed.
|
|
8
|
+
*/
|
|
9
|
+
export declare function narrowRequestMaxTokens(ownerMaxTokens: number | undefined, requestedMaxTokens: number | undefined, modelMaxTokens: number, label: string): number | undefined;
|
|
2
10
|
/** Apply one request-local preflight without mutating persistent loop configuration. */
|
|
3
11
|
export declare function resolveRequestPreflightMaxTokens(options: {
|
|
4
12
|
requestPreflight?: (context: RequestPreflightContext, signal?: AbortSignal) => RequestPreflightResult | undefined | Promise<RequestPreflightResult | undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-request-planner.d.ts","sourceRoot":"","sources":["../src/provider-request-planner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACX,YAAY,EAEZ,eAAe,EAEf,uBAAuB,EACvB,sBAAsB,EACtB,QAAQ,EACR,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"provider-request-planner.d.ts","sourceRoot":"","sources":["../src/provider-request-planner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACX,YAAY,EAEZ,eAAe,EAEf,uBAAuB,EACvB,sBAAsB,EACtB,QAAQ,EACR,MAAM,YAAY,CAAC;AAapB;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACrC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAYpB;AAED,wFAAwF;AACxF,wBAAsB,gCAAgC,CAAC,OAAO,EAAE;IAC/D,gBAAgB,CAAC,EAAE,CAClB,OAAO,EAAE,uBAAuB,EAChC,MAAM,CAAC,EAAE,WAAW,KAChB,sBAAsB,GAAG,SAAS,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAAC;IACtF,KAAK,EAAE,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,EAAE,uBAAuB,CAAC,SAAS,CAAC,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAO9B;AAiDD;;;GAGG;AACH,wBAAsB,gCAAgC,CACrD,cAAc,EAAE,YAAY,EAC5B,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CA6GxC"}
|
|
@@ -10,7 +10,14 @@ function nextStalePlanCount(count) {
|
|
|
10
10
|
}
|
|
11
11
|
return next;
|
|
12
12
|
}
|
|
13
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Narrow an owner-selected output cap by one more requested ceiling and the model's own limit,
|
|
15
|
+
* validating each supplied value is a positive safe integer. Exported so hosts computing their own
|
|
16
|
+
* ceiling (e.g. a goal's remaining token budget) can route it through the SAME validated narrowing
|
|
17
|
+
* this module applies just before transport, instead of hand-rolling an unvalidated min-merge that
|
|
18
|
+
* only fails loudly here, several layers away from where the degenerate value was actually computed.
|
|
19
|
+
*/
|
|
20
|
+
export function narrowRequestMaxTokens(ownerMaxTokens, requestedMaxTokens, modelMaxTokens, label) {
|
|
14
21
|
if (ownerMaxTokens !== undefined && (!Number.isSafeInteger(ownerMaxTokens) || ownerMaxTokens <= 0)) {
|
|
15
22
|
throw new TypeError("request maxTokens must be a positive safe integer");
|
|
16
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-request-planner.js","sourceRoot":"","sources":["../src/provider-request-planner.ts"],"names":[],"mappings":"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","sourcesContent":["import { materializeProviderRequest, startMaterializedProviderStream, streamSimple } from \"@caupulican/pi-ai/stream\";\nimport type { Context, Message } from \"@caupulican/pi-ai/types\";\nimport { projectToolsForProvider } from \"./provider-tool-projection.ts\";\nimport { sanitizeToolFailureContext } from \"./tool-failure-memory.ts\";\nimport type {\n\tAgentContext,\n\tAgentContextPlan,\n\tAgentLoopConfig,\n\tAgentMessage,\n\tRequestPreflightContext,\n\tRequestPreflightResult,\n\tStreamFn,\n} from \"./types.ts\";\n\nconst MAX_STALE_PROVIDER_REQUEST_PLANS = 3;\nconst MAX_PROVIDER_REQUEST_REPLANS = 2;\n\nfunction nextStalePlanCount(count: number): number {\n\tconst next = count + 1;\n\tif (next >= MAX_STALE_PROVIDER_REQUEST_PLANS) {\n\t\tthrow new Error(`Provider request plan stayed stale after ${MAX_STALE_PROVIDER_REQUEST_PLANS} attempts`);\n\t}\n\treturn next;\n}\n\nfunction narrowRequestMaxTokens(\n\townerMaxTokens: number | undefined,\n\trequestedMaxTokens: number | undefined,\n\tmodelMaxTokens: number,\n\tlabel: string,\n): number | undefined {\n\tif (ownerMaxTokens !== undefined && (!Number.isSafeInteger(ownerMaxTokens) || ownerMaxTokens <= 0)) {\n\t\tthrow new TypeError(\"request maxTokens must be a positive safe integer\");\n\t}\n\tif (requestedMaxTokens === undefined) return ownerMaxTokens;\n\tif (!Number.isSafeInteger(requestedMaxTokens) || requestedMaxTokens <= 0) {\n\t\tthrow new TypeError(`${label}.maxTokens must be a positive safe integer`);\n\t}\n\tconst ceilings = [requestedMaxTokens];\n\tif (ownerMaxTokens !== undefined) ceilings.push(ownerMaxTokens);\n\tif (Number.isSafeInteger(modelMaxTokens) && modelMaxTokens > 0) ceilings.push(modelMaxTokens);\n\treturn Math.min(...ceilings);\n}\n\n/** Apply one request-local preflight without mutating persistent loop configuration. */\nexport async function resolveRequestPreflightMaxTokens(options: {\n\trequestPreflight?: (\n\t\tcontext: RequestPreflightContext,\n\t\tsignal?: AbortSignal,\n\t) => RequestPreflightResult | undefined | Promise<RequestPreflightResult | undefined>;\n\tmodel: RequestPreflightContext[\"model\"];\n\tcontext: RequestPreflightContext[\"context\"];\n\tmaxTokens?: number;\n\tsignal?: AbortSignal;\n}): Promise<number | undefined> {\n\tif (!options.requestPreflight) return options.maxTokens;\n\tconst preflight = await options.requestPreflight(\n\t\t{ model: options.model, context: options.context, maxTokens: options.maxTokens },\n\t\toptions.signal,\n\t);\n\treturn narrowRequestMaxTokens(options.maxTokens, preflight?.maxTokens, options.model.maxTokens, \"requestPreflight\");\n}\n\nasync function buildContextPlan(\n\tmessages: AgentMessage[],\n\tattempt: number,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n): Promise<AgentContextPlan> {\n\tif (config.planContext) return await config.planContext({ messages, attempt }, signal);\n\treturn {\n\t\tmessages: config.transformContext ? await config.transformContext(messages, signal) : messages,\n\t};\n}\n\nfunction nonCompactableProviderContext(\n\tcontext: Context,\n\tcompactableMessageCount: number,\n\tusesTextToolProtocol: boolean,\n): Context {\n\tconst protocolGuardCount = usesTextToolProtocol && context.messages.length > 0 ? 1 : 0;\n\treturn {\n\t\t...context,\n\t\tmessages: [\n\t\t\t...context.messages.slice(0, protocolGuardCount),\n\t\t\t...context.messages.slice(protocolGuardCount + compactableMessageCount),\n\t\t],\n\t};\n}\n\nfunction sameToolSurface(left: AgentContext[\"tools\"], right: AgentContext[\"tools\"]): boolean {\n\tif (left === right) return true;\n\tif (!left || !right || left.length !== right.length) return false;\n\treturn left.every((tool, index) => tool === right[index]);\n}\n\nfunction validateReplannedSourceContext(previous: AgentContext, next: AgentContext): void {\n\tif (previous.systemPrompt !== next.systemPrompt || !sameToolSurface(previous.tools, next.tools)) {\n\t\tthrow new TypeError(\"Provider request admission may replan durable messages only\");\n\t}\n}\n\n/** Preserve the loop-owned messages array so shallow response-context projections observe compaction. */\nfunction adoptReplannedMessages(target: AgentContext, accepted: AgentContext): void {\n\tif (target.messages === accepted.messages) return;\n\tconst messages = accepted.messages.slice();\n\ttarget.messages.length = 0;\n\tfor (const message of messages) target.messages.push(message);\n}\n\n/**\n * Canonical two-phase provider boundary: plan replay-safe context, materialize once, admit the exact\n * payload, commit only the accepted plan, then send the admitted object unchanged.\n */\nexport async function startPlannedAgentProviderRequest(\n\tinitialContext: AgentContext,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\tstreamFn?: StreamFn,\n): Promise<Awaited<ReturnType<StreamFn>>> {\n\tlet sourceContext = initialContext;\n\tlet admissionAttempt = 0;\n\tlet stalePlanCount = 0;\n\twhile (true) {\n\t\tsignal?.throwIfAborted();\n\t\tconst sanitized = sanitizeToolFailureContext(sourceContext.messages, sourceContext.systemPrompt);\n\t\tconst plan = await buildContextPlan(sanitized.messages, admissionAttempt, config, signal);\n\t\tlet keepPlan = false;\n\t\ttry {\n\t\t\tsignal?.throwIfAborted();\n\t\t\tif (plan.isCurrent?.() === false) {\n\t\t\t\tstalePlanCount = nextStalePlanCount(stalePlanCount);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst transientMessages = plan.transientMessages ?? [];\n\t\t\tconst compactableMessages = await config.convertToLlm(plan.messages);\n\t\t\tconst providerTransients = transientMessages.length > 0 ? await config.convertToLlm(transientMessages) : [];\n\t\t\tconst llmMessages: Message[] = [...compactableMessages, ...providerTransients];\n\t\t\tsignal?.throwIfAborted();\n\n\t\t\tconst sourceProviderContext: Context = {\n\t\t\t\tsystemPrompt: sanitized.systemPrompt,\n\t\t\t\tmessages: llmMessages,\n\t\t\t\ttools: projectToolsForProvider(sourceContext.tools),\n\t\t\t};\n\t\t\tconst materialized = materializeProviderRequest(sourceProviderContext, config);\n\t\t\tconst nonCompactableContext = nonCompactableProviderContext(\n\t\t\t\tmaterialized.context,\n\t\t\t\tcompactableMessages.length,\n\t\t\t\tmaterialized.usesTextToolProtocol,\n\t\t\t);\n\n\t\t\tif (plan.isCurrent?.() === false) {\n\t\t\t\tstalePlanCount = nextStalePlanCount(stalePlanCount);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst admission = await config.admitProviderRequest?.(\n\t\t\t\t{\n\t\t\t\t\tmodel: config.model,\n\t\t\t\t\tcontext: materialized.context,\n\t\t\t\t\tnonCompactableContext,\n\t\t\t\t\tsourceContext,\n\t\t\t\t\tmaxTokens: config.maxTokens,\n\t\t\t\t\tattempt: admissionAttempt,\n\t\t\t\t},\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tsignal?.throwIfAborted();\n\t\t\tif (admission?.action === \"replan\") {\n\t\t\t\tvalidateReplannedSourceContext(sourceContext, admission.context);\n\t\t\t\tif (admissionAttempt >= MAX_PROVIDER_REQUEST_REPLANS) {\n\t\t\t\t\tthrow new Error(`Provider request admission exceeded ${MAX_PROVIDER_REQUEST_REPLANS} replans`);\n\t\t\t\t}\n\t\t\t\tsourceContext = admission.context;\n\t\t\t\tadmissionAttempt++;\n\t\t\t\tstalePlanCount = 0;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet requestMaxTokens = narrowRequestMaxTokens(\n\t\t\t\tconfig.maxTokens,\n\t\t\t\tadmission?.maxTokens,\n\t\t\t\tconfig.model.maxTokens,\n\t\t\t\t\"admitProviderRequest\",\n\t\t\t);\n\t\t\trequestMaxTokens = await resolveRequestPreflightMaxTokens({\n\t\t\t\trequestPreflight: config.requestPreflight,\n\t\t\t\tmodel: config.model,\n\t\t\t\tcontext: materialized.context,\n\t\t\t\tmaxTokens: requestMaxTokens,\n\t\t\t\tsignal,\n\t\t\t});\n\t\t\tsignal?.throwIfAborted();\n\n\t\t\tconst resolvedApiKey =\n\t\t\t\t(config.getApiKey ? await config.getApiKey(config.model.provider) : undefined) || config.apiKey;\n\t\t\tsignal?.throwIfAborted();\n\t\t\tconst requestReasoning = config.resolveRequestReasoning\n\t\t\t\t? config.resolveRequestReasoning(config.reasoning, {\n\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\tcontext: materialized.context,\n\t\t\t\t\t\tmaxTokens: requestMaxTokens,\n\t\t\t\t\t})\n\t\t\t\t: config.reasoning;\n\t\t\tconst streamFunction = streamFn ?? streamSimple;\n\t\t\tif (plan.isCurrent?.() === false || plan.prepareCommit?.() === false) {\n\t\t\t\tstalePlanCount = nextStalePlanCount(stalePlanCount);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tplan.commit?.();\n\t\t\tadoptReplannedMessages(initialContext, sourceContext);\n\t\t\tkeepPlan = true;\n\t\t\treturn (await startMaterializedProviderStream(\n\t\t\t\tconfig.model,\n\t\t\t\tmaterialized,\n\t\t\t\t{\n\t\t\t\t\t...config,\n\t\t\t\t\tapiKey: resolvedApiKey,\n\t\t\t\t\tmaxTokens: requestMaxTokens,\n\t\t\t\t\treasoning: requestReasoning,\n\t\t\t\t\tsignal,\n\t\t\t\t},\n\t\t\t\t(providerContext, providerOptions) => streamFunction(config.model, providerContext, providerOptions),\n\t\t\t)) as Awaited<ReturnType<StreamFn>>;\n\t\t} finally {\n\t\t\tif (!keepPlan) plan.discard?.();\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"provider-request-planner.js","sourceRoot":"","sources":["../src/provider-request-planner.ts"],"names":[],"mappings":"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","sourcesContent":["import { materializeProviderRequest, startMaterializedProviderStream, streamSimple } from \"@caupulican/pi-ai/stream\";\nimport type { Context, Message } from \"@caupulican/pi-ai/types\";\nimport { projectToolsForProvider } from \"./provider-tool-projection.ts\";\nimport { sanitizeToolFailureContext } from \"./tool-failure-memory.ts\";\nimport type {\n\tAgentContext,\n\tAgentContextPlan,\n\tAgentLoopConfig,\n\tAgentMessage,\n\tRequestPreflightContext,\n\tRequestPreflightResult,\n\tStreamFn,\n} from \"./types.ts\";\n\nconst MAX_STALE_PROVIDER_REQUEST_PLANS = 3;\nconst MAX_PROVIDER_REQUEST_REPLANS = 2;\n\nfunction nextStalePlanCount(count: number): number {\n\tconst next = count + 1;\n\tif (next >= MAX_STALE_PROVIDER_REQUEST_PLANS) {\n\t\tthrow new Error(`Provider request plan stayed stale after ${MAX_STALE_PROVIDER_REQUEST_PLANS} attempts`);\n\t}\n\treturn next;\n}\n\n/**\n * Narrow an owner-selected output cap by one more requested ceiling and the model's own limit,\n * validating each supplied value is a positive safe integer. Exported so hosts computing their own\n * ceiling (e.g. a goal's remaining token budget) can route it through the SAME validated narrowing\n * this module applies just before transport, instead of hand-rolling an unvalidated min-merge that\n * only fails loudly here, several layers away from where the degenerate value was actually computed.\n */\nexport function narrowRequestMaxTokens(\n\townerMaxTokens: number | undefined,\n\trequestedMaxTokens: number | undefined,\n\tmodelMaxTokens: number,\n\tlabel: string,\n): number | undefined {\n\tif (ownerMaxTokens !== undefined && (!Number.isSafeInteger(ownerMaxTokens) || ownerMaxTokens <= 0)) {\n\t\tthrow new TypeError(\"request maxTokens must be a positive safe integer\");\n\t}\n\tif (requestedMaxTokens === undefined) return ownerMaxTokens;\n\tif (!Number.isSafeInteger(requestedMaxTokens) || requestedMaxTokens <= 0) {\n\t\tthrow new TypeError(`${label}.maxTokens must be a positive safe integer`);\n\t}\n\tconst ceilings = [requestedMaxTokens];\n\tif (ownerMaxTokens !== undefined) ceilings.push(ownerMaxTokens);\n\tif (Number.isSafeInteger(modelMaxTokens) && modelMaxTokens > 0) ceilings.push(modelMaxTokens);\n\treturn Math.min(...ceilings);\n}\n\n/** Apply one request-local preflight without mutating persistent loop configuration. */\nexport async function resolveRequestPreflightMaxTokens(options: {\n\trequestPreflight?: (\n\t\tcontext: RequestPreflightContext,\n\t\tsignal?: AbortSignal,\n\t) => RequestPreflightResult | undefined | Promise<RequestPreflightResult | undefined>;\n\tmodel: RequestPreflightContext[\"model\"];\n\tcontext: RequestPreflightContext[\"context\"];\n\tmaxTokens?: number;\n\tsignal?: AbortSignal;\n}): Promise<number | undefined> {\n\tif (!options.requestPreflight) return options.maxTokens;\n\tconst preflight = await options.requestPreflight(\n\t\t{ model: options.model, context: options.context, maxTokens: options.maxTokens },\n\t\toptions.signal,\n\t);\n\treturn narrowRequestMaxTokens(options.maxTokens, preflight?.maxTokens, options.model.maxTokens, \"requestPreflight\");\n}\n\nasync function buildContextPlan(\n\tmessages: AgentMessage[],\n\tattempt: number,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n): Promise<AgentContextPlan> {\n\tif (config.planContext) return await config.planContext({ messages, attempt }, signal);\n\treturn {\n\t\tmessages: config.transformContext ? await config.transformContext(messages, signal) : messages,\n\t};\n}\n\nfunction nonCompactableProviderContext(\n\tcontext: Context,\n\tcompactableMessageCount: number,\n\tusesTextToolProtocol: boolean,\n): Context {\n\tconst protocolGuardCount = usesTextToolProtocol && context.messages.length > 0 ? 1 : 0;\n\treturn {\n\t\t...context,\n\t\tmessages: [\n\t\t\t...context.messages.slice(0, protocolGuardCount),\n\t\t\t...context.messages.slice(protocolGuardCount + compactableMessageCount),\n\t\t],\n\t};\n}\n\nfunction sameToolSurface(left: AgentContext[\"tools\"], right: AgentContext[\"tools\"]): boolean {\n\tif (left === right) return true;\n\tif (!left || !right || left.length !== right.length) return false;\n\treturn left.every((tool, index) => tool === right[index]);\n}\n\nfunction validateReplannedSourceContext(previous: AgentContext, next: AgentContext): void {\n\tif (previous.systemPrompt !== next.systemPrompt || !sameToolSurface(previous.tools, next.tools)) {\n\t\tthrow new TypeError(\"Provider request admission may replan durable messages only\");\n\t}\n}\n\n/** Preserve the loop-owned messages array so shallow response-context projections observe compaction. */\nfunction adoptReplannedMessages(target: AgentContext, accepted: AgentContext): void {\n\tif (target.messages === accepted.messages) return;\n\tconst messages = accepted.messages.slice();\n\ttarget.messages.length = 0;\n\tfor (const message of messages) target.messages.push(message);\n}\n\n/**\n * Canonical two-phase provider boundary: plan replay-safe context, materialize once, admit the exact\n * payload, commit only the accepted plan, then send the admitted object unchanged.\n */\nexport async function startPlannedAgentProviderRequest(\n\tinitialContext: AgentContext,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\tstreamFn?: StreamFn,\n): Promise<Awaited<ReturnType<StreamFn>>> {\n\tlet sourceContext = initialContext;\n\tlet admissionAttempt = 0;\n\tlet stalePlanCount = 0;\n\twhile (true) {\n\t\tsignal?.throwIfAborted();\n\t\tconst sanitized = sanitizeToolFailureContext(sourceContext.messages, sourceContext.systemPrompt);\n\t\tconst plan = await buildContextPlan(sanitized.messages, admissionAttempt, config, signal);\n\t\tlet keepPlan = false;\n\t\ttry {\n\t\t\tsignal?.throwIfAborted();\n\t\t\tif (plan.isCurrent?.() === false) {\n\t\t\t\tstalePlanCount = nextStalePlanCount(stalePlanCount);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst transientMessages = plan.transientMessages ?? [];\n\t\t\tconst compactableMessages = await config.convertToLlm(plan.messages);\n\t\t\tconst providerTransients = transientMessages.length > 0 ? await config.convertToLlm(transientMessages) : [];\n\t\t\tconst llmMessages: Message[] = [...compactableMessages, ...providerTransients];\n\t\t\tsignal?.throwIfAborted();\n\n\t\t\tconst sourceProviderContext: Context = {\n\t\t\t\tsystemPrompt: sanitized.systemPrompt,\n\t\t\t\tmessages: llmMessages,\n\t\t\t\ttools: projectToolsForProvider(sourceContext.tools),\n\t\t\t};\n\t\t\tconst materialized = materializeProviderRequest(sourceProviderContext, config);\n\t\t\tconst nonCompactableContext = nonCompactableProviderContext(\n\t\t\t\tmaterialized.context,\n\t\t\t\tcompactableMessages.length,\n\t\t\t\tmaterialized.usesTextToolProtocol,\n\t\t\t);\n\n\t\t\tif (plan.isCurrent?.() === false) {\n\t\t\t\tstalePlanCount = nextStalePlanCount(stalePlanCount);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst admission = await config.admitProviderRequest?.(\n\t\t\t\t{\n\t\t\t\t\tmodel: config.model,\n\t\t\t\t\tcontext: materialized.context,\n\t\t\t\t\tnonCompactableContext,\n\t\t\t\t\tsourceContext,\n\t\t\t\t\tmaxTokens: config.maxTokens,\n\t\t\t\t\tattempt: admissionAttempt,\n\t\t\t\t},\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tsignal?.throwIfAborted();\n\t\t\tif (admission?.action === \"replan\") {\n\t\t\t\tvalidateReplannedSourceContext(sourceContext, admission.context);\n\t\t\t\tif (admissionAttempt >= MAX_PROVIDER_REQUEST_REPLANS) {\n\t\t\t\t\tthrow new Error(`Provider request admission exceeded ${MAX_PROVIDER_REQUEST_REPLANS} replans`);\n\t\t\t\t}\n\t\t\t\tsourceContext = admission.context;\n\t\t\t\tadmissionAttempt++;\n\t\t\t\tstalePlanCount = 0;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet requestMaxTokens = narrowRequestMaxTokens(\n\t\t\t\tconfig.maxTokens,\n\t\t\t\tadmission?.maxTokens,\n\t\t\t\tconfig.model.maxTokens,\n\t\t\t\t\"admitProviderRequest\",\n\t\t\t);\n\t\t\trequestMaxTokens = await resolveRequestPreflightMaxTokens({\n\t\t\t\trequestPreflight: config.requestPreflight,\n\t\t\t\tmodel: config.model,\n\t\t\t\tcontext: materialized.context,\n\t\t\t\tmaxTokens: requestMaxTokens,\n\t\t\t\tsignal,\n\t\t\t});\n\t\t\tsignal?.throwIfAborted();\n\n\t\t\tconst resolvedApiKey =\n\t\t\t\t(config.getApiKey ? await config.getApiKey(config.model.provider) : undefined) || config.apiKey;\n\t\t\tsignal?.throwIfAborted();\n\t\t\tconst requestReasoning = config.resolveRequestReasoning\n\t\t\t\t? config.resolveRequestReasoning(config.reasoning, {\n\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\tcontext: materialized.context,\n\t\t\t\t\t\tmaxTokens: requestMaxTokens,\n\t\t\t\t\t})\n\t\t\t\t: config.reasoning;\n\t\t\tconst streamFunction = streamFn ?? streamSimple;\n\t\t\tif (plan.isCurrent?.() === false || plan.prepareCommit?.() === false) {\n\t\t\t\tstalePlanCount = nextStalePlanCount(stalePlanCount);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tplan.commit?.();\n\t\t\tadoptReplannedMessages(initialContext, sourceContext);\n\t\t\tkeepPlan = true;\n\t\t\treturn (await startMaterializedProviderStream(\n\t\t\t\tconfig.model,\n\t\t\t\tmaterialized,\n\t\t\t\t{\n\t\t\t\t\t...config,\n\t\t\t\t\tapiKey: resolvedApiKey,\n\t\t\t\t\tmaxTokens: requestMaxTokens,\n\t\t\t\t\treasoning: requestReasoning,\n\t\t\t\t\tsignal,\n\t\t\t\t},\n\t\t\t\t(providerContext, providerOptions) => streamFunction(config.model, providerContext, providerOptions),\n\t\t\t)) as Awaited<ReturnType<StreamFn>>;\n\t\t} finally {\n\t\t\tif (!keepPlan) plan.discard?.();\n\t\t}\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-tool-projection.d.ts","sourceRoot":"","sources":["../src/provider-tool-projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"provider-tool-projection.d.ts","sourceRoot":"","sources":["../src/provider-tool-projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAiJ9C,wBAAgB,gCAAgC,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAErE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;AACrE,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;AACxE,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS,GAAG,IAAI,EAAE,GAAG,SAAS,CAAC"}
|
|
@@ -87,21 +87,14 @@ function compactLiteralUnion(projected) {
|
|
|
87
87
|
compacted.enum = values;
|
|
88
88
|
return compacted;
|
|
89
89
|
}
|
|
90
|
-
function enumValueMatchesType(value, type) {
|
|
91
|
-
if (type === "null")
|
|
92
|
-
return value === null;
|
|
93
|
-
if (type === "integer")
|
|
94
|
-
return typeof value === "number" && Number.isInteger(value);
|
|
95
|
-
return typeof value === type;
|
|
96
|
-
}
|
|
97
90
|
function compactRedundantEnumConstraints(projected) {
|
|
98
91
|
const values = projected.enum;
|
|
99
92
|
if (!Array.isArray(values) || values.length === 0 || !values.every(isJsonPrimitive))
|
|
100
93
|
return projected;
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
94
|
+
// `type` is never dropped here even though every enum value satisfies it: providers whose
|
|
95
|
+
// function-declaration schema requires `type` per property (e.g. Google's OpenAPI subset)
|
|
96
|
+
// reject the entire tool list with a 400 if it is missing. minLength/maxLength stay safe to
|
|
97
|
+
// drop because they constrain the value's shape, not its provider-required schema kind.
|
|
105
98
|
if (values.every((value) => typeof value === "string")) {
|
|
106
99
|
const minLength = projected.minLength;
|
|
107
100
|
if (typeof minLength === "number" && values.every((value) => value.length >= minLength)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-tool-projection.js","sourceRoot":"","sources":["../src/provider-tool-projection.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Tool } from \"@caupulican/pi-ai\";\nimport type { TSchema } from \"typebox\";\n\n/**\n * Provider-only tool projection.\n *\n * Execution and validation retain the authoritative AgentTool and full TypeBox schema. Providers\n * receive the same names, required fields, alternatives, defaults, and validation constraints, but\n * not recursive schema annotations already available through deterministic validation teaching.\n * This is one request-boundary path for native and text tool protocols.\n */\n\nconst OMITTED_SCHEMA_ANNOTATIONS = new Set([\n\t\"$comment\",\n\t\"deprecated\",\n\t\"description\",\n\t\"examples\",\n\t\"readOnly\",\n\t\"title\",\n\t\"writeOnly\",\n]);\nconst SCHEMA_MAP_KEYS = new Set([\"$defs\", \"definitions\", \"dependentSchemas\", \"patternProperties\", \"properties\"]);\nconst SCHEMA_ARRAY_KEYS = new Set([\"allOf\", \"anyOf\", \"oneOf\", \"prefixItems\"]);\nconst SCHEMA_SINGLE_KEYS = new Set([\n\t\"additionalProperties\",\n\t\"contains\",\n\t\"else\",\n\t\"if\",\n\t\"items\",\n\t\"not\",\n\t\"propertyNames\",\n\t\"then\",\n\t\"unevaluatedItems\",\n\t\"unevaluatedProperties\",\n]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction createProviderRecord(): Record<string, unknown> {\n\t// Null prototype preserves a legitimate schema property named \"__proto__\". Object.keys below\n\t// matches the JSON wire surface and never promotes TypeBox's non-enumerable ~kind/~optional data.\n\treturn Object.create(null) as Record<string, unknown>;\n}\n\nfunction projectSchemaMap(value: unknown): unknown {\n\tif (!isRecord(value)) return value;\n\tconst projected = createProviderRecord();\n\tfor (const key of Object.keys(value)) {\n\t\tprojected[key] = projectSchemaNode(value[key]);\n\t}\n\treturn projected;\n}\n\nfunction isJsonPrimitive(value: unknown): value is string | number | boolean | null {\n\treturn (\n\t\tvalue === null ||\n\t\ttypeof value === \"string\" ||\n\t\ttypeof value === \"boolean\" ||\n\t\t(typeof value === \"number\" && Number.isFinite(value))\n\t);\n}\n\nfunction compactLiteralUnion(projected: Record<string, unknown>): Record<string, unknown> {\n\tconst branches = projected.anyOf;\n\tif (!Array.isArray(branches) || branches.length < 2) return projected;\n\tconst values: Array<string | number | boolean | null> = [];\n\tconst types: string[] = [];\n\tconst identities = new Set<string>();\n\tfor (const branch of branches) {\n\t\tif (!isRecord(branch) || !Object.hasOwn(branch, \"const\") || !isJsonPrimitive(branch.const)) return projected;\n\t\tif (Object.keys(branch).some((key) => key !== \"const\" && key !== \"type\")) return projected;\n\t\tif (typeof branch.type !== \"string\") return projected;\n\t\tconst identity = `${typeof branch.const}:${JSON.stringify(branch.const)}`;\n\t\tif (identities.has(identity)) return projected;\n\t\tidentities.add(identity);\n\t\tvalues.push(branch.const);\n\t\ttypes.push(branch.type);\n\t}\n\t// Keep mixed-type or branch-constrained unions intact. A same-type primitive literal union is\n\t// validation-equivalent to type+enum and is supported by every provider already accepting enums.\n\tif (!types.every((type) => type === types[0])) return projected;\n\n\tconst compacted = createProviderRecord();\n\tfor (const key of Object.keys(projected)) {\n\t\tif (key !== \"anyOf\") compacted[key] = projected[key];\n\t}\n\tif (compacted.type === undefined) compacted.type = types[0];\n\tcompacted.enum = values;\n\treturn compacted;\n}\n\nfunction enumValueMatchesType(value: string | number | boolean | null, type: string): boolean {\n\tif (type === \"null\") return value === null;\n\tif (type === \"integer\") return typeof value === \"number\" && Number.isInteger(value);\n\treturn typeof value === type;\n}\n\nfunction compactRedundantEnumConstraints(projected: Record<string, unknown>): Record<string, unknown> {\n\tconst values = projected.enum;\n\tif (!Array.isArray(values) || values.length === 0 || !values.every(isJsonPrimitive)) return projected;\n\tif (\n\t\ttypeof projected.type === \"string\" &&\n\t\tvalues.every((value) => enumValueMatchesType(value, projected.type as string))\n\t) {\n\t\tdelete projected.type;\n\t}\n\tif (values.every((value): value is string => typeof value === \"string\")) {\n\t\tconst minLength = projected.minLength;\n\t\tif (typeof minLength === \"number\" && values.every((value) => value.length >= minLength)) {\n\t\t\tdelete projected.minLength;\n\t\t}\n\t\tconst maxLength = projected.maxLength;\n\t\tif (typeof maxLength === \"number\" && values.every((value) => value.length <= maxLength)) {\n\t\t\tdelete projected.maxLength;\n\t\t}\n\t}\n\treturn projected;\n}\n\nfunction projectSchemaNode(value: unknown): unknown {\n\tif (!isRecord(value)) return value;\n\tconst projected = createProviderRecord();\n\tfor (const key of Object.keys(value)) {\n\t\tif (OMITTED_SCHEMA_ANNOTATIONS.has(key)) continue;\n\t\tconst child = value[key];\n\t\tif (SCHEMA_MAP_KEYS.has(key)) {\n\t\t\tprojected[key] = projectSchemaMap(child);\n\t\t\tcontinue;\n\t\t}\n\t\tif (SCHEMA_ARRAY_KEYS.has(key)) {\n\t\t\tprojected[key] = Array.isArray(child) ? child.map(projectSchemaNode) : child;\n\t\t\tcontinue;\n\t\t}\n\t\tif (key === \"dependencies\" && isRecord(child)) {\n\t\t\tconst dependencies = createProviderRecord();\n\t\t\tfor (const dependencyKey of Object.keys(child)) {\n\t\t\t\tconst dependency = child[dependencyKey];\n\t\t\t\tdependencies[dependencyKey] = Array.isArray(dependency) ? dependency : projectSchemaNode(dependency);\n\t\t\t}\n\t\t\tprojected[key] = dependencies;\n\t\t\tcontinue;\n\t\t}\n\t\tif (SCHEMA_SINGLE_KEYS.has(key)) {\n\t\t\tprojected[key] = Array.isArray(child) ? child.map(projectSchemaNode) : projectSchemaNode(child);\n\t\t\tcontinue;\n\t\t}\n\t\tprojected[key] = child;\n\t}\n\treturn compactRedundantEnumConstraints(compactLiteralUnion(projected));\n}\n\nexport function normalizeProviderToolDescription(description: string): string {\n\treturn description.replace(/\\s+/g, \" \").trim();\n}\n\nexport function projectToolSchemaForProvider(schema: unknown): unknown {\n\treturn projectSchemaNode(schema);\n}\n\nexport function projectToolsForProvider(tools: undefined): undefined;\nexport function projectToolsForProvider(tools: readonly Tool[]): Tool[];\nexport function projectToolsForProvider(tools: readonly Tool[] | undefined): Tool[] | undefined;\nexport function projectToolsForProvider(tools: readonly Tool[] | undefined): Tool[] | undefined {\n\tif (!tools) return undefined;\n\treturn tools.map((tool) => ({\n\t\tname: tool.name,\n\t\tdescription: normalizeProviderToolDescription(\n\t\t\t\"providerDescription\" in tool && typeof tool.providerDescription === \"string\"\n\t\t\t\t? tool.providerDescription\n\t\t\t\t: tool.description,\n\t\t),\n\t\tparameters: projectSchemaNode(tool.parameters) as TSchema,\n\t}));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"provider-tool-projection.js","sourceRoot":"","sources":["../src/provider-tool-projection.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Tool } from \"@caupulican/pi-ai\";\nimport type { TSchema } from \"typebox\";\n\n/**\n * Provider-only tool projection.\n *\n * Execution and validation retain the authoritative AgentTool and full TypeBox schema. Providers\n * receive the same names, required fields, alternatives, defaults, and validation constraints, but\n * not recursive schema annotations already available through deterministic validation teaching.\n * This is one request-boundary path for native and text tool protocols.\n */\n\nconst OMITTED_SCHEMA_ANNOTATIONS = new Set([\n\t\"$comment\",\n\t\"deprecated\",\n\t\"description\",\n\t\"examples\",\n\t\"readOnly\",\n\t\"title\",\n\t\"writeOnly\",\n]);\nconst SCHEMA_MAP_KEYS = new Set([\"$defs\", \"definitions\", \"dependentSchemas\", \"patternProperties\", \"properties\"]);\nconst SCHEMA_ARRAY_KEYS = new Set([\"allOf\", \"anyOf\", \"oneOf\", \"prefixItems\"]);\nconst SCHEMA_SINGLE_KEYS = new Set([\n\t\"additionalProperties\",\n\t\"contains\",\n\t\"else\",\n\t\"if\",\n\t\"items\",\n\t\"not\",\n\t\"propertyNames\",\n\t\"then\",\n\t\"unevaluatedItems\",\n\t\"unevaluatedProperties\",\n]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction createProviderRecord(): Record<string, unknown> {\n\t// Null prototype preserves a legitimate schema property named \"__proto__\". Object.keys below\n\t// matches the JSON wire surface and never promotes TypeBox's non-enumerable ~kind/~optional data.\n\treturn Object.create(null) as Record<string, unknown>;\n}\n\nfunction projectSchemaMap(value: unknown): unknown {\n\tif (!isRecord(value)) return value;\n\tconst projected = createProviderRecord();\n\tfor (const key of Object.keys(value)) {\n\t\tprojected[key] = projectSchemaNode(value[key]);\n\t}\n\treturn projected;\n}\n\nfunction isJsonPrimitive(value: unknown): value is string | number | boolean | null {\n\treturn (\n\t\tvalue === null ||\n\t\ttypeof value === \"string\" ||\n\t\ttypeof value === \"boolean\" ||\n\t\t(typeof value === \"number\" && Number.isFinite(value))\n\t);\n}\n\nfunction compactLiteralUnion(projected: Record<string, unknown>): Record<string, unknown> {\n\tconst branches = projected.anyOf;\n\tif (!Array.isArray(branches) || branches.length < 2) return projected;\n\tconst values: Array<string | number | boolean | null> = [];\n\tconst types: string[] = [];\n\tconst identities = new Set<string>();\n\tfor (const branch of branches) {\n\t\tif (!isRecord(branch) || !Object.hasOwn(branch, \"const\") || !isJsonPrimitive(branch.const)) return projected;\n\t\tif (Object.keys(branch).some((key) => key !== \"const\" && key !== \"type\")) return projected;\n\t\tif (typeof branch.type !== \"string\") return projected;\n\t\tconst identity = `${typeof branch.const}:${JSON.stringify(branch.const)}`;\n\t\tif (identities.has(identity)) return projected;\n\t\tidentities.add(identity);\n\t\tvalues.push(branch.const);\n\t\ttypes.push(branch.type);\n\t}\n\t// Keep mixed-type or branch-constrained unions intact. A same-type primitive literal union is\n\t// validation-equivalent to type+enum and is supported by every provider already accepting enums.\n\tif (!types.every((type) => type === types[0])) return projected;\n\n\tconst compacted = createProviderRecord();\n\tfor (const key of Object.keys(projected)) {\n\t\tif (key !== \"anyOf\") compacted[key] = projected[key];\n\t}\n\tif (compacted.type === undefined) compacted.type = types[0];\n\tcompacted.enum = values;\n\treturn compacted;\n}\n\nfunction compactRedundantEnumConstraints(projected: Record<string, unknown>): Record<string, unknown> {\n\tconst values = projected.enum;\n\tif (!Array.isArray(values) || values.length === 0 || !values.every(isJsonPrimitive)) return projected;\n\t// `type` is never dropped here even though every enum value satisfies it: providers whose\n\t// function-declaration schema requires `type` per property (e.g. Google's OpenAPI subset)\n\t// reject the entire tool list with a 400 if it is missing. minLength/maxLength stay safe to\n\t// drop because they constrain the value's shape, not its provider-required schema kind.\n\tif (values.every((value): value is string => typeof value === \"string\")) {\n\t\tconst minLength = projected.minLength;\n\t\tif (typeof minLength === \"number\" && values.every((value) => value.length >= minLength)) {\n\t\t\tdelete projected.minLength;\n\t\t}\n\t\tconst maxLength = projected.maxLength;\n\t\tif (typeof maxLength === \"number\" && values.every((value) => value.length <= maxLength)) {\n\t\t\tdelete projected.maxLength;\n\t\t}\n\t}\n\treturn projected;\n}\n\nfunction projectSchemaNode(value: unknown): unknown {\n\tif (!isRecord(value)) return value;\n\tconst projected = createProviderRecord();\n\tfor (const key of Object.keys(value)) {\n\t\tif (OMITTED_SCHEMA_ANNOTATIONS.has(key)) continue;\n\t\tconst child = value[key];\n\t\tif (SCHEMA_MAP_KEYS.has(key)) {\n\t\t\tprojected[key] = projectSchemaMap(child);\n\t\t\tcontinue;\n\t\t}\n\t\tif (SCHEMA_ARRAY_KEYS.has(key)) {\n\t\t\tprojected[key] = Array.isArray(child) ? child.map(projectSchemaNode) : child;\n\t\t\tcontinue;\n\t\t}\n\t\tif (key === \"dependencies\" && isRecord(child)) {\n\t\t\tconst dependencies = createProviderRecord();\n\t\t\tfor (const dependencyKey of Object.keys(child)) {\n\t\t\t\tconst dependency = child[dependencyKey];\n\t\t\t\tdependencies[dependencyKey] = Array.isArray(dependency) ? dependency : projectSchemaNode(dependency);\n\t\t\t}\n\t\t\tprojected[key] = dependencies;\n\t\t\tcontinue;\n\t\t}\n\t\tif (SCHEMA_SINGLE_KEYS.has(key)) {\n\t\t\tprojected[key] = Array.isArray(child) ? child.map(projectSchemaNode) : projectSchemaNode(child);\n\t\t\tcontinue;\n\t\t}\n\t\tprojected[key] = child;\n\t}\n\treturn compactRedundantEnumConstraints(compactLiteralUnion(projected));\n}\n\nexport function normalizeProviderToolDescription(description: string): string {\n\treturn description.replace(/\\s+/g, \" \").trim();\n}\n\nexport function projectToolSchemaForProvider(schema: unknown): unknown {\n\treturn projectSchemaNode(schema);\n}\n\nexport function projectToolsForProvider(tools: undefined): undefined;\nexport function projectToolsForProvider(tools: readonly Tool[]): Tool[];\nexport function projectToolsForProvider(tools: readonly Tool[] | undefined): Tool[] | undefined;\nexport function projectToolsForProvider(tools: readonly Tool[] | undefined): Tool[] | undefined {\n\tif (!tools) return undefined;\n\treturn tools.map((tool) => ({\n\t\tname: tool.name,\n\t\tdescription: normalizeProviderToolDescription(\n\t\t\t\"providerDescription\" in tool && typeof tool.providerDescription === \"string\"\n\t\t\t\t? tool.providerDescription\n\t\t\t\t: tool.description,\n\t\t),\n\t\tparameters: projectSchemaNode(tool.parameters) as TSchema,\n\t}));\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-failure-memory.d.ts","sourceRoot":"","sources":["../src/tool-failure-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,KAAK,gBAAgB,EACrB,MAAM,wCAAwC,CAAC;AAMhD,OAAO,KAAK,EAAE,YAAY,EAAiB,eAAe,EAAE,MAAM,YAAY,CAAC;AAG/E,QAAA,MAAM,2BAA2B,IAAI,CAAC;AACtC,QAAA,MAAM,8BAA8B,IAAI,CAAC;AACzC,QAAA,MAAM,0BAA0B,eAAoC,CAAC;AAiBrE,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAErD,MAAM,WAAW,uBAAuB;IACvC,OAAO,EAAE,OAAO,2BAA2B,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,QAAQ,CAAC,CAAC,0BAA0B,CAAC,CAAC,EAAE,MAAM,CAAC;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,gBAAgB,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACxC,mBAAmB,EAAE,uBAAuB,CAAC;CAC7C;AAED,MAAM,WAAW,2BAA2B;IAC3C,sBAAsB,EAAE;QACvB,OAAO,EAAE,OAAO,8BAA8B,CAAC;QAC/C,KAAK,EAAE,gBAAgB,CAAC;QACxB,KAAK,EAAE,gBAAgB,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;KACnB,CAAC;CACF;AAED,MAAM,MAAM,wBAAwB,GAAG,wBAAwB,GAAG,2BAA2B,CAAC;AAE9F,MAAM,MAAM,wBAAwB,GAAG,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;AAqQ5E;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAE9E;AA6BD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAEvE;AAED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,uBAAuB,GAAG,MAAM,GAAG,SAAS,CAEpG;AAED,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,wBAAwB,EACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,GACX,uBAAuB,GAAG,SAAS,CAErC;
|
|
1
|
+
{"version":3,"file":"tool-failure-memory.d.ts","sourceRoot":"","sources":["../src/tool-failure-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -287,9 +287,24 @@ function boundedFailureCode(value) {
|
|
|
287
287
|
.replace(/^_+|_+$/g, "");
|
|
288
288
|
return truncate(normalized || "tool_error", MAX_FAILURE_CODE_CHARS);
|
|
289
289
|
}
|
|
290
|
+
/**
|
|
291
|
+
* bash.ts's own trailer (`appendStatus`) always ends the message with a line like "Command
|
|
292
|
+
* exited with code 1"; a structured result (e.g. run_process) instead puts "exitCode: 1" on its
|
|
293
|
+
* own line near the top. Both are anchored to the START of their own line, with at most one
|
|
294
|
+
* leading tool-name token ("Command"/"Python"/...) — ordinary stdout/stderr prose is never
|
|
295
|
+
* anchored that way, so a captured line like "container will exit 0 on SIGTERM" can never be
|
|
296
|
+
* read as the process exit status. Scan from the end of the message so the tool's own trailer —
|
|
297
|
+
* always the last line it appends — outranks any earlier, non-authoritative line that matches.
|
|
298
|
+
*/
|
|
299
|
+
const EXIT_STATUS_LINE_PATTERN = /^(?:\S+\s+)?(?:exit(?:ed)?(?:\s+with)?(?:\s+code)?|exitcode)\s*[:=]?\s*(-?\d+)\b/i;
|
|
290
300
|
function processExitFailureCode(message) {
|
|
291
|
-
const
|
|
292
|
-
|
|
301
|
+
const lines = message.split(/\r\n|\n/);
|
|
302
|
+
for (let index = lines.length - 1; index >= 0; index--) {
|
|
303
|
+
const match = EXIT_STATUS_LINE_PATTERN.exec(lines[index].trim());
|
|
304
|
+
if (match)
|
|
305
|
+
return boundedFailureCode(`exit_${match[1]}`);
|
|
306
|
+
}
|
|
307
|
+
return undefined;
|
|
293
308
|
}
|
|
294
309
|
export function classifyToolFailure(message, errorClass) {
|
|
295
310
|
// A tool-owned terminal status is authoritative; stdout may contain arbitrary all-caps identifiers.
|
|
@@ -366,7 +381,16 @@ function extractFailureDiagnostic(message, allowUnclassifiedFallback, requireStr
|
|
|
366
381
|
.filter((line) => line.length > 0 && !/^command (?:exited with code|timed out after|aborted|killed after)\b/i.test(line));
|
|
367
382
|
if (stderrLines.length > 0) {
|
|
368
383
|
const classified = stderrLines.find((line) => strongDiagnosticPattern.test(line));
|
|
369
|
-
|
|
384
|
+
if (classified)
|
|
385
|
+
return truncateMiddle(classified, MAX_DIAGNOSTIC_CHARS);
|
|
386
|
+
// No stderr line carries a strong signal. Under requireStrongSignal, the caller has
|
|
387
|
+
// already decided uncatalogued output must never be fabricated into a diagnostic (see
|
|
388
|
+
// assessToolFailure) — falling back to the last raw stderr lines here would defeat that
|
|
389
|
+
// guarantee for the common bash case, so fall through to the same allowUnclassifiedFallback
|
|
390
|
+
// gate the no-stderr path below applies.
|
|
391
|
+
if (!requireStrongSignal) {
|
|
392
|
+
return truncateMiddle(stderrLines.slice(-4).join(" | "), MAX_DIAGNOSTIC_CHARS);
|
|
393
|
+
}
|
|
370
394
|
}
|
|
371
395
|
}
|
|
372
396
|
const lines = rawLines
|