@withpica/mcp-server 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +5 -0
- package/CHANGELOG.md +1850 -0
- package/README.md +304 -0
- package/assets/fonts/GeistSans-Light.woff2 +0 -0
- package/assets/fonts/InstrumentSerif-Italic.woff2 +0 -0
- package/assets/fonts/InstrumentSerif-Regular.woff2 +0 -0
- package/dist/apps/download.d.ts +2 -0
- package/dist/apps/download.d.ts.map +1 -0
- package/dist/apps/download.js +125 -0
- package/dist/apps/download.js.map +1 -0
- package/dist/apps/generated/shared-bundle.d.ts +5 -0
- package/dist/apps/generated/shared-bundle.d.ts.map +1 -0
- package/dist/apps/generated/shared-bundle.js +7 -0
- package/dist/apps/generated/shared-bundle.js.map +1 -0
- package/dist/apps/release.d.ts +2 -0
- package/dist/apps/release.d.ts.map +1 -0
- package/dist/apps/release.js +69 -0
- package/dist/apps/release.js.map +1 -0
- package/dist/apps/shared.d.ts +15 -0
- package/dist/apps/shared.d.ts.map +1 -0
- package/dist/apps/shared.js +480 -0
- package/dist/apps/shared.js.map +1 -0
- package/dist/apps/upload.d.ts +2 -0
- package/dist/apps/upload.d.ts.map +1 -0
- package/dist/apps/upload.js +280 -0
- package/dist/apps/upload.js.map +1 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +73 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +86 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +645 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/resources/agent-guide.d.ts +15 -0
- package/dist/resources/agent-guide.d.ts.map +1 -0
- package/dist/resources/agent-guide.js +284 -0
- package/dist/resources/agent-guide.js.map +1 -0
- package/dist/resources/index.d.ts +66 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +510 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/llms-primer.d.ts +2 -0
- package/dist/resources/llms-primer.d.ts.map +1 -0
- package/dist/resources/llms-primer.js +68 -0
- package/dist/resources/llms-primer.js.map +1 -0
- package/dist/resources/required-schemas.generated.d.ts +455 -0
- package/dist/resources/required-schemas.generated.d.ts.map +1 -0
- package/dist/resources/required-schemas.generated.js +1041 -0
- package/dist/resources/required-schemas.generated.js.map +1 -0
- package/dist/resources/required-schemas.source.d.ts +53 -0
- package/dist/resources/required-schemas.source.d.ts.map +1 -0
- package/dist/resources/required-schemas.source.js +493 -0
- package/dist/resources/required-schemas.source.js.map +1 -0
- package/dist/resources/welcome.d.ts +14 -0
- package/dist/resources/welcome.d.ts.map +1 -0
- package/dist/resources/welcome.js +26 -0
- package/dist/resources/welcome.js.map +1 -0
- package/dist/server-instructions.d.ts +60 -0
- package/dist/server-instructions.d.ts.map +1 -0
- package/dist/server-instructions.js +93 -0
- package/dist/server-instructions.js.map +1 -0
- package/dist/server.d.ts +52 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +334 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/access-simulate.d.ts +23 -0
- package/dist/tools/access-simulate.d.ts.map +1 -0
- package/dist/tools/access-simulate.js +162 -0
- package/dist/tools/access-simulate.js.map +1 -0
- package/dist/tools/agent-identity.d.ts +36 -0
- package/dist/tools/agent-identity.d.ts.map +1 -0
- package/dist/tools/agent-identity.js +274 -0
- package/dist/tools/agent-identity.js.map +1 -0
- package/dist/tools/agreement-types.d.ts +27 -0
- package/dist/tools/agreement-types.d.ts.map +1 -0
- package/dist/tools/agreement-types.js +281 -0
- package/dist/tools/agreement-types.js.map +1 -0
- package/dist/tools/agreements.d.ts +20 -0
- package/dist/tools/agreements.d.ts.map +1 -0
- package/dist/tools/agreements.js +282 -0
- package/dist/tools/agreements.js.map +1 -0
- package/dist/tools/analytics.d.ts +20 -0
- package/dist/tools/analytics.d.ts.map +1 -0
- package/dist/tools/analytics.js +130 -0
- package/dist/tools/analytics.js.map +1 -0
- package/dist/tools/app-tools.d.ts +15 -0
- package/dist/tools/app-tools.d.ts.map +1 -0
- package/dist/tools/app-tools.js +388 -0
- package/dist/tools/app-tools.js.map +1 -0
- package/dist/tools/assets.d.ts +25 -0
- package/dist/tools/assets.d.ts.map +1 -0
- package/dist/tools/assets.js +454 -0
- package/dist/tools/assets.js.map +1 -0
- package/dist/tools/audio-files.d.ts +20 -0
- package/dist/tools/audio-files.d.ts.map +1 -0
- package/dist/tools/audio-files.js +409 -0
- package/dist/tools/audio-files.js.map +1 -0
- package/dist/tools/audit.d.ts +19 -0
- package/dist/tools/audit.d.ts.map +1 -0
- package/dist/tools/audit.js +58 -0
- package/dist/tools/audit.js.map +1 -0
- package/dist/tools/auth.d.ts +22 -0
- package/dist/tools/auth.d.ts.map +1 -0
- package/dist/tools/auth.js +212 -0
- package/dist/tools/auth.js.map +1 -0
- package/dist/tools/bulk.d.ts +22 -0
- package/dist/tools/bulk.d.ts.map +1 -0
- package/dist/tools/bulk.js +164 -0
- package/dist/tools/bulk.js.map +1 -0
- package/dist/tools/calendar.d.ts +15 -0
- package/dist/tools/calendar.d.ts.map +1 -0
- package/dist/tools/calendar.js +68 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/collaborators.d.ts +21 -0
- package/dist/tools/collaborators.d.ts.map +1 -0
- package/dist/tools/collaborators.js +381 -0
- package/dist/tools/collaborators.js.map +1 -0
- package/dist/tools/comparisons.d.ts +22 -0
- package/dist/tools/comparisons.d.ts.map +1 -0
- package/dist/tools/comparisons.js +80 -0
- package/dist/tools/comparisons.js.map +1 -0
- package/dist/tools/credits.d.ts +39 -0
- package/dist/tools/credits.d.ts.map +1 -0
- package/dist/tools/credits.js +541 -0
- package/dist/tools/credits.js.map +1 -0
- package/dist/tools/custody-hints.d.ts +16 -0
- package/dist/tools/custody-hints.d.ts.map +1 -0
- package/dist/tools/custody-hints.js +27 -0
- package/dist/tools/custody-hints.js.map +1 -0
- package/dist/tools/custody.d.ts +38 -0
- package/dist/tools/custody.d.ts.map +1 -0
- package/dist/tools/custody.js +281 -0
- package/dist/tools/custody.js.map +1 -0
- package/dist/tools/dashboard.d.ts +22 -0
- package/dist/tools/dashboard.d.ts.map +1 -0
- package/dist/tools/dashboard.js +258 -0
- package/dist/tools/dashboard.js.map +1 -0
- package/dist/tools/directory.d.ts +15 -0
- package/dist/tools/directory.d.ts.map +1 -0
- package/dist/tools/directory.js +107 -0
- package/dist/tools/directory.js.map +1 -0
- package/dist/tools/discovery.d.ts +49 -0
- package/dist/tools/discovery.d.ts.map +1 -0
- package/dist/tools/discovery.js +851 -0
- package/dist/tools/discovery.js.map +1 -0
- package/dist/tools/disputes.d.ts +18 -0
- package/dist/tools/disputes.d.ts.map +1 -0
- package/dist/tools/disputes.js +62 -0
- package/dist/tools/disputes.js.map +1 -0
- package/dist/tools/documents.d.ts +15 -0
- package/dist/tools/documents.d.ts.map +1 -0
- package/dist/tools/documents.js +37 -0
- package/dist/tools/documents.js.map +1 -0
- package/dist/tools/duplicates.d.ts +25 -0
- package/dist/tools/duplicates.d.ts.map +1 -0
- package/dist/tools/duplicates.js +108 -0
- package/dist/tools/duplicates.js.map +1 -0
- package/dist/tools/enrichment.d.ts +56 -0
- package/dist/tools/enrichment.d.ts.map +1 -0
- package/dist/tools/enrichment.js +616 -0
- package/dist/tools/enrichment.js.map +1 -0
- package/dist/tools/exports.d.ts +19 -0
- package/dist/tools/exports.d.ts.map +1 -0
- package/dist/tools/exports.js +184 -0
- package/dist/tools/exports.js.map +1 -0
- package/dist/tools/feedback.d.ts +22 -0
- package/dist/tools/feedback.d.ts.map +1 -0
- package/dist/tools/feedback.js +100 -0
- package/dist/tools/feedback.js.map +1 -0
- package/dist/tools/forbidden-keywords.d.ts +62 -0
- package/dist/tools/forbidden-keywords.d.ts.map +1 -0
- package/dist/tools/forbidden-keywords.js +99 -0
- package/dist/tools/forbidden-keywords.js.map +1 -0
- package/dist/tools/gap-hints.d.ts +53 -0
- package/dist/tools/gap-hints.d.ts.map +1 -0
- package/dist/tools/gap-hints.js +245 -0
- package/dist/tools/gap-hints.js.map +1 -0
- package/dist/tools/groups.d.ts +29 -0
- package/dist/tools/groups.d.ts.map +1 -0
- package/dist/tools/groups.js +186 -0
- package/dist/tools/groups.js.map +1 -0
- package/dist/tools/import-documents.d.ts +21 -0
- package/dist/tools/import-documents.d.ts.map +1 -0
- package/dist/tools/import-documents.js +206 -0
- package/dist/tools/import-documents.js.map +1 -0
- package/dist/tools/import.d.ts +31 -0
- package/dist/tools/import.d.ts.map +1 -0
- package/dist/tools/import.js +610 -0
- package/dist/tools/import.js.map +1 -0
- package/dist/tools/index.d.ts +293 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +1182 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/integrations.d.ts +19 -0
- package/dist/tools/integrations.d.ts.map +1 -0
- package/dist/tools/integrations.js +120 -0
- package/dist/tools/integrations.js.map +1 -0
- package/dist/tools/labels.d.ts +20 -0
- package/dist/tools/labels.d.ts.map +1 -0
- package/dist/tools/labels.js +48 -0
- package/dist/tools/labels.js.map +1 -0
- package/dist/tools/licensing.d.ts +40 -0
- package/dist/tools/licensing.d.ts.map +1 -0
- package/dist/tools/licensing.js +436 -0
- package/dist/tools/licensing.js.map +1 -0
- package/dist/tools/memory.d.ts +21 -0
- package/dist/tools/memory.d.ts.map +1 -0
- package/dist/tools/memory.js +120 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/metadata.d.ts +15 -0
- package/dist/tools/metadata.d.ts.map +1 -0
- package/dist/tools/metadata.js +1532 -0
- package/dist/tools/metadata.js.map +1 -0
- package/dist/tools/multimedia.d.ts +19 -0
- package/dist/tools/multimedia.d.ts.map +1 -0
- package/dist/tools/multimedia.js +371 -0
- package/dist/tools/multimedia.js.map +1 -0
- package/dist/tools/my-reported-issues.d.ts +32 -0
- package/dist/tools/my-reported-issues.d.ts.map +1 -0
- package/dist/tools/my-reported-issues.js +123 -0
- package/dist/tools/my-reported-issues.js.map +1 -0
- package/dist/tools/notes.d.ts +21 -0
- package/dist/tools/notes.d.ts.map +1 -0
- package/dist/tools/notes.js +115 -0
- package/dist/tools/notes.js.map +1 -0
- package/dist/tools/notifications.d.ts +28 -0
- package/dist/tools/notifications.d.ts.map +1 -0
- package/dist/tools/notifications.js +417 -0
- package/dist/tools/notifications.js.map +1 -0
- package/dist/tools/onboarding.d.ts +24 -0
- package/dist/tools/onboarding.d.ts.map +1 -0
- package/dist/tools/onboarding.js +81 -0
- package/dist/tools/onboarding.js.map +1 -0
- package/dist/tools/people.d.ts +254 -0
- package/dist/tools/people.d.ts.map +1 -0
- package/dist/tools/people.js +481 -0
- package/dist/tools/people.js.map +1 -0
- package/dist/tools/projects.d.ts +20 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +316 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/public-filter.d.ts +43 -0
- package/dist/tools/public-filter.d.ts.map +1 -0
- package/dist/tools/public-filter.js +356 -0
- package/dist/tools/public-filter.js.map +1 -0
- package/dist/tools/publishers.d.ts +30 -0
- package/dist/tools/publishers.d.ts.map +1 -0
- package/dist/tools/publishers.js +105 -0
- package/dist/tools/publishers.js.map +1 -0
- package/dist/tools/purchases.d.ts +27 -0
- package/dist/tools/purchases.d.ts.map +1 -0
- package/dist/tools/purchases.js +9 -0
- package/dist/tools/purchases.js.map +1 -0
- package/dist/tools/recording-attribution-hints.d.ts +24 -0
- package/dist/tools/recording-attribution-hints.d.ts.map +1 -0
- package/dist/tools/recording-attribution-hints.js +27 -0
- package/dist/tools/recording-attribution-hints.js.map +1 -0
- package/dist/tools/recordings.d.ts +96 -0
- package/dist/tools/recordings.d.ts.map +1 -0
- package/dist/tools/recordings.js +564 -0
- package/dist/tools/recordings.js.map +1 -0
- package/dist/tools/recovery-hints.d.ts +40 -0
- package/dist/tools/recovery-hints.d.ts.map +1 -0
- package/dist/tools/recovery-hints.js +827 -0
- package/dist/tools/recovery-hints.js.map +1 -0
- package/dist/tools/release-rich.d.ts +31 -0
- package/dist/tools/release-rich.d.ts.map +1 -0
- package/dist/tools/release-rich.js +245 -0
- package/dist/tools/release-rich.js.map +1 -0
- package/dist/tools/releases.d.ts +36 -0
- package/dist/tools/releases.d.ts.map +1 -0
- package/dist/tools/releases.js +649 -0
- package/dist/tools/releases.js.map +1 -0
- package/dist/tools/report-issue.d.ts +21 -0
- package/dist/tools/report-issue.d.ts.map +1 -0
- package/dist/tools/report-issue.js +101 -0
- package/dist/tools/report-issue.js.map +1 -0
- package/dist/tools/royalties.d.ts +23 -0
- package/dist/tools/royalties.d.ts.map +1 -0
- package/dist/tools/royalties.js +262 -0
- package/dist/tools/royalties.js.map +1 -0
- package/dist/tools/search.d.ts +30 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +115 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/send.d.ts +17 -0
- package/dist/tools/send.d.ts.map +1 -0
- package/dist/tools/send.js +188 -0
- package/dist/tools/send.js.map +1 -0
- package/dist/tools/sessions.d.ts +18 -0
- package/dist/tools/sessions.d.ts.map +1 -0
- package/dist/tools/sessions.js +153 -0
- package/dist/tools/sessions.js.map +1 -0
- package/dist/tools/settings.d.ts +23 -0
- package/dist/tools/settings.d.ts.map +1 -0
- package/dist/tools/settings.js +365 -0
- package/dist/tools/settings.js.map +1 -0
- package/dist/tools/share-links.d.ts +22 -0
- package/dist/tools/share-links.d.ts.map +1 -0
- package/dist/tools/share-links.js +188 -0
- package/dist/tools/share-links.js.map +1 -0
- package/dist/tools/signup.d.ts +26 -0
- package/dist/tools/signup.d.ts.map +1 -0
- package/dist/tools/signup.js +266 -0
- package/dist/tools/signup.js.map +1 -0
- package/dist/tools/split-sheets.d.ts +25 -0
- package/dist/tools/split-sheets.d.ts.map +1 -0
- package/dist/tools/split-sheets.js +309 -0
- package/dist/tools/split-sheets.js.map +1 -0
- package/dist/tools/storage-config.d.ts +13 -0
- package/dist/tools/storage-config.d.ts.map +1 -0
- package/dist/tools/storage-config.js +245 -0
- package/dist/tools/storage-config.js.map +1 -0
- package/dist/tools/subscription.d.ts +60 -0
- package/dist/tools/subscription.d.ts.map +1 -0
- package/dist/tools/subscription.js +440 -0
- package/dist/tools/subscription.js.map +1 -0
- package/dist/tools/sync-placements.d.ts +31 -0
- package/dist/tools/sync-placements.d.ts.map +1 -0
- package/dist/tools/sync-placements.js +431 -0
- package/dist/tools/sync-placements.js.map +1 -0
- package/dist/tools/team.d.ts +22 -0
- package/dist/tools/team.d.ts.map +1 -0
- package/dist/tools/team.js +144 -0
- package/dist/tools/team.js.map +1 -0
- package/dist/tools/telegram.d.ts +21 -0
- package/dist/tools/telegram.d.ts.map +1 -0
- package/dist/tools/telegram.js +144 -0
- package/dist/tools/telegram.js.map +1 -0
- package/dist/tools/uploads.d.ts +17 -0
- package/dist/tools/uploads.d.ts.map +1 -0
- package/dist/tools/uploads.js +165 -0
- package/dist/tools/uploads.js.map +1 -0
- package/dist/tools/works.d.ts +71 -0
- package/dist/tools/works.d.ts.map +1 -0
- package/dist/tools/works.js +694 -0
- package/dist/tools/works.js.map +1 -0
- package/package.json +54 -0
- package/scripts/build-required-schemas.ts +233 -0
- package/scripts/bundle-apps.ts +61 -0
- package/scripts/refresh-schema-mirror.ts +182 -0
- package/server.json +20 -0
|
@@ -0,0 +1,610 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
import { formatSuccess, formatAsText, mapGapsToHints, } from "@withpica/mcp-utils";
|
|
3
|
+
const VALID_DOMAINS = [
|
|
4
|
+
"works",
|
|
5
|
+
"people",
|
|
6
|
+
"recordings",
|
|
7
|
+
"documents",
|
|
8
|
+
"enquiries",
|
|
9
|
+
"royalties",
|
|
10
|
+
];
|
|
11
|
+
export class ImportTools {
|
|
12
|
+
pica;
|
|
13
|
+
constructor(pica) {
|
|
14
|
+
this.pica = pica;
|
|
15
|
+
}
|
|
16
|
+
getTools() {
|
|
17
|
+
return [
|
|
18
|
+
{
|
|
19
|
+
definition: {
|
|
20
|
+
name: "pica_import_analyze",
|
|
21
|
+
description: "Analyze a CSV file and get AI-suggested column mappings. Pass the raw CSV content as a string. " +
|
|
22
|
+
"Returns parsed headers, sample rows, and AI-suggested mappings from CSV columns to PICA fields. " +
|
|
23
|
+
"Use this as the first step before validate and execute. " +
|
|
24
|
+
"→ then: pica_import_validate (check for errors), pica_import_execute (run the import)",
|
|
25
|
+
workflows: "infrastructure",
|
|
26
|
+
inputSchema: {
|
|
27
|
+
type: "object",
|
|
28
|
+
properties: {
|
|
29
|
+
file_content: {
|
|
30
|
+
type: "string",
|
|
31
|
+
description: "Raw CSV content as a string (read the CSV file and pass its contents here)",
|
|
32
|
+
},
|
|
33
|
+
domain: {
|
|
34
|
+
type: "string",
|
|
35
|
+
description: "Import domain — what type of records to create",
|
|
36
|
+
enum: VALID_DOMAINS,
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
required: ["file_content", "domain"],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
executor: this.analyzeImport.bind(this),
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
definition: {
|
|
46
|
+
name: "pica_import_validate",
|
|
47
|
+
description: "Validate all CSV rows against a field mapping before executing import. " +
|
|
48
|
+
"Returns per-row validation errors and a summary of valid/invalid rows. " +
|
|
49
|
+
"Run this after pica_import_analyze to check for issues before importing.",
|
|
50
|
+
workflows: "infrastructure",
|
|
51
|
+
inputSchema: {
|
|
52
|
+
type: "object",
|
|
53
|
+
properties: {
|
|
54
|
+
file_content: {
|
|
55
|
+
type: "string",
|
|
56
|
+
description: "Raw CSV content (same as passed to pica_import_analyze)",
|
|
57
|
+
},
|
|
58
|
+
domain: {
|
|
59
|
+
type: "string",
|
|
60
|
+
description: "Import domain",
|
|
61
|
+
enum: VALID_DOMAINS,
|
|
62
|
+
},
|
|
63
|
+
mapping: {
|
|
64
|
+
type: "array",
|
|
65
|
+
description: "Column mappings from pica_import_analyze (or manually adjusted). " +
|
|
66
|
+
"Each entry maps a CSV column to a PICA target field.",
|
|
67
|
+
items: {
|
|
68
|
+
type: "object",
|
|
69
|
+
properties: {
|
|
70
|
+
csvColumn: {
|
|
71
|
+
type: "string",
|
|
72
|
+
description: "CSV column header name",
|
|
73
|
+
},
|
|
74
|
+
targetField: {
|
|
75
|
+
type: "string",
|
|
76
|
+
description: "PICA database field name",
|
|
77
|
+
},
|
|
78
|
+
transformType: {
|
|
79
|
+
type: "string",
|
|
80
|
+
description: "Transform to apply (default: 'text'). Options: text, date, number, boolean, enum",
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
required: ["csvColumn", "targetField"],
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
required: ["file_content", "domain", "mapping"],
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
executor: this.validateImport.bind(this),
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
definition: {
|
|
94
|
+
name: "pica_import_execute",
|
|
95
|
+
description: "Execute a bulk import from CSV. Creates records in PICA based on the CSV data and field mapping. " +
|
|
96
|
+
"Always run pica_import_validate first to check for errors. " +
|
|
97
|
+
"Use dry_run: true to preview what would be imported without actually creating records. " +
|
|
98
|
+
"Max 10,000 rows per import.",
|
|
99
|
+
workflows: "infrastructure",
|
|
100
|
+
inputSchema: {
|
|
101
|
+
type: "object",
|
|
102
|
+
properties: {
|
|
103
|
+
file_content: {
|
|
104
|
+
type: "string",
|
|
105
|
+
description: "Raw CSV content",
|
|
106
|
+
},
|
|
107
|
+
domain: {
|
|
108
|
+
type: "string",
|
|
109
|
+
description: "Import domain",
|
|
110
|
+
enum: VALID_DOMAINS,
|
|
111
|
+
},
|
|
112
|
+
mapping: {
|
|
113
|
+
type: "array",
|
|
114
|
+
description: "Column mappings (same format as pica_import_validate)",
|
|
115
|
+
items: {
|
|
116
|
+
type: "object",
|
|
117
|
+
properties: {
|
|
118
|
+
csvColumn: { type: "string", description: "Name of the column in the CSV file" },
|
|
119
|
+
targetField: { type: "string", description: "PICA field to map the column to" },
|
|
120
|
+
transformType: { type: "string", description: "Optional transform to apply (e.g. date, uppercase)" },
|
|
121
|
+
},
|
|
122
|
+
required: ["csvColumn", "targetField"],
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
dry_run: {
|
|
126
|
+
type: "boolean",
|
|
127
|
+
description: "If true, simulates the import without creating records. Recommended before first real import.",
|
|
128
|
+
},
|
|
129
|
+
skip_invalid_rows: {
|
|
130
|
+
type: "boolean",
|
|
131
|
+
description: "If true, skips rows with validation errors instead of failing the entire import.",
|
|
132
|
+
},
|
|
133
|
+
batch_size: {
|
|
134
|
+
type: "number",
|
|
135
|
+
description: "Number of rows to process per batch (default: 50, max: 1000)",
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
required: ["file_content", "domain", "mapping"],
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
executor: this.executeImport.bind(this),
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
definition: {
|
|
145
|
+
name: "pica_import_fields",
|
|
146
|
+
description: "Get the available target fields for an import domain. Returns field names, labels, types, " +
|
|
147
|
+
"and whether they are required. Useful for understanding what columns a CSV should have.",
|
|
148
|
+
workflows: "infrastructure",
|
|
149
|
+
inputSchema: {
|
|
150
|
+
type: "object",
|
|
151
|
+
properties: {
|
|
152
|
+
domain: {
|
|
153
|
+
type: "string",
|
|
154
|
+
description: "Import domain to get fields for",
|
|
155
|
+
enum: VALID_DOMAINS,
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
required: ["domain"],
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
executor: this.getImportFields.bind(this),
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
definition: {
|
|
165
|
+
name: "pica_import_template",
|
|
166
|
+
description: "Get an example CSV template for an import domain. Returns a CSV string with headers " +
|
|
167
|
+
"and example rows that can be used as a starting point.",
|
|
168
|
+
workflows: "infrastructure",
|
|
169
|
+
inputSchema: {
|
|
170
|
+
type: "object",
|
|
171
|
+
properties: {
|
|
172
|
+
domain: {
|
|
173
|
+
type: "string",
|
|
174
|
+
description: "Import domain to get template for",
|
|
175
|
+
enum: VALID_DOMAINS,
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
required: ["domain"],
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
executor: this.getImportTemplate.bind(this),
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
definition: {
|
|
185
|
+
name: "pica_import_from_spotify",
|
|
186
|
+
description: "Import works from a Spotify URL (track, album, or playlist). " +
|
|
187
|
+
"Matches tracks against existing catalog works, enriches matches, creates new works for unmatched. " +
|
|
188
|
+
"Two-step: omit confirm to preview, set confirm: true to execute. " +
|
|
189
|
+
"→ then: pica_works_query (check imported works)",
|
|
190
|
+
workflows: "infrastructure",
|
|
191
|
+
inputSchema: {
|
|
192
|
+
type: "object",
|
|
193
|
+
properties: {
|
|
194
|
+
spotify_url: {
|
|
195
|
+
type: "string",
|
|
196
|
+
description: "Any Spotify URL or URI — track, album, or playlist.",
|
|
197
|
+
},
|
|
198
|
+
confirm: {
|
|
199
|
+
type: "boolean",
|
|
200
|
+
description: "Set true to execute import. Omit or false to preview first.",
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
required: ["spotify_url"],
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
executor: this.importFromSpotify.bind(this),
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
definition: {
|
|
210
|
+
name: "pica_import_streaming_link",
|
|
211
|
+
description: "Import works from a Spotify or Deezer URL. Paste a track, album, or playlist link " +
|
|
212
|
+
"and PICA will fetch all tracks and create works, recordings, people, and performer credits automatically. " +
|
|
213
|
+
"Two-step flow: first call without confirm to preview tracks, then call with confirm: true to execute.\n\n" +
|
|
214
|
+
"Supported platforms: Spotify (track/album/playlist), Deezer (track/album/playlist).\n" +
|
|
215
|
+
"Apple Music and artist profile URLs are not yet supported.\n\n" +
|
|
216
|
+
"Each imported track creates: a work (with title, ISRC, UPC, label, artwork), " +
|
|
217
|
+
"a recording (with ISRC, linked to work), people records for artists, " +
|
|
218
|
+
"performer credits, and multimedia links. Enrichment cascades fire automatically. " +
|
|
219
|
+
"→ then: pica_credits_update (add songwriting credits), pica_works_inspect (check gaps)",
|
|
220
|
+
workflows: "infrastructure",
|
|
221
|
+
inputSchema: {
|
|
222
|
+
type: "object",
|
|
223
|
+
properties: {
|
|
224
|
+
url: {
|
|
225
|
+
type: "string",
|
|
226
|
+
description: "Spotify or Deezer URL (track, album, or playlist). " +
|
|
227
|
+
"Examples: https://open.spotify.com/album/4aawyAB9vmqN3uQ7FjRGTy, " +
|
|
228
|
+
"https://deezer.com/playlist/1234567",
|
|
229
|
+
},
|
|
230
|
+
confirm: {
|
|
231
|
+
type: "boolean",
|
|
232
|
+
description: "Set to true to execute the import. Omit or set false to preview tracks first.",
|
|
233
|
+
},
|
|
234
|
+
selected_track_ids: {
|
|
235
|
+
type: "array",
|
|
236
|
+
items: { type: "string" },
|
|
237
|
+
description: "Optional: external IDs of specific tracks to import (from the preview). " +
|
|
238
|
+
"If omitted, all non-duplicate tracks are imported.",
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
required: ["url"],
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
executor: this.importStreamingLink.bind(this),
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
definition: {
|
|
248
|
+
name: "pica_import_youtube_link",
|
|
249
|
+
description: "Import a YouTube video as a recording attached to a matching work. " +
|
|
250
|
+
"Paste a YouTube URL (video ID or full watch URL) and PICA will classify the video's " +
|
|
251
|
+
"version type (music_video / live_performance / acoustic / cover / remix / lyric_video / " +
|
|
252
|
+
"alternate / master), match it to an existing work when possible, or create a new work " +
|
|
253
|
+
"if no match.\n\n" +
|
|
254
|
+
"Two-step flow: first call without confirm to preview the video + classification + " +
|
|
255
|
+
"work match, then call with confirm: true to execute.\n\n" +
|
|
256
|
+
"Each imported video creates: a recording (with version_type, youtube_video_id, duration, " +
|
|
257
|
+
"artist name, thumbnail as album art), a multimedia_items row linked to the work via " +
|
|
258
|
+
"multimedia_work_links. The post-import enrichment cascade hydrates view/like counts " +
|
|
259
|
+
"onto the recording.\n\n" +
|
|
260
|
+
"→ then: pica_credits_update (add songwriting credits), pica_recordings_inspect (check gaps)",
|
|
261
|
+
workflows: "infrastructure",
|
|
262
|
+
inputSchema: {
|
|
263
|
+
type: "object",
|
|
264
|
+
properties: {
|
|
265
|
+
url: {
|
|
266
|
+
type: "string",
|
|
267
|
+
description: "YouTube URL or video ID. Examples: " +
|
|
268
|
+
"https://www.youtube.com/watch?v=dQw4w9WgXcQ, " +
|
|
269
|
+
"https://youtu.be/dQw4w9WgXcQ, " +
|
|
270
|
+
"dQw4w9WgXcQ",
|
|
271
|
+
},
|
|
272
|
+
confirm: {
|
|
273
|
+
type: "boolean",
|
|
274
|
+
description: "Set to true to execute the import. Omit or set false to preview the video + classification first.",
|
|
275
|
+
},
|
|
276
|
+
selected_video_ids: {
|
|
277
|
+
type: "array",
|
|
278
|
+
items: { type: "string" },
|
|
279
|
+
description: "Optional: subset of video IDs from the preview to import. " +
|
|
280
|
+
"If omitted, every preview item is imported.",
|
|
281
|
+
},
|
|
282
|
+
target_work_id: {
|
|
283
|
+
type: "string",
|
|
284
|
+
description: "Optional: force-attach the recording to this work id instead of running the matcher. " +
|
|
285
|
+
"Use when the agent already knows which work the video belongs to.",
|
|
286
|
+
},
|
|
287
|
+
override_version_type: {
|
|
288
|
+
type: "string",
|
|
289
|
+
enum: [
|
|
290
|
+
"master",
|
|
291
|
+
"alternate_master",
|
|
292
|
+
"music_video",
|
|
293
|
+
"lyric_video",
|
|
294
|
+
"live_performance",
|
|
295
|
+
"acoustic",
|
|
296
|
+
"remix",
|
|
297
|
+
"cover",
|
|
298
|
+
"alternate",
|
|
299
|
+
],
|
|
300
|
+
description: "Optional: force a specific version_type on the recording instead of using the heuristic classifier.",
|
|
301
|
+
},
|
|
302
|
+
},
|
|
303
|
+
required: ["url"],
|
|
304
|
+
},
|
|
305
|
+
},
|
|
306
|
+
executor: this.importYouTubeLink.bind(this),
|
|
307
|
+
},
|
|
308
|
+
];
|
|
309
|
+
}
|
|
310
|
+
async analyzeImport(args) {
|
|
311
|
+
const result = await this.pica.imports.analyze({
|
|
312
|
+
fileContent: args.file_content,
|
|
313
|
+
domain: args.domain,
|
|
314
|
+
});
|
|
315
|
+
const parsed = result.parsed;
|
|
316
|
+
const mappingCount = Object.keys(result.analysis?.mappings || {}).length;
|
|
317
|
+
return formatSuccess(`CSV analyzed: ${parsed.totalRows} rows, ${parsed.headers.length} columns. ` +
|
|
318
|
+
`${mappingCount} columns auto-mapped. ` +
|
|
319
|
+
`Review the mappings and run pica_import_validate to check for errors.`, {
|
|
320
|
+
headers: parsed.headers,
|
|
321
|
+
totalRows: parsed.totalRows,
|
|
322
|
+
sampleRows: parsed.rows.slice(0, 3),
|
|
323
|
+
mappings: result.analysis?.mappings,
|
|
324
|
+
suggestions: result.analysis?.suggestions,
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
async validateImport(args) {
|
|
328
|
+
const result = await this.pica.imports.validate({
|
|
329
|
+
domain: args.domain,
|
|
330
|
+
fileContent: args.file_content,
|
|
331
|
+
mapping: args.mapping,
|
|
332
|
+
});
|
|
333
|
+
if (result.valid) {
|
|
334
|
+
return formatSuccess(`All ${result.totalRowCount} rows are valid. Ready to import with pica_import_execute.`, {
|
|
335
|
+
validRowCount: result.validRowCount,
|
|
336
|
+
totalRowCount: result.totalRowCount,
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
return formatSuccess(`Validation: ${result.validRowCount}/${result.totalRowCount} rows valid, ` +
|
|
340
|
+
`${result.invalidRowCount} invalid. ` +
|
|
341
|
+
`Fix the errors or use skip_invalid_rows: true when importing.`, {
|
|
342
|
+
valid: result.valid,
|
|
343
|
+
validRowCount: result.validRowCount,
|
|
344
|
+
invalidRowCount: result.invalidRowCount,
|
|
345
|
+
totalRowCount: result.totalRowCount,
|
|
346
|
+
errorsByType: result.errorsByType,
|
|
347
|
+
errors: result.errors.slice(0, 20),
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
async executeImport(args) {
|
|
351
|
+
const result = await this.pica.imports.execute({
|
|
352
|
+
domain: args.domain,
|
|
353
|
+
fileContent: args.file_content,
|
|
354
|
+
mapping: args.mapping,
|
|
355
|
+
options: {
|
|
356
|
+
dryRun: args.dry_run ?? false,
|
|
357
|
+
skipInvalidRows: args.skip_invalid_rows ?? false,
|
|
358
|
+
batchSize: args.batch_size,
|
|
359
|
+
},
|
|
360
|
+
});
|
|
361
|
+
const prefix = result.dryRun ? "[DRY RUN] " : "";
|
|
362
|
+
return formatSuccess(`${prefix}Import complete: ${result.importedCount} created, ` +
|
|
363
|
+
`${result.updatedCount} updated, ${result.skippedCount} skipped. ` +
|
|
364
|
+
`${result.errors.length} errors.`, {
|
|
365
|
+
importedCount: result.importedCount,
|
|
366
|
+
updatedCount: result.updatedCount,
|
|
367
|
+
skippedCount: result.skippedCount,
|
|
368
|
+
dryRun: result.dryRun,
|
|
369
|
+
errors: result.errors.length > 0 ? result.errors.slice(0, 10) : undefined,
|
|
370
|
+
createdRecords: result.createdRecords.length <= 20
|
|
371
|
+
? result.createdRecords
|
|
372
|
+
: `${result.createdRecords.length} records (showing first 20)`,
|
|
373
|
+
summary: result.summary,
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
async getImportFields(args) {
|
|
377
|
+
const fields = await this.pica.imports.getFields(args.domain);
|
|
378
|
+
return formatAsText({
|
|
379
|
+
domain: args.domain,
|
|
380
|
+
fields,
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
async getImportTemplate(args) {
|
|
384
|
+
const csvContent = await this.pica.imports.getTemplate(args.domain);
|
|
385
|
+
return formatSuccess(`Template CSV for "${args.domain}" import. Use this as a starting point.`, { csvContent });
|
|
386
|
+
}
|
|
387
|
+
async importFromSpotify(args) {
|
|
388
|
+
const spotifyUrl = args.spotify_url;
|
|
389
|
+
if (!spotifyUrl) {
|
|
390
|
+
return {
|
|
391
|
+
content: [{ type: "text", text: "Error: spotify_url is required" }],
|
|
392
|
+
isError: true,
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
try {
|
|
396
|
+
if (args.confirm) {
|
|
397
|
+
const result = await this.pica.enrichment.spotifyUrlExecute(spotifyUrl);
|
|
398
|
+
const data = result.data ?? result;
|
|
399
|
+
return formatSuccess(`Spotify import complete: ${data.worksCreated ?? 0} works created, ` +
|
|
400
|
+
`${data.worksEnriched ?? data.enrichResults?.length ?? 0} works enriched, ` +
|
|
401
|
+
`${data.duplicatesSkipped ?? 0} duplicates skipped`, data);
|
|
402
|
+
}
|
|
403
|
+
const result = await this.pica.enrichment.spotifyUrlPreview(spotifyUrl);
|
|
404
|
+
const data = result.data ?? result;
|
|
405
|
+
const trackCount = data.tracks?.length ?? 0;
|
|
406
|
+
const newCount = data.newTracks?.length ?? 0;
|
|
407
|
+
const dupCount = data.duplicates?.length ?? 0;
|
|
408
|
+
return formatSuccess(`Spotify preview: ${trackCount} tracks found. ` +
|
|
409
|
+
`${newCount} new (will be created), ${dupCount} already in catalog (will be enriched). ` +
|
|
410
|
+
`Call again with confirm: true to execute.`, data);
|
|
411
|
+
}
|
|
412
|
+
catch (error) {
|
|
413
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
414
|
+
return {
|
|
415
|
+
content: [
|
|
416
|
+
{
|
|
417
|
+
type: "text",
|
|
418
|
+
text: `Spotify import failed: ${message}`,
|
|
419
|
+
},
|
|
420
|
+
],
|
|
421
|
+
isError: true,
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
async importStreamingLink(args) {
|
|
426
|
+
const url = args.url;
|
|
427
|
+
if (!url) {
|
|
428
|
+
return {
|
|
429
|
+
content: [{ type: "text", text: "Error: url is required" }],
|
|
430
|
+
isError: true,
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
try {
|
|
434
|
+
if (args.confirm) {
|
|
435
|
+
// Execute import
|
|
436
|
+
const result = await this.pica.imports.streamingLinkImport(url, args.selected_track_ids);
|
|
437
|
+
// Generate completion hints by sampling the first created work
|
|
438
|
+
const hints = [];
|
|
439
|
+
if (result.workIds?.length > 0) {
|
|
440
|
+
try {
|
|
441
|
+
const sample = await this.pica.health.getWorkCompleteness(result.workIds[0]);
|
|
442
|
+
hints.push(...mapGapsToHints(sample?.gaps || sample?.missing || []));
|
|
443
|
+
}
|
|
444
|
+
catch {
|
|
445
|
+
// Completeness check is best-effort — don't fail the import
|
|
446
|
+
}
|
|
447
|
+
// Hint about songwriting credits for streaming imports
|
|
448
|
+
// (streaming platforms only provide performer credits, not writers)
|
|
449
|
+
if (!hints.some((h) => h.gap.includes("credit"))) {
|
|
450
|
+
hints.push({
|
|
451
|
+
gap: "no_songwriting_credits",
|
|
452
|
+
suggestion: "Add songwriting credits — streaming imports only include performer credits",
|
|
453
|
+
count: result.worksCreated,
|
|
454
|
+
severity: "critical",
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
return formatSuccess(`Streaming import complete: ${result.worksCreated} works, ` +
|
|
459
|
+
`${result.recordingsCreated} recordings, ${result.peopleCreated} people, ` +
|
|
460
|
+
`${result.creditsCreated} credits created. ` +
|
|
461
|
+
`${result.duplicatesSkipped} duplicates skipped.`, {
|
|
462
|
+
worksCreated: result.worksCreated,
|
|
463
|
+
recordingsCreated: result.recordingsCreated,
|
|
464
|
+
peopleCreated: result.peopleCreated,
|
|
465
|
+
creditsCreated: result.creditsCreated,
|
|
466
|
+
multimediaLinked: result.multimediaLinked,
|
|
467
|
+
duplicatesSkipped: result.duplicatesSkipped,
|
|
468
|
+
workIds: result.workIds,
|
|
469
|
+
}, hints);
|
|
470
|
+
}
|
|
471
|
+
// Preview mode
|
|
472
|
+
const preview = await this.pica.imports.streamingLinkPreview(url);
|
|
473
|
+
const trackSummary = preview.newTracks
|
|
474
|
+
.slice(0, 10)
|
|
475
|
+
.map((t) => ` - ${t.title} — ${t.artists.map((a) => a.name).join(", ")}${t.isrc ? ` [${t.isrc}]` : ""}`)
|
|
476
|
+
.join("\n");
|
|
477
|
+
const dupSummary = preview.duplicates.length > 0
|
|
478
|
+
? `\n\n${preview.duplicates.length} duplicates found (will be skipped):\n` +
|
|
479
|
+
preview.duplicates
|
|
480
|
+
.slice(0, 5)
|
|
481
|
+
.map((d) => ` - "${d.track.title}" matches "${d.existingTitle}" (${d.matchType})`)
|
|
482
|
+
.join("\n")
|
|
483
|
+
: "";
|
|
484
|
+
return formatSuccess(`Found ${preview.tracks.length} tracks from ${preview.source.platform} ${preview.source.type}. ` +
|
|
485
|
+
`${preview.newTracks.length} new, ${preview.duplicates.length} duplicates.\n\n` +
|
|
486
|
+
`New tracks:\n${trackSummary}` +
|
|
487
|
+
(preview.newTracks.length > 10
|
|
488
|
+
? `\n ... and ${preview.newTracks.length - 10} more`
|
|
489
|
+
: "") +
|
|
490
|
+
dupSummary +
|
|
491
|
+
`\n\nTo import, call again with confirm: true.`, {
|
|
492
|
+
source: preview.source,
|
|
493
|
+
totalTracks: preview.tracks.length,
|
|
494
|
+
newTrackCount: preview.newTracks.length,
|
|
495
|
+
duplicateCount: preview.duplicates.length,
|
|
496
|
+
newTracks: preview.newTracks.map((t) => ({
|
|
497
|
+
title: t.title,
|
|
498
|
+
artists: t.artists.map((a) => a.name),
|
|
499
|
+
isrc: t.isrc,
|
|
500
|
+
externalId: t.externalId,
|
|
501
|
+
})),
|
|
502
|
+
duplicates: preview.duplicates.map((d) => ({
|
|
503
|
+
title: d.track.title,
|
|
504
|
+
existingTitle: d.existingTitle,
|
|
505
|
+
existingWorkId: d.existingWorkId,
|
|
506
|
+
matchType: d.matchType,
|
|
507
|
+
})),
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
catch (error) {
|
|
511
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
512
|
+
return {
|
|
513
|
+
content: [
|
|
514
|
+
{
|
|
515
|
+
type: "text",
|
|
516
|
+
text: `Streaming import failed: ${message}`,
|
|
517
|
+
},
|
|
518
|
+
],
|
|
519
|
+
isError: true,
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
async importYouTubeLink(args) {
|
|
524
|
+
const url = args.url;
|
|
525
|
+
if (!url) {
|
|
526
|
+
return {
|
|
527
|
+
content: [{ type: "text", text: "Error: url is required" }],
|
|
528
|
+
isError: true,
|
|
529
|
+
};
|
|
530
|
+
}
|
|
531
|
+
try {
|
|
532
|
+
if (args.confirm) {
|
|
533
|
+
const result = await this.pica.imports.youtubeLinkImport(url, {
|
|
534
|
+
selectedVideoIds: args.selected_video_ids,
|
|
535
|
+
targetWorkId: args.target_work_id,
|
|
536
|
+
overrideVersionType: args.override_version_type,
|
|
537
|
+
});
|
|
538
|
+
// Completion hints pointed at filling songwriting credits +
|
|
539
|
+
// inspecting the new recording (same shape as the streaming
|
|
540
|
+
// import hints — YouTube never provides writer data, and the
|
|
541
|
+
// newly-created recording's gap profile is worth surfacing).
|
|
542
|
+
const hints = [];
|
|
543
|
+
if (result.recordingsCreated > 0) {
|
|
544
|
+
hints.push({
|
|
545
|
+
gap: "no_songwriting_credits",
|
|
546
|
+
suggestion: "YouTube imports don't include writer data — add songwriting credits via pica_credits_update",
|
|
547
|
+
count: result.recordingsCreated,
|
|
548
|
+
severity: "critical",
|
|
549
|
+
});
|
|
550
|
+
if (result.workIds?.length > 0) {
|
|
551
|
+
hints.push({
|
|
552
|
+
gap: "verify_recording",
|
|
553
|
+
suggestion: `Inspect the new recording${result.recordingsCreated > 1 ? "s" : ""} with pica_recordings_inspect to confirm the classification + fill any gaps`,
|
|
554
|
+
count: result.recordingsCreated,
|
|
555
|
+
severity: "important",
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
const itemSummary = result.items
|
|
560
|
+
.map((i) => {
|
|
561
|
+
if (i.status === "error")
|
|
562
|
+
return ` ❌ ${i.videoId}: ${i.error ?? "unknown error"}`;
|
|
563
|
+
if (i.status === "skipped")
|
|
564
|
+
return ` ⏭ ${i.videoId}: skipped`;
|
|
565
|
+
return ` ✓ ${i.videoId}: ${i.versionType} → work ${i.workId} (${i.matched ? "matched" : "new"})`;
|
|
566
|
+
})
|
|
567
|
+
.join("\n");
|
|
568
|
+
return formatSuccess(`YouTube import complete: ${result.recordingsCreated} recording(s) created, ` +
|
|
569
|
+
`${result.worksCreated} new work(s), ${result.worksMatched} existing work(s) matched, ` +
|
|
570
|
+
`${result.multimediaLinked} multimedia row(s) linked.\n\n` +
|
|
571
|
+
itemSummary, result, hints);
|
|
572
|
+
}
|
|
573
|
+
const preview = await this.pica.imports.youtubeLinkPreview(url);
|
|
574
|
+
const itemLines = preview.items
|
|
575
|
+
.map((item) => {
|
|
576
|
+
const t = item.track;
|
|
577
|
+
const c = item.classification;
|
|
578
|
+
const match = item.match;
|
|
579
|
+
const matchLine = match
|
|
580
|
+
? `matched work ${match.workId} (${match.confidence}% — ${match.reason})`
|
|
581
|
+
: "no work match → will create a new work";
|
|
582
|
+
const duration = t.durationMs
|
|
583
|
+
? `${Math.round(t.durationMs / 1000)}s`
|
|
584
|
+
: "unknown duration";
|
|
585
|
+
return (` • "${t.title}" — ${t.channel} (${duration}, ${t.viewCount ?? "?"} views)\n` +
|
|
586
|
+
` version: ${c.versionType} (confidence ${c.confidence} — ${c.reason})\n` +
|
|
587
|
+
` ${matchLine}`);
|
|
588
|
+
})
|
|
589
|
+
.join("\n\n");
|
|
590
|
+
return formatSuccess(`YouTube preview: ${preview.items.length} video(s) resolved from ${preview.source.type} "${preview.source.name}".\n\n` +
|
|
591
|
+
itemLines +
|
|
592
|
+
`\n\nTo import, call again with confirm: true. ` +
|
|
593
|
+
`Override the classification with override_version_type, ` +
|
|
594
|
+
`or attach to a specific work with target_work_id.`, preview);
|
|
595
|
+
}
|
|
596
|
+
catch (error) {
|
|
597
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
598
|
+
return {
|
|
599
|
+
content: [
|
|
600
|
+
{
|
|
601
|
+
type: "text",
|
|
602
|
+
text: `YouTube import failed: ${message}`,
|
|
603
|
+
},
|
|
604
|
+
],
|
|
605
|
+
isError: true,
|
|
606
|
+
};
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/tools/import.ts"],"names":[],"mappings":"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"}
|