paperclip-github-plugin 0.4.4 → 0.4.5

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/README.md CHANGED
@@ -71,7 +71,7 @@ Paperclip issue linkage on the queue prefers the GitHub issue that the pull requ
71
71
 
72
72
  ### Agent workflows built in
73
73
 
74
- Paperclip agents can search GitHub for duplicates, read and update issues, post comments, create pull requests, inspect changed files and CI, reply to review threads, resolve or unresolve threads, request reviewers, list org-level GitHub Projects, and associate pull requests with those projects without leaving the Paperclip plugin surface.
74
+ Paperclip agents can search GitHub for duplicates, read and update issues, post comments, create pull requests, inspect changed files and CI, reply to review threads, resolve or unresolve threads, request reviewers, search org-level GitHub Projects, and associate pull requests with those projects without leaving the Paperclip plugin surface.
75
75
 
76
76
  ## Requirements
77
77
 
@@ -185,9 +185,9 @@ The plugin exposes GitHub workflow tools to Paperclip agents, including:
185
185
  - issue reads, comment reads, comment writes, and metadata updates
186
186
  - pull request creation, reads, updates, changed-file inspection, and CI-check inspection
187
187
  - review-thread reads, replies, resolve and unresolve actions, and reviewer requests
188
- - organization-level GitHub Project listing and pull-request-to-project association
188
+ - organization-level GitHub Project search/listing and pull-request-to-project association
189
189
 
190
- When an agent posts a GitHub comment or review-thread reply through the plugin, the message includes a footer disclosing that it was created by a Paperclip AI agent and which model was used.
190
+ When an agent sends GitHub body content through the plugin, including issue bodies, pull request descriptions, comments, and review-thread replies, the plugin adds a GitHub-flavored Markdown footer with a horizontal rule and compact heading that discloses AI authorship. If the tool caller supplies `llmModel`, the footer also includes the model name, for example `###### ✨ This comment was AI-generated using gpt-5.4`.
191
191
 
192
192
  Current host caveat: on authenticated Paperclip deployments, the Paperclip host currently guards `GET /api/plugins/tools` and `POST /api/plugins/tools/execute` with board authentication before dispatching to any plugin worker. If an agent run does not have board access for the target company, GitHub Sync tool discovery and execution fail with `403 {"error":"Board access required"}` before this plugin's worker code runs.
193
193
 
package/dist/manifest.js CHANGED
@@ -35,7 +35,7 @@ var projectNumberProperty = {
35
35
  };
36
36
  var llmModelProperty = {
37
37
  type: "string",
38
- description: "Exact LLM name used to draft the comment. Required so the plugin can append the mandatory AI-authorship footer."
38
+ description: "Exact LLM name used to draft the GitHub content. When provided, the plugin includes it in the mandatory AI-authorship footer."
39
39
  };
