@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.
Files changed (347) hide show
  1. package/.claude/settings.local.json +5 -0
  2. package/CHANGELOG.md +1850 -0
  3. package/README.md +304 -0
  4. package/assets/fonts/GeistSans-Light.woff2 +0 -0
  5. package/assets/fonts/InstrumentSerif-Italic.woff2 +0 -0
  6. package/assets/fonts/InstrumentSerif-Regular.woff2 +0 -0
  7. package/dist/apps/download.d.ts +2 -0
  8. package/dist/apps/download.d.ts.map +1 -0
  9. package/dist/apps/download.js +125 -0
  10. package/dist/apps/download.js.map +1 -0
  11. package/dist/apps/generated/shared-bundle.d.ts +5 -0
  12. package/dist/apps/generated/shared-bundle.d.ts.map +1 -0
  13. package/dist/apps/generated/shared-bundle.js +7 -0
  14. package/dist/apps/generated/shared-bundle.js.map +1 -0
  15. package/dist/apps/release.d.ts +2 -0
  16. package/dist/apps/release.d.ts.map +1 -0
  17. package/dist/apps/release.js +69 -0
  18. package/dist/apps/release.js.map +1 -0
  19. package/dist/apps/shared.d.ts +15 -0
  20. package/dist/apps/shared.d.ts.map +1 -0
  21. package/dist/apps/shared.js +480 -0
  22. package/dist/apps/shared.js.map +1 -0
  23. package/dist/apps/upload.d.ts +2 -0
  24. package/dist/apps/upload.d.ts.map +1 -0
  25. package/dist/apps/upload.js +280 -0
  26. package/dist/apps/upload.js.map +1 -0
  27. package/dist/config.d.ts +14 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +73 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +35 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/prompts/index.d.ts +86 -0
  36. package/dist/prompts/index.d.ts.map +1 -0
  37. package/dist/prompts/index.js +645 -0
  38. package/dist/prompts/index.js.map +1 -0
  39. package/dist/resources/agent-guide.d.ts +15 -0
  40. package/dist/resources/agent-guide.d.ts.map +1 -0
  41. package/dist/resources/agent-guide.js +284 -0
  42. package/dist/resources/agent-guide.js.map +1 -0
  43. package/dist/resources/index.d.ts +66 -0
  44. package/dist/resources/index.d.ts.map +1 -0
  45. package/dist/resources/index.js +510 -0
  46. package/dist/resources/index.js.map +1 -0
  47. package/dist/resources/llms-primer.d.ts +2 -0
  48. package/dist/resources/llms-primer.d.ts.map +1 -0
  49. package/dist/resources/llms-primer.js +68 -0
  50. package/dist/resources/llms-primer.js.map +1 -0
  51. package/dist/resources/required-schemas.generated.d.ts +455 -0
  52. package/dist/resources/required-schemas.generated.d.ts.map +1 -0
  53. package/dist/resources/required-schemas.generated.js +1041 -0
  54. package/dist/resources/required-schemas.generated.js.map +1 -0
  55. package/dist/resources/required-schemas.source.d.ts +53 -0
  56. package/dist/resources/required-schemas.source.d.ts.map +1 -0
  57. package/dist/resources/required-schemas.source.js +493 -0
  58. package/dist/resources/required-schemas.source.js.map +1 -0
  59. package/dist/resources/welcome.d.ts +14 -0
  60. package/dist/resources/welcome.d.ts.map +1 -0
  61. package/dist/resources/welcome.js +26 -0
  62. package/dist/resources/welcome.js.map +1 -0
  63. package/dist/server-instructions.d.ts +60 -0
  64. package/dist/server-instructions.d.ts.map +1 -0
  65. package/dist/server-instructions.js +93 -0
  66. package/dist/server-instructions.js.map +1 -0
  67. package/dist/server.d.ts +52 -0
  68. package/dist/server.d.ts.map +1 -0
  69. package/dist/server.js +334 -0
  70. package/dist/server.js.map +1 -0
  71. package/dist/tools/access-simulate.d.ts +23 -0
  72. package/dist/tools/access-simulate.d.ts.map +1 -0
  73. package/dist/tools/access-simulate.js +162 -0
  74. package/dist/tools/access-simulate.js.map +1 -0
  75. package/dist/tools/agent-identity.d.ts +36 -0
  76. package/dist/tools/agent-identity.d.ts.map +1 -0
  77. package/dist/tools/agent-identity.js +274 -0
  78. package/dist/tools/agent-identity.js.map +1 -0
  79. package/dist/tools/agreement-types.d.ts +27 -0
  80. package/dist/tools/agreement-types.d.ts.map +1 -0
  81. package/dist/tools/agreement-types.js +281 -0
  82. package/dist/tools/agreement-types.js.map +1 -0
  83. package/dist/tools/agreements.d.ts +20 -0
  84. package/dist/tools/agreements.d.ts.map +1 -0
  85. package/dist/tools/agreements.js +282 -0
  86. package/dist/tools/agreements.js.map +1 -0
  87. package/dist/tools/analytics.d.ts +20 -0
  88. package/dist/tools/analytics.d.ts.map +1 -0
  89. package/dist/tools/analytics.js +130 -0
  90. package/dist/tools/analytics.js.map +1 -0
  91. package/dist/tools/app-tools.d.ts +15 -0
  92. package/dist/tools/app-tools.d.ts.map +1 -0
  93. package/dist/tools/app-tools.js +388 -0
  94. package/dist/tools/app-tools.js.map +1 -0
  95. package/dist/tools/assets.d.ts +25 -0
  96. package/dist/tools/assets.d.ts.map +1 -0
  97. package/dist/tools/assets.js +454 -0
  98. package/dist/tools/assets.js.map +1 -0
  99. package/dist/tools/audio-files.d.ts +20 -0
  100. package/dist/tools/audio-files.d.ts.map +1 -0
  101. package/dist/tools/audio-files.js +409 -0
  102. package/dist/tools/audio-files.js.map +1 -0
  103. package/dist/tools/audit.d.ts +19 -0
  104. package/dist/tools/audit.d.ts.map +1 -0
  105. package/dist/tools/audit.js +58 -0
  106. package/dist/tools/audit.js.map +1 -0
  107. package/dist/tools/auth.d.ts +22 -0
  108. package/dist/tools/auth.d.ts.map +1 -0
  109. package/dist/tools/auth.js +212 -0
  110. package/dist/tools/auth.js.map +1 -0
  111. package/dist/tools/bulk.d.ts +22 -0
  112. package/dist/tools/bulk.d.ts.map +1 -0
  113. package/dist/tools/bulk.js +164 -0
  114. package/dist/tools/bulk.js.map +1 -0
  115. package/dist/tools/calendar.d.ts +15 -0
  116. package/dist/tools/calendar.d.ts.map +1 -0
  117. package/dist/tools/calendar.js +68 -0
  118. package/dist/tools/calendar.js.map +1 -0
  119. package/dist/tools/collaborators.d.ts +21 -0
  120. package/dist/tools/collaborators.d.ts.map +1 -0
  121. package/dist/tools/collaborators.js +381 -0
  122. package/dist/tools/collaborators.js.map +1 -0
  123. package/dist/tools/comparisons.d.ts +22 -0
  124. package/dist/tools/comparisons.d.ts.map +1 -0
  125. package/dist/tools/comparisons.js +80 -0
  126. package/dist/tools/comparisons.js.map +1 -0
  127. package/dist/tools/credits.d.ts +39 -0
  128. package/dist/tools/credits.d.ts.map +1 -0
  129. package/dist/tools/credits.js +541 -0
  130. package/dist/tools/credits.js.map +1 -0
  131. package/dist/tools/custody-hints.d.ts +16 -0
  132. package/dist/tools/custody-hints.d.ts.map +1 -0
  133. package/dist/tools/custody-hints.js +27 -0
  134. package/dist/tools/custody-hints.js.map +1 -0
  135. package/dist/tools/custody.d.ts +38 -0
  136. package/dist/tools/custody.d.ts.map +1 -0
  137. package/dist/tools/custody.js +281 -0
  138. package/dist/tools/custody.js.map +1 -0
  139. package/dist/tools/dashboard.d.ts +22 -0
  140. package/dist/tools/dashboard.d.ts.map +1 -0
  141. package/dist/tools/dashboard.js +258 -0
  142. package/dist/tools/dashboard.js.map +1 -0
  143. package/dist/tools/directory.d.ts +15 -0
  144. package/dist/tools/directory.d.ts.map +1 -0
  145. package/dist/tools/directory.js +107 -0
  146. package/dist/tools/directory.js.map +1 -0
  147. package/dist/tools/discovery.d.ts +49 -0
  148. package/dist/tools/discovery.d.ts.map +1 -0
  149. package/dist/tools/discovery.js +851 -0
  150. package/dist/tools/discovery.js.map +1 -0
  151. package/dist/tools/disputes.d.ts +18 -0
  152. package/dist/tools/disputes.d.ts.map +1 -0
  153. package/dist/tools/disputes.js +62 -0
  154. package/dist/tools/disputes.js.map +1 -0
  155. package/dist/tools/documents.d.ts +15 -0
  156. package/dist/tools/documents.d.ts.map +1 -0
  157. package/dist/tools/documents.js +37 -0
  158. package/dist/tools/documents.js.map +1 -0
  159. package/dist/tools/duplicates.d.ts +25 -0
  160. package/dist/tools/duplicates.d.ts.map +1 -0
  161. package/dist/tools/duplicates.js +108 -0
  162. package/dist/tools/duplicates.js.map +1 -0
  163. package/dist/tools/enrichment.d.ts +56 -0
  164. package/dist/tools/enrichment.d.ts.map +1 -0
  165. package/dist/tools/enrichment.js +616 -0
  166. package/dist/tools/enrichment.js.map +1 -0
  167. package/dist/tools/exports.d.ts +19 -0
  168. package/dist/tools/exports.d.ts.map +1 -0
  169. package/dist/tools/exports.js +184 -0
  170. package/dist/tools/exports.js.map +1 -0
  171. package/dist/tools/feedback.d.ts +22 -0
  172. package/dist/tools/feedback.d.ts.map +1 -0
  173. package/dist/tools/feedback.js +100 -0
  174. package/dist/tools/feedback.js.map +1 -0
  175. package/dist/tools/forbidden-keywords.d.ts +62 -0
  176. package/dist/tools/forbidden-keywords.d.ts.map +1 -0
  177. package/dist/tools/forbidden-keywords.js +99 -0
  178. package/dist/tools/forbidden-keywords.js.map +1 -0
  179. package/dist/tools/gap-hints.d.ts +53 -0
  180. package/dist/tools/gap-hints.d.ts.map +1 -0
  181. package/dist/tools/gap-hints.js +245 -0
  182. package/dist/tools/gap-hints.js.map +1 -0
  183. package/dist/tools/groups.d.ts +29 -0
  184. package/dist/tools/groups.d.ts.map +1 -0
  185. package/dist/tools/groups.js +186 -0
  186. package/dist/tools/groups.js.map +1 -0
  187. package/dist/tools/import-documents.d.ts +21 -0
  188. package/dist/tools/import-documents.d.ts.map +1 -0
  189. package/dist/tools/import-documents.js +206 -0
  190. package/dist/tools/import-documents.js.map +1 -0
  191. package/dist/tools/import.d.ts +31 -0
  192. package/dist/tools/import.d.ts.map +1 -0
  193. package/dist/tools/import.js +610 -0
  194. package/dist/tools/import.js.map +1 -0
  195. package/dist/tools/index.d.ts +293 -0
  196. package/dist/tools/index.d.ts.map +1 -0
  197. package/dist/tools/index.js +1182 -0
  198. package/dist/tools/index.js.map +1 -0
  199. package/dist/tools/integrations.d.ts +19 -0
  200. package/dist/tools/integrations.d.ts.map +1 -0
  201. package/dist/tools/integrations.js +120 -0
  202. package/dist/tools/integrations.js.map +1 -0
  203. package/dist/tools/labels.d.ts +20 -0
  204. package/dist/tools/labels.d.ts.map +1 -0
  205. package/dist/tools/labels.js +48 -0
  206. package/dist/tools/labels.js.map +1 -0
  207. package/dist/tools/licensing.d.ts +40 -0
  208. package/dist/tools/licensing.d.ts.map +1 -0
  209. package/dist/tools/licensing.js +436 -0
  210. package/dist/tools/licensing.js.map +1 -0
  211. package/dist/tools/memory.d.ts +21 -0
  212. package/dist/tools/memory.d.ts.map +1 -0
  213. package/dist/tools/memory.js +120 -0
  214. package/dist/tools/memory.js.map +1 -0
  215. package/dist/tools/metadata.d.ts +15 -0
  216. package/dist/tools/metadata.d.ts.map +1 -0
  217. package/dist/tools/metadata.js +1532 -0
  218. package/dist/tools/metadata.js.map +1 -0
  219. package/dist/tools/multimedia.d.ts +19 -0
  220. package/dist/tools/multimedia.d.ts.map +1 -0
  221. package/dist/tools/multimedia.js +371 -0
  222. package/dist/tools/multimedia.js.map +1 -0
  223. package/dist/tools/my-reported-issues.d.ts +32 -0
  224. package/dist/tools/my-reported-issues.d.ts.map +1 -0
  225. package/dist/tools/my-reported-issues.js +123 -0
  226. package/dist/tools/my-reported-issues.js.map +1 -0
  227. package/dist/tools/notes.d.ts +21 -0
  228. package/dist/tools/notes.d.ts.map +1 -0
  229. package/dist/tools/notes.js +115 -0
  230. package/dist/tools/notes.js.map +1 -0
  231. package/dist/tools/notifications.d.ts +28 -0
  232. package/dist/tools/notifications.d.ts.map +1 -0
  233. package/dist/tools/notifications.js +417 -0
  234. package/dist/tools/notifications.js.map +1 -0
  235. package/dist/tools/onboarding.d.ts +24 -0
  236. package/dist/tools/onboarding.d.ts.map +1 -0
  237. package/dist/tools/onboarding.js +81 -0
  238. package/dist/tools/onboarding.js.map +1 -0
  239. package/dist/tools/people.d.ts +254 -0
  240. package/dist/tools/people.d.ts.map +1 -0
  241. package/dist/tools/people.js +481 -0
  242. package/dist/tools/people.js.map +1 -0
  243. package/dist/tools/projects.d.ts +20 -0
  244. package/dist/tools/projects.d.ts.map +1 -0
  245. package/dist/tools/projects.js +316 -0
  246. package/dist/tools/projects.js.map +1 -0
  247. package/dist/tools/public-filter.d.ts +43 -0
  248. package/dist/tools/public-filter.d.ts.map +1 -0
  249. package/dist/tools/public-filter.js +356 -0
  250. package/dist/tools/public-filter.js.map +1 -0
  251. package/dist/tools/publishers.d.ts +30 -0
  252. package/dist/tools/publishers.d.ts.map +1 -0
  253. package/dist/tools/publishers.js +105 -0
  254. package/dist/tools/publishers.js.map +1 -0
  255. package/dist/tools/purchases.d.ts +27 -0
  256. package/dist/tools/purchases.d.ts.map +1 -0
  257. package/dist/tools/purchases.js +9 -0
  258. package/dist/tools/purchases.js.map +1 -0
  259. package/dist/tools/recording-attribution-hints.d.ts +24 -0
  260. package/dist/tools/recording-attribution-hints.d.ts.map +1 -0
  261. package/dist/tools/recording-attribution-hints.js +27 -0
  262. package/dist/tools/recording-attribution-hints.js.map +1 -0
  263. package/dist/tools/recordings.d.ts +96 -0
  264. package/dist/tools/recordings.d.ts.map +1 -0
  265. package/dist/tools/recordings.js +564 -0
  266. package/dist/tools/recordings.js.map +1 -0
  267. package/dist/tools/recovery-hints.d.ts +40 -0
  268. package/dist/tools/recovery-hints.d.ts.map +1 -0
  269. package/dist/tools/recovery-hints.js +827 -0
  270. package/dist/tools/recovery-hints.js.map +1 -0
  271. package/dist/tools/release-rich.d.ts +31 -0
  272. package/dist/tools/release-rich.d.ts.map +1 -0
  273. package/dist/tools/release-rich.js +245 -0
  274. package/dist/tools/release-rich.js.map +1 -0
  275. package/dist/tools/releases.d.ts +36 -0
  276. package/dist/tools/releases.d.ts.map +1 -0
  277. package/dist/tools/releases.js +649 -0
  278. package/dist/tools/releases.js.map +1 -0
  279. package/dist/tools/report-issue.d.ts +21 -0
  280. package/dist/tools/report-issue.d.ts.map +1 -0
  281. package/dist/tools/report-issue.js +101 -0
  282. package/dist/tools/report-issue.js.map +1 -0
  283. package/dist/tools/royalties.d.ts +23 -0
  284. package/dist/tools/royalties.d.ts.map +1 -0
  285. package/dist/tools/royalties.js +262 -0
  286. package/dist/tools/royalties.js.map +1 -0
  287. package/dist/tools/search.d.ts +30 -0
  288. package/dist/tools/search.d.ts.map +1 -0
  289. package/dist/tools/search.js +115 -0
  290. package/dist/tools/search.js.map +1 -0
  291. package/dist/tools/send.d.ts +17 -0
  292. package/dist/tools/send.d.ts.map +1 -0
  293. package/dist/tools/send.js +188 -0
  294. package/dist/tools/send.js.map +1 -0
  295. package/dist/tools/sessions.d.ts +18 -0
  296. package/dist/tools/sessions.d.ts.map +1 -0
  297. package/dist/tools/sessions.js +153 -0
  298. package/dist/tools/sessions.js.map +1 -0
  299. package/dist/tools/settings.d.ts +23 -0
  300. package/dist/tools/settings.d.ts.map +1 -0
  301. package/dist/tools/settings.js +365 -0
  302. package/dist/tools/settings.js.map +1 -0
  303. package/dist/tools/share-links.d.ts +22 -0
  304. package/dist/tools/share-links.d.ts.map +1 -0
  305. package/dist/tools/share-links.js +188 -0
  306. package/dist/tools/share-links.js.map +1 -0
  307. package/dist/tools/signup.d.ts +26 -0
  308. package/dist/tools/signup.d.ts.map +1 -0
  309. package/dist/tools/signup.js +266 -0
  310. package/dist/tools/signup.js.map +1 -0
  311. package/dist/tools/split-sheets.d.ts +25 -0
  312. package/dist/tools/split-sheets.d.ts.map +1 -0
  313. package/dist/tools/split-sheets.js +309 -0
  314. package/dist/tools/split-sheets.js.map +1 -0
  315. package/dist/tools/storage-config.d.ts +13 -0
  316. package/dist/tools/storage-config.d.ts.map +1 -0
  317. package/dist/tools/storage-config.js +245 -0
  318. package/dist/tools/storage-config.js.map +1 -0
  319. package/dist/tools/subscription.d.ts +60 -0
  320. package/dist/tools/subscription.d.ts.map +1 -0
  321. package/dist/tools/subscription.js +440 -0
  322. package/dist/tools/subscription.js.map +1 -0
  323. package/dist/tools/sync-placements.d.ts +31 -0
  324. package/dist/tools/sync-placements.d.ts.map +1 -0
  325. package/dist/tools/sync-placements.js +431 -0
  326. package/dist/tools/sync-placements.js.map +1 -0
  327. package/dist/tools/team.d.ts +22 -0
  328. package/dist/tools/team.d.ts.map +1 -0
  329. package/dist/tools/team.js +144 -0
  330. package/dist/tools/team.js.map +1 -0
  331. package/dist/tools/telegram.d.ts +21 -0
  332. package/dist/tools/telegram.d.ts.map +1 -0
  333. package/dist/tools/telegram.js +144 -0
  334. package/dist/tools/telegram.js.map +1 -0
  335. package/dist/tools/uploads.d.ts +17 -0
  336. package/dist/tools/uploads.d.ts.map +1 -0
  337. package/dist/tools/uploads.js +165 -0
  338. package/dist/tools/uploads.js.map +1 -0
  339. package/dist/tools/works.d.ts +71 -0
  340. package/dist/tools/works.d.ts.map +1 -0
  341. package/dist/tools/works.js +694 -0
  342. package/dist/tools/works.js.map +1 -0
  343. package/package.json +54 -0
  344. package/scripts/build-required-schemas.ts +233 -0
  345. package/scripts/bundle-apps.ts +61 -0
  346. package/scripts/refresh-schema-mirror.ts +182 -0
  347. package/server.json +20 -0
