From b8097eaf8347029cb9209e259462ba6ca9fc6aec Mon Sep 17 00:00:00 2001 From: Dotta Date: Mon, 4 May 2026 16:12:57 -0500 Subject: [PATCH] Resolve LLM wiki manifest review gaps Co-Authored-By: Paperclip --- .../plugins/plugin-llm-wiki/src/manifest.ts | 1 + packages/plugins/plugin-llm-wiki/src/wiki.ts | 85 +------------------ .../plugin-llm-wiki/tests/plugin.spec.ts | 10 +++ .../tests/screenshots/harness.tsx | 2 +- 4 files changed, 14 insertions(+), 84 deletions(-) diff --git a/packages/plugins/plugin-llm-wiki/src/manifest.ts b/packages/plugins/plugin-llm-wiki/src/manifest.ts index 6c40683cbb0..31b1ce8a063 100644 --- a/packages/plugins/plugin-llm-wiki/src/manifest.ts +++ b/packages/plugins/plugin-llm-wiki/src/manifest.ts @@ -132,6 +132,7 @@ const manifest: PaperclipPluginManifestV1 = { "wiki", "wiki/sources", "wiki/projects", + "wiki/areas", "wiki/entities", "wiki/concepts", "wiki/synthesis" diff --git a/packages/plugins/plugin-llm-wiki/src/wiki.ts b/packages/plugins/plugin-llm-wiki/src/wiki.ts index 483eb1d1735..2430367492d 100644 --- a/packages/plugins/plugin-llm-wiki/src/wiki.ts +++ b/packages/plugins/plugin-llm-wiki/src/wiki.ts @@ -1,6 +1,6 @@ import { createHash, randomUUID } from "node:crypto"; -import type { Agent, AgentSessionEvent, Issue, IssueComment, PluginContext, PluginEvent, PluginLocalFolderEntry, Project, ToolResult } from "@paperclipai/plugin-sdk"; -import type { IssueDocument, PluginIssueOriginKind, PluginManagedRoutineResolution } from "@paperclipai/plugin-sdk/types"; +import type { Agent, AgentSessionEvent, Issue, PluginContext, PluginEvent, PluginLocalFolderEntry, Project, ToolResult } from "@paperclipai/plugin-sdk"; +import type { PluginIssueOriginKind, PluginManagedRoutineResolution } from "@paperclipai/plugin-sdk/types"; import { DEFAULT_MAX_SOURCE_BYTES, DEFAULT_MAX_PAPERCLIP_CURSOR_WINDOW_CHARS, @@ -2355,11 +2355,6 @@ export async function distillPaperclipProjectPage(ctx: PluginContext, input: Pap }; } -function truncateEventSource(contents: string, maxCharacters: number): string { - if (contents.length <= maxCharacters) return contents; - return `${contents.slice(0, maxCharacters)}\n\n[Truncated by LLM Wiki event ingestion policy at ${maxCharacters} characters.]\n`; -} - function eventPayload(event: PluginEvent): Record { return event.payload && typeof event.payload === "object" && !Array.isArray(event.payload) ? event.payload as Record @@ -2370,82 +2365,6 @@ function sourceTitleForIssue(issue: Issue): string { return issue.identifier ? `${issue.identifier} ${issue.title}` : issue.title; } -function rawPathForPaperclipEvent(input: { - sourceKind: WikiEventIngestionSource; - issue: Issue; - label: string; - contents: string; - event: PluginEvent; -}): string { - const identifier = input.issue.identifier ?? input.issue.id.slice(0, 8); - const eventDate = input.event.occurredAt.slice(0, 10); - return assertRawPath(`raw/paperclip/${input.sourceKind}/${eventDate}-${slugify(identifier)}-${slugify(input.label)}-${contentHash(input.contents).slice(0, 8)}.md`); -} - -function formatIssueEventSource(issue: Issue, event: PluginEvent, maxCharacters: number): string { - return truncateEventSource([ - `# Paperclip issue: ${sourceTitleForIssue(issue)}`, - "", - "## Provenance", - "", - `- Company ID: ${issue.companyId}`, - `- Issue ID: ${issue.id}`, - issue.identifier ? `- Issue identifier: ${issue.identifier}` : null, - `- Event type: ${event.eventType}`, - `- Event ID: ${event.eventId}`, - `- Event occurred at: ${event.occurredAt}`, - `- Status: ${issue.status}`, - `- Priority: ${issue.priority}`, - "", - "## Issue", - "", - issue.description?.trim() ? issue.description.trim() : "_No issue description._", - ].filter((line): line is string => line !== null).join("\n"), maxCharacters); -} - -function formatCommentEventSource(issue: Issue, comment: IssueComment, event: PluginEvent, maxCharacters: number): string { - return truncateEventSource([ - `# Paperclip comment on ${sourceTitleForIssue(issue)}`, - "", - "## Provenance", - "", - `- Company ID: ${issue.companyId}`, - `- Issue ID: ${issue.id}`, - issue.identifier ? `- Issue identifier: ${issue.identifier}` : null, - `- Comment ID: ${comment.id}`, - `- Event type: ${event.eventType}`, - `- Event ID: ${event.eventId}`, - `- Event occurred at: ${event.occurredAt}`, - "", - "## Comment", - "", - comment.body, - ].filter((line): line is string => line !== null).join("\n"), maxCharacters); -} - -function formatDocumentEventSource(issue: Issue, document: IssueDocument, event: PluginEvent, maxCharacters: number): string { - return truncateEventSource([ - `# Paperclip document: ${document.title ?? document.key}`, - "", - "## Provenance", - "", - `- Company ID: ${issue.companyId}`, - `- Issue ID: ${issue.id}`, - issue.identifier ? `- Issue identifier: ${issue.identifier}` : null, - `- Document ID: ${document.id}`, - `- Document key: ${document.key}`, - `- Event type: ${event.eventType}`, - `- Event ID: ${event.eventId}`, - `- Event occurred at: ${event.occurredAt}`, - `- Format: ${document.format}`, - `- Revision: ${document.latestRevisionNumber}`, - "", - "## Document", - "", - document.body, - ].filter((line): line is string => line !== null).join("\n"), maxCharacters); -} - async function recordPaperclipCursorObservation(ctx: PluginContext, input: { companyId: string; wikiId: string; diff --git a/packages/plugins/plugin-llm-wiki/tests/plugin.spec.ts b/packages/plugins/plugin-llm-wiki/tests/plugin.spec.ts index fd839d30760..8c024796868 100644 --- a/packages/plugins/plugin-llm-wiki/tests/plugin.spec.ts +++ b/packages/plugins/plugin-llm-wiki/tests/plugin.spec.ts @@ -511,6 +511,16 @@ describe("LLM Wiki plugin scaffold", () => { exportName: "WikiRouteSidebar", routePath: "wiki", }); + expect(manifest.localFolders?.[0]?.requiredDirectories).toEqual([ + "raw", + "wiki", + "wiki/sources", + "wiki/projects", + "wiki/areas", + "wiki/entities", + "wiki/concepts", + "wiki/synthesis", + ]); expect(packageJson.dependencies).toBeUndefined(); expect(packageJson.devDependencies?.react).toBeUndefined(); expect(packageJson.devDependencies?.["react-dom"]).toBeDefined(); diff --git a/packages/plugins/plugin-llm-wiki/tests/screenshots/harness.tsx b/packages/plugins/plugin-llm-wiki/tests/screenshots/harness.tsx index e1b86c0acb0..cb7d54d87e5 100644 --- a/packages/plugins/plugin-llm-wiki/tests/screenshots/harness.tsx +++ b/packages/plugins/plugin-llm-wiki/tests/screenshots/harness.tsx @@ -23,7 +23,7 @@ const FOLDER_HEALTHY = { access: "readWrite" as const, readable: true, writable: true, - requiredDirectories: ["raw", "wiki", "wiki/sources", "wiki/projects", "wiki/entities", "wiki/concepts", "wiki/synthesis"], + requiredDirectories: ["raw", "wiki", "wiki/sources", "wiki/projects", "wiki/areas", "wiki/entities", "wiki/concepts", "wiki/synthesis"], requiredFiles: ["AGENTS.md", "IDEA.md", "wiki/index.md", "wiki/log.md"], missingDirectories: [], missingFiles: [],