Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
aca0067
ANG-007: Markdown preprocessing & embedding pipeline
yugalkaushik Jul 9, 2026
7872ce2
ANG-007: fixed ai suggestions
yugalkaushik Jul 9, 2026
3df5025
ANG-007: bug fix, added doc strings & few more tests
yugalkaushik Jul 9, 2026
731889f
ANG-007:add docstrings
yugalkaushik Jul 9, 2026
e43e390
ANG-007:remove settings section
yugalkaushik Jul 9, 2026
c7d92ff
ANG-007:split into three helpers
yugalkaushik Jul 12, 2026
c901b84
ANG-007:this._modelName set once after loop ends
yugalkaushik Jul 12, 2026
7b301e1
ANG-007:added docstring
yugalkaushik Jul 12, 2026
1b806c8
ANG-007:added docstring
yugalkaushik Jul 12, 2026
db085bf
ANG-007: JoplinAiApi is exported and reused in ProviderResolver
yugalkaushik Jul 12, 2026
7648493
ANG-007: moved joplin-native and 1000 to named class constants
yugalkaushik Jul 12, 2026
520f3ca
ANG-007: revert few unrelated changes
yugalkaushik Jul 12, 2026
45a7e25
ANG-007: removed unrelated changes
yugalkaushik Jul 12, 2026
804c991
ANG-007: update package-lock
yugalkaushik Jul 12, 2026
9e569f3
ANG-007: some bug fixes
yugalkaushik Jul 12, 2026
626f665
ANG-007: removed dead code
yugalkaushik Jul 12, 2026
41bf0a3
ANG-007: added suggested fixes
yugalkaushik Jul 13, 2026
cdd81db
Merge pull request #11 from joplin/ANG-007
malekhavasi Jul 13, 2026
c14f42e
ANG-008:Similarity computation, edge creation & SQLite cache
yugalkaushik Jul 13, 2026
7695e2a
ANG-008:bug fixes and format
yugalkaushik Jul 18, 2026
fce2a0f
ANG-008:few bug fixes
yugalkaushik Jul 18, 2026
2438ddd
ANG-008:Similarity computation, edge creation & SQLite cache
yugalkaushik Jul 21, 2026
d73de80
ANG-009: 
Wire embedding pipeline into the graph command
yugalkaushik Jul 21, 2026
65cf9fd
ANG-009: few bug fixes
yugalkaushik Jul 23, 2026
1af7b26
ANG-009:Added try-catch
yugalkaushik Jul 25, 2026
fdaa0d2
Merge pull request #13 from joplin/ANG-009
malekhavasi Jul 25, 2026
0700944
ANG-O10:Louvain Community detection and degree/centrality scoring
yugalkaushik Jul 27, 2026
8a465b5
ANG-010: Cleaned code
yugalkaushik Jul 27, 2026
d726a72
ANG-010:Fix community color ordering for keyword fallback
yugalkaushik Jul 28, 2026
eca9d5f
ANG-010:added try-catch
yugalkaushik Jul 28, 2026
b5bf228
Merge pull request #14 from joplin/ANG-010
malekhavasi Jul 29, 2026
8f8b2ff
dev: code improvements based on comments
yugalkaushik Aug 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions api/Global.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import Plugin from '../Plugin';
import Joplin from './Joplin';
import BasePlatformImplementation from '../BasePlatformImplementation';
import type { Store } from 'redux';
/**
* @ignore
*/
Expand All @@ -8,7 +10,7 @@ import Joplin from './Joplin';
*/
export default class Global {
private joplin_;
constructor(implementation: any, plugin: Plugin, store: any);
constructor(implementation: BasePlatformImplementation, plugin: Plugin, store: Store<any>);
get joplin(): Joplin;
get process(): any;
get process(): NodeJS.Process;
}
15 changes: 14 additions & 1 deletion api/Joplin.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ import JoplinClipboard from './JoplinClipboard';
import JoplinWindow from './JoplinWindow';
import BasePlatformImplementation from '../BasePlatformImplementation';
import JoplinImaging from './JoplinImaging';
import JoplinFs from './JoplinFs';
import JoplinAi from './JoplinAi';
import type { Store } from 'redux';
/**
* This is the main entry point to the Joplin API. You can access various services using the provided accessors.
*
Expand All @@ -28,6 +31,7 @@ export default class Joplin {
private data_;
private plugins_;
private imaging_;
private fs_;
private workspace_;
private filters_;
private commands_;
Expand All @@ -37,11 +41,13 @@ export default class Joplin {
private contentScripts_;
private clipboard_;
private window_;
private ai_;
private implementation_;
constructor(implementation: BasePlatformImplementation, plugin: Plugin, store: any);
constructor(implementation: BasePlatformImplementation, plugin: Plugin, store: Store<any>);
get data(): JoplinData;
get clipboard(): JoplinClipboard;
get imaging(): JoplinImaging;
get fs(): JoplinFs;
get window(): JoplinWindow;
get plugins(): JoplinPlugins;
get workspace(): JoplinWorkspace;
Expand All @@ -57,6 +63,13 @@ export default class Joplin {
get views(): JoplinViews;
get interop(): JoplinInterop;
get settings(): JoplinSettings;
/**
* Access to AI features: chat completions and semantic search over the
* local embeddings index. See {@link JoplinAi}.
*
* <span class="platform-desktop">desktop</span>
*/
get ai(): JoplinAi;
/**
* It is not possible to bundle native packages with a plugin, because they
* need to work cross-platforms. Instead access to certain useful native
Expand Down
80 changes: 80 additions & 0 deletions api/JoplinAi.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import { ChatMessage, ChatOptions, SearchOptions, SearchResult } from './types';
/**
* Provides access to AI models configured by the user. The active provider
* (Joplin Cloud AI, OpenAI-compatible, or Anthropic) and the model are picked
* by the user in the Joplin settings — plugins inherit whichever is active.
*
* AI is disabled by default. The user must enable it in the settings, and
* separately grant permission to use a remote (cloud-hosted) provider before
* any plugin call will succeed.
*
* If the user is signed into Joplin Cloud, AI works zero-config — they only
* need to flip the master toggle on.
*
* <span class="platform-desktop">desktop</span>
*/
export default class JoplinAi {
/**
* Sends a chat completion request to the active AI provider and returns the
* assistant's text response.
*
* The active provider and model are controlled by the user in Settings →
* AI. Plugins should not assume any particular provider or model.
*
* This call throws when:
*
* - AI features are disabled (`AI features are disabled`).
* - The active provider is remote and the user has not allowed remote
* providers (`Remote AI access is not allowed`).
* - The provider is misconfigured, e.g. missing API key or model name
* (`*provider* has no API key configured`).
* - The provider returns an HTTP error (the message includes the status
* and any detail returned by the provider).
*
* Plugins should catch these errors and present a user-friendly message
* pointing the user at the Joplin settings.
*
* @example
* ```typescript
* const reply = await joplin.ai.chat([
* { role: 'system', content: 'You are a concise assistant.' },
* { role: 'user', content: 'Summarise this note: ...' },
* ]);
* console.log(reply);
* ```
*/
chat(messages: ChatMessage[], options?: ChatOptions): Promise<string>;
/**
* Runs a semantic search against the locally-indexed embeddings and
* returns matching chunks ranked by similarity.
*
* The `query` is either plain text (which gets embedded internally) or
* `{ noteId }`, which reuses the note's already-indexed chunks as the
* query — useful for "find related notes" / tag suggestion / semantic
* graph use cases without spending another embedding pass.
*
* The `scope` restricts the search: `'all'` (default), `'note'`,
* `'folder'` (by folder id), or `'tag'` (by tag id).
* Trashed and conflict notes are excluded from results.
*
* The `relevance` preset controls how strict the match is:
* `'strict' | 'normal' | 'loose'`. Joplin owns the mapping from preset
* to model-specific (k, minScore) — plugins write against the preset
* and stay compatible when the bundled model changes.
*
* Throws when AI features are disabled or no embedding provider is
* active (e.g. ONNX failed to load on this platform).
*
* @example
* ```typescript
* const results = await joplin.ai.search({
* query: { text: 'pizza dough hydration' },
* relevance: 'normal',
* });
* for (const r of results) {
* console.log(r.score, r.noteId, r.chunkText.slice(0, 80));
* }
* ```
*/
search(options: SearchOptions): Promise<SearchResult[]>;
}
18 changes: 17 additions & 1 deletion api/JoplinClipboard.d.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,23 @@
import { ClipboardContent } from './types';
interface ElectronClipboardLike {
readText(): string;
writeText(text: string): void;
readHTML(): string;
writeHTML(html: string): void;
readImage(): {
toDataURL(): string;
} | null;
writeImage(image: unknown): void;
availableFormats(): string[];
write(data: Record<string, unknown>): void;
}
interface ElectronNativeImageLike {
createFromDataURL(dataUrl: string): unknown;
}
export default class JoplinClipboard {
private electronClipboard_;
private electronNativeImage_;
constructor(electronClipboard: any, electronNativeImage: any);
constructor(electronClipboard: ElectronClipboardLike, electronNativeImage: ElectronNativeImageLike);
readText(): Promise<string>;
writeText(text: string): Promise<void>;
/** <span class="platform-desktop">desktop</span> */
Expand Down Expand Up @@ -43,3 +58,4 @@ export default class JoplinClipboard {
*/
write(content: ClipboardContent): Promise<void>;
}
export {};
4 changes: 2 additions & 2 deletions api/JoplinContentScripts.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import Plugin from '../Plugin';
import Plugin, { MessageListenerCallback } from '../Plugin';
import { ContentScriptType } from './types';
export default class JoplinContentScripts {
private plugin;
Expand Down Expand Up @@ -37,5 +37,5 @@ export default class JoplinContentScripts {
* [postMessage
* demo](https://github.com/laurent22/joplin/tree/dev/packages/app-cli/tests/support/plugins/post_messages)
*/
onMessage(contentScriptId: string, callback: any): Promise<void>;
onMessage(contentScriptId: string, callback: MessageListenerCallback): Promise<void>;
}
5 changes: 3 additions & 2 deletions api/JoplinData.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { ModelType } from '../../../BaseModel';
import { RequestFile } from '../../rest/Api';
import Plugin from '../Plugin';
import { Path } from './types';
/**
Expand Down Expand Up @@ -45,8 +46,8 @@ export default class JoplinData {
private serializeApiBody;
private pathToString;
get(path: Path, query?: any): Promise<any>;
post(path: Path, query?: any, body?: any, files?: any[]): Promise<any>;
put(path: Path, query?: any, body?: any, files?: any[]): Promise<any>;
post(path: Path, query?: any, body?: any, files?: RequestFile[]): Promise<any>;
put(path: Path, query?: any, body?: any, files?: RequestFile[]): Promise<any>;
delete(path: Path, query?: any): Promise<any>;
itemType(itemId: string): Promise<ModelType>;
resourcePath(resourceId: string): Promise<string>;
Expand Down
22 changes: 22 additions & 0 deletions api/JoplinFs.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
export interface ArchiveEntry {
entryName: string;
name: string;
}
/**
* Provides file system utilities for plugins.
*
* <span class="platform-desktop">desktop</span>
*/
export default class JoplinFs {
/**
* Extracts an archive to the specified directory. Currently only ZIP files
* are supported.
*
* <span class="platform-desktop">desktop</span>
*
* @param sourcePath Path to the archive file to extract
* @param destinationPath Path to the directory where the contents should be extracted
* @returns List of entries extracted from the archive
*/
archiveExtract(sourcePath: string, destinationPath: string): Promise<ArchiveEntry[]>;
}
10 changes: 7 additions & 3 deletions api/JoplinImaging.d.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { ResourceEntity } from '../../database/types';
import { Rectangle } from './types';
export interface CreateFromBufferOptions {
width?: number;
Expand Down Expand Up @@ -65,7 +66,10 @@ export default class JoplinImaging {
createFromPdfResource(resourceId: string, options?: CreateFromPdfOptions): Promise<Handle[]>;
getPdfInfoFromPath(path: string): Promise<PdfInfo>;
getPdfInfoFromResource(resourceId: string): Promise<PdfInfo>;
getSize(handle: Handle): Promise<any>;
getSize(handle: Handle): Promise<{
width: number;
height: number;
}>;
resize(handle: Handle, options?: ResizeOptions): Promise<string>;
crop(handle: Handle, rectangle: Rectangle): Promise<string>;
toPngFile(handle: Handle, filePath: string): Promise<void>;
Expand All @@ -78,12 +82,12 @@ export default class JoplinImaging {
* Creates a new Joplin resource from the image data. The image will be
* first converted to a JPEG.
*/
toJpgResource(handle: Handle, resourceProps: any, quality?: number): Promise<import("../../database/types").ResourceEntity>;
toJpgResource(handle: Handle, resourceProps: Partial<ResourceEntity>, quality?: number): Promise<ResourceEntity>;
/**
* Creates a new Joplin resource from the image data. The image will be
* first converted to a PNG.
*/
toPngResource(handle: Handle, resourceProps: any): Promise<import("../../database/types").ResourceEntity>;
toPngResource(handle: Handle, resourceProps: Partial<ResourceEntity>): Promise<ResourceEntity>;
/**
* Image data is not automatically deleted by Joplin so make sure you call
* this method on the handle once you are done.
Expand Down
2 changes: 1 addition & 1 deletion api/JoplinSettings.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ export default class JoplinSettings {
/**
* Gets setting values (only applies to setting you registered from your plugin)
*/
values(keys: string[] | string): Promise<Record<string, unknown>>;
values(keys: string[] | string): Promise<Record<string, any>>;
/**
* Gets a setting value (only applies to setting you registered from your plugin).
*
Expand Down
4 changes: 3 additions & 1 deletion api/JoplinViews.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import { JoplinViews as JoplinViewsImplementation } from '../BasePlatformImplementation';
import Plugin from '../Plugin';
import { PluginStore } from '../ViewController';
import JoplinViewsDialogs from './JoplinViewsDialogs';
import JoplinViewsMenuItems from './JoplinViewsMenuItems';
import JoplinViewsMenus from './JoplinViewsMenus';
Expand Down Expand Up @@ -32,7 +34,7 @@ export default class JoplinViews {
private editors_;
private noteList_;
private implementation_;
constructor(implementation: any, plugin: Plugin, store: any);
constructor(implementation: JoplinViewsImplementation, plugin: Plugin, store: PluginStore);
get dialogs(): JoplinViewsDialogs;
get panels(): JoplinViewsPanels;
get editors(): JoplinViewsEditors;
Expand Down
6 changes: 4 additions & 2 deletions api/JoplinViewsDialogs.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import Plugin from '../Plugin';
import { ButtonSpec, ViewHandle, DialogResult, Toast } from './types';
import { JoplinViewsDialogs as JoplinViewsDialogsImplementation, ShowOpenDialogOptions } from '../BasePlatformImplementation';
import { PluginStore } from '../ViewController';
/**
* Allows creating and managing dialogs. A dialog is modal window that
* contains a webview and a row of buttons. You can update the
Expand Down Expand Up @@ -33,7 +35,7 @@ export default class JoplinViewsDialogs {
private store;
private plugin;
private implementation_;
constructor(implementation: any, plugin: Plugin, store: any);
constructor(implementation: JoplinViewsDialogsImplementation, plugin: Plugin, store: PluginStore);
private controller;
/**
* Creates a new dialog
Expand All @@ -54,7 +56,7 @@ export default class JoplinViewsDialogs {
*
* <span class="platform-desktop">desktop</span>
*/
showOpenDialog(options: any): Promise<any>;
showOpenDialog(options: ShowOpenDialogOptions): Promise<string[] | null>;
/**
* Sets the dialog HTML content
*/
Expand Down
7 changes: 4 additions & 3 deletions api/JoplinViewsEditor.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Plugin from '../Plugin';
import Plugin, { MessageListenerCallback } from '../Plugin';
import { PluginStore } from '../ViewController';
import { ActivationCheckCallback, ViewHandle, UpdateCallback, EditorPluginCallbacks } from './types';
interface SaveNoteOptions {
/**
Expand Down Expand Up @@ -55,7 +56,7 @@ export default class JoplinViewsEditors {
private plugin;
private activationCheckHandlers_;
private unhandledActivationCheck_;
constructor(plugin: Plugin, store: any);
constructor(plugin: Plugin, store: PluginStore);
private controller;
/**
* Registers a new editor plugin. Joplin will call the provided callback to create new editor views
Expand All @@ -79,7 +80,7 @@ export default class JoplinViewsEditors {
/**
* See [[JoplinViewPanels]]
*/
onMessage(handle: ViewHandle, callback: Function): Promise<void>;
onMessage(handle: ViewHandle, callback: MessageListenerCallback): Promise<void>;
/**
* Saves the content of the editor, without calling `onUpdate` for editors in the same window.
*/
Expand Down
3 changes: 2 additions & 1 deletion api/JoplinViewsMenuItems.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { CreateMenuItemOptions, MenuItemLocation } from './types';
import Plugin from '../Plugin';
import { PluginStore } from '../ViewController';
/**
* Allows creating and managing menu items.
*
Expand All @@ -10,7 +11,7 @@ import Plugin from '../Plugin';
export default class JoplinViewsMenuItems {
private store;
private plugin;
constructor(plugin: Plugin, store: any);
constructor(plugin: Plugin, store: PluginStore);
/**
* Creates a new menu item and associate it with the given command. You can specify under which menu the item should appear using the `location` parameter.
*/
Expand Down
3 changes: 2 additions & 1 deletion api/JoplinViewsMenus.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { MenuItem, MenuItemLocation } from './types';
import Plugin from '../Plugin';
import { PluginStore } from '../ViewController';
/**
* Allows creating menus.
*
Expand All @@ -10,7 +11,7 @@ import Plugin from '../Plugin';
export default class JoplinViewsMenus {
private store;
private plugin;
constructor(plugin: Plugin, store: any);
constructor(plugin: Plugin, store: PluginStore);
private registerCommandAccelerators;
/**
* Creates a new menu from the provided menu items and place it at the given location. As of now, it is only possible to place the
Expand Down
7 changes: 4 additions & 3 deletions api/JoplinViewsPanels.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Plugin from '../Plugin';
import Plugin, { MessageListenerCallback } from '../Plugin';
import { PluginStore } from '../ViewController';
import { ViewHandle } from './types';
/**
* Allows creating and managing view panels. View panels allow displaying any HTML
Expand All @@ -17,7 +18,7 @@ import { ViewHandle } from './types';
export default class JoplinViewsPanels {
private store;
private plugin;
constructor(plugin: Plugin, store: any);
constructor(plugin: Plugin, store: PluginStore);
private controller;
/**
* Creates a new panel
Expand Down Expand Up @@ -50,7 +51,7 @@ export default class JoplinViewsPanels {
* demo](https://github.com/laurent22/joplin/tree/dev/packages/app-cli/tests/support/plugins/post_messages) for more details.
*
*/
onMessage(handle: ViewHandle, callback: Function): Promise<void>;
onMessage(handle: ViewHandle, callback: MessageListenerCallback): Promise<void>;
/**
* Sends a message to the webview.
*
Expand Down
Loading