@@ -0,0 +1,541 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ import { formatSuccess, formatStructuredList, withBillingGate, mapGapsToHints, } from "@withpica/mcp-utils";
3
+ import { notifyParties, summarizeNotifications, } from "@withpica/mcp-utils";
4
+ // ADR-213: 16-role enum for recording_credits. Mirror of
5
+ // RECORDING_CREDIT_ROLES in lib/services/recording-credits.ts. Writer /
6
+ // Composer / Lyricist / Arranger live on work_credits — those route via
7
+ // pica_credits_update, not this tool.
8
+ const RECORDING_CREDIT_ROLES = [
9
+ "MainArtist",
10
+ "FeaturedArtist",
11
+ "Remixer",
12
+ "Producer",
13
+ "Co-Producer",
14
+ "Executive Producer",
15
+ "Mixer",
16
+ "Engineer",
17
+ "Recording Engineer",
18
+ "Mastering Engineer",
19
+ "Performer",
20
+ "Vocalist",
21
+ "Instrumentalist",
22
+ "Arranger",
23
+ "Programmer",
24
+ "Other",
25
+ ];
26
+ export class CreditsTools {
27
+ pica;
28
+ constructor(pica) {
29
+ this.pica = pica;
30
+ }
31
+ getTools() {
32
+ // NOTE: `pica_credits_balance` / `pica_credits_history` / `pica_credits_purchase`
33
+ // were removed from the MCP surface 2026-04-22 (see docs/MCP_REFINEMENT_LOG.md
34
+ // entry B-001). withPICA is subscription-only at £9.99/mo; surfacing a credit
35
+ // balance tool misled agents into gating actions behind a balance check.
36
+ // The underlying lib/services/credits/** infra remains intact for any internal
37
+ // telemetry or future pay-per-call work (MPP), it just isn't advertised.
38
+ //
39
+ // `pica_credits_list` and `pica_credits_update` below are work_credits
40
+ // (songwriter / producer credits on a work), not billing credits. Keep.
41
+ return [
42
+ {
43
+ definition: {
44
+ name: "pica_credits_list",
45
+ description: "Get all credits (collaborators, roles, and splits) for a specific work. Returns who wrote, composed, arranged, or produced the work and their percentage splits. " +
46
+ "→ then: pica_credits_update (fix credits), pica_people_inspect (inspect a credited person)",
47
+ workflows: "infrastructure",
48
+ inputSchema: {
49
+ type: "object",
50
+ properties: {
51
+ work_id: {
52
+ type: "string",
53
+ description: "The work ID to get credits for",
54
+ },
55
+ },
56
+ required: ["work_id"],
57
+ },
58
+ nextSteps: [
59
+ {
60
+ tool: "pica_credits_update",
61
+ reason: "Fix or fill credit gaps when the listing surfaces missing roles or splits.",
62
+ when: "on_success",
63
+ },
64
+ {
65
+ tool: "pica_works_inspect",
66
+ reason: "Re-inspect the work to see how the credits affect completeness scoring.",
67
+ when: "on_success",
68
+ },
69
+ ],
70
+ },
71
+ executor: this.listCredits.bind(this),
72
+ },
73
+ {
74
+ definition: {
75
+ name: "pica_credits_update",
76
+ description: "Set credits on a work. Replaces all existing credits. Splits must total 100%. " +
77
+ "15 roles: writer, composer, arranger, lyricist, producer, performer, engineer, mixer, mastering, owner, vocalist, instrumentalist, conductor, programmer, remixer. " +
78
+ "For publishing credits, pass publisher_id (resolve a publisher name/IPI to an id via pica_publishers_query, or create one via pica_publishers_create). " +
79
+ "Supports territory/rights metadata plus is_primary / notes / attestation_status. " +
80
+ "IMPORTANT: After updating, call pica_credits_list to verify the credits actually persisted — silent failures are possible if roles are invalid. " +
81
+ "After several mutations, surface a pica_dashboard_briefing to the user. " +
82
+ "→ then: pica_credits_list (verify saved), pica_works_inspect (check progress)",
83
+ workflows: ["work-required", "work-credits-required"],
84
+ inputSchema: {
85
+ type: "object",
86
+ properties: {
87
+ work_id: {
88
+ type: "string",
89
+ description: "The work ID to set credits on",
90
+ },
91
+ credits: {
92
+ type: "array",
93
+ description: "Array of credit entries. Splits must total 100%.",
94
+ items: {
95
+ type: "object",
96
+ properties: {
97
+ person_id: {
98
+ type: "string",
99
+ description: "Person ID of the credited collaborator",
100
+ },
101
+ role: {
102
+ type: "string",
103
+ description: "Role (stored as credit_type on work_credits). One of: writer, composer, arranger, lyricist, producer, performer, engineer, mixer, mastering, owner, vocalist, instrumentalist, conductor, programmer, remixer.",
104
+ enum: [
105
+ "writer",
106
+ "composer",
107
+ "arranger",
108
+ "lyricist",
109
+ "producer",
110
+ "performer",
111
+ "engineer",
112
+ "mixer",
113
+ "mastering",
114
+ "owner",
115
+ "vocalist",
116
+ "instrumentalist",
117
+ "conductor",
118
+ "programmer",
119
+ "remixer",
120
+ ],
121
+ },
122
+ splits: {
123
+ type: "number",
124
+ description: "Percentage split (0-100), stored as writer_split_percentage on work_credits. All splits across the credits array must total 100%.",
125
+ },
126
+ publisher_id: {
127
+ type: "string",
128
+ description: "Publisher UUID on global_publishers. Resolve a publisher name or IPI to an id via pica_publishers_query, or create one via pica_publishers_create. Required when publisher_split_percentage is set.",
129
+ },
130
+ publisher_split_percentage: {
131
+ type: "number",
132
+ description: "Publisher's share percentage (0-100). Separate from writer split.",
133
+ },
134
+ territory: {
135
+ type: "array",
136
+ items: { type: "string" },
137
+ description: 'Territories where this credit applies (e.g., ["worldwide"], ["UK", "US"]). Default: ["worldwide"].',
138
+ },
139
+ rights_type: {
140
+ type: "string",
141
+ enum: [
142
+ "all",
143
+ "performing",
144
+ "mechanical",
145
+ "synchronization",
146
+ ],
147
+ description: "Type of rights covered. Default: all.",
148
+ },
149
+ start_date: {
150
+ type: "string",
151
+ description: "When rights start (ISO date). Null = from inception.",
152
+ },
153
+ end_date: {
154
+ type: "string",
155
+ description: "When rights end (ISO date). Null = perpetual.",
156
+ },
157
+ is_primary: {
158
+ type: "boolean",
159
+ description: "Mark this credit as the primary attribution for the person on this work.",
160
+ },
161
+ notes: {
162
+ type: "string",
163
+ description: "Free-text notes about this credit (e.g., recording-session context, contribution specifics).",
164
+ },
165
+ attestation_status: {
166
+ type: "string",
167
+ enum: ["pending", "attested", "disputed", "declined"],
168
+ description: "Attestation status. Default: pending. Service-managed fields attested_at / attested_by are set by the attestation workflow, not this tool.",
169
+ },
170
+ },
171
+ required: ["person_id", "role", "splits"],
172
+ },
173
+ },
174
+ },
175
+ required: ["work_id", "credits"],
176
+ },
177
+ nextSteps: [
178
+ {
179
+ tool: "pica_credits_list",
180
+ reason: "Read the credits back to confirm every advertised field (is_primary, notes, attestation_status, publisher_id) actually persisted. Silent persistence drops are real — never trust the write response alone.",
181
+ when: "on_success",
182
+ },
183
+ {
184
+ tool: "pica_works_inspect",
185
+ reason: "Check the work's completeness score now that credits are in place.",
186
+ when: "on_success",
187
+ },
188
+ ],
189
+ },
190
+ executor: withBillingGate(this.pica, "credit update", this.updateCredits.bind(this)),
191
+ },
192
+ // ADR-213 Primitive B — pica_recording_credits_update
193
+ {
194
+ definition: {
195
+ name: "pica_recording_credits_update",
196
+ description: "Add a first-party performance / production credit to a recording. Writes to the recording_credits table (distinct from work_credits which is for songwriting credits). " +
197
+ "16 roles: MainArtist, FeaturedArtist, Remixer, Producer, Co-Producer, Executive Producer, Mixer, Engineer, Recording Engineer, Mastering Engineer, Performer, Vocalist, Instrumentalist, Arranger, Programmer, Other. " +
198
+ "(Songwriting credits — Writer, Composer, Lyricist, Arranger as a publishing role — go via pica_credits_update on the parent work.) " +
199
+ "Resolve a person's name to person_id via pica_people_query first; if no person record exists, set person_id to null and credited_name carries the displayed name. " +
200
+ "After writing, call pica_recordings_inspect with sections:['recording_credits'] to verify the credit persisted. " +
201
+ "→ then: pica_recordings_inspect (verify saved), pica_people_query (resolve more credits)",
202
+ workflows: ["recording-required", "recording-credits-required"],
203
+ inputSchema: {
204
+ type: "object",
205
+ properties: {
206
+ recording_id: {
207
+ type: "string",
208
+ description: "The recording UUID to credit",
209
+ },
210
+ person_id: {
211
+ type: "string",
212
+ description: "Optional UUID of an existing person record. Resolve via pica_people_query (or pica_people_create) first. Null is allowed when the credited entity is not yet a person record.",
213
+ },
214
+ credited_name: {
215
+ type: "string",
216
+ description: "The displayed credit name (NOT NULL on recording_credits). Use the artist/performer's professional or contributor name as it should appear on the recording.",
217
+ },
218
+ role: {
219
+ type: "string",
220
+ description: "Recording credit role from the 16-entry RECORDING_CREDIT_ROLES enum.",
221
+ enum: [...RECORDING_CREDIT_ROLES],
222
+ },
223
+ split_percentage: {
224
+ type: "number",
225
+ description: "Optional percentage share for this credit (0-100). Independent of work_credits writer_split_percentage — recording-side splits are tracked separately from songwriter splits.",
226
+ },
227
+ split_type: {
228
+ type: "string",
229
+ description: "Optional free-form split type label (e.g. 'master', 'producer_points').",
230
+ },
231
+ display_order: {
232
+ type: "number",
233
+ description: "Optional display order for sorting credits in UI lists. Defaults to 0.",
234
+ },
235
+ notes: {
236
+ type: "string",
237
+ description: "Optional free-text notes about this credit (recording-session context, role specifics).",
238
+ },
239
+ },
240
+ required: ["recording_id", "credited_name", "role"],
241
+ },
242
+ nextSteps: [
243
+ {
244
+ tool: "pica_recordings_inspect",
245
+ reason: "Read recording_credits back via sections:['recording_credits'] to confirm the new row persisted.",
246
+ when: "on_success",
247
+ },
248
+ {
249
+ tool: "pica_people_query",
250
+ reason: "Resolve another person to credit, then call pica_recording_credits_update again for the next role.",
251
+ when: "on_success",
252
+ },
253
+ ],
254
+ },
255
+ executor: withBillingGate(this.pica, "recording credit update", this.updateRecordingCredits.bind(this)),
256
+ },
257
+ ];
258
+ }
259
+ async listCredits(args) {
260
+ // Fetch both publishing collaborators and recording credits
261
+ const [collabSettled, creditsSettled] = await Promise.allSettled([
262
+ this.pica.credits.listCollaborators(args.work_id),
263
+ this.pica.credits.listForWork(args.work_id),
264
+ ]);
265
+ const collaborators = collabSettled.status === "fulfilled"
266
+ ? collabSettled.value
267
+ : { collaborators: [], count: 0 };
268
+ const recordingCredits = creditsSettled.status === "fulfilled" ? creditsSettled.value : [];
269
+ // Merge both into a single list
270
+ const collabArray = Array.isArray(collaborators)
271
+ ? collaborators
272
+ : collaborators?.collaborators || [];
273
+ const creditArray = Array.isArray(recordingCredits)
274
+ ? recordingCredits
275
+ : recordingCredits?.credits || [];
276
+ const allCredits = [...collabArray, ...creditArray];
277
+ return formatStructuredList(allCredits, "credit", {
278
+ work_id: args.work_id,
279
+ });
280
+ }
281
+ async updateCredits(args) {
282
+ // Validate splits total 100% before saving
283
+ const splitTotal = args.credits.reduce((sum, c) => sum + (c.splits || 0), 0);
284
+ if (splitTotal !== 100) {
285
+ return {
286
+ content: [
287
+ {
288
+ type: "text",
289
+ text: `Splits total ${splitTotal}%, must be exactly 100%. Adjust the splits and try again.`,
290
+ },
291
+ ],
292
+ isError: true,
293
+ };
294
+ }
295
+ // Split credits by role type: publishing roles → /collaborators, recording roles → /credits
296
+ const PUBLISHING_ROLES = new Set([
297
+ "writer",
298
+ "composer",
299
+ "lyricist",
300
+ "arranger",
301
+ ]);
302
+ const allCredits = args.credits.map((c) => {
303
+ const credit = {
304
+ person_id: c.person_id,
305
+ role: c.role,
306
+ splits: c.splits || 0,
307
+ };
308
+ if (c.publisher_id)
309
+ credit.publisher_id = c.publisher_id;
310
+ if (c.publisher_split_percentage !== undefined)
311
+ credit.publisher_split_percentage = c.publisher_split_percentage;
312
+ if (c.territory)
313
+ credit.territory = c.territory;
314
+ if (c.rights_type)
315
+ credit.rights_type = c.rights_type;
316
+ if (c.start_date)
317
+ credit.start_date = c.start_date;
318
+ if (c.end_date)
319
+ credit.end_date = c.end_date;
320
+ if (c.is_primary !== undefined)
321
+ credit.is_primary = c.is_primary;
322
+ if (c.notes !== undefined)
323
+ credit.notes = c.notes;
324
+ if (c.attestation_status)
325
+ credit.attestation_status = c.attestation_status;
326
+ return credit;
327
+ });
328
+ const publishingCredits = allCredits.filter((c) => PUBLISHING_ROLES.has(String(c.role || "writer")
329
+ .split(", ")[0]
330
+ .trim()));
331
+ const recordingCredits = allCredits.filter((c) => !PUBLISHING_ROLES.has(String(c.role || "writer")
332
+ .split(", ")[0]
333
+ .trim()));
334
+ let credits;
335
+ // Route to correct endpoint(s)
336
+ if (publishingCredits.length > 0 && recordingCredits.length > 0) {
337
+ // Mixed — call both endpoints, use allSettled so a partial failure is reported not silently swallowed
338
+ const [pubSettled, recSettled] = await Promise.allSettled([
339
+ this.pica.credits.updateCollaborators(args.work_id, {
340
+ credits: publishingCredits,
341
+ }),
342
+ this.pica.credits.updateForWork(args.work_id, {
343
+ credits: recordingCredits,
344
+ }),
345
+ ]);
346
+ const pubResult = pubSettled.status === "fulfilled" ? pubSettled.value : null;
347
+ const recResult = recSettled.status === "fulfilled" ? recSettled.value : null;
348
+ const pubError = pubSettled.status === "rejected"
349
+ ? pubSettled.reason
350
+ : null;
351
+ const recError = recSettled.status === "rejected"
352
+ ? recSettled.reason
353
+ : null;
354
+ if (pubError && recError) {
355
+ return {
356
+ content: [
357
+ {
358
+ type: "text",
359
+ text: `both publishing and recording credits failed to save — publishing error: ${pubError?.message ?? pubError}, recording error: ${recError?.message ?? recError}`,
360
+ },
361
+ ],
362
+ isError: true,
363
+ };
364
+ }
365
+ if (pubError) {
366
+ return {
367
+ content: [
368
+ {
369
+ type: "text",
370
+ text: `recording credits updated, but publishing credits failed — ${pubError?.message ?? pubError}. retry the publishing portion.`,
371
+ },
372
+ ],
373
+ isError: true,
374
+ };
375
+ }
376
+ if (recError) {
377
+ return {
378
+ content: [
379
+ {
380
+ type: "text",
381
+ text: `publishing credits updated, but recording credits failed — ${recError?.message ?? recError}. retry the recording portion.`,
382
+ },
383
+ ],
384
+ isError: true,
385
+ };
386
+ }
387
+ credits = { collaborators: pubResult, credits: recResult };
388
+ }
389
+ else if (publishingCredits.length > 0) {
390
+ credits = await this.pica.credits.updateCollaborators(args.work_id, {
391
+ credits: publishingCredits,
392
+ });
393
+ }
394
+ else {
395
+ credits = await this.pica.credits.updateForWork(args.work_id, {
396
+ credits: recordingCredits,
397
+ });
398
+ }
399
+ // Check completeness for hints about next steps
400
+ const hints = [];
401
+ try {
402
+ const completeness = await this.pica.health.getWorkCompleteness(args.work_id);
403
+ hints.push(...mapGapsToHints(completeness?.gaps || completeness?.missing || [], 3));
404
+ }
405
+ catch {
406
+ // Best-effort
407
+ }
408
+ // Notify all credited people about their credit
409
+ const parties = args.credits
410
+ .filter((c) => c.person_id)
411
+ .map((c) => ({
412
+ person_id: c.person_id,
413
+ message: `you've been credited as ${c.role || "writer"} (${c.splits || 0}%) on a work — please verify`,
414
+ work_id: args.work_id,
415
+ notification_type: "credit_added",
416
+ }));
417
+ let notifySummary = "";
418
+ if (parties.length > 0) {
419
+ const results = await notifyParties(this.pica, parties);
420
+ notifySummary = summarizeNotifications(results);
421
+ }
422
+ const msg = notifySummary
423
+ ? `Credits updated. ${notifySummary}`
424
+ : "Credits updated successfully";
425
+ return formatSuccess(msg, credits, hints);
426
+ }
427
+ /**
428
+ * ADR-213 Primitive B — pica_recording_credits_update
429
+ *
430
+ * Writes a single first-party recording credit to the recording_credits
431
+ * table via POST /admin/recordings/{recording_id}/credits.
432
+ *
433
+ * Validates role against RECORDING_CREDIT_ROLES (16 entries) before the
434
+ * round trip so we get a structured error rather than a generic 400 from
435
+ * the route. credited_name is required (NOT NULL on the table); the route
436
+ * also validates this but we surface it earlier.
437
+ *
438
+ * On success, includes a notification to the credited person if person_id
439
+ * is set, mirroring the work-side updateCredits notification flow.
440
+ */
441
+ async updateRecordingCredits(args) {
442
+ const recordingId = args.recording_id;
443
+ const personId = (args.person_id ?? null);
444
+ const creditedName = (args.credited_name ?? "");
445
+ const role = args.role;
446
+ if (!recordingId) {
447
+ return {
448
+ content: [
449
+ {
450
+ type: "text",
451
+ text: "recording_id is required.",
452
+ },
453
+ ],
454
+ isError: true,
455
+ };
456
+ }
457
+ if (!creditedName.trim()) {
458
+ return {
459
+ content: [
460
+ {
461
+ type: "text",
462
+ text: "credited_name is required (recording_credits.credited_name is NOT NULL).",
463
+ },
464
+ ],
465
+ isError: true,
466
+ };
467
+ }
468
+ if (!role || !RECORDING_CREDIT_ROLES.includes(role)) {
469
+ return {
470
+ content: [
471
+ {
472
+ type: "text",
473
+ text: `Invalid role '${role}'. Must be one of: ${RECORDING_CREDIT_ROLES.join(", ")}. Songwriting credits (Writer, Composer, Lyricist, Arranger) go via pica_credits_update on the parent work.`,
474
+ },
475
+ ],
476
+ isError: true,
477
+ };
478
+ }
479
+ let credit;
480
+ try {
481
+ credit = await this.pica.recordingCredits.create(recordingId, {
482
+ person_id: personId,
483
+ credited_name: creditedName.trim(),
484
+ role,
485
+ split_percentage: args.split_percentage ?? null,
486
+ split_type: args.split_type ?? null,
487
+ display_order: args.display_order ?? 0,
488
+ notes: args.notes ?? null,
489
+ });
490
+ }
491
+ catch (err) {
492
+ const errorMessage = err instanceof Error ? err.message : String(err);
493
+ // Distinguish person-not-found so the agent can recover via
494
+ // pica_people_query — surfaces next_tool guidance per ADR-198.
495
+ if (/person_id|fk|foreign key|not found/i.test(errorMessage) &&
496
+ personId) {
497
+ return {
498
+ content: [
499
+ {
500
+ type: "text",
501
+ text: `Failed to create recording credit — person_id '${personId}' may not exist. Resolve via pica_people_query then retry. Underlying error: ${errorMessage}`,
502
+ },
503
+ ],
504
+ isError: true,
505
+ };
506
+ }
507
+ return {
508
+ content: [
509
+ {
510
+ type: "text",
511
+ text: `Failed to create recording credit: ${errorMessage}`,
512
+ },
513
+ ],
514
+ isError: true,
515
+ };
516
+ }
517
+ // Notify the credited person if structured (matches work-side pattern).
518
+ let notifySummary = "";
519
+ if (personId) {
520
+ const parties = [
521
+ {
522
+ person_id: personId,
523
+ message: `you've been credited as ${role} on a recording — please verify`,
524
+ notification_type: "credit_added",
525
+ },
526
+ ];
527
+ try {
528
+ const results = await notifyParties(this.pica, parties);
529
+ notifySummary = summarizeNotifications(results);
530
+ }
531
+ catch {
532
+ // Best-effort — don't fail the create
533
+ }
534
+ }
535
+ const msg = notifySummary
536
+ ? `Recording credit added. ${notifySummary}`
537
+ : "Recording credit added successfully";
538
+ return formatSuccess(msg, credit);
539
+ }
540
+ }
541
+ //# sourceMappingURL=credits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credits.js","sourceRoot":"","sources":["../../src/tools/credits.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAgB7D,OAAO,EAEL,aAAa,EACb,oBAAoB,EACpB,eAAe,EAEf,cAAc,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,aAAa,EACb,sBAAsB,GAEvB,MAAM,qBAAqB,CAAC;AAE7B,yDAAyD;AACzD,wEAAwE;AACxE,wEAAwE;AACxE,sCAAsC;AACtC,MAAM,sBAAsB,GAAG;IAC7B,YAAY;IACZ,gBAAgB;IAChB,SAAS;IACT,UAAU;IACV,aAAa;IACb,oBAAoB;IACpB,OAAO;IACP,UAAU;IACV,oBAAoB;IACpB,oBAAoB;IACpB,WAAW;IACX,UAAU;IACV,iBAAiB;IACjB,UAAU;IACV,YAAY;IACZ,OAAO;CACC,CAAC;AAEX,MAAM,OAAO,YAAY;IACf,IAAI,CAAa;IAEzB,YAAY,IAAgB;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,QAAQ;QACN,kFAAkF;QAClF,+EAA+E;QAC/E,8EAA8E;QAC9E,yEAAyE;QACzE,+EAA+E;QAC/E,yEAAyE;QACzE,EAAE;QACF,uEAAuE;QACvE,wEAAwE;QACxE,OAAO;YACL;gBACE,UAAU,EAAE;oBACV,IAAI,EAAE,mBAAmB;oBACzB,WAAW,EACT,mKAAmK;wBACnK,4FAA4F;oBAC9F,SAAS,EAAE,gBAAgB;oBAC3B,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,OAAO,EAAE;gCACP,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,gCAAgC;6BAC9C;yBACF;wBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;qBACtB;oBACD,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,qBAAqB;4BAC3B,MAAM,EACJ,4EAA4E;4BAC9E,IAAI,EAAE,YAAY;yBACnB;wBACD;4BACE,IAAI,EAAE,oBAAoB;4BAC1B,MAAM,EACJ,yEAAyE;4BAC3E,IAAI,EAAE,YAAY;yBACnB;qBACF;iBACF;gBACD,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;aACtC;YACD;gBACE,UAAU,EAAE;oBACV,IAAI,EAAE,qBAAqB;oBAC3B,WAAW,EACT,gFAAgF;wBAChF,qKAAqK;wBACrK,yJAAyJ;wBACzJ,mFAAmF;wBACnF,kJAAkJ;wBAClJ,0EAA0E;wBAC1E,+EAA+E;oBACjF,SAAS,EAAE,CAAC,eAAe,EAAE,uBAAuB,CAAC;oBACrD,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,OAAO,EAAE;gCACP,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,+BAA+B;6BAC7C;4BACD,OAAO,EAAE;gCACP,IAAI,EAAE,OAAO;gCACb,WAAW,EAAE,kDAAkD;gCAC/D,KAAK,EAAE;oCACL,IAAI,EAAE,QAAQ;oCACd,UAAU,EAAE;wCACV,SAAS,EAAE;4CACT,IAAI,EAAE,QAAQ;4CACd,WAAW,EAAE,wCAAwC;yCACtD;wCACD,IAAI,EAAE;4CACJ,IAAI,EAAE,QAAQ;4CACd,WAAW,EACT,gNAAgN;4CAClN,IAAI,EAAE;gDACJ,QAAQ;gDACR,UAAU;gDACV,UAAU;gDACV,UAAU;gDACV,UAAU;gDACV,WAAW;gDACX,UAAU;gDACV,OAAO;gDACP,WAAW;gDACX,OAAO;gDACP,UAAU;gDACV,iBAAiB;gDACjB,WAAW;gDACX,YAAY;gDACZ,SAAS;6CACV;yCACF;wCACD,MAAM,EAAE;4CACN,IAAI,EAAE,QAAQ;4CACd,WAAW,EACT,mIAAmI;yCACtI;wCACD,YAAY,EAAE;4CACZ,IAAI,EAAE,QAAQ;4CACd,WAAW,EACT,qMAAqM;yCACxM;wCACD,0BAA0B,EAAE;4CAC1B,IAAI,EAAE,QAAQ;4CACd,WAAW,EACT,mEAAmE;yCACtE;wCACD,SAAS,EAAE;4CACT,IAAI,EAAE,OAAO;4CACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4CACzB,WAAW,EACT,oGAAoG;yCACvG;wCACD,WAAW,EAAE;4CACX,IAAI,EAAE,QAAQ;4CACd,IAAI,EAAE;gDACJ,KAAK;gDACL,YAAY;gDACZ,YAAY;gDACZ,iBAAiB;6CAClB;4CACD,WAAW,EAAE,uCAAuC;yCACrD;wCACD,UAAU,EAAE;4CACV,IAAI,EAAE,QAAQ;4CACd,WAAW,EACT,sDAAsD;yCACzD;wCACD,QAAQ,EAAE;4CACR,IAAI,EAAE,QAAQ;4CACd,WAAW,EACT,+CAA+C;yCAClD;wCACD,UAAU,EAAE;4CACV,IAAI,EAAE,SAAS;4CACf,WAAW,EACT,0EAA0E;yCAC7E;wCACD,KAAK,EAAE;4CACL,IAAI,EAAE,QAAQ;4CACd,WAAW,EACT,8FAA8F;yCACjG;wCACD,kBAAkB,EAAE;4CAClB,IAAI,EAAE,QAAQ;4CACd,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC;4CACrD,WAAW,EACT,4IAA4I;yCAC/I;qCACF;oCACD,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC;iCAC1C;6BACF;yBACF;wBACD,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;qBACjC;oBACD,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,mBAAmB;4BACzB,MAAM,EACJ,6MAA6M;4BAC/M,IAAI,EAAE,YAAY;yBACnB;wBACD;4BACE,IAAI,EAAE,oBAAoB;4BAC1B,MAAM,EACJ,oEAAoE;4BACtE,IAAI,EAAE,YAAY;yBACnB;qBACF;iBACF;gBACD,QAAQ,EAAE,eAAe,CACvB,IAAI,CAAC,IAAI,EACT,eAAe,EACf,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAC9B;aACF;YACD,sDAAsD;YACtD;gBACE,UAAU,EAAE;oBACV,IAAI,EAAE,+BAA+B;oBACrC,WAAW,EACT,yKAAyK;wBACzK,wNAAwN;wBACxN,qIAAqI;wBACrI,oKAAoK;wBACpK,kHAAkH;wBAClH,0FAA0F;oBAC5F,SAAS,EAAE,CAAC,oBAAoB,EAAE,4BAA4B,CAAC;oBAC/D,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,YAAY,EAAE;gCACZ,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,8BAA8B;6BAC5C;4BACD,SAAS,EAAE;gCACT,IAAI,EAAE,QAAQ;gCACd,WAAW,EACT,+KAA+K;6BAClL;4BACD,aAAa,EAAE;gCACb,IAAI,EAAE,QAAQ;gCACd,WAAW,EACT,8JAA8J;6BACjK;4BACD,IAAI,EAAE;gCACJ,IAAI,EAAE,QAAQ;gCACd,WAAW,EACT,sEAAsE;gCACxE,IAAI,EAAE,CAAC,GAAG,sBAAsB,CAAC;6BAClC;4BACD,gBAAgB,EAAE;gCAChB,IAAI,EAAE,QAAQ;gCACd,WAAW,EACT,+KAA+K;6BAClL;4BACD,UAAU,EAAE;gCACV,IAAI,EAAE,QAAQ;gCACd,WAAW,EACT,yEAAyE;6BAC5E;4BACD,aAAa,EAAE;gCACb,IAAI,EAAE,QAAQ;gCACd,WAAW,EACT,wEAAwE;6BAC3E;4BACD,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,WAAW,EACT,yFAAyF;6BAC5F;yBACF;wBACD,QAAQ,EAAE,CAAC,cAAc,EAAE,eAAe,EAAE,MAAM,CAAC;qBACpD;oBACD,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,yBAAyB;4BAC/B,MAAM,EACJ,kGAAkG;4BACpG,IAAI,EAAE,YAAY;yBACnB;wBACD;4BACE,IAAI,EAAE,mBAAmB;4BACzB,MAAM,EACJ,oGAAoG;4BACtG,IAAI,EAAE,YAAY;yBACnB;qBACF;iBACF;gBACD,QAAQ,EAAE,eAAe,CACvB,IAAI,CAAC,IAAI,EACT,yBAAyB,EACzB,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CACvC;aACF;SACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,IAAyB;QACjD,4DAA4D;QAC5D,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;YAC/D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;YACjD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;SAC5C,CAAC,CAAC;QACH,MAAM,aAAa,GACjB,aAAa,CAAC,MAAM,KAAK,WAAW;YAClC,CAAC,CAAC,aAAa,CAAC,KAAK;YACrB,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACtC,MAAM,gBAAgB,GACpB,cAAc,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAEpE,gCAAgC;QAChC,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;YAC9C,CAAC,CAAC,aAAa;YACf,CAAC,CAAE,aAAqB,EAAE,aAAa,IAAI,EAAE,CAAC;QAChD,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC;YACjD,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAE,gBAAwB,EAAE,OAAO,IAAI,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,WAAW,CAAC,CAAC;QAEpD,OAAO,oBAAoB,CAAC,UAAU,EAAE,QAAQ,EAAE;YAChD,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,IAAyB;QACnD,2CAA2C;QAC3C,MAAM,UAAU,GAAI,IAAI,CAAC,OAAsC,CAAC,MAAM,CACpE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,EACjC,CAAC,CACF,CAAC;QACF,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;YACvB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,gBAAgB,UAAU,2DAA2D;qBAC5F;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,4FAA4F;QAC5F,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;YAC/B,QAAQ;YACR,UAAU;YACV,UAAU;YACV,UAAU;SACX,CAAC,CAAC;QACH,MAAM,UAAU,GACd,IAAI,CAAC,OAcN,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACV,MAAM,MAAM,GAKR;gBACF,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;aACtB,CAAC;YACF,IAAI,CAAC,CAAC,YAAY;gBAAE,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC;YACzD,IAAI,CAAC,CAAC,0BAA0B,KAAK,SAAS;gBAC5C,MAAM,CAAC,0BAA0B,GAAG,CAAC,CAAC,0BAA0B,CAAC;YACnE,IAAI,CAAC,CAAC,SAAS;gBAAE,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;YAChD,IAAI,CAAC,CAAC,WAAW;gBAAE,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;YACtD,IAAI,CAAC,CAAC,UAAU;gBAAE,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;YACnD,IAAI,CAAC,CAAC,QAAQ;gBAAE,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;YAC7C,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS;gBAAE,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;YACjE,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS;gBAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;YAClD,IAAI,CAAC,CAAC,kBAAkB;gBACtB,MAAM,CAAC,kBAAkB,GAAG,CAAC,CAAC,kBAAkB,CAAC;YACnD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,MAAM,iBAAiB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAChD,gBAAgB,CAAC,GAAG,CAClB,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC;aACvB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACd,IAAI,EAAE,CACV,CACF,CAAC;QACF,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CACxC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,gBAAgB,CAAC,GAAG,CACnB,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC;aACvB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACd,IAAI,EAAE,CACV,CACJ,CAAC;QAEF,IAAI,OAAY,CAAC;QAEjB,+BAA+B;QAC/B,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChE,sGAAsG;YACtG,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;gBACxD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE;oBAClD,OAAO,EAAE,iBAAiB;iBAC3B,CAAC;gBACF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE;oBAC5C,OAAO,EAAE,gBAAgB;iBAC1B,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,SAAS,GACb,UAAU,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9D,MAAM,SAAS,GACb,UAAU,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9D,MAAM,QAAQ,GACZ,UAAU,CAAC,MAAM,KAAK,UAAU;gBAC9B,CAAC,CAAE,UAAoC,CAAC,MAAM;gBAC9C,CAAC,CAAC,IAAI,CAAC;YACX,MAAM,QAAQ,GACZ,UAAU,CAAC,MAAM,KAAK,UAAU;gBAC9B,CAAC,CAAE,UAAoC,CAAC,MAAM;gBAC9C,CAAC,CAAC,IAAI,CAAC;YAEX,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;gBACzB,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,4EAA4E,QAAQ,EAAE,OAAO,IAAI,QAAQ,sBAAsB,QAAQ,EAAE,OAAO,IAAI,QAAQ,EAAE;yBACrK;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,8DAA8D,QAAQ,EAAE,OAAO,IAAI,QAAQ,iCAAiC;yBACnI;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,8DAA8D,QAAQ,EAAE,OAAO,IAAI,QAAQ,gCAAgC;yBAClI;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,OAAO,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QAC7D,CAAC;aAAM,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE;gBAClE,OAAO,EAAE,iBAAiB;aAC3B,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE;gBAC5D,OAAO,EAAE,gBAAgB;aAC1B,CAAC,CAAC;QACL,CAAC;QAED,gDAAgD;QAChD,MAAM,KAAK,GAAqB,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAC7D,IAAI,CAAC,OAAO,CACb,CAAC;YACF,KAAK,CAAC,IAAI,CACR,GAAG,cAAc,CAAC,YAAY,EAAE,IAAI,IAAI,YAAY,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC,CACxE,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;QAED,gDAAgD;QAChD,MAAM,OAAO,GACX,IAAI,CAAC,OAMN;aACE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;aAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,SAAS,EAAE,CAAC,CAAC,SAAU;YACvB,OAAO,EAAE,2BAA2B,CAAC,CAAC,IAAI,IAAI,QAAQ,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,8BAA8B;YACtG,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,iBAAiB,EAAE,cAAc;SAClC,CAAC,CAAC,CAAC;QAEN,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACxD,aAAa,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,GAAG,GAAG,aAAa;YACvB,CAAC,CAAC,oBAAoB,aAAa,EAAE;YACrC,CAAC,CAAC,8BAA8B,CAAC;QACnC,OAAO,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;;;;;;;;OAaG;IACK,KAAK,CAAC,sBAAsB,CAClC,IAAyB;QAEzB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAsB,CAAC;QAChD,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAkB,CAAC;QAC3D,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAW,CAAC;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAc,CAAC;QAEjC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,2BAA2B;qBAClC;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,0EAA0E;qBACjF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,IAAI,IAAI,CAAE,sBAA4C,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3E,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,iBAAiB,IAAI,sBAAsB,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,6GAA6G;qBAChM;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC;QACX,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,WAAW,EAAE;gBAC5D,SAAS,EAAE,QAAQ;gBACnB,aAAa,EAAE,YAAY,CAAC,IAAI,EAAE;gBAClC,IAAI;gBACJ,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,IAAI;gBAC/C,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;gBACnC,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,CAAC;gBACtC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;aAC1B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtE,4DAA4D;YAC5D,+DAA+D;YAC/D,IACE,qCAAqC,CAAC,IAAI,CAAC,YAAY,CAAC;gBACxD,QAAQ,EACR,CAAC;gBACD,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,kDAAkD,QAAQ,gFAAgF,YAAY,EAAE;yBAC/J;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,sCAAsC,YAAY,EAAE;qBAC3D;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,wEAAwE;QACxE,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,OAAO,GAAwB;gBACnC;oBACE,SAAS,EAAE,QAAQ;oBACnB,OAAO,EAAE,2BAA2B,IAAI,iCAAiC;oBACzE,iBAAiB,EAAE,cAAc;iBAClC;aACF,CAAC;YACF,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACxD,aAAa,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;YAClD,CAAC;YAAC,MAAM,CAAC;gBACP,sCAAsC;YACxC,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,aAAa;YACvB,CAAC,CAAC,2BAA2B,aAAa,EAAE;YAC5C,CAAC,CAAC,qCAAqC,CAAC;QAC1C,OAAO,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * ADR-158 Plan C Phase 2 — completion hints for pica_works_create.
3
+ *
4
+ * When a fresh work is created, the custody columns default to
5
+ * "entry_default" (the org that typed it in is the placeholder custodian
6
+ * until an actual claim is made). These hints nudge the agent to have
7
+ * the rights conversation immediately rather than leaving custody dangling.
8
+ *
9
+ * The helper is intentionally defensive — the SDK's `Work` TS interface
10
+ * does not declare `composition_custody_source` / `master_custody_source`,
11
+ * but the API returns them as JSON pass-through from `worksService.create`.
12
+ * Callers pass the raw work object; we read the fields with a typed wrapper.
13
+ */
14
+ import type { CompletionHint } from "@withpica/mcp-utils";
15
+ export declare function buildCustodyHints(work: unknown): CompletionHint[];
16
+ //# sourceMappingURL=custody-hints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custody-hints.d.ts","sourceRoot":"","sources":["../../src/tools/custody-hints.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAO1D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,EAAE,CA+BjE"}
@@ -0,0 +1,27 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ export function buildCustodyHints(work) {
3
+ const w = (work ?? {});
4
+ const hints = [];
5
+ if (w.composition_custody_source === "entry_default") {
6
+ hints.push({
7
+ gap: "custody_unclaimed_composition",
8
+ severity: "important",
9
+ suggestion: "Who holds the publishing (composition) rights? If you, call pica_custody_claim with chain='composition'. If someone else (publisher, co-writer), invite them via pica_collaborators_invite and let them claim custody on acceptance.",
10
+ });
11
+ }
12
+ if (w.master_custody_source === "entry_default") {
13
+ hints.push({
14
+ gap: "custody_unclaimed_master",
15
+ severity: "important",
16
+ suggestion: "Who holds the recording (master) rights? Label, distributor, self-released? Same pattern — claim it yourself via pica_custody_claim with chain='master', or invite the rightsholder.",
17
+ });
18
+ }
19
+ // Always fire the split hint — we never know splits from a single work row.
20
+ hints.push({
21
+ gap: "rights_share_unknown",
22
+ severity: "nice_to_have",
23
+ suggestion: "Is the publishing 100% yours or split with co-writers? If split, add co-writers via pica_work_credits_add with their percentage shares so the splits sum to 100. Then invite them via pica_collaborators_invite to confirm.",
24
+ });
25
+ return hints;
26
+ }
27
+ //# sourceMappingURL=custody-hints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custody-hints.js","sourceRoot":"","sources":["../../src/tools/custody-hints.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAuB7D,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC7C,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAoB,CAAC;IAC1C,MAAM,KAAK,GAAqB,EAAE,CAAC;IAEnC,IAAI,CAAC,CAAC,0BAA0B,KAAK,eAAe,EAAE,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC;YACT,GAAG,EAAE,+BAA+B;YACpC,QAAQ,EAAE,WAAW;YACrB,UAAU,EACR,sOAAsO;SACzO,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,CAAC,qBAAqB,KAAK,eAAe,EAAE,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC;YACT,GAAG,EAAE,0BAA0B;YAC/B,QAAQ,EAAE,WAAW;YACrB,UAAU,EACR,sLAAsL;SACzL,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,IAAI,CAAC;QACT,GAAG,EAAE,sBAAsB;QAC3B,QAAQ,EAAE,cAAc;QACxB,UAAU,EACR,6NAA6N;KAChO,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Custody MCP Tools — ADR-158 Plan C Phase 1
3
+ *
4
+ * Six tools covering the custody claim lifecycle + reconciliation, exposed
5
+ * on the stdio transport. Thin wrappers around this.pica.custody.* which
6
+ * calls the HTTP routes under /api/admin/custody/.
7
+ *
8
+ * Tools:
9
+ * pica_custody_claim — request custody of a work's chain
10
+ * pica_custody_respond — accept/decline/dispute an incoming claim
11
+ * pica_custody_list — list incoming + outgoing claims
12
+ * pica_custody_history — custody-related provenance_history rows
13
+ * pica_custody_resolve_pending — preview inheritable works for a global_publisher_id
14
+ * pica_custody_reconcile — bulk-claim inheritable works
15
+ *
16
+ * RBAC (enforced at the HTTP route layer, see app/api/admin/custody/*):
17
+ * claim, respond, resolve_pending, reconcile → admin/owner only
18
+ * list, history → any authenticated member
19
+ *
20
+ * Pricing: FREE. ADR-162 deprecates credit gating as a user-facing concept.
21
+ */
22
+ import { PicaClient } from "@withpica/mcp-sdk";
23
+ import type { ToolDefinition, ToolExecutor } from "./index.js";
24
+ export declare class CustodyTools {
25
+ private pica;
26
+ constructor(pica: PicaClient);
27
+ getTools(): Array<{
28
+ definition: ToolDefinition;
29
+ executor: ToolExecutor;
30
+ }>;
31
+ private claim;
32
+ private respond;
33
+ private list;
34
+ private history;
35
+ private resolvePending;
36
+ private reconcile;
37
+ }
38
+ //# sourceMappingURL=custody.d.ts.map