@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.
- package/LICENSE +21 -0
- package/README.md +170 -2
- package/assets/boardclip-icon.png +0 -0
- package/bin/boardclip.js +43 -0
- package/editor-preload.js +71 -0
- package/editor.html +220 -0
- package/icon.png +0 -0
- package/icon@2x.png +0 -0
- package/iconTemplate.png +0 -0
- package/iconTemplate@2x.png +0 -0
- package/index.html +1339 -0
- package/lib/appearance.js +183 -0
- package/lib/auto-update.js +306 -0
- package/lib/backup-worker.js +46 -0
- package/lib/backup.js +275 -0
- package/lib/blob-field-store.js +275 -0
- package/lib/blob-store.js +68 -0
- package/lib/build-info.js +89 -0
- package/lib/clip-blob-store.js +161 -0
- package/lib/clip-revision.js +81 -0
- package/lib/clipboard-capture.js +95 -0
- package/lib/clipboard-follow.js +98 -0
- package/lib/clipboard-model.js +1235 -0
- package/lib/cloud-accounts.js +250 -0
- package/lib/conflict-model.js +186 -0
- package/lib/control-client.js +87 -0
- package/lib/control-server.js +149 -0
- package/lib/diagnostics.js +121 -0
- package/lib/drag-files.js +48 -0
- package/lib/ensure-directory.js +56 -0
- package/lib/fork-names.js +35 -0
- package/lib/fs-probe.js +132 -0
- package/lib/history-feed.js +48 -0
- package/lib/hmac-auth.js +78 -0
- package/lib/macos-hotkey.js +297 -0
- package/lib/macos-paste.js +112 -0
- package/lib/mcp-core.js +270 -0
- package/lib/mcp-installers.js +284 -0
- package/lib/mcp-paths.js +99 -0
- package/lib/p2p-crypto.js +54 -0
- package/lib/p2p-discovery.js +191 -0
- package/lib/quick-paste.js +187 -0
- package/lib/retention.js +43 -0
- package/lib/sync-delta.js +227 -0
- package/lib/sync-journal.js +181 -0
- package/lib/sync-paths.js +73 -0
- package/lib/tailscale.js +80 -0
- package/lib/text-blob-store.js +38 -0
- package/lib/windows-clipboard.js +213 -0
- package/lib/windows-console.js +63 -0
- package/lib/windows-dwm.js +183 -0
- package/lib/windows-hook-worker.js +236 -0
- package/lib/windows-hook.js +91 -0
- package/lib/windows-paste.js +185 -0
- package/main.js +7540 -0
- package/mcp/boardclip-mcp.js +255 -0
- package/mcp-approval-preload.js +22 -0
- package/mcp-approval.html +218 -0
- package/package.json +55 -4
- package/preload.js +106 -0
- package/site/index.html +1624 -0
- package/site/shared/clip-search.js +2330 -0
- package/site/shared/clipboard-popup.css +1046 -0
- package/site/shared/clipboard-tokens.css +326 -0
- package/site/shared/clipboard-ui-core.js +6921 -0
- package/site/shared/clipboard-window.css +36 -0
- package/site/shared/vendor/cm5/README.md +52 -0
- package/site/shared/vendor/cm5/codemirror.css +344 -0
- package/site/shared/vendor/cm5/codemirror.js +9884 -0
- package/site/shared/vendor/cm5/diff-match-patch.js +2228 -0
- package/site/shared/vendor/cm5/merge.css +119 -0
- package/site/shared/vendor/cm5/merge.js +1182 -0
- package/site/shared/vendor/fonts/README.md +19 -0
- package/site/shared/vendor/fonts/material-symbols-rounded.woff2 +0 -0
- package/viewer-preload.js +51 -0
- 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
|
+
});
|