文件
mynode/readme/cla/consent_records/moaaz-ae_145723871.json
chen 301194963b
一些检查失败了
automerge / automerge (push) Has been cancelled
react-native-android-build-apk / AssembleRelease (push) Has been cancelled
Build macOS M1 / Main (push) Has been cancelled
Joplin Continuous Integration / Main (macos-15-intel) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-11-vs2026-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-2025) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04-arm) (push) Has been cancelled
Joplin UI tests / Main (ubuntu-22.04) (push) Has been cancelled
Joplin UI tests / Main (windows-2025) (push) Has been cancelled
Joplin UI tests / Mobile (push) Has been cancelled
Close stale issues / ProcessStaleIssues (push) Has been cancelled
feat: Initial clean release of CHM
2026-11-04 11:29:39 +08:00

544 行
40 KiB
JSON

此文件含有不可见的 Unicode 字符

此文件含有人类无法区分的不可见的 Unicode 字符,但可以由计算机进行不同的处理。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

{
"issue": {
"url": "https://api.github.com/repos/laurent22/joplin/issues/14750",
"repository_url": "https://api.github.com/repos/laurent22/joplin",
"labels_url": "https://api.github.com/repos/laurent22/joplin/issues/14750/labels{/name}",
"comments_url": "https://api.github.com/repos/laurent22/joplin/issues/14750/comments",
"events_url": "https://api.github.com/repos/laurent22/joplin/issues/14750/events",
"html_url": "https://github.com/laurent22/joplin/pull/14750",
"id": 4078391579,
"node_id": "PR_kwDOBLftOs7KuP9D",
"number": 14750,
"title": "Desktop: Fixes #14613: Fix JPEG image paste from clipboard on Linux",
"user": {
"login": "moaaz-ae",
"id": 145723871,
"node_id": "U_kgDOCK-R3w",
"avatar_url": "https://avatars.githubusercontent.com/u/145723871?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/moaaz-ae",
"html_url": "https://github.com/moaaz-ae",
"followers_url": "https://api.github.com/users/moaaz-ae/followers",
"following_url": "https://api.github.com/users/moaaz-ae/following{/other_user}",
"gists_url": "https://api.github.com/users/moaaz-ae/gists{/gist_id}",
"starred_url": "https://api.github.com/users/moaaz-ae/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/moaaz-ae/subscriptions",
"organizations_url": "https://api.github.com/users/moaaz-ae/orgs",
"repos_url": "https://api.github.com/users/moaaz-ae/repos",
"events_url": "https://api.github.com/users/moaaz-ae/events{/privacy}",
"received_events_url": "https://api.github.com/users/moaaz-ae/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"labels": [
{
"id": 519700741,
"node_id": "MDU6TGFiZWw1MTk3MDA3NDE=",
"url": "https://api.github.com/repos/laurent22/joplin/labels/bug",
"name": "bug",
"color": "cf353b",
"default": true,
"description": "It's a bug"
},
{
"id": 1080341216,
"node_id": "MDU6TGFiZWwxMDgwMzQxMjE2",
"url": "https://api.github.com/repos/laurent22/joplin/labels/desktop",
"name": "desktop",
"color": "ffc274",
"default": false,
"description": "All desktop platforms"
},
{
"id": 1366671832,
"node_id": "MDU6TGFiZWwxMzY2NjcxODMy",
"url": "https://api.github.com/repos/laurent22/joplin/labels/linux",
"name": "linux",
"color": "bfd4f2",
"default": false,
"description": ""
},
{
"id": 1366672371,
"node_id": "MDU6TGFiZWwxMzY2NjcyMzcx",
"url": "https://api.github.com/repos/laurent22/joplin/labels/editor",
"name": "editor",
"color": "91ca55",
"default": false,
"description": ""
}
],
"state": "closed",
"locked": false,
"assignees": [],
"milestone": null,
"comments": 6,
"created_at": "2026-03-15T13:36:39Z",
"updated_at": "2026-04-05T17:50:11Z",
"closed_at": "2026-03-20T20:02:06Z",
"assignee": null,
"author_association": "CONTRIBUTOR",
"active_lock_reason": null,
"draft": false,
"pull_request": {
"url": "https://api.github.com/repos/laurent22/joplin/pulls/14750",
"html_url": "https://github.com/laurent22/joplin/pull/14750",
"diff_url": "https://github.com/laurent22/joplin/pull/14750.diff",
"patch_url": "https://github.com/laurent22/joplin/pull/14750.patch",
"merged_at": "2026-03-20T20:02:06Z"
},
"body": "On Linux, pasting a JPEG image from the system clipboard into a Joplin note does nothing. The image is silently dropped. PNG paste works fine, and drag-and-dropping a JPEG file also works. Only JPEG clipboard paste is broken.\r\n\r\n## The problem\r\n\r\nTwo Electron/Chromium platform behaviours combine to break this:\r\n\r\n1. `clipboard.availableFormats()` returns `[]` for JPEG-only clipboard data on Linux, even though the JPEG bytes are present. This is a known Chromium limitation ([electron/electron#32490](https://github.com/electron/electron/issues/32490)). Since the old code iterated over `availableFormats()`, the loop body never executed for JPEG.\r\n\r\n2. `clipboard.readImage()` returns an empty `NativeImage` for JPEG-only clipboard data, so even if the format were detected, the old `readImage()` to `nativeImage.toJPEG()` path would produce a corrupt file.\r\n\r\n## The fix\r\n\r\nReplace the detection and reading strategy in `getResourcesFromPasteEvent`:\r\n\r\n| Before | After |\r\n| -------------------------------------------------- | ----------------------------------------------------------------- |\r\n| `clipboard.availableFormats()` to detect formats | `clipboard.has(format)` against a fixed list of supported formats |\r\n| `clipboard.readImage()` to read image data | `clipboard.readBuffer(format)` to read raw bytes |\r\n| `shim.writeImageToFile()` (NativeImage conversion) | `shim.fsDriver().writeFile()` (write buffer directly) |\r\n| `event.preventDefault()` called before attachment | `event.preventDefault()` called only after successful attachment |\r\n\r\n`clipboard.has()` and `clipboard.readBuffer()` work correctly on all platforms (Linux, macOS, Windows), so the fix is applied unconditionally rather than behind a platform check.\r\n\r\nThe function signature and return type are unchanged. All three callers (TinyMCE, CodeMirror v5, CodeMirror v6) work without modification.\r\n\r\n## Testing\r\n\r\n### Automated\r\n\r\nAll 11 tests pass in `resourceHandling.test.ts` (7 existing + 4 new).\r\n\r\n### Manual\r\n\r\n1. Copied JPEG via `xclip -selection clipboard -t image/jpeg test.jpeg`, pressed Ctrl+V in Joplin. Image appears in note.\r\n2. Copied PNG via `xclip -selection clipboard -t image/png test.png`, pressed Ctrl+V. Image appears in note.\r\n3. Copied image from browser (right-click, Copy Image), pressed Ctrl+V. Image appears in note.\r\n4. Pasted plain text. Text appears normally, no interference.\r\n5. Tested in both Rich Text (TinyMCE) and Markdown (CodeMirror) editors.\r\n\r\n### Video\r\n\r\nhttps://github.com/user-attachments/assets/35c109d0-aec0-486d-80e1-d6ff66cae87f\r\n\r\n## AI Assistance Disclosure\r\n\r\nThis PR used AI to assist with code refactoring and test design. All code has been manually reviewed and tested.\r\n",
"closed_by": {
"login": "laurent22",
"id": 1285584,
"node_id": "MDQ6VXNlcjEyODU1ODQ=",
"avatar_url": "https://avatars.githubusercontent.com/u/1285584?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/laurent22",
"html_url": "https://github.com/laurent22",
"followers_url": "https://api.github.com/users/laurent22/followers",
"following_url": "https://api.github.com/users/laurent22/following{/other_user}",
"gists_url": "https://api.github.com/users/laurent22/gists{/gist_id}",
"starred_url": "https://api.github.com/users/laurent22/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/laurent22/subscriptions",
"organizations_url": "https://api.github.com/users/laurent22/orgs",
"repos_url": "https://api.github.com/users/laurent22/repos",
"events_url": "https://api.github.com/users/laurent22/events{/privacy}",
"received_events_url": "https://api.github.com/users/laurent22/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"reactions": {
"url": "https://api.github.com/repos/laurent22/joplin/issues/14750/reactions",
"total_count": 1,
"+1": 0,
"-1": 0,
"laugh": 0,
"hooray": 0,
"confused": 0,
"heart": 1,
"rocket": 0,
"eyes": 0
},
"timeline_url": "https://api.github.com/repos/laurent22/joplin/issues/14750/timeline",
"performed_via_github_app": null,
"state_reason": null
},
"comments": [
{
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/4063006174",
"html_url": "https://github.com/laurent22/joplin/pull/14750#issuecomment-4063006174",
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/14750",
"id": 4063006174,
"node_id": "IC_kwDOBLftOs7yLI3e",
"user": {
"login": "github-actions[bot]",
"id": 41898282,
"node_id": "MDM6Qm90NDE4OTgyODI=",
"avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/github-actions%5Bbot%5D",
"html_url": "https://github.com/apps/github-actions",
"followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
"following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
"gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
"starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
"organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
"repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
"events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
"received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
"type": "Bot",
"user_view_type": "public",
"site_admin": false
},
"created_at": "2026-03-15T13:36:51Z",
"updated_at": "2026-03-20T20:45:07Z",
"body": "****CLA Assistant Lite bot**** All contributors have signed the CLA ✍️ ✅",
"author_association": "CONTRIBUTOR",
"reactions": {
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/4063006174/reactions",
"total_count": 0,
"+1": 0,
"-1": 0,
"laugh": 0,
"hooray": 0,
"confused": 0,
"heart": 0,
"rocket": 0,
"eyes": 0
},
"performed_via_github_app": {
"id": 15368,
"client_id": "Iv1.05c79e9ad1f6bdfa",
"slug": "github-actions",
"node_id": "MDM6QXBwMTUzNjg=",
"owner": {
"login": "github",
"id": 9919,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjk5MTk=",
"avatar_url": "https://avatars.githubusercontent.com/u/9919?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/github",
"html_url": "https://github.com/github",
"followers_url": "https://api.github.com/users/github/followers",
"following_url": "https://api.github.com/users/github/following{/other_user}",
"gists_url": "https://api.github.com/users/github/gists{/gist_id}",
"starred_url": "https://api.github.com/users/github/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/github/subscriptions",
"organizations_url": "https://api.github.com/users/github/orgs",
"repos_url": "https://api.github.com/users/github/repos",
"events_url": "https://api.github.com/users/github/events{/privacy}",
"received_events_url": "https://api.github.com/users/github/received_events",
"type": "Organization",
"user_view_type": "public",
"site_admin": false
},
"name": "GitHub Actions",
"description": "Automate your workflow from idea to production",
"external_url": "https://help.github.com/en/actions",
"html_url": "https://github.com/apps/github-actions",
"created_at": "2018-07-30T09:30:17Z",
"updated_at": "2026-05-05T14:51:38Z",
"permissions": {
"actions": "write",
"administration": "read",
"artifact_metadata": "write",
"attestations": "write",
"checks": "write",
"code_quality": "write",
"contents": "write",
"copilot_requests": "write",
"deployments": "write",
"discussions": "write",
"issues": "write",
"merge_queues": "write",
"metadata": "read",
"models": "read",
"packages": "write",
"pages": "write",
"pull_requests": "write",
"repository_hooks": "write",
"repository_projects": "write",
"security_events": "write",
"statuses": "write",
"vulnerability_alerts": "read"
},
"events": [
"branch_protection_rule",
"check_run",
"check_suite",
"create",
"delete",
"deployment",
"deployment_status",
"discussion",
"discussion_comment",
"fork",
"gollum",
"issues",
"issue_comment",
"label",
"merge_group",
"milestone",
"page_build",
"public",
"pull_request",
"pull_request_review",
"pull_request_review_comment",
"push",
"registry_package",
"release",
"repository",
"repository_dispatch",
"status",
"watch",
"workflow_dispatch",
"workflow_run"
]
}
},
{
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/4063006793",
"html_url": "https://github.com/laurent22/joplin/pull/14750#issuecomment-4063006793",
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/14750",
"id": 4063006793,
"node_id": "IC_kwDOBLftOs7yLJBJ",
"user": {
"login": "coderabbitai[bot]",
"id": 136622811,
"node_id": "BOT_kgDOCCSy2w",
"avatar_url": "https://avatars.githubusercontent.com/in/347564?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/coderabbitai%5Bbot%5D",
"html_url": "https://github.com/apps/coderabbitai",
"followers_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/followers",
"following_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/following{/other_user}",
"gists_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/gists{/gist_id}",
"starred_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/subscriptions",
"organizations_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/orgs",
"repos_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/repos",
"events_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/events{/privacy}",
"received_events_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/received_events",
"type": "Bot",
"user_view_type": "public",
"site_admin": false
},
"created_at": "2026-03-15T13:37:13Z",
"updated_at": "2026-03-19T17:03:44Z",
"body": "<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\nNo actionable comments were generated in the recent review. 🎉\n\n<details>\n<summary>ℹ️ Recent review info</summary>\n\n<details>\n<summary>⚙️ Run configuration</summary>\n\n**Configuration used**: Path: .coderabbit.yaml\n\n**Review profile**: CHILL\n\n**Plan**: Pro\n\n**Run ID**: `e15c0ce1-0dca-4953-9563-f1961f7bf3e2`\n\n</details>\n\n<details>\n<summary>📥 Commits</summary>\n\nReviewing files that changed from the base of the PR and between 0ce1e0611807aa981be09d1cdb565f2826fa5598 and f3821422b76df33a91a6c751a9470920aa9c2d8d.\n\n</details>\n\n<details>\n<summary>📒 Files selected for processing (1)</summary>\n\n* `packages/app-desktop/gui/NoteEditor/utils/resourceHandling.test.ts`\n\n</details>\n\n<details>\n<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>\n\n* packages/app-desktop/gui/NoteEditor/utils/resourceHandling.test.ts\n\n</details>\n\n</details>\n\n---\n\n\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nAdds an exported getResourcesFromPasteEvent and tests; paste handling now checks specific clipboard image MIME types, reads buffers, writes a temp file, attaches the first valid non-empty image to the note body, prevents the default paste only on success, and ensures temp-file cleanup.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Clipboard image handling** <br> `packages/app-desktop/gui/NoteEditor/utils/resourceHandling.ts`|Replaces `availableFormats()`/`readImage()` flow with explicit checks for `image/png`, `image/jpeg`, `image/jpg` using `clipboard.has()` and `clipboard.readBuffer()`; reads buffer, writes a temp file, calls `commandAttachFileToBody` for the first valid non-empty image, calls `event.preventDefault()` only on success, and deletes the temp file in a `finally` block with a logged warning on cleanup failure.|\n|**Tests & mocks** <br> `packages/app-desktop/gui/NoteEditor/utils/resourceHandling.test.ts`|Adds Jest tests and an Electron `clipboard` mock (typed `ClipboardMock` and shared `mockClipboard`); tests successful paste flows for JPEG/JPG/PNG producing a single resource and calling `preventDefault()`, and negative cases where clipboard reports no image or empty buffer expecting no resource and no `preventDefault()`; resets mocks in `afterEach`.|\n\n## Sequence Diagram\n\n```mermaid\nsequenceDiagram\n participant User as User\n participant Event as PasteEvent\n participant Clipboard as Clipboard\n participant Temp as TempFile\n participant Editor as Editor\n\n User->>Event: paste\n Event->>Clipboard: has(image/png|image/jpeg|image/jpg)?\n alt supported format found\n Event->>Clipboard: readBuffer(format)\n alt buffer non-empty\n Clipboard->>Temp: writeBuffer(tempFilePath)\n Temp->>Editor: commandAttachFileToBody(tempFilePath)\n Editor->>Event: event.preventDefault()\n Editor->>Temp: delete tempFile\n else buffer empty\n Event->>User: no attachment\n end\n else no supported format\n Event->>User: no attachment\n end\n```\n\n## Possibly related PRs\n\n- laurent22/joplin#14632: Modifies the same paste/image handling logic in `packages/app-desktop/gui/NoteEditor/utils/resourceHandling.ts`, altering how pasted images are converted to resources/temporary files.\n\n</details>\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 4</summary>\n\n<details>\n<summary>✅ Passed checks (4 passed)</summary>\n\n| Check name | Status | Explanation |\n| :-----------------------------------: | :------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Title check | ✅ Passed | The title accurately reflects the primary change: fixing JPEG image paste from clipboard on Linux, which is the main issue addressed by the PR. |\n| Description check | ✅ Passed | The description provides comprehensive context about the problem, root causes, the solution, testing, and manual verification—all directly related to the changeset. |\n| Docstring Coverage | ✅ Passed | Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. |\n| Pr Description Must Follow Guidelines | ✅ Passed | PR description includes all three required sections: clear problem statement about JPEG clipboard paste issue on Linux, high-level solution explanation describing the approach of switching from clipboard.availableFormats() to clipboard.has() checks and using clipboard.readBuffer() instead of clipboard.readImage(), and comprehensive test plan covering 11 automated tests plus manual testing across multiple scenarios. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing Touches</summary>\n\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} --> Create PR with unit tests\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- pr_review_plan_action_start -->\n\n<details>\n<summary>📝 Coding Plan</summary>\n\n- [ ] <!-- {\"checkboxId\": \"6ad8a4e1-0b3a-4ea2-9b5b-d82c1f47d1f2\"} --> Generate coding plan for human review comments\n\n</details>\n\n<!-- pr_review_plan_action_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=laurent22/joplin&utm_content=14750)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->",
"author_association": "CONTRIBUTOR",
"reactions": {
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/4063006793/reactions",
"total_count": 0,
"+1": 0,
"-1": 0,
"laugh": 0,
"hooray": 0,
"confused": 0,
"heart": 0,
"rocket": 0,
"eyes": 0
},
"performed_via_github_app": {
"id": 347564,
"client_id": "Iv1.6aaafe4fe882736b",
"slug": "coderabbitai",
"node_id": "A_kwHOB96YWc4ABU2s",
"owner": {
"login": "coderabbitai",
"id": 132028505,
"node_id": "O_kgDOB96YWQ",
"avatar_url": "https://avatars.githubusercontent.com/u/132028505?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/coderabbitai",
"html_url": "https://github.com/coderabbitai",
"followers_url": "https://api.github.com/users/coderabbitai/followers",
"following_url": "https://api.github.com/users/coderabbitai/following{/other_user}",
"gists_url": "https://api.github.com/users/coderabbitai/gists{/gist_id}",
"starred_url": "https://api.github.com/users/coderabbitai/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/coderabbitai/subscriptions",
"organizations_url": "https://api.github.com/users/coderabbitai/orgs",
"repos_url": "https://api.github.com/users/coderabbitai/repos",
"events_url": "https://api.github.com/users/coderabbitai/events{/privacy}",
"received_events_url": "https://api.github.com/users/coderabbitai/received_events",
"type": "Organization",
"user_view_type": "public",
"site_admin": false
},
"name": "coderabbitai",
"description": "# Transforming Code Reviews with AI\r\n\r\n## Features\r\n\r\n**Automated Reviews**: Continuous reviews of the pull requests including incremental commits. \r\n\r\n**Summarization**: Generates high-level summary and a technical walkthrough of the PR changes. \r\n\r\n**Line-by-line review**: Provides line-by-line suggestions committable with one click.\r\n\r\n**Codebase verification**: Verifies the impact on the overall codebase and identifies missing changes.\r\n\r\n**Insights into your code**: Ask any questions on your codebase within the pull request \r\n\r\n**Chat about your code** : Chat with the bot around your code. The more you chat, the smarter it gets.\r\n\r\n**Issue Validation**: Validates the PR against the linked issues and identifies other related issues \r\n\r\n\r\n\r\n",
"external_url": "https://coderabbit.ai?utm_source=cr_app&utm_medium=github",
"html_url": "https://github.com/apps/coderabbitai",
"created_at": "2023-06-14T15:47:27Z",
"updated_at": "2026-03-14T07:58:44Z",
"permissions": {
"actions": "read",
"checks": "write",
"contents": "write",
"discussions": "read",
"issues": "write",
"members": "read",
"metadata": "read",
"pull_requests": "write",
"statuses": "write"
},
"events": [
"issues",
"issue_comment",
"label",
"organization",
"pull_request",
"pull_request_review",
"pull_request_review_comment",
"pull_request_review_thread",
"release",
"repository"
]
}
},
{
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/4063006991",
"html_url": "https://github.com/laurent22/joplin/pull/14750#issuecomment-4063006991",
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/14750",
"id": 4063006991,
"node_id": "IC_kwDOBLftOs7yLJEP",
"user": {
"login": "moaaz-ae",
"id": 145723871,
"node_id": "U_kgDOCK-R3w",
"avatar_url": "https://avatars.githubusercontent.com/u/145723871?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/moaaz-ae",
"html_url": "https://github.com/moaaz-ae",
"followers_url": "https://api.github.com/users/moaaz-ae/followers",
"following_url": "https://api.github.com/users/moaaz-ae/following{/other_user}",
"gists_url": "https://api.github.com/users/moaaz-ae/gists{/gist_id}",
"starred_url": "https://api.github.com/users/moaaz-ae/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/moaaz-ae/subscriptions",
"organizations_url": "https://api.github.com/users/moaaz-ae/orgs",
"repos_url": "https://api.github.com/users/moaaz-ae/repos",
"events_url": "https://api.github.com/users/moaaz-ae/events{/privacy}",
"received_events_url": "https://api.github.com/users/moaaz-ae/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"created_at": "2026-03-15T13:37:19Z",
"updated_at": "2026-03-15T13:37:19Z",
"body": "I have read the CLA Document and I hereby sign the CLA",
"author_association": "CONTRIBUTOR",
"reactions": {
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/4063006991/reactions",
"total_count": 0,
"+1": 0,
"-1": 0,
"laugh": 0,
"hooray": 0,
"confused": 0,
"heart": 0,
"rocket": 0,
"eyes": 0
},
"performed_via_github_app": null
},
{
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/4139846427",
"html_url": "https://github.com/laurent22/joplin/pull/14750#issuecomment-4139846427",
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/14750",
"id": 4139846427,
"node_id": "IC_kwDOBLftOs72wQsb",
"user": {
"login": "bsavant",
"id": 209364,
"node_id": "MDQ6VXNlcjIwOTM2NA==",
"avatar_url": "https://avatars.githubusercontent.com/u/209364?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/bsavant",
"html_url": "https://github.com/bsavant",
"followers_url": "https://api.github.com/users/bsavant/followers",
"following_url": "https://api.github.com/users/bsavant/following{/other_user}",
"gists_url": "https://api.github.com/users/bsavant/gists{/gist_id}",
"starred_url": "https://api.github.com/users/bsavant/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/bsavant/subscriptions",
"organizations_url": "https://api.github.com/users/bsavant/orgs",
"repos_url": "https://api.github.com/users/bsavant/repos",
"events_url": "https://api.github.com/users/bsavant/events{/privacy}",
"received_events_url": "https://api.github.com/users/bsavant/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"created_at": "2026-03-27T03:13:22Z",
"updated_at": "2026-03-27T03:13:22Z",
"body": "This change appears to have caused a regression that no longer allows pasting of png or jpeg images from the clipboard on MacOS.",
"author_association": "NONE",
"reactions": {
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/4139846427/reactions",
"total_count": 0,
"+1": 0,
"-1": 0,
"laugh": 0,
"hooray": 0,
"confused": 0,
"heart": 0,
"rocket": 0,
"eyes": 0
},
"performed_via_github_app": null
},
{
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/4143492668",
"html_url": "https://github.com/laurent22/joplin/pull/14750#issuecomment-4143492668",
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/14750",
"id": 4143492668,
"node_id": "IC_kwDOBLftOs72-K48",
"user": {
"login": "moaaz-ae",
"id": 145723871,
"node_id": "U_kgDOCK-R3w",
"avatar_url": "https://avatars.githubusercontent.com/u/145723871?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/moaaz-ae",
"html_url": "https://github.com/moaaz-ae",
"followers_url": "https://api.github.com/users/moaaz-ae/followers",
"following_url": "https://api.github.com/users/moaaz-ae/following{/other_user}",
"gists_url": "https://api.github.com/users/moaaz-ae/gists{/gist_id}",
"starred_url": "https://api.github.com/users/moaaz-ae/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/moaaz-ae/subscriptions",
"organizations_url": "https://api.github.com/users/moaaz-ae/orgs",
"repos_url": "https://api.github.com/users/moaaz-ae/repos",
"events_url": "https://api.github.com/users/moaaz-ae/events{/privacy}",
"received_events_url": "https://api.github.com/users/moaaz-ae/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"created_at": "2026-03-27T15:39:02Z",
"updated_at": "2026-03-27T15:39:02Z",
"body": "Sorry about that. Since I don't use macOS, I can't reproduce or test this myself.\r\n\r\nTo be safe, I can wrap my changes in a Linux-only check so macOS (and Windows) go back to their previous working state. Let me know if that sounds good.\r\n\r\n@bsavant In the meantime, could you let me know if this happens with all images and what app you're copying from? Also, are there any errors in the console (Help > Toggle Development Tools) when you paste?",
"author_association": "CONTRIBUTOR",
"reactions": {
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/4143492668/reactions",
"total_count": 0,
"+1": 0,
"-1": 0,
"laugh": 0,
"hooray": 0,
"confused": 0,
"heart": 0,
"rocket": 0,
"eyes": 0
},
"performed_via_github_app": null
},
{
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/4189264642",
"html_url": "https://github.com/laurent22/joplin/pull/14750#issuecomment-4189264642",
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/14750",
"id": 4189264642,
"node_id": "IC_kwDOBLftOs75sxsC",
"user": {
"login": "laurent22",
"id": 1285584,
"node_id": "MDQ6VXNlcjEyODU1ODQ=",
"avatar_url": "https://avatars.githubusercontent.com/u/1285584?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/laurent22",
"html_url": "https://github.com/laurent22",
"followers_url": "https://api.github.com/users/laurent22/followers",
"following_url": "https://api.github.com/users/laurent22/following{/other_user}",
"gists_url": "https://api.github.com/users/laurent22/gists{/gist_id}",
"starred_url": "https://api.github.com/users/laurent22/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/laurent22/subscriptions",
"organizations_url": "https://api.github.com/users/laurent22/orgs",
"repos_url": "https://api.github.com/users/laurent22/repos",
"events_url": "https://api.github.com/users/laurent22/events{/privacy}",
"received_events_url": "https://api.github.com/users/laurent22/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"created_at": "2026-04-05T17:50:11Z",
"updated_at": "2026-04-05T17:50:11Z",
"body": "Reverted in 379a53eca57893acf463ead8afc306a72eeff429 due to https://github.com/laurent22/joplin/issues/15022#issuecomment-4189250496",
"author_association": "OWNER",
"reactions": {
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/4189264642/reactions",
"total_count": 0,
"+1": 0,
"-1": 0,
"laugh": 0,
"hooray": 0,
"confused": 0,
"heart": 0,
"rocket": 0,
"eyes": 0
},
"performed_via_github_app": null
}
]
}