@tobq/boardclip 0.0.0-stage → 2.1.107

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 (76) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +170 -2
  3. package/assets/boardclip-icon.png +0 -0
  4. package/bin/boardclip.js +43 -0
  5. package/editor-preload.js +71 -0
  6. package/editor.html +220 -0
  7. package/icon.png +0 -0
  8. package/icon@2x.png +0 -0
  9. package/iconTemplate.png +0 -0
  10. package/iconTemplate@2x.png +0 -0
  11. package/index.html +1339 -0
  12. package/lib/appearance.js +183 -0
  13. package/lib/auto-update.js +306 -0
  14. package/lib/backup-worker.js +46 -0
  15. package/lib/backup.js +275 -0
  16. package/lib/blob-field-store.js +275 -0
  17. package/lib/blob-store.js +68 -0
  18. package/lib/build-info.js +89 -0
  19. package/lib/clip-blob-store.js +161 -0
  20. package/lib/clip-revision.js +81 -0
  21. package/lib/clipboard-capture.js +95 -0
  22. package/lib/clipboard-follow.js +98 -0
  23. package/lib/clipboard-model.js +1235 -0
  24. package/lib/cloud-accounts.js +250 -0
  25. package/lib/conflict-model.js +186 -0
  26. package/lib/control-client.js +87 -0
  27. package/lib/control-server.js +149 -0
  28. package/lib/diagnostics.js +121 -0
  29. package/lib/drag-files.js +48 -0
  30. package/lib/ensure-directory.js +56 -0
  31. package/lib/fork-names.js +35 -0
  32. package/lib/fs-probe.js +132 -0
  33. package/lib/history-feed.js +48 -0
  34. package/lib/hmac-auth.js +78 -0
  35. package/lib/macos-hotkey.js +297 -0
  36. package/lib/macos-paste.js +112 -0
  37. package/lib/mcp-core.js +270 -0
  38. package/lib/mcp-installers.js +284 -0
  39. package/lib/mcp-paths.js +99 -0
  40. package/lib/p2p-crypto.js +54 -0
  41. package/lib/p2p-discovery.js +191 -0
  42. package/lib/quick-paste.js +187 -0
  43. package/lib/retention.js +43 -0
  44. package/lib/sync-delta.js +227 -0
  45. package/lib/sync-journal.js +181 -0
  46. package/lib/sync-paths.js +73 -0
  47. package/lib/tailscale.js +80 -0
  48. package/lib/text-blob-store.js +38 -0
  49. package/lib/windows-clipboard.js +213 -0
  50. package/lib/windows-console.js +63 -0
  51. package/lib/windows-dwm.js +183 -0
  52. package/lib/windows-hook-worker.js +236 -0
  53. package/lib/windows-hook.js +91 -0
  54. package/lib/windows-paste.js +185 -0
  55. package/main.js +7540 -0
  56. package/mcp/boardclip-mcp.js +255 -0
  57. package/mcp-approval-preload.js +22 -0
  58. package/mcp-approval.html +218 -0
  59. package/package.json +55 -4
  60. package/preload.js +106 -0
  61. package/site/index.html +1624 -0
  62. package/site/shared/clip-search.js +2330 -0
  63. package/site/shared/clipboard-popup.css +1046 -0
  64. package/site/shared/clipboard-tokens.css +326 -0
  65. package/site/shared/clipboard-ui-core.js +6921 -0
  66. package/site/shared/clipboard-window.css +36 -0
  67. package/site/shared/vendor/cm5/README.md +52 -0
  68. package/site/shared/vendor/cm5/codemirror.css +344 -0
  69. package/site/shared/vendor/cm5/codemirror.js +9884 -0
  70. package/site/shared/vendor/cm5/diff-match-patch.js +2228 -0
  71. package/site/shared/vendor/cm5/merge.css +119 -0
  72. package/site/shared/vendor/cm5/merge.js +1182 -0
  73. package/site/shared/vendor/fonts/README.md +19 -0
  74. package/site/shared/vendor/fonts/material-symbols-rounded.woff2 +0 -0
  75. package/viewer-preload.js +51 -0
  76. package/viewer.html +129 -0
