@edihasaj/recall 0.5.7 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/{chunk-K5FZ47NN.js → chunk-7XCLKPJ3.js} +6 -8
  2. package/dist/{chunk-K5FZ47NN.js.map → chunk-7XCLKPJ3.js.map} +1 -1
  3. package/dist/{chunk-A5UIRZU6.js → chunk-A6XEULA4.js} +3 -2
  4. package/dist/chunk-A6XEULA4.js.map +1 -0
  5. package/dist/{chunk-F56Y3SHS.js → chunk-E4HJDGCW.js} +7 -9
  6. package/dist/{chunk-F56Y3SHS.js.map → chunk-E4HJDGCW.js.map} +1 -1
  7. package/dist/{chunk-IILLSHLM.js → chunk-KAGIAOD7.js} +2583 -84
  8. package/dist/chunk-KAGIAOD7.js.map +1 -0
  9. package/dist/{chunk-FHKV6ELT.js → chunk-MJ4GGBTL.js} +11 -13
  10. package/dist/{chunk-FHKV6ELT.js.map → chunk-MJ4GGBTL.js.map} +1 -1
  11. package/dist/{chunk-LVQW6WHK.js → chunk-XUM7JEJU.js} +2 -2
  12. package/dist/{cleanup-TVOX2S2S.js → cleanup-MYSQ44EP.js} +4 -4
  13. package/dist/cli.js +206 -33
  14. package/dist/cli.js.map +1 -1
  15. package/dist/daemon.js +60 -49
  16. package/dist/daemon.js.map +1 -1
  17. package/dist/dispatcher-SUUX5AX6.js +16 -0
  18. package/dist/mcp.js +5 -5
  19. package/dist/{quality-Z7LPMMBC.js → quality-YTQKAEY6.js} +3 -3
  20. package/dist/{tasks-UOLSPXJQ.js → tasks-GSQUHD4F.js} +6 -3
  21. package/dist/{usage-CY3V72YN.js → usage-DU4TKVJH.js} +2 -2
  22. package/package.json +1 -1
  23. package/dist/chunk-A5UIRZU6.js.map +0 -1
  24. package/dist/chunk-GC5XMBG4.js +0 -551
  25. package/dist/chunk-GC5XMBG4.js.map +0 -1
  26. package/dist/chunk-IILLSHLM.js.map +0 -1
  27. package/dist/chunk-VEPXEHRZ.js +0 -1763
  28. package/dist/chunk-VEPXEHRZ.js.map +0 -1
  29. package/dist/dispatcher-UGMU6THT.js +0 -15
  30. /package/dist/{chunk-LVQW6WHK.js.map → chunk-XUM7JEJU.js.map} +0 -0
  31. /package/dist/{cleanup-TVOX2S2S.js.map → cleanup-MYSQ44EP.js.map} +0 -0
  32. /package/dist/{dispatcher-UGMU6THT.js.map → dispatcher-SUUX5AX6.js.map} +0 -0
  33. /package/dist/{quality-Z7LPMMBC.js.map → quality-YTQKAEY6.js.map} +0 -0
  34. /package/dist/{tasks-UOLSPXJQ.js.map → tasks-GSQUHD4F.js.map} +0 -0
  35. /package/dist/{usage-CY3V72YN.js.map → usage-DU4TKVJH.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/llm/client.ts","../src/maintenance/dispatcher.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n getProviderConfig,\n type AzureOpenAiConfig,\n type LlmProvider,\n} from \"../credentials/keychain.js\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { llmUsage } from \"../db/schema.js\";\n\nexport type { LlmProvider };\n\nexport interface LlmCallInput {\n provider: LlmProvider;\n model?: string;\n system: string;\n user: string;\n max_output_tokens?: number;\n temperature?: number;\n task_kind: string;\n task_id?: string | null;\n repo?: string | null;\n}\n\nexport interface LlmUsageRow {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n cost_usd: number | null;\n}\n\nexport interface LlmCallResult {\n text: string;\n usage: LlmUsageRow;\n model: string;\n provider: LlmProvider;\n duration_ms: number;\n}\n\nexport class LlmCredentialError extends Error {}\nexport class LlmRequestError extends Error {}\n\nexport const DEFAULT_MODELS: Record<LlmProvider, string> = {\n openai: \"gpt-4o-mini\",\n anthropic: \"claude-haiku-4-5-20251001\",\n // For Azure the \"model\" is the deployment name, set by the user when they\n // provisioned the deployment. We leave it empty so we always fall through\n // to the deployment from AzureOpenAiConfig.\n \"azure-openai\": \"\",\n};\n\n// Rough per-1M token rates ($). Kept conservative; tighten when model pricing shifts.\n// Map by exact model id; unknown models fall through to null cost (still tracked, just un-priced).\nconst COST_PER_M_TOKENS: Record<string, { input: number; output: number }> = {\n \"gpt-4o-mini\": { input: 0.15, output: 0.60 },\n \"gpt-4o\": { input: 2.5, output: 10.0 },\n \"claude-haiku-4-5-20251001\": { input: 1.0, output: 5.0 },\n \"claude-sonnet-4-6\": { input: 3.0, output: 15.0 },\n \"claude-opus-4-7\": { input: 15.0, output: 75.0 },\n};\n\nexport async function callLlm(\n db: RecallDb,\n input: LlmCallInput,\n): Promise<LlmCallResult> {\n const provider = input.provider;\n const config = getProviderConfig(provider);\n if (!config) {\n throw new LlmCredentialError(missingCredentialMessage(provider));\n }\n const model = input.model ?? (provider === \"azure-openai\"\n ? (config as AzureOpenAiConfig).deployment\n : DEFAULT_MODELS[provider]);\n\n const started = Date.now();\n let result: LlmCallResult | null = null;\n let errorMessage: string | undefined;\n\n try {\n if (provider === \"openai\") {\n result = await callOpenAi((config as { key: string }).key, model, input);\n } else if (provider === \"anthropic\") {\n result = await callAnthropic((config as { key: string }).key, model, input);\n } else {\n result = await callAzureOpenAi(config as AzureOpenAiConfig, model, input);\n }\n return result;\n } catch (err) {\n errorMessage = err instanceof Error ? err.message : String(err);\n throw err;\n } finally {\n try {\n await recordUsage(db, {\n provider,\n model,\n task_kind: input.task_kind,\n task_id: input.task_id ?? null,\n repo: input.repo ?? null,\n usage: result?.usage ?? { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0, cost_usd: null },\n duration_ms: Date.now() - started,\n ok: Boolean(result),\n error: errorMessage,\n });\n } catch {\n // telemetry must never break the caller\n }\n }\n}\n\nasync function callOpenAi(\n apiKey: string,\n model: string,\n input: LlmCallInput,\n): Promise<LlmCallResult> {\n const started = Date.now();\n const response = await fetch(\"https://api.openai.com/v1/chat/completions\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages: [\n { role: \"system\", content: input.system },\n { role: \"user\", content: input.user },\n ],\n max_completion_tokens: input.max_output_tokens ?? 2048,\n temperature: input.temperature ?? 0,\n }),\n });\n\n if (!response.ok) {\n const body = await safeText(response);\n throw new LlmRequestError(`OpenAI ${response.status}: ${body.slice(0, 400)}`);\n }\n\n const payload = await response.json() as {\n choices?: Array<{ message?: { content?: string } }>;\n usage?: { prompt_tokens?: number; completion_tokens?: number; total_tokens?: number };\n };\n const text = payload.choices?.[0]?.message?.content?.trim() ?? \"\";\n const prompt_tokens = payload.usage?.prompt_tokens ?? 0;\n const completion_tokens = payload.usage?.completion_tokens ?? 0;\n const total_tokens = payload.usage?.total_tokens ?? prompt_tokens + completion_tokens;\n\n return {\n text,\n model,\n provider: \"openai\",\n duration_ms: Date.now() - started,\n usage: {\n prompt_tokens,\n completion_tokens,\n total_tokens,\n cost_usd: computeCost(model, prompt_tokens, completion_tokens),\n },\n };\n}\n\nasync function callAzureOpenAi(\n config: AzureOpenAiConfig,\n deployment: string,\n input: LlmCallInput,\n): Promise<LlmCallResult> {\n const started = Date.now();\n const url = `${config.endpoint}/openai/deployments/${encodeURIComponent(deployment)}/chat/completions?api-version=${encodeURIComponent(config.api_version)}`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": config.key,\n },\n body: JSON.stringify({\n messages: [\n { role: \"system\", content: input.system },\n { role: \"user\", content: input.user },\n ],\n max_completion_tokens: input.max_output_tokens ?? 2048,\n temperature: input.temperature ?? 0,\n }),\n });\n\n if (!response.ok) {\n const body = await safeText(response);\n throw new LlmRequestError(`Azure OpenAI ${response.status}: ${body.slice(0, 400)}`);\n }\n\n const payload = await response.json() as {\n choices?: Array<{ message?: { content?: string } }>;\n usage?: { prompt_tokens?: number; completion_tokens?: number; total_tokens?: number };\n };\n const text = payload.choices?.[0]?.message?.content?.trim() ?? \"\";\n const prompt_tokens = payload.usage?.prompt_tokens ?? 0;\n const completion_tokens = payload.usage?.completion_tokens ?? 0;\n const total_tokens = payload.usage?.total_tokens ?? prompt_tokens + completion_tokens;\n\n return {\n text,\n model: deployment,\n provider: \"azure-openai\",\n duration_ms: Date.now() - started,\n usage: {\n prompt_tokens,\n completion_tokens,\n total_tokens,\n cost_usd: computeCost(deployment, prompt_tokens, completion_tokens),\n },\n };\n}\n\nasync function callAnthropic(\n apiKey: string,\n model: string,\n input: LlmCallInput,\n): Promise<LlmCallResult> {\n const started = Date.now();\n const response = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify({\n model,\n system: input.system,\n messages: [{ role: \"user\", content: input.user }],\n max_tokens: input.max_output_tokens ?? 2048,\n temperature: input.temperature ?? 0,\n }),\n });\n\n if (!response.ok) {\n const body = await safeText(response);\n throw new LlmRequestError(`Anthropic ${response.status}: ${body.slice(0, 400)}`);\n }\n\n const payload = await response.json() as {\n content?: Array<{ type?: string; text?: string }>;\n usage?: { input_tokens?: number; output_tokens?: number };\n };\n const text = (payload.content ?? [])\n .filter((block) => block.type === \"text\" && typeof block.text === \"string\")\n .map((block) => block.text)\n .join(\"\")\n .trim();\n const prompt_tokens = payload.usage?.input_tokens ?? 0;\n const completion_tokens = payload.usage?.output_tokens ?? 0;\n\n return {\n text,\n model,\n provider: \"anthropic\",\n duration_ms: Date.now() - started,\n usage: {\n prompt_tokens,\n completion_tokens,\n total_tokens: prompt_tokens + completion_tokens,\n cost_usd: computeCost(model, prompt_tokens, completion_tokens),\n },\n };\n}\n\nfunction computeCost(model: string, inputTokens: number, outputTokens: number): number | null {\n const rates = COST_PER_M_TOKENS[model];\n if (!rates) return null;\n return (\n (inputTokens / 1_000_000) * rates.input +\n (outputTokens / 1_000_000) * rates.output\n );\n}\n\nasync function recordUsage(\n db: RecallDb,\n row: {\n provider: LlmProvider;\n model: string;\n task_kind: string;\n task_id: string | null;\n repo: string | null;\n usage: LlmUsageRow;\n duration_ms: number;\n ok: boolean;\n error?: string;\n },\n): Promise<void> {\n await db.insert(llmUsage).values({\n id: randomUUID(),\n provider: row.provider,\n model: row.model,\n task_kind: row.task_kind,\n task_id: row.task_id,\n repo: row.repo,\n prompt_tokens: row.usage.prompt_tokens,\n completion_tokens: row.usage.completion_tokens,\n total_tokens: row.usage.total_tokens,\n cost_usd: row.usage.cost_usd ?? null,\n duration_ms: row.duration_ms,\n ok: row.ok,\n error: row.error ?? null,\n created_at: new Date().toISOString(),\n });\n}\n\nfunction missingCredentialMessage(provider: LlmProvider): string {\n switch (provider) {\n case \"openai\":\n return `No API key for provider \"openai\". Set it via \\`recall maintenance credentials set openai <key>\\` or the OPENAI_API_KEY env var.`;\n case \"anthropic\":\n return `No API key for provider \"anthropic\". Set it via \\`recall maintenance credentials set anthropic <key>\\` or the ANTHROPIC_API_KEY env var.`;\n case \"azure-openai\":\n return `Azure OpenAI is not fully configured. Run \\`recall maintenance credentials set azure --endpoint <url> --deployment <name> --api-version <version> <key>\\` or set AZURE_OPENAI_{ENDPOINT,DEPLOYMENT,API_VERSION,API_KEY}.`;\n }\n}\n\nasync function safeText(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return \"\";\n }\n}\n","import type { RecallDb } from \"../db/client.js\";\nimport type { MaintenanceTask, MaintenanceTaskKind } from \"../types.js\";\nimport {\n TaskClaimConflictError,\n claimTask,\n listTasks,\n releaseTask,\n submitTask,\n} from \"./tasks.js\";\nimport { callLlm, LlmCredentialError, type LlmProvider } from \"../llm/client.js\";\nimport { hasProviderConfigured } from \"../credentials/keychain.js\";\n\nconst DISPATCH_AGENT = \"recall:dispatcher\";\nconst DEFAULT_LEASE_SECONDS = 120;\n\nexport interface DispatchOptions {\n provider?: LlmProvider;\n model?: string;\n maxTasks?: number;\n kinds?: MaintenanceTaskKind[];\n repo?: string;\n dryRun?: boolean;\n}\n\nexport interface DispatchOutcome {\n task_id: string;\n kind: MaintenanceTaskKind;\n repo: string | null;\n status: \"applied\" | \"rejected\" | \"released\" | \"skipped\";\n reason?: string;\n target_id?: string;\n changed_fields?: string[];\n prompt_tokens?: number;\n completion_tokens?: number;\n cost_usd?: number | null;\n duration_ms?: number;\n}\n\nexport interface DispatchReport {\n provider: LlmProvider | null;\n model: string | null;\n dry_run: boolean;\n attempted: number;\n applied: number;\n rejected: number;\n released: number;\n outcomes: DispatchOutcome[];\n}\n\nexport async function dispatchPendingTasks(\n db: RecallDb,\n options: DispatchOptions = {},\n): Promise<DispatchReport> {\n const provider = resolveProvider(options.provider);\n const report: DispatchReport = {\n provider,\n model: null,\n dry_run: Boolean(options.dryRun),\n attempted: 0,\n applied: 0,\n rejected: 0,\n released: 0,\n outcomes: [],\n };\n if (!provider) return report;\n\n const pending = listTasks(db, {\n status: \"pending\",\n kinds: options.kinds,\n repo: options.repo,\n limit: options.maxTasks ?? 5,\n });\n\n for (const task of pending) {\n if (options.dryRun) {\n report.outcomes.push({\n task_id: task.id,\n kind: task.kind,\n repo: task.repo,\n status: \"skipped\",\n reason: \"dry-run\",\n });\n continue;\n }\n report.attempted += 1;\n const outcome = await runSingle(db, task, provider, options.model);\n report.outcomes.push(outcome);\n if (outcome.status === \"applied\") report.applied += 1;\n else if (outcome.status === \"rejected\") report.rejected += 1;\n else if (outcome.status === \"released\") report.released += 1;\n if (outcome.prompt_tokens != null && !report.model) {\n // remember the model the first successful call used, for display\n const last = report.outcomes[report.outcomes.length - 1];\n report.model = (last as DispatchOutcome & { model?: string }).task_id ? options.model ?? null : null;\n }\n }\n\n return report;\n}\n\nasync function runSingle(\n db: RecallDb,\n task: MaintenanceTask,\n provider: LlmProvider,\n model?: string,\n): Promise<DispatchOutcome> {\n let claimed: MaintenanceTask;\n try {\n const claim = claimTask(db, task.id, DISPATCH_AGENT, DEFAULT_LEASE_SECONDS);\n claimed = claim.task;\n } catch (err) {\n if (err instanceof TaskClaimConflictError) {\n return {\n task_id: task.id,\n kind: task.kind,\n repo: task.repo,\n status: \"skipped\",\n reason: err.reason,\n };\n }\n throw err;\n }\n\n const prompt = buildPrompt(claimed);\n if (!prompt) {\n releaseTask(db, claimed.id, DISPATCH_AGENT);\n return {\n task_id: claimed.id,\n kind: claimed.kind,\n repo: claimed.repo,\n status: \"released\",\n reason: \"no prompt builder\",\n };\n }\n\n try {\n const llmResult = await callLlm(db, {\n provider,\n model,\n system: prompt.system,\n user: prompt.user,\n max_output_tokens: prompt.max_output_tokens,\n task_kind: claimed.kind,\n task_id: claimed.id,\n repo: claimed.repo,\n });\n\n const parsed = parseJson(llmResult.text);\n if (!parsed) {\n releaseTask(db, claimed.id, DISPATCH_AGENT);\n return {\n task_id: claimed.id,\n kind: claimed.kind,\n repo: claimed.repo,\n status: \"released\",\n reason: \"llm did not return valid JSON\",\n prompt_tokens: llmResult.usage.prompt_tokens,\n completion_tokens: llmResult.usage.completion_tokens,\n cost_usd: llmResult.usage.cost_usd,\n duration_ms: llmResult.duration_ms,\n };\n }\n\n const submit = submitTask(db, claimed.id, DISPATCH_AGENT, parsed);\n if (submit.status === \"applied\") {\n return {\n task_id: claimed.id,\n kind: claimed.kind,\n repo: claimed.repo,\n status: \"applied\",\n target_id: submit.target_id,\n changed_fields: submit.changed_fields,\n prompt_tokens: llmResult.usage.prompt_tokens,\n completion_tokens: llmResult.usage.completion_tokens,\n cost_usd: llmResult.usage.cost_usd,\n duration_ms: llmResult.duration_ms,\n };\n }\n return {\n task_id: claimed.id,\n kind: claimed.kind,\n repo: claimed.repo,\n status: \"rejected\",\n reason: submit.reason,\n prompt_tokens: llmResult.usage.prompt_tokens,\n completion_tokens: llmResult.usage.completion_tokens,\n cost_usd: llmResult.usage.cost_usd,\n duration_ms: llmResult.duration_ms,\n };\n } catch (err) {\n releaseTask(db, claimed.id, DISPATCH_AGENT);\n const reason = err instanceof LlmCredentialError\n ? err.message\n : err instanceof Error\n ? err.message\n : String(err);\n return {\n task_id: claimed.id,\n kind: claimed.kind,\n repo: claimed.repo,\n status: \"released\",\n reason,\n };\n }\n}\n\nfunction resolveProvider(preferred?: LlmProvider): LlmProvider | null {\n const candidates: LlmProvider[] = preferred\n ? [preferred]\n : [\"anthropic\", \"azure-openai\", \"openai\"];\n for (const provider of candidates) {\n if (hasProviderConfigured(provider)) return provider;\n }\n return null;\n}\n\nfunction parseJson(text: string): unknown | null {\n const trimmed = text.trim();\n if (trimmed.length === 0) return null;\n // Strip code fences if present.\n const stripped = trimmed\n .replace(/^```(?:json)?\\s*/i, \"\")\n .replace(/\\s*```$/i, \"\")\n .trim();\n try {\n return JSON.parse(stripped);\n } catch {\n // Some models return a leading sentence before the JSON. Try to locate the first {.\n const first = stripped.indexOf(\"{\");\n const last = stripped.lastIndexOf(\"}\");\n if (first >= 0 && last > first) {\n try {\n return JSON.parse(stripped.slice(first, last + 1));\n } catch {\n return null;\n }\n }\n return null;\n }\n}\n\nexport interface Prompt {\n system: string;\n user: string;\n max_output_tokens?: number;\n}\n\nexport function buildPrompt(task: MaintenanceTask): Prompt | null {\n switch (task.kind) {\n case \"verify_capture\":\n return buildVerifyCapturePrompt(task);\n case \"refine_candidate\":\n return buildRefineCandidatePrompt(task);\n case \"summarize_history\":\n return buildSummarizeHistoryPrompt(task);\n case \"merge_duplicates\":\n return buildMergeDuplicatesPrompt(task);\n case \"summarize_session\":\n return buildSummarizeSessionPrompt(task);\n case \"synthesize_repo\":\n return buildSynthesizeRepoPrompt(task);\n default:\n return null;\n }\n}\n\nfunction buildVerifyCapturePrompt(task: MaintenanceTask): Prompt {\n const payload = task.payload as {\n memory_id?: string;\n text?: string;\n inferred_scope?: string;\n inferred_path_scope?: string | null;\n repo?: string | null;\n capture_context?: unknown;\n };\n const system = [\n \"You verify a captured candidate rule for a coding-agent memory store.\",\n \"Decide if it is a durable rule worth saving, salvageable but needs rewriting, or noise/narration.\",\n \"Be strict — false positives produce wrong agent behavior. When unsure, prefer reject over save.\",\n \"Reject voice transcripts, descriptive clauses about what the user does ('things I never use'), one-shot task chatter, and any text whose intent is unclear without surrounding context.\",\n \"When rewriting, output a single canonical sentence in imperative mood. Keep scope as tight as the evidence supports.\",\n \"Flag is_destructive_risky=true when the rule pairs a destructive verb (remove/delete/drop/wipe) with high-risk targets (settings/config/files/secrets/branches), OR when it is shaped as a literal-trigger rule (\\\"when user says X, do Y\\\") — both require explicit user confirm regardless.\",\n JSON_ONLY,\n ].join(\" \");\n const user = [\n `Candidate text: ${JSON.stringify(payload.text ?? \"\")}`,\n `Inferred scope: ${payload.inferred_scope ?? \"repo\"}`,\n `Inferred path_scope: ${JSON.stringify(payload.inferred_path_scope ?? null)}`,\n `Repo: ${JSON.stringify(payload.repo ?? null)}`,\n `Capture context: ${JSON.stringify(payload.capture_context ?? null)}`,\n \"\",\n 'Return JSON: {\"verdict\": \"save\"|\"rewrite\"|\"reject\", \"cleaned_text\"?: string, \"scope\"?: \"session\"|\"path\"|\"repo\"|\"team\"|\"global\", \"path_scope\"?: string|null, \"is_destructive_risky\"?: boolean, \"reason\"?: string}',\n ].join(\"\\n\");\n return { system, user };\n}\n\nconst JSON_ONLY = \"Respond with a single JSON object matching the required schema, no prose, no markdown fences.\";\n\nfunction buildRefineCandidatePrompt(task: MaintenanceTask): Prompt {\n const payload = task.payload as {\n memory_id?: string;\n text?: string;\n current_scope?: string;\n current_path_scope?: string | null;\n repo?: string | null;\n repetition_count?: number;\n };\n const system = [\n \"You refine candidate memories in a coding-agent memory store.\",\n \"Keep only durable rules/commands/gotchas. Clamp scope tighter when the evidence is path-specific.\",\n JSON_ONLY,\n ].join(\" \");\n const user = [\n `Current memory text: ${JSON.stringify(payload.text ?? \"\")}`,\n `Current scope: ${payload.current_scope ?? \"repo\"}`,\n `Current path_scope: ${JSON.stringify(payload.current_path_scope ?? null)}`,\n `Repo: ${JSON.stringify(payload.repo ?? null)}`,\n `Repetition count: ${payload.repetition_count ?? 0}`,\n \"\",\n 'Return JSON: {\"refined_text\": string, \"scope\": \"session\"|\"path\"|\"repo\"|\"team\"|\"global\", \"path_scope\": string|null, \"rationale\": string, \"verdict\"?: \"rewrite\"|\"reject\"}',\n ].join(\"\\n\");\n return { system, user };\n}\n\nfunction buildSummarizeHistoryPrompt(task: MaintenanceTask): Prompt {\n const payload = task.payload as {\n current_text?: string;\n kind?: string;\n repo?: string | null;\n };\n const system = [\n \"You compress activity snippets in a coding-agent memory store.\",\n \"Keep the essential facts; drop filler. <= 3 short sentences.\",\n JSON_ONLY,\n ].join(\" \");\n const user = [\n `Kind: ${payload.kind ?? \"unknown\"}`,\n `Repo: ${JSON.stringify(payload.repo ?? null)}`,\n `Current text: ${JSON.stringify(payload.current_text ?? \"\")}`,\n \"\",\n 'Return JSON: {\"summary_text\": string, \"tags\": [string, ...]}',\n ].join(\"\\n\");\n return { system, user };\n}\n\nfunction buildMergeDuplicatesPrompt(task: MaintenanceTask): Prompt {\n const payload = task.payload as {\n cluster?: Array<{ id: string; text: string; confidence?: number; scope?: string; path_scope?: string | null }>;\n repo?: string | null;\n };\n const system = [\n \"You pick the best memory among near-duplicates in a coding-agent memory store.\",\n \"Choose the single winning id. You may also rewrite the winner's text for clarity, and tighten its scope if evidence supports it.\",\n JSON_ONLY,\n ].join(\" \");\n const user = [\n `Repo: ${JSON.stringify(payload.repo ?? null)}`,\n `Cluster:`,\n JSON.stringify(payload.cluster ?? [], null, 2),\n \"\",\n 'Return JSON: {\"winner_id\": uuid, \"winner_text\"?: string, \"winner_scope\"?: \"session\"|\"path\"|\"repo\"|\"team\", \"winner_path_scope\"?: string|null, \"rationale\"?: string}',\n ].join(\"\\n\");\n return { system, user };\n}\n\nfunction buildSummarizeSessionPrompt(task: MaintenanceTask): Prompt {\n const payload = task.payload as { events?: unknown[]; session_id?: string; repo?: string | null };\n const system = [\n \"You condense a coding-agent session into a brief durable summary.\",\n \"<= 5 short bullet points; no filler.\",\n JSON_ONLY,\n ].join(\" \");\n const user = [\n `Session: ${payload.session_id ?? \"unknown\"}`,\n `Repo: ${JSON.stringify(payload.repo ?? null)}`,\n `Events: ${JSON.stringify(payload.events ?? [], null, 2).slice(0, 12_000)}`,\n \"\",\n 'Return JSON: {\"summary_text\": string}',\n ].join(\"\\n\");\n return { system, user };\n}\n\nfunction buildSynthesizeRepoPrompt(task: MaintenanceTask): Prompt {\n const payload = task.payload as { repo?: string | null; memories?: unknown[] };\n const system = [\n \"You synthesize a concise repo-level summary from the stable memory set.\",\n \"Focus on commands, rules, gotchas, and decisions that repeat across sessions.\",\n JSON_ONLY,\n ].join(\" \");\n const user = [\n `Repo: ${JSON.stringify(payload.repo ?? null)}`,\n `Memory set: ${JSON.stringify(payload.memories ?? [], null, 2).slice(0, 12_000)}`,\n \"\",\n 'Return JSON: {\"summary_text\": string}',\n ].join(\"\\n\");\n return { system, user };\n}\n\nexport function formatDispatchReport(report: DispatchReport): string {\n const lines: string[] = [\n \"# Recall Maintenance Dispatch\",\n `Provider: ${report.provider ?? \"(none — no API key)\"}`,\n `Dry run: ${report.dry_run ? \"yes\" : \"no\"}`,\n `Attempted: ${report.attempted}`,\n `Applied: ${report.applied}`,\n `Rejected: ${report.rejected}`,\n `Released: ${report.released}`,\n ];\n if (report.outcomes.length > 0) {\n lines.push(\"\", \"## Outcomes\");\n for (const o of report.outcomes) {\n const cost = o.cost_usd != null ? ` $${o.cost_usd.toFixed(4)}` : \"\";\n const tokens = o.prompt_tokens != null ? ` tokens=${(o.prompt_tokens ?? 0) + (o.completion_tokens ?? 0)}` : \"\";\n const reason = o.reason ? ` — ${o.reason}` : \"\";\n lines.push(` ${o.task_id.slice(0, 8)} ${o.kind.padEnd(20)} ${o.status.padEnd(10)}${tokens}${cost}${reason}`);\n }\n }\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":[]}