mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-30 13:20:54 +01:00
## Thinking Path > - Paperclip orchestrates AI agents for zero-human companies. > - The plugin system is the extension surface for adding specialized company capabilities without baking every workflow into core. > - The LLM Wiki plugin needs to land as a self-contained package so its worker, UI, skills, migrations, fixtures, and docs can be reviewed independently. > - [PAP-9173](/PAP/issues/PAP-9173) asked for this work to be split by file boundary, with this PR containing only `packages/plugins/plugin-llm-wiki/`. > - This pull request is stacked on the host-support PR so policy checks can see the required Dockerfile/workspace support while this PR diff remains plugin-only. > - The benefit is a narrow review focused on the LLM Wiki plugin surface without carrying development-only visual artifacts. ## What Changed - Added the LLM Wiki plugin package under `packages/plugins/plugin-llm-wiki/`. - Included plugin worker/UI code, skills, migrations, fixtures, templates, and tests. - Kept all host/runtime/workspace changes in the base PR instead of this plugin-only diff. ## Verification - `pnpm --filter @paperclipai/plugin-llm-wiki test` - Boundary check: `git diff --name-only pap-9173-llm-wiki-rest...pap-9173-llm-wiki-plugin-only` contains only `packages/plugins/plugin-llm-wiki/` paths. ## Risks - This is a stacked PR and should be reviewed/merged after the host-support PR, or retargeted to `master` once that branch lands. - Generated screenshot/design assets are no longer retained in git; future visual review will need to regenerate local screenshots from the harness. > For core feature work, check [`ROADMAP.md`](ROADMAP.md) first and discuss it in `#dev` before opening the PR. Feature PRs that overlap with planned core work may need to be redirected — check the roadmap first. See `CONTRIBUTING.md`. ## Model Used - OpenAI GPT-5 Codex via Codex CLI, tool use and local code execution enabled; context window not exposed. ## Checklist - [x] I have included a thinking path that traces from project context to this change - [x] I have specified the model used (with version and capability details) - [x] I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work - [x] I have run tests locally and they pass - [x] I have added or updated tests where applicable - [x] If this change affects the UI, I validated screenshots during development; generated screenshots are not retained in git per maintainer request - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [x] I will address all Greptile and reviewer comments before requesting merge Stack base: PR #5597 (`pap-9173-llm-wiki-rest`). --------- Co-authored-by: Paperclip <noreply@paperclip.ing>
186 lines
11 KiB
SQL
186 lines
11 KiB
SQL
CREATE TABLE plugin_llm_wiki_8f50da974f.wiki_spaces (
|
|
id uuid PRIMARY KEY,
|
|
company_id uuid NOT NULL REFERENCES public.companies(id) ON DELETE CASCADE,
|
|
wiki_id text NOT NULL DEFAULT 'default',
|
|
slug text NOT NULL,
|
|
display_name text NOT NULL,
|
|
space_type text NOT NULL DEFAULT 'local_folder',
|
|
folder_mode text NOT NULL DEFAULT 'managed_subfolder',
|
|
root_folder_key text NOT NULL DEFAULT 'wiki-root',
|
|
path_prefix text,
|
|
configured_root_path text,
|
|
access_scope text NOT NULL DEFAULT 'shared',
|
|
owner_user_id text,
|
|
owner_agent_id uuid REFERENCES public.agents(id) ON DELETE SET NULL,
|
|
team_key text,
|
|
settings jsonb NOT NULL DEFAULT '{}'::jsonb,
|
|
status text NOT NULL DEFAULT 'active',
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
UNIQUE (company_id, wiki_id, slug)
|
|
);
|
|
|
|
CREATE INDEX wiki_spaces_company_status_idx
|
|
ON plugin_llm_wiki_8f50da974f.wiki_spaces (company_id, wiki_id, status);
|
|
|
|
WITH wiki_pairs AS (
|
|
SELECT company_id, wiki_id FROM plugin_llm_wiki_8f50da974f.wiki_instances
|
|
UNION
|
|
SELECT company_id, wiki_id FROM plugin_llm_wiki_8f50da974f.wiki_sources
|
|
UNION
|
|
SELECT company_id, wiki_id FROM plugin_llm_wiki_8f50da974f.wiki_pages
|
|
UNION
|
|
SELECT company_id, wiki_id FROM plugin_llm_wiki_8f50da974f.wiki_page_revisions
|
|
UNION
|
|
SELECT company_id, wiki_id FROM plugin_llm_wiki_8f50da974f.wiki_operations
|
|
UNION
|
|
SELECT company_id, wiki_id FROM plugin_llm_wiki_8f50da974f.wiki_query_sessions
|
|
UNION
|
|
SELECT company_id, wiki_id FROM plugin_llm_wiki_8f50da974f.paperclip_distillation_cursors
|
|
UNION
|
|
SELECT company_id, wiki_id FROM plugin_llm_wiki_8f50da974f.paperclip_distillation_work_items
|
|
UNION
|
|
SELECT company_id, wiki_id FROM plugin_llm_wiki_8f50da974f.paperclip_distillation_runs
|
|
UNION
|
|
SELECT company_id, wiki_id FROM plugin_llm_wiki_8f50da974f.paperclip_source_snapshots
|
|
UNION
|
|
SELECT company_id, wiki_id FROM plugin_llm_wiki_8f50da974f.paperclip_page_bindings
|
|
)
|
|
INSERT INTO plugin_llm_wiki_8f50da974f.wiki_spaces
|
|
(id, company_id, wiki_id, slug, display_name, space_type, folder_mode, root_folder_key, path_prefix, access_scope, status)
|
|
SELECT (
|
|
substr(md5(company_id::text || ':' || wiki_id || ':default'), 1, 8) || '-' ||
|
|
substr(md5(company_id::text || ':' || wiki_id || ':default'), 9, 4) || '-' ||
|
|
'4' || substr(md5(company_id::text || ':' || wiki_id || ':default'), 14, 3) || '-' ||
|
|
'8' || substr(md5(company_id::text || ':' || wiki_id || ':default'), 18, 3) || '-' ||
|
|
substr(md5(company_id::text || ':' || wiki_id || ':default'), 21, 12)
|
|
)::uuid,
|
|
company_id,
|
|
wiki_id,
|
|
'default',
|
|
'default',
|
|
'local_folder',
|
|
'managed_subfolder',
|
|
'wiki-root',
|
|
NULL,
|
|
'shared',
|
|
'active'
|
|
FROM wiki_pairs
|
|
ON CONFLICT (company_id, wiki_id, slug) DO NOTHING;
|
|
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.wiki_sources ADD COLUMN IF NOT EXISTS space_id uuid;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.wiki_pages ADD COLUMN IF NOT EXISTS space_id uuid;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.wiki_page_revisions ADD COLUMN IF NOT EXISTS space_id uuid;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.wiki_operations ADD COLUMN IF NOT EXISTS space_id uuid;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.wiki_query_sessions ADD COLUMN IF NOT EXISTS space_id uuid;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_distillation_cursors ADD COLUMN IF NOT EXISTS space_id uuid;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_distillation_work_items ADD COLUMN IF NOT EXISTS space_id uuid;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_distillation_runs ADD COLUMN IF NOT EXISTS space_id uuid;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_source_snapshots ADD COLUMN IF NOT EXISTS space_id uuid;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_page_bindings ADD COLUMN IF NOT EXISTS space_id uuid;
|
|
|
|
UPDATE plugin_llm_wiki_8f50da974f.wiki_sources t
|
|
SET space_id = s.id
|
|
FROM plugin_llm_wiki_8f50da974f.wiki_spaces s
|
|
WHERE t.company_id = s.company_id AND t.wiki_id = s.wiki_id AND s.slug = 'default' AND t.space_id IS NULL;
|
|
|
|
UPDATE plugin_llm_wiki_8f50da974f.wiki_pages t
|
|
SET space_id = s.id
|
|
FROM plugin_llm_wiki_8f50da974f.wiki_spaces s
|
|
WHERE t.company_id = s.company_id AND t.wiki_id = s.wiki_id AND s.slug = 'default' AND t.space_id IS NULL;
|
|
|
|
UPDATE plugin_llm_wiki_8f50da974f.wiki_page_revisions t
|
|
SET space_id = s.id
|
|
FROM plugin_llm_wiki_8f50da974f.wiki_spaces s
|
|
WHERE t.company_id = s.company_id AND t.wiki_id = s.wiki_id AND s.slug = 'default' AND t.space_id IS NULL;
|
|
|
|
UPDATE plugin_llm_wiki_8f50da974f.wiki_operations t
|
|
SET space_id = s.id
|
|
FROM plugin_llm_wiki_8f50da974f.wiki_spaces s
|
|
WHERE t.company_id = s.company_id AND t.wiki_id = s.wiki_id AND s.slug = 'default' AND t.space_id IS NULL;
|
|
|
|
UPDATE plugin_llm_wiki_8f50da974f.wiki_query_sessions t
|
|
SET space_id = s.id
|
|
FROM plugin_llm_wiki_8f50da974f.wiki_spaces s
|
|
WHERE t.company_id = s.company_id AND t.wiki_id = s.wiki_id AND s.slug = 'default' AND t.space_id IS NULL;
|
|
|
|
UPDATE plugin_llm_wiki_8f50da974f.paperclip_distillation_cursors t
|
|
SET space_id = s.id
|
|
FROM plugin_llm_wiki_8f50da974f.wiki_spaces s
|
|
WHERE t.company_id = s.company_id AND t.wiki_id = s.wiki_id AND s.slug = 'default' AND t.space_id IS NULL;
|
|
|
|
UPDATE plugin_llm_wiki_8f50da974f.paperclip_distillation_work_items t
|
|
SET space_id = s.id
|
|
FROM plugin_llm_wiki_8f50da974f.wiki_spaces s
|
|
WHERE t.company_id = s.company_id AND t.wiki_id = s.wiki_id AND s.slug = 'default' AND t.space_id IS NULL;
|
|
|
|
UPDATE plugin_llm_wiki_8f50da974f.paperclip_distillation_runs t
|
|
SET space_id = s.id
|
|
FROM plugin_llm_wiki_8f50da974f.wiki_spaces s
|
|
WHERE t.company_id = s.company_id AND t.wiki_id = s.wiki_id AND s.slug = 'default' AND t.space_id IS NULL;
|
|
|
|
UPDATE plugin_llm_wiki_8f50da974f.paperclip_source_snapshots t
|
|
SET space_id = s.id
|
|
FROM plugin_llm_wiki_8f50da974f.wiki_spaces s
|
|
WHERE t.company_id = s.company_id AND t.wiki_id = s.wiki_id AND s.slug = 'default' AND t.space_id IS NULL;
|
|
|
|
UPDATE plugin_llm_wiki_8f50da974f.paperclip_page_bindings t
|
|
SET space_id = s.id
|
|
FROM plugin_llm_wiki_8f50da974f.wiki_spaces s
|
|
WHERE t.company_id = s.company_id AND t.wiki_id = s.wiki_id AND s.slug = 'default' AND t.space_id IS NULL;
|
|
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.wiki_sources ALTER COLUMN space_id SET NOT NULL;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.wiki_pages ALTER COLUMN space_id SET NOT NULL;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.wiki_page_revisions ALTER COLUMN space_id SET NOT NULL;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.wiki_operations ALTER COLUMN space_id SET NOT NULL;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.wiki_query_sessions ALTER COLUMN space_id SET NOT NULL;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_distillation_cursors ALTER COLUMN space_id SET NOT NULL;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_distillation_work_items ALTER COLUMN space_id SET NOT NULL;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_distillation_runs ALTER COLUMN space_id SET NOT NULL;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_source_snapshots ALTER COLUMN space_id SET NOT NULL;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_page_bindings ALTER COLUMN space_id SET NOT NULL;
|
|
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.wiki_pages
|
|
DROP CONSTRAINT IF EXISTS wiki_pages_company_id_wiki_id_path_key;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_distillation_cursors
|
|
DROP CONSTRAINT IF EXISTS paperclip_distillation_cursor_company_id_wiki_id_source_sco_key;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_distillation_work_items
|
|
DROP CONSTRAINT IF EXISTS paperclip_distillation_work_i_company_id_wiki_id_idempotenc_key;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_page_bindings
|
|
DROP CONSTRAINT IF EXISTS paperclip_page_bindings_company_id_wiki_id_page_path_key;
|
|
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.wiki_pages
|
|
ADD CONSTRAINT wiki_pages_company_wiki_space_path_key UNIQUE (company_id, wiki_id, space_id, path);
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_distillation_cursors
|
|
ADD CONSTRAINT distillation_cursors_company_wiki_space_scope_key UNIQUE (company_id, wiki_id, space_id, source_scope, scope_key, source_kind);
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_distillation_work_items
|
|
ADD CONSTRAINT distillation_work_items_company_wiki_space_idempotency_key UNIQUE (company_id, wiki_id, space_id, idempotency_key);
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_page_bindings
|
|
ADD CONSTRAINT page_bindings_company_wiki_space_page_path_key UNIQUE (company_id, wiki_id, space_id, page_path);
|
|
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.wiki_sources
|
|
ADD CONSTRAINT wiki_sources_space_id_fk FOREIGN KEY (space_id) REFERENCES plugin_llm_wiki_8f50da974f.wiki_spaces(id) ON DELETE CASCADE;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.wiki_pages
|
|
ADD CONSTRAINT wiki_pages_space_id_fk FOREIGN KEY (space_id) REFERENCES plugin_llm_wiki_8f50da974f.wiki_spaces(id) ON DELETE CASCADE;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.wiki_page_revisions
|
|
ADD CONSTRAINT wiki_page_revisions_space_id_fk FOREIGN KEY (space_id) REFERENCES plugin_llm_wiki_8f50da974f.wiki_spaces(id) ON DELETE CASCADE;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.wiki_operations
|
|
ADD CONSTRAINT wiki_operations_space_id_fk FOREIGN KEY (space_id) REFERENCES plugin_llm_wiki_8f50da974f.wiki_spaces(id) ON DELETE CASCADE;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.wiki_query_sessions
|
|
ADD CONSTRAINT wiki_query_sessions_space_id_fk FOREIGN KEY (space_id) REFERENCES plugin_llm_wiki_8f50da974f.wiki_spaces(id) ON DELETE CASCADE;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_distillation_cursors
|
|
ADD CONSTRAINT paperclip_distillation_cursors_space_id_fk FOREIGN KEY (space_id) REFERENCES plugin_llm_wiki_8f50da974f.wiki_spaces(id) ON DELETE CASCADE;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_distillation_work_items
|
|
ADD CONSTRAINT paperclip_distillation_work_items_space_id_fk FOREIGN KEY (space_id) REFERENCES plugin_llm_wiki_8f50da974f.wiki_spaces(id) ON DELETE CASCADE;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_distillation_runs
|
|
ADD CONSTRAINT paperclip_distillation_runs_space_id_fk FOREIGN KEY (space_id) REFERENCES plugin_llm_wiki_8f50da974f.wiki_spaces(id) ON DELETE CASCADE;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_source_snapshots
|
|
ADD CONSTRAINT paperclip_source_snapshots_space_id_fk FOREIGN KEY (space_id) REFERENCES plugin_llm_wiki_8f50da974f.wiki_spaces(id) ON DELETE CASCADE;
|
|
ALTER TABLE plugin_llm_wiki_8f50da974f.paperclip_page_bindings
|
|
ADD CONSTRAINT paperclip_page_bindings_space_id_fk FOREIGN KEY (space_id) REFERENCES plugin_llm_wiki_8f50da974f.wiki_spaces(id) ON DELETE CASCADE;
|
|
|
|
CREATE INDEX wiki_sources_space_idx ON plugin_llm_wiki_8f50da974f.wiki_sources (company_id, wiki_id, space_id, created_at DESC);
|
|
CREATE INDEX wiki_operations_space_idx ON plugin_llm_wiki_8f50da974f.wiki_operations (company_id, wiki_id, space_id, created_at DESC);
|
|
CREATE INDEX wiki_query_sessions_space_idx ON plugin_llm_wiki_8f50da974f.wiki_query_sessions (company_id, wiki_id, space_id, updated_at DESC);
|
|
CREATE INDEX distillation_runs_space_idx ON plugin_llm_wiki_8f50da974f.paperclip_distillation_runs (company_id, wiki_id, space_id, created_at DESC);
|