package/preload.js ADDED
@@ -0,0 +1,106 @@
1
+ const { contextBridge, ipcRenderer } = require('electron');
2
+
3
+ contextBridge.exposeInMainWorld('api', {
4
+ getHistory: () => ipcRenderer.invoke('get-history'),
5
+ getHistoryState: (knownRevision) => ipcRenderer.invoke('get-history-state', knownRevision),
6
+ onHistoryChanged: (callback) => {
7
+ const listener = (_, revision) => callback(revision);
8
+ ipcRenderer.on('history-changed', listener);
9
+ return () => ipcRenderer.removeListener('history-changed', listener);
10
+ },
11
+ getSettings: () => ipcRenderer.invoke('get-settings'),
12
+ paste: (id) => ipcRenderer.invoke('paste', id),
13
+ pasteAndHide: (id) => ipcRenderer.invoke('paste-and-hide', id),
14
+ numpadPasteAndHide: (slot) => ipcRenderer.invoke('numpad-paste-and-hide', slot),
15
+ hidePopup: () => ipcRenderer.invoke('hide-popup'),
16
+ // Header drag (Core.attachWindowDrag): phase 'start' | 'move' | 'end', dx/dy =
17
+ // the pointer's screen delta since the press. Main moves THIS window.
18
+ windowDrag: (phase, dx, dy) => ipcRenderer.send('window-drag', phase, dx, dy),
19
+ copy: (text) => ipcRenderer.invoke('copy', text),
20
+ deleteItem: (id, rev) => ipcRenderer.invoke('delete-item', id, rev),
21
+ deleteItems: (targets) => ipcRenderer.invoke('delete-items', targets), // [{ id, rev }]
22
+ restoreItems: (snaps) => ipcRenderer.invoke('restore-items', snaps),
23
+ groupAssignMany: (targets, group, shouldHave) => ipcRenderer.invoke('group-assign-many', targets, group, shouldHave), // [{ id, rev }]
24
+ pasteMany: (ids) => ipcRenderer.invoke('paste-many', ids),
25
+ startUnify: (ids) => ipcRenderer.invoke('start-unify', ids),
26
+ deleteAll: () => ipcRenderer.invoke('delete-all'),
27
+ pin: (id, rev) => ipcRenderer.invoke('pin', id, rev),
28
+ numpadAssign: (id, slot, rev) => ipcRenderer.invoke('numpad-assign', id, slot, rev),
29
+ numpadUnassign: (slot) => ipcRenderer.invoke('numpad-unassign', slot),
30
+ saveSettings: (settings) => ipcRenderer.invoke('save-settings', settings),
31
+ setShowShortcut: (shortcut) => ipcRenderer.invoke('set-show-shortcut', shortcut),
32
+ setQuickPasteShortcut: (shortcut) => ipcRenderer.invoke('set-quick-paste-shortcut', shortcut),
33
+ suspendShortcuts: () => ipcRenderer.invoke('suspend-shortcuts'),
34
+ resumeShortcuts: () => ipcRenderer.invoke('resume-shortcuts'),
35
+ resolveShowShortcut: (shortcut) => ipcRenderer.invoke('resolve-show-shortcut', shortcut),
36
+ groupCreate: (name) => ipcRenderer.invoke('group-create', name),
37
+ groupDelete: (name) => ipcRenderer.invoke('group-delete', name),
38
+ groupAssign: (id, group, rev) => ipcRenderer.invoke('group-assign', id, group, rev),
39
+ copyImagePath: (id) => ipcRenderer.invoke('copy-image-path', id),
40
+ openEditor: (id, options) => ipcRenderer.invoke('open-editor', id, options || {}),
41
+ newNote: (options) => ipcRenderer.invoke('new-note', options || {}),
42
+ getConflicts: () => ipcRenderer.invoke('get-conflicts'),
43
+ openConflict: (id) => ipcRenderer.invoke('open-conflict', id),
44
+ openImage: (id, options) => ipcRenderer.invoke('open-image', id, options || {}),
45
+ // Native file drag of image clips (send, not invoke: main must call
46
+ // startDrag while the renderer's drag gesture is still live).
47
+ startDrag: (ids) => ipcRenderer.send('start-drag', ids),
48
+ // Ctrl/Cmd+= / - / 0, claimed by main before the app menu (macOS key
49
+ // equivalents would otherwise zoom the whole page): 'in' | 'out' | 'reset'.
50
+ onImageZoomKey: (callback) => {
51
+ const listener = (_, act) => callback(act);
52
+ ipcRenderer.on('image-zoom-key', listener);
53
+ return () => ipcRenderer.removeListener('image-zoom-key', listener);
54
+ },
55
+ openImageExternal: (id) => ipcRenderer.invoke('open-image-external', id),
56
+ platform: process.platform,
57
+ setSyncPath: (path) => ipcRenderer.invoke('set-sync-path', path),
58
+ chooseSyncFolder: () => ipcRenderer.invoke('choose-sync-folder'),
59
+ setSyncPathEnabled: (path, enabled) => ipcRenderer.invoke('set-sync-path-enabled', path, enabled),
60
+ getCloudAccounts: () => ipcRenderer.invoke('get-cloud-accounts'),
61
+ setP2PEnabled: (enabled) => ipcRenderer.invoke('set-p2p-enabled', enabled),
62
+ getP2PStatus: () => ipcRenderer.invoke('get-p2p-status'),
63
+ getSyncDiagnostics: () => ipcRenderer.invoke('get-sync-diagnostics'),
64
+ recordDiagnostics: (event, details) => ipcRenderer.invoke('record-diagnostics', event, details),
65
+ syncNow: () => ipcRenderer.invoke('sync-now'),
66
+ onSyncProgress: (callback) => {
67
+ const listener = (_, payload) => callback(payload);
68
+ ipcRenderer.on('sync-progress', listener);
69
+ return () => ipcRenderer.removeListener('sync-progress', listener);
70
+ },
71
+ checkForUpdates: () => ipcRenderer.invoke('check-for-updates'),
72
+ setUpdateMode: (mode) => ipcRenderer.invoke('set-update-mode', mode),
73
+ getAutoLaunch: () => ipcRenderer.invoke('get-auto-launch'),
74
+ setAutoLaunch: (enabled) => ipcRenderer.invoke('set-auto-launch', enabled),
75
+ getColorScheme: () => ipcRenderer.invoke('get-color-scheme'),
76
+ onColorSchemeChanged: (callback) => {
77
+ const listener = (_, scheme) => callback(scheme);
78
+ ipcRenderer.on('color-scheme-changed', listener);
79
+ return () => ipcRenderer.removeListener('color-scheme-changed', listener);
80
+ },
81
+ onSurfaceChanged: (callback) => {
82
+ const listener = (_, style) => callback(style);
83
+ ipcRenderer.on('surface-changed', listener);
84
+ return () => ipcRenderer.removeListener('surface-changed', listener);
85
+ },
86
+ // Appearance (accent, density, corners, theme mode, this window's surface):
87
+ // one event whenever any of it changes - a setting, another device, the OS accent.
88
+ onAppearanceChanged: (callback) => {
89
+ const listener = (_, look) => callback(look || {});
90
+ ipcRenderer.on('appearance-changed', listener);
91
+ return () => ipcRenderer.removeListener('appearance-changed', listener);
92
+ },
93
+ // AI Access (MCP)
94
+ getAiAccess: () => ipcRenderer.invoke('get-ai-access'),
95
+ setAiAccessEnabled: (enabled) => ipcRenderer.invoke('set-ai-access-enabled', enabled),
96
+ setMcpClientEnabled: (id, enabled) => ipcRenderer.invoke('set-mcp-client-enabled', id, enabled),
97
+ setGroupSharedAi: (name, shared) => ipcRenderer.invoke('set-group-shared-ai', name, shared),
98
+ revokeAiAlwaysAllow: (tool) => ipcRenderer.invoke('revoke-ai-always-allow', tool),
99
+ setClipTitle: (id, title, rev) => ipcRenderer.invoke('set-clip-title', id, title, rev),
100
+ setAiApprovalTimeout: (sec) => ipcRenderer.invoke('set-ai-approval-timeout', sec),
101
+ onAiAccessChanged: (callback) => {
102
+ const listener = () => callback();
103
+ ipcRenderer.on('ai-access-changed', listener);
104
+ return () => ipcRenderer.removeListener('ai-access-changed', listener);
105
+ },
106
+ });