40
40
  var issueTargetSchema = {
41
41
  anyOf: [
@@ -149,7 +149,7 @@ var GITHUB_AGENT_TOOLS = [
149
149
  {
150
150
  name: "update_issue",
151
151
  displayName: "Update Issue",
152
- description: "Update GitHub issue fields such as title, body, state, labels, assignees, or milestone.",
152
+ description: "Update GitHub issue fields such as title, body, state, labels, assignees, or milestone. When a non-empty body is provided, the plugin appends an AI-authorship footer and includes llmModel when supplied.",
153
153
  parametersSchema: {
154
154
  type: "object",
155
155
  additionalProperties: false,
@@ -162,8 +162,10 @@ var GITHUB_AGENT_TOOLS = [
162
162
  type: "string"
163
163
  },
164
164
  body: {
165
- type: "string"
165
+ type: "string",
166
+ description: "Optional human-facing issue description body. If provided, it must remain non-empty after trimming and removing any existing AI footer."
166
167
  },
168
+ llmModel: llmModelProperty,
167
169
  state: {
168
170
  type: "string",
169
171
  enum: ["open", "closed"]
@@ -215,11 +217,11 @@ var GITHUB_AGENT_TOOLS = [
215
217
  {
216
218
  name: "add_issue_comment",
217
219
  displayName: "Add Issue Comment",
218
- description: "Post a comment on a GitHub issue or pull request. Provide only the human-facing message body; include llmModel so the plugin can append the required AI-authorship footer.",
220
+ description: "Post a comment on a GitHub issue or pull request. Provide only the human-facing message body; it must remain non-empty after trimming and removing any existing AI footer. The plugin appends the required AI-authorship footer and includes llmModel when supplied.",
219
221
  parametersSchema: {
220
222
  type: "object",
221
223
  additionalProperties: false,
222
- required: ["body", "llmModel"],
224
+ required: ["body"],
223
225
  ...issueTargetSchema,
224
226
  properties: {
225
227
  repository: repositoryProperty,
@@ -227,7 +229,8 @@ var GITHUB_AGENT_TOOLS = [
227
229
  paperclipIssueId: paperclipIssueIdProperty,
228
230
  body: {
229
231
  type: "string",
230
- description: "Human-facing comment body without the AI footer."
232
+ minLength: 1,
233
+ description: "Human-facing comment body without the AI footer. It must remain non-empty after trimming and removing any existing AI footer."
231
234
  },
232
235
  llmModel: llmModelProperty
233
236
  }
@@ -236,7 +239,7 @@ var GITHUB_AGENT_TOOLS = [
236
239
  {
237
240
  name: "create_pull_request",
238
241
  displayName: "Create Pull Request",
239
- description: "Open a GitHub pull request once the implementation branch is pushed.",
242
+ description: "Open a GitHub pull request once the implementation branch is pushed. When a non-empty body is provided, the plugin appends an AI-authorship footer and includes llmModel when supplied.",
240
243
  parametersSchema: {
241
244
  type: "object",
242
245
  additionalProperties: false,
@@ -255,8 +258,10 @@ var GITHUB_AGENT_TOOLS = [
255
258
  type: "string"
256
259
  },
257
260
  body: {
258
- type: "string"
261
+ type: "string",
262
+ description: "Optional human-facing pull request description. If provided, it must remain non-empty after trimming and removing any existing AI footer."
259
263
  },
264
+ llmModel: llmModelProperty,
260
265
  draft: {
261
266
  type: "boolean"
262
267
  }
@@ -281,7 +286,7 @@ var GITHUB_AGENT_TOOLS = [
281
286
  {
282
287
  name: "update_pull_request",
283
288
  displayName: "Update Pull Request",
284
- description: "Edit pull request title, body, base branch, open or close it, or convert between draft and ready for review.",
289
+ description: "Edit pull request title, body, base branch, open or close it, or convert between draft and ready for review. When a non-empty body is provided, the plugin appends an AI-authorship footer and includes llmModel when supplied.",
285
290
  parametersSchema: {
286
291
  type: "object",
287
292
  additionalProperties: false,
@@ -294,8 +299,10 @@ var GITHUB_AGENT_TOOLS = [
294
299
  type: "string"
295
300
  },
296
301
  body: {
297
- type: "string"
302
+ type: "string",
303
+ description: "Optional human-facing pull request description. If provided, it must remain non-empty after trimming and removing any existing AI footer."
298
304
  },
305
+ llmModel: llmModelProperty,
299
306
  base: {
300
307
  type: "string"
301
308
  },
@@ -358,11 +365,11 @@ var GITHUB_AGENT_TOOLS = [
358
365
  {
359
366
  name: "reply_to_review_thread",
360
367
  displayName: "Reply To Review Thread",
361
- description: "Reply to an existing pull request review thread. Provide only the human-facing body; include llmModel so the plugin can append the required AI-authorship footer.",
368
+ description: "Reply to an existing pull request review thread. Provide only the human-facing body; the plugin appends the required AI-authorship footer and includes llmModel when supplied.",
362
369
  parametersSchema: {
363
370
  type: "object",
364
371
  additionalProperties: false,
365
- required: ["threadId", "body", "llmModel"],
372
+ required: ["threadId", "body"],
366
373
  properties: {
367
374
  threadId: {
368
375
  type: "string",
@@ -370,7 +377,8 @@ var GITHUB_AGENT_TOOLS = [
370
377
  },
371
378
  body: {
372
379
  type: "string",
373
- description: "Human-facing reply body without the AI footer."
380
+ minLength: 1,
381
+ description: "Human-facing reply body without the AI footer. It must remain non-empty after trimming and removing any existing AI footer."
374
382
  },
375
383
  llmModel: llmModelProperty
376
384
  }
@@ -454,7 +462,7 @@ var GITHUB_AGENT_TOOLS = [
454
462
  {
455
463
  name: "list_organization_projects",
456
464
  displayName: "List Organization Projects",
457
- description: "List GitHub organization-level Projects so an agent can choose where to associate pull requests.",
465
+ description: "Search or list GitHub organization-level Projects so an agent can choose where to associate pull requests.",
458
466
  parametersSchema: {
459
467
  type: "object",
460
468
  additionalProperties: false,
@@ -503,7 +511,7 @@ var require2 = createRequire(import.meta.url);
503
511
  var packageJson = require2("../package.json");
504
512
  var DASHBOARD_WIDGET_CAPABILITY = "ui.dashboardWidget.register";
505
513
  var SCHEDULE_TICK_CRON = "* * * * *";
506
- var MANIFEST_VERSION = "0.4.4"?.trim() || typeof packageJson.version === "string" && packageJson.version.trim() || process.env.npm_package_version?.trim() || "0.0.0-dev";
514
+ var MANIFEST_VERSION = "0.4.5"?.trim() || typeof packageJson.version === "string" && packageJson.version.trim() || process.env.npm_package_version?.trim() || "0.0.0-dev";
507
515
  var manifest = {
508
516
  id: "paperclip-github-plugin",
509
517
  apiVersion: 1,
package/dist/worker.js CHANGED
@@ -44,7 +44,7 @@ var projectNumberProperty = {
44
44
  };
45
45
  var llmModelProperty = {
46
46
  type: "string",
47
- description: "Exact LLM name used to draft the comment. Required so the plugin can append the mandatory AI-authorship footer."
47
+ description: "Exact LLM name used to draft the GitHub content. When provided, the plugin includes it in the mandatory AI-authorship footer."
48
48
  };
49
49
  var issueTargetSchema = {
50
50
  anyOf: [
@@ -158,7 +158,7 @@ var GITHUB_AGENT_TOOLS = [
158
158
  {
159
159
  name: "update_issue",
160
160
  displayName: "Update Issue",
161
- description: "Update GitHub issue fields such as title, body, state, labels, assignees, or milestone.",
161
+ description: "Update GitHub issue fields such as title, body, state, labels, assignees, or milestone. When a non-empty body is provided, the plugin appends an AI-authorship footer and includes llmModel when supplied.",
162
162
  parametersSchema: {
163
163
  type: "object",
164
164
  additionalProperties: false,
@@ -171,8 +171,10 @@ var GITHUB_AGENT_TOOLS = [
171
171
  type: "string"
172
172
  },
173
173
  body: {
174
- type: "string"
174
+ type: "string",
175
+ description: "Optional human-facing issue description body. If provided, it must remain non-empty after trimming and removing any existing AI footer."
175
176
  },
177
+ llmModel: llmModelProperty,
176
178
  state: {
177
179
  type: "string",
178
180
  enum: ["open", "closed"]
@@ -224,11 +226,11 @@ var GITHUB_AGENT_TOOLS = [
224
226
  {
225
227
  name: "add_issue_comment",
226
228
  displayName: "Add Issue Comment",
227
- description: "Post a comment on a GitHub issue or pull request. Provide only the human-facing message body; include llmModel so the plugin can append the required AI-authorship footer.",
229
+ description: "Post a comment on a GitHub issue or pull request. Provide only the human-facing message body; it must remain non-empty after trimming and removing any existing AI footer. The plugin appends the required AI-authorship footer and includes llmModel when supplied.",
228
230
  parametersSchema: {
229
231
  type: "object",
230
232
  additionalProperties: false,
231
- required: ["body", "llmModel"],
233
+ required: ["body"],
232
234
  ...issueTargetSchema,
233
235
  properties: {
234
236
  repository: repositoryProperty,
@@ -236,7 +238,8 @@ var GITHUB_AGENT_TOOLS = [
236
238
  paperclipIssueId: paperclipIssueIdProperty,
237
239
  body: {
238
240
  type: "string",
239
- description: "Human-facing comment body without the AI footer."
241
+ minLength: 1,
242
+ description: "Human-facing comment body without the AI footer. It must remain non-empty after trimming and removing any existing AI footer."
240
243
  },
241
244
  llmModel: llmModelProperty
242
245
  }
@@ -245,7 +248,7 @@ var GITHUB_AGENT_TOOLS = [
245
248
  {
246
249
  name: "create_pull_request",
247
250
  displayName: "Create Pull Request",
248
- description: "Open a GitHub pull request once the implementation branch is pushed.",
251
+ description: "Open a GitHub pull request once the implementation branch is pushed. When a non-empty body is provided, the plugin appends an AI-authorship footer and includes llmModel when supplied.",
249
252
  parametersSchema: {
250
253
  type: "object",
251
254
  additionalProperties: false,
@@ -264,8 +267,10 @@ var GITHUB_AGENT_TOOLS = [
264
267
  type: "string"
265
268
  },
266
269
  body: {
267
- type: "string"
270
+ type: "string",
271
+ description: "Optional human-facing pull request description. If provided, it must remain non-empty after trimming and removing any existing AI footer."
268
272
  },
273
+ llmModel: llmModelProperty,
269
274
  draft: {
270
275
  type: "boolean"
271
276
  }
@@ -290,7 +295,7 @@ var GITHUB_AGENT_TOOLS = [
290
295
  {
291
296
  name: "update_pull_request",
292
297
  displayName: "Update Pull Request",
293
- description: "Edit pull request title, body, base branch, open or close it, or convert between draft and ready for review.",
298
+ description: "Edit pull request title, body, base branch, open or close it, or convert between draft and ready for review. When a non-empty body is provided, the plugin appends an AI-authorship footer and includes llmModel when supplied.",
294
299
  parametersSchema: {
295
300
  type: "object",
296
301
  additionalProperties: false,
@@ -303,8 +308,10 @@ var GITHUB_AGENT_TOOLS = [
303
308
  type: "string"
304
309
  },
305
310
  body: {
306
- type: "string"
311
+ type: "string",
312
+ description: "Optional human-facing pull request description. If provided, it must remain non-empty after trimming and removing any existing AI footer."
307
313
  },
314
+ llmModel: llmModelProperty,
308
315
  base: {
309
316
  type: "string"
310
317
  },
@@ -367,11 +374,11 @@ var GITHUB_AGENT_TOOLS = [
367
374
  {
368
375
  name: "reply_to_review_thread",
369
376
  displayName: "Reply To Review Thread",
370
- description: "Reply to an existing pull request review thread. Provide only the human-facing body; include llmModel so the plugin can append the required AI-authorship footer.",
377
+ description: "Reply to an existing pull request review thread. Provide only the human-facing body; the plugin appends the required AI-authorship footer and includes llmModel when supplied.",
371
378
  parametersSchema: {
372
379
  type: "object",
373
380
  additionalProperties: false,
374
- required: ["threadId", "body", "llmModel"],
381
+ required: ["threadId", "body"],
375
382
  properties: {
376
383
  threadId: {
377
384
  type: "string",
@@ -379,7 +386,8 @@ var GITHUB_AGENT_TOOLS = [
379
386
  },
380
387
  body: {
381
388
  type: "string",
382
- description: "Human-facing reply body without the AI footer."
389
+ minLength: 1,
390
+ description: "Human-facing reply body without the AI footer. It must remain non-empty after trimming and removing any existing AI footer."
383
391
  },
384
392
  llmModel: llmModelProperty
385
393
  }
@@ -463,7 +471,7 @@ var GITHUB_AGENT_TOOLS = [
463
471
  {
464
472
  name: "list_organization_projects",
465
473
  displayName: "List Organization Projects",
466
- description: "List GitHub organization-level Projects so an agent can choose where to associate pull requests.",
474
+ description: "Search or list GitHub organization-level Projects so an agent can choose where to associate pull requests.",
467
475
  parametersSchema: {
468
476
  type: "object",
469
477
  additionalProperties: false,
@@ -629,7 +637,9 @@ var IMPORTED_ISSUE_WAKE_REASON = "GitHub Sync imported an assigned issue that is
629
637
  var ISSUE_LINK_ENTITY_TYPE = "paperclip-github-plugin.issue-link";
630
638
  var PULL_REQUEST_LINK_ENTITY_TYPE = "paperclip-github-plugin.pull-request-link";
631
639
  var COMMENT_ANNOTATION_ENTITY_TYPE = "paperclip-github-plugin.comment-annotation";
632
- var AI_AUTHORED_COMMENT_FOOTER_PREFIX = "Created by a Paperclip AI agent using ";
640
+ var AI_AUTHORED_FOOTER_MARKDOWN_PREFIX = "###### \u2728 This ";
641
+ var AI_AUTHORED_LEGACY_FOOTER_PATTERN = /\n\n---\nCreated by a Paperclip AI agent(?: using [^\n]+)?\.\s*$/;
642
+ var AI_AUTHORED_MARKDOWN_FOOTER_PATTERN = /\n\n---\n###### ✨ This (?:comment|issue description|pull request description) was AI-generated(?: using [^\n]+)?\s*$/;
633
643
  var HIDDEN_GITHUB_IMPORT_MARKER_PREFIX = "<!-- paperclip-github-plugin-imported-from: ";
634
644
  var HIDDEN_GITHUB_IMPORT_MARKER_SUFFIX = " -->";
635
645
  var EMPTY_GITHUB_ISSUE_DESCRIPTION_PLACEHOLDER = "_No description provided on GitHub._";
@@ -7183,22 +7193,36 @@ async function getGitHubPullRequestProjectItems(octokit, repository, pullRequest
7183
7193
  projectItems
7184
7194
  };
7185
7195
  }
7186
- function formatAiAuthorshipFooter(llmModel) {
7196
+ function stripAiAuthorshipFooter(body) {
7197
+ let strippedBody = body;
7198
+ while (true) {
7199
+ const nextBody = strippedBody.replace(AI_AUTHORED_LEGACY_FOOTER_PATTERN, "").replace(AI_AUTHORED_MARKDOWN_FOOTER_PATTERN, "");
7200
+ if (nextBody === strippedBody) {
7201
+ return strippedBody;
7202
+ }
7203
+ strippedBody = nextBody;
7204
+ }
7205
+ }
7206
+ function formatAiAuthorshipFooter(subject, llmModel) {
7207
+ const trimmedModel = llmModel?.trim();
7187
7208
  return `
7188
7209
 
7189
7210
  ---
7190
- ${AI_AUTHORED_COMMENT_FOOTER_PREFIX}${llmModel.trim()}.`;
7211
+ ${AI_AUTHORED_FOOTER_MARKDOWN_PREFIX}${subject} was AI-generated${trimmedModel ? ` using ${trimmedModel}` : ""}`;
7191
7212
  }
7192
- function appendAiAuthorshipFooter(body, llmModel) {
7193
- const trimmedBody = body.trim();
7213
+ function appendAiAuthorshipFooter(body, subject, llmModel) {
7214
+ const trimmedBody = stripAiAuthorshipFooter(body).trim();
7194
7215
  if (!trimmedBody) {
7195
7216
  throw new Error("Comment body cannot be empty.");
7196
7217
  }
7197
- const trimmedModel = llmModel.trim();
7198
- if (!trimmedModel) {
7199
- throw new Error("llmModel is required when posting a GitHub comment.");
7218
+ return `${trimmedBody}${formatAiAuthorshipFooter(subject, llmModel)}`;
7219
+ }
7220
+ function appendOptionalAiAuthorshipFooter(body, subject, llmModel) {
7221
+ const trimmedBody = stripAiAuthorshipFooter(body).trim();
7222
+ if (!trimmedBody) {
7223
+ return void 0;
7200
7224
  }
7201
- return `${trimmedBody}${formatAiAuthorshipFooter(trimmedModel)}`;
7225
+ return `${trimmedBody}${formatAiAuthorshipFooter(subject, llmModel)}`;
7202
7226
  }
7203
7227
  async function listAllGitHubIssueComments(octokit, repository, issueNumber) {
7204
7228
  const comments = [];
@@ -10262,7 +10286,8 @@ function registerGitHubAgentTools(ctx) {
10262
10286
  removeValues: normalizeToolStringArray(input.removeAssignees)
10263
10287
  });
10264
10288
  const title = Object.prototype.hasOwnProperty.call(input, "title") && typeof input.title === "string" ? input.title : void 0;
10265
- const body = Object.prototype.hasOwnProperty.call(input, "body") && typeof input.body === "string" ? input.body : void 0;
10289
+ const llmModel = normalizeOptionalToolString(input.llmModel);
10290
+ const body = Object.prototype.hasOwnProperty.call(input, "body") && typeof input.body === "string" ? appendOptionalAiAuthorshipFooter(input.body, "issue description", llmModel) : void 0;
10266
10291
  const state = input.state === "open" || input.state === "closed" ? input.state : void 0;
10267
10292
  const milestoneNumber = Object.prototype.hasOwnProperty.call(input, "milestoneNumber") ? input.milestoneNumber === null ? null : normalizeToolPositiveInteger(input.milestoneNumber) : void 0;
10268
10293
  const hasChanges = title !== void 0 || body !== void 0 || state !== void 0 || Object.prototype.hasOwnProperty.call(input, "milestoneNumber") || normalizeToolStringArray(input.setLabels).length > 0 || normalizeToolStringArray(input.addLabels).length > 0 || normalizeToolStringArray(input.removeLabels).length > 0 || normalizeToolStringArray(input.setAssignees).length > 0 || normalizeToolStringArray(input.addAssignees).length > 0 || normalizeToolStringArray(input.removeAssignees).length > 0;
@@ -10312,7 +10337,7 @@ function registerGitHubAgentTools(ctx) {
10312
10337
  const input = getToolInputRecord(params);
10313
10338
  const target = await resolveGitHubIssueToolTarget(ctx, runCtx, input);
10314
10339
  const octokit = await createGitHubToolOctokit(ctx, runCtx.companyId);
10315
- const body = appendAiAuthorshipFooter(String(input.body ?? ""), normalizeOptionalToolString(input.llmModel) ?? "");
10340
+ const body = appendAiAuthorshipFooter(String(input.body ?? ""), "comment", normalizeOptionalToolString(input.llmModel));
10316
10341
  const response = await octokit.rest.issues.createComment({
10317
10342
  owner: target.repository.owner,
10318
10343
  repo: target.repository.repo,
@@ -10350,6 +10375,11 @@ function registerGitHubAgentTools(ctx) {
10350
10375
  if (!head || !base || !title) {
10351
10376
  throw new Error("head, base, and title are required.");
10352
10377
  }
10378
+ const body = typeof input.body === "string" ? appendOptionalAiAuthorshipFooter(
10379
+ input.body,
10380
+ "pull request description",
10381
+ normalizeOptionalToolString(input.llmModel)
10382
+ ) : void 0;
10353
10383
  const octokit = await createGitHubToolOctokit(ctx, runCtx.companyId);
10354
10384
  const response = await octokit.rest.pulls.create({
10355
10385
  owner: repository.owner,
@@ -10357,7 +10387,7 @@ function registerGitHubAgentTools(ctx) {
10357
10387
  head,
10358
10388
  base,
10359
10389
  title,
10360
- ...typeof input.body === "string" ? { body: input.body } : {},
10390
+ ...body !== void 0 ? { body } : {},
10361
10391
  ...typeof input.draft === "boolean" ? { draft: input.draft } : {},
10362
10392
  headers: {
10363
10393
  "X-GitHub-Api-Version": GITHUB_API_VERSION
@@ -10445,7 +10475,8 @@ function registerGitHubAgentTools(ctx) {
10445
10475
  }
10446
10476
  });
10447
10477
  const title = Object.prototype.hasOwnProperty.call(input, "title") && typeof input.title === "string" ? input.title : void 0;
10448
- const body = Object.prototype.hasOwnProperty.call(input, "body") && typeof input.body === "string" ? input.body : void 0;
10478
+ const llmModel = normalizeOptionalToolString(input.llmModel);
10479
+ const body = Object.prototype.hasOwnProperty.call(input, "body") && typeof input.body === "string" ? appendOptionalAiAuthorshipFooter(input.body, "pull request description", llmModel) : void 0;
10449
10480
  const base = normalizeOptionalToolString(input.base);
10450
10481
  const state = input.state === "open" || input.state === "closed" ? input.state : void 0;
10451
10482
  const isDraft = typeof input.isDraft === "boolean" ? input.isDraft : void 0;
@@ -10637,7 +10668,7 @@ function registerGitHubAgentTools(ctx) {
10637
10668
  if (!threadId) {
10638
10669
  throw new Error("threadId is required.");
10639
10670
  }
10640
- const body = appendAiAuthorshipFooter(String(input.body ?? ""), normalizeOptionalToolString(input.llmModel) ?? "");
10671
+ const body = appendAiAuthorshipFooter(String(input.body ?? ""), "comment", normalizeOptionalToolString(input.llmModel));
10641
10672
  const octokit = await createGitHubToolOctokit(ctx, runCtx.companyId);
10642
10673
  const response = await octokit.graphql(
10643
10674
  GITHUB_ADD_PULL_REQUEST_REVIEW_THREAD_REPLY_MUTATION,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "paperclip-github-plugin",
3
- "version": "0.4.4",
3
+ "version": "0.4.5",
4
4
  "description": "Paperclip plugin for synchronizing GitHub issues into Paperclip projects.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",