omnifocus-mcp-server 1.0.0
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 +165 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +20 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/omnifocus/cache.d.ts +26 -0
- package/dist/omnifocus/cache.d.ts.map +1 -0
- package/dist/omnifocus/cache.js +68 -0
- package/dist/omnifocus/cache.js.map +1 -0
- package/dist/omnifocus/client.d.ts +84 -0
- package/dist/omnifocus/client.d.ts.map +1 -0
- package/dist/omnifocus/client.js +340 -0
- package/dist/omnifocus/client.js.map +1 -0
- package/dist/omnifocus/executor.d.ts +11 -0
- package/dist/omnifocus/executor.d.ts.map +1 -0
- package/dist/omnifocus/executor.js +62 -0
- package/dist/omnifocus/executor.js.map +1 -0
- package/dist/omnifocus/scripts/database.d.ts +6 -0
- package/dist/omnifocus/scripts/database.d.ts.map +1 -0
- package/dist/omnifocus/scripts/database.js +161 -0
- package/dist/omnifocus/scripts/database.js.map +1 -0
- package/dist/omnifocus/scripts/folders.d.ts +7 -0
- package/dist/omnifocus/scripts/folders.d.ts.map +1 -0
- package/dist/omnifocus/scripts/folders.js +73 -0
- package/dist/omnifocus/scripts/folders.js.map +1 -0
- package/dist/omnifocus/scripts/perspectives.d.ts +4 -0
- package/dist/omnifocus/scripts/perspectives.d.ts.map +1 -0
- package/dist/omnifocus/scripts/perspectives.js +62 -0
- package/dist/omnifocus/scripts/perspectives.js.map +1 -0
- package/dist/omnifocus/scripts/projects.d.ts +13 -0
- package/dist/omnifocus/scripts/projects.d.ts.map +1 -0
- package/dist/omnifocus/scripts/projects.js +235 -0
- package/dist/omnifocus/scripts/projects.js.map +1 -0
- package/dist/omnifocus/scripts/tags.d.ts +7 -0
- package/dist/omnifocus/scripts/tags.d.ts.map +1 -0
- package/dist/omnifocus/scripts/tags.js +91 -0
- package/dist/omnifocus/scripts/tags.js.map +1 -0
- package/dist/omnifocus/scripts/tasks.d.ts +23 -0
- package/dist/omnifocus/scripts/tasks.d.ts.map +1 -0
- package/dist/omnifocus/scripts/tasks.js +560 -0
- package/dist/omnifocus/scripts/tasks.js.map +1 -0
- package/dist/omnifocus/serializers.d.ts +16 -0
- package/dist/omnifocus/serializers.d.ts.map +1 -0
- package/dist/omnifocus/serializers.js +181 -0
- package/dist/omnifocus/serializers.js.map +1 -0
- package/dist/prompts.d.ts +3 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +49 -0
- package/dist/prompts.js.map +1 -0
- package/dist/resources.d.ts +4 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +48 -0
- package/dist/resources.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/database.d.ts +4 -0
- package/dist/tools/database.d.ts.map +1 -0
- package/dist/tools/database.js +60 -0
- package/dist/tools/database.js.map +1 -0
- package/dist/tools/folders.d.ts +4 -0
- package/dist/tools/folders.d.ts.map +1 -0
- package/dist/tools/folders.js +67 -0
- package/dist/tools/folders.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +15 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/perspectives.d.ts +4 -0
- package/dist/tools/perspectives.d.ts.map +1 -0
- package/dist/tools/perspectives.js +30 -0
- package/dist/tools/perspectives.js.map +1 -0
- package/dist/tools/projects.d.ts +4 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +175 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/tags.d.ts +4 -0
- package/dist/tools/tags.d.ts.map +1 -0
- package/dist/tools/tags.js +70 -0
- package/dist/tools/tags.js.map +1 -0
- package/dist/tools/tasks.d.ts +4 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +356 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/types/omnifocus.d.ts +313 -0
- package/dist/types/omnifocus.d.ts.map +1 -0
- package/dist/types/omnifocus.js +3 -0
- package/dist/types/omnifocus.js.map +1 -0
- package/dist/utils/dates.d.ts +23 -0
- package/dist/utils/dates.d.ts.map +1 -0
- package/dist/utils/dates.js +44 -0
- package/dist/utils/dates.js.map +1 -0
- package/dist/utils/errors.d.ts +25 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +76 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +30 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +53 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Illya Starikov
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# omnifocus-mcp-server
|
|
2
|
+
|
|
3
|
+
Feature-complete [Model Context Protocol](https://modelcontextprotocol.io/) server for [OmniFocus](https://www.omnigroup.com/omnifocus). Full CRUD access to tasks, projects, folders, tags, and perspectives — 50 tools, 2 resources, and 3 prompts.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
### Claude Desktop
|
|
8
|
+
|
|
9
|
+
Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"mcpServers": {
|
|
14
|
+
"omnifocus": {
|
|
15
|
+
"command": "npx",
|
|
16
|
+
"args": ["-y", "omnifocus-mcp-server"]
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Claude Code
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
claude mcp add omnifocus -- npx -y omnifocus-mcp-server
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Or add to `.claude/settings.json`:
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"mcpServers": {
|
|
33
|
+
"omnifocus": {
|
|
34
|
+
"command": "npx",
|
|
35
|
+
"args": ["-y", "omnifocus-mcp-server"]
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Requirements
|
|
42
|
+
|
|
43
|
+
- macOS (OmniFocus is macOS-only)
|
|
44
|
+
- OmniFocus 4 (or OmniFocus 3 with Omni Automation support)
|
|
45
|
+
- Node.js >= 18
|
|
46
|
+
- Automation permission granted in System Settings > Privacy & Security > Automation
|
|
47
|
+
|
|
48
|
+
## Tools (50)
|
|
49
|
+
|
|
50
|
+
### Tasks (23)
|
|
51
|
+
|
|
52
|
+
| Tool | Description |
|
|
53
|
+
|------|-------------|
|
|
54
|
+
| `list_tasks` | List tasks with filters for status, flags, tags, projects, date ranges, and text search |
|
|
55
|
+
| `get_task` | Get task details by ID, optionally including subtask hierarchy |
|
|
56
|
+
| `create_task` | Create a task in inbox or a project, with tags, dates, and recurrence |
|
|
57
|
+
| `update_task` | Update task properties (name, note, dates, flags, recurrence) |
|
|
58
|
+
| `complete_task` | Mark a task as completed |
|
|
59
|
+
| `uncomplete_task` | Re-open a completed task |
|
|
60
|
+
| `drop_task` | Mark a task as dropped (cancelled) |
|
|
61
|
+
| `delete_task` | Permanently delete a task |
|
|
62
|
+
| `move_tasks` | Move tasks to a different project, parent task, or inbox |
|
|
63
|
+
| `duplicate_tasks` | Duplicate tasks, optionally into a different project |
|
|
64
|
+
| `set_task_tags` | Set, add, or remove tags on a task |
|
|
65
|
+
| `add_task_notification` | Add an absolute or due-relative notification |
|
|
66
|
+
| `remove_task_notification` | Remove a notification from a task |
|
|
67
|
+
| `list_task_notifications` | List all notifications on a task |
|
|
68
|
+
| `append_task_note` | Append text to a task's note |
|
|
69
|
+
| `get_inbox_tasks` | Get all inbox tasks |
|
|
70
|
+
| `get_flagged_tasks` | Get all available flagged tasks |
|
|
71
|
+
| `get_today_completed_tasks` | Get tasks completed today |
|
|
72
|
+
| `get_task_count` | Count tasks matching filters (faster than list) |
|
|
73
|
+
| `convert_task_to_project` | Convert a task into a project, preserving subtasks |
|
|
74
|
+
| `batch_create_tasks` | Create multiple tasks at once with subtask hierarchies |
|
|
75
|
+
| `batch_complete_tasks` | Complete multiple tasks at once |
|
|
76
|
+
| `batch_delete_tasks` | Delete multiple tasks at once |
|
|
77
|
+
|
|
78
|
+
### Projects (11)
|
|
79
|
+
|
|
80
|
+
| Tool | Description |
|
|
81
|
+
|------|-------------|
|
|
82
|
+
| `list_projects` | List projects with filters for status, folder, and text search |
|
|
83
|
+
| `get_project` | Get project details by ID or name |
|
|
84
|
+
| `create_project` | Create a project with folder, sequential, SAL, tags, and review options |
|
|
85
|
+
| `update_project` | Update project properties |
|
|
86
|
+
| `complete_project` | Mark a project as done |
|
|
87
|
+
| `drop_project` | Mark a project as dropped (cancelled) |
|
|
88
|
+
| `move_project` | Move a project to a different folder |
|
|
89
|
+
| `delete_project` | Permanently delete a project |
|
|
90
|
+
| `get_project_tasks` | Get all tasks in a project |
|
|
91
|
+
| `get_review_queue` | Get projects due for review |
|
|
92
|
+
| `mark_reviewed` | Mark a project as reviewed |
|
|
93
|
+
|
|
94
|
+
### Folders (5)
|
|
95
|
+
|
|
96
|
+
| Tool | Description |
|
|
97
|
+
|------|-------------|
|
|
98
|
+
| `list_folders` | List all folders |
|
|
99
|
+
| `get_folder` | Get folder details including child folders and projects |
|
|
100
|
+
| `create_folder` | Create a folder (supports nesting) |
|
|
101
|
+
| `update_folder` | Update folder name or status |
|
|
102
|
+
| `delete_folder` | Permanently delete a folder |
|
|
103
|
+
|
|
104
|
+
### Tags (5)
|
|
105
|
+
|
|
106
|
+
| Tool | Description |
|
|
107
|
+
|------|-------------|
|
|
108
|
+
| `list_tags` | List all tags |
|
|
109
|
+
| `get_tag` | Get tag details including child tags |
|
|
110
|
+
| `create_tag` | Create a tag (supports nesting and allowsNextAction) |
|
|
111
|
+
| `update_tag` | Update tag properties |
|
|
112
|
+
| `delete_tag` | Permanently delete a tag |
|
|
113
|
+
|
|
114
|
+
### Perspectives (2)
|
|
115
|
+
|
|
116
|
+
| Tool | Description |
|
|
117
|
+
|------|-------------|
|
|
118
|
+
| `list_perspectives` | List perspectives (built-in and/or custom) |
|
|
119
|
+
| `get_perspective_tasks` | Get tasks shown in a specific perspective |
|
|
120
|
+
|
|
121
|
+
### Database (4)
|
|
122
|
+
|
|
123
|
+
| Tool | Description |
|
|
124
|
+
|------|-------------|
|
|
125
|
+
| `get_database_summary` | Get counts of inbox items, projects, tags, folders, and task statistics |
|
|
126
|
+
| `search` | Search across all items (tasks, projects, folders, tags) by name or note |
|
|
127
|
+
| `dump_database` | Dump the entire database in a single call |
|
|
128
|
+
| `save_database` | Explicitly save the database to disk |
|
|
129
|
+
|
|
130
|
+
## Resources
|
|
131
|
+
|
|
132
|
+
| URI | Description |
|
|
133
|
+
|-----|-------------|
|
|
134
|
+
| `omnifocus://database/summary` | Database summary with counts |
|
|
135
|
+
| `omnifocus://perspectives` | List of all perspectives |
|
|
136
|
+
|
|
137
|
+
## Prompts
|
|
138
|
+
|
|
139
|
+
| Prompt | Description |
|
|
140
|
+
|--------|-------------|
|
|
141
|
+
| `weekly-review` | Guided weekly review of projects and tasks |
|
|
142
|
+
| `inbox-processing` | Process inbox items using GTD methodology |
|
|
143
|
+
| `daily-planning` | Plan today's tasks based on due dates, flags, and completions |
|
|
144
|
+
|
|
145
|
+
## Development
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
npm install
|
|
149
|
+
npm run build # Compile TypeScript
|
|
150
|
+
npm run dev # Run with tsx (hot reload)
|
|
151
|
+
npm test # Run unit tests
|
|
152
|
+
npm run test:watch # Watch mode
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Integration Tests
|
|
156
|
+
|
|
157
|
+
Tests against a real OmniFocus instance (creates and cleans up test items):
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
OMNIFOCUS_LIVE=1 npm run test:integration
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## License
|
|
164
|
+
|
|
165
|
+
MIT
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const config: {
|
|
2
|
+
/** Timeout for osascript execution in milliseconds */
|
|
3
|
+
readonly executorTimeout: 30000;
|
|
4
|
+
/** Maximum buffer size for osascript stdout/stderr */
|
|
5
|
+
readonly maxBuffer: number;
|
|
6
|
+
/** Cache TTLs in milliseconds by domain */
|
|
7
|
+
readonly cacheTTL: {
|
|
8
|
+
readonly tasks: 60000;
|
|
9
|
+
readonly projects: 60000;
|
|
10
|
+
readonly folders: 60000;
|
|
11
|
+
readonly tags: 60000;
|
|
12
|
+
readonly database: 60000;
|
|
13
|
+
readonly perspectives: 60000;
|
|
14
|
+
};
|
|
15
|
+
/** Default pagination limit */
|
|
16
|
+
readonly defaultLimit: 100;
|
|
17
|
+
/** Maximum pagination limit */
|
|
18
|
+
readonly maxLimit: 1000;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM;IACjB,sDAAsD;;IAGtD,sDAAsD;;IAGtD,2CAA2C;;;;;;;;;IAU3C,+BAA+B;;IAG/B,+BAA+B;;CAEvB,CAAC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const config = {
|
|
2
|
+
/** Timeout for osascript execution in milliseconds */
|
|
3
|
+
executorTimeout: 30_000,
|
|
4
|
+
/** Maximum buffer size for osascript stdout/stderr */
|
|
5
|
+
maxBuffer: 10 * 1024 * 1024, // 10 MB
|
|
6
|
+
/** Cache TTLs in milliseconds by domain */
|
|
7
|
+
cacheTTL: {
|
|
8
|
+
tasks: 60_000,
|
|
9
|
+
projects: 60_000,
|
|
10
|
+
folders: 60_000,
|
|
11
|
+
tags: 60_000,
|
|
12
|
+
database: 60_000,
|
|
13
|
+
perspectives: 60_000,
|
|
14
|
+
},
|
|
15
|
+
/** Default pagination limit */
|
|
16
|
+
defaultLimit: 100,
|
|
17
|
+
/** Maximum pagination limit */
|
|
18
|
+
maxLimit: 1000,
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,sDAAsD;IACtD,eAAe,EAAE,MAAM;IAEvB,sDAAsD;IACtD,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,QAAQ;IAErC,2CAA2C;IAC3C,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,MAAM;QAChB,YAAY,EAAE,MAAM;KACrB;IAED,+BAA+B;IAC/B,YAAY,EAAE,GAAG;IAEjB,+BAA+B;IAC/B,QAAQ,EAAE,IAAI;CACN,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { createServer } from "./server.js";
|
|
4
|
+
import { logger } from "./utils/logger.js";
|
|
5
|
+
async function main() {
|
|
6
|
+
const { server, client } = createServer();
|
|
7
|
+
const transport = new StdioServerTransport();
|
|
8
|
+
const shutdown = async () => {
|
|
9
|
+
logger.info("Shutting down OmniFocus MCP server");
|
|
10
|
+
client.destroy();
|
|
11
|
+
await server.close();
|
|
12
|
+
process.exit(0);
|
|
13
|
+
};
|
|
14
|
+
process.on("SIGINT", shutdown);
|
|
15
|
+
process.on("SIGTERM", shutdown);
|
|
16
|
+
logger.info("Starting OmniFocus MCP server");
|
|
17
|
+
await server.connect(transport);
|
|
18
|
+
logger.info("OmniFocus MCP server connected");
|
|
19
|
+
}
|
|
20
|
+
main().catch((error) => {
|
|
21
|
+
logger.error("Fatal error", { error: String(error) });
|
|
22
|
+
process.exit(1);
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;AAChD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare class Cache {
|
|
2
|
+
private maxSize;
|
|
3
|
+
private store;
|
|
4
|
+
private sweepInterval;
|
|
5
|
+
constructor(maxSize?: number);
|
|
6
|
+
get<T>(key: string): T | undefined;
|
|
7
|
+
set<T>(key: string, value: T, ttlMs: number): void;
|
|
8
|
+
/**
|
|
9
|
+
* Invalidate all cache entries whose key starts with the given prefix.
|
|
10
|
+
*/
|
|
11
|
+
invalidatePrefix(prefix: string): void;
|
|
12
|
+
/**
|
|
13
|
+
* Invalidate all cache entries.
|
|
14
|
+
*/
|
|
15
|
+
invalidateAll(): void;
|
|
16
|
+
get size(): number;
|
|
17
|
+
/**
|
|
18
|
+
* Remove all expired entries.
|
|
19
|
+
*/
|
|
20
|
+
private sweep;
|
|
21
|
+
/**
|
|
22
|
+
* Stop the periodic sweep and clear all entries.
|
|
23
|
+
*/
|
|
24
|
+
destroy(): void;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/omnifocus/cache.ts"],"names":[],"mappings":"AAKA,qBAAa,KAAK;IAIJ,OAAO,CAAC,OAAO;IAH3B,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,aAAa,CAAiC;gBAElC,OAAO,SAAM;IAIjC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAYlC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAYlD;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQtC;;OAEG;IACH,aAAa,IAAI,IAAI;IAIrB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,OAAO,CAAC,KAAK;IAOb;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export class Cache {
|
|
2
|
+
maxSize;
|
|
3
|
+
store = new Map();
|
|
4
|
+
sweepInterval;
|
|
5
|
+
constructor(maxSize = 500) {
|
|
6
|
+
this.maxSize = maxSize;
|
|
7
|
+
this.sweepInterval = setInterval(() => this.sweep(), 5 * 60 * 1000);
|
|
8
|
+
}
|
|
9
|
+
get(key) {
|
|
10
|
+
const entry = this.store.get(key);
|
|
11
|
+
if (!entry)
|
|
12
|
+
return undefined;
|
|
13
|
+
if (Date.now() > entry.expiresAt) {
|
|
14
|
+
this.store.delete(key);
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
return entry.value;
|
|
18
|
+
}
|
|
19
|
+
set(key, value, ttlMs) {
|
|
20
|
+
if (this.store.size >= this.maxSize && !this.store.has(key)) {
|
|
21
|
+
// Evict oldest entry
|
|
22
|
+
const first = this.store.keys().next().value;
|
|
23
|
+
if (first !== undefined)
|
|
24
|
+
this.store.delete(first);
|
|
25
|
+
}
|
|
26
|
+
this.store.set(key, {
|
|
27
|
+
value,
|
|
28
|
+
expiresAt: Date.now() + ttlMs,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Invalidate all cache entries whose key starts with the given prefix.
|
|
33
|
+
*/
|
|
34
|
+
invalidatePrefix(prefix) {
|
|
35
|
+
for (const key of this.store.keys()) {
|
|
36
|
+
if (key.startsWith(prefix)) {
|
|
37
|
+
this.store.delete(key);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Invalidate all cache entries.
|
|
43
|
+
*/
|
|
44
|
+
invalidateAll() {
|
|
45
|
+
this.store.clear();
|
|
46
|
+
}
|
|
47
|
+
get size() {
|
|
48
|
+
return this.store.size;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Remove all expired entries.
|
|
52
|
+
*/
|
|
53
|
+
sweep() {
|
|
54
|
+
const now = Date.now();
|
|
55
|
+
for (const [key, entry] of this.store) {
|
|
56
|
+
if (now > entry.expiresAt)
|
|
57
|
+
this.store.delete(key);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Stop the periodic sweep and clear all entries.
|
|
62
|
+
*/
|
|
63
|
+
destroy() {
|
|
64
|
+
clearInterval(this.sweepInterval);
|
|
65
|
+
this.store.clear();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/omnifocus/cache.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,KAAK;IAII;IAHZ,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;IAC/C,aAAa,CAAiC;IAEtD,YAAoB,UAAU,GAAG;QAAb,YAAO,GAAP,OAAO,CAAM;QAC/B,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,GAAG,CAAI,GAAW;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAE7B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,KAAK,CAAC,KAAU,CAAC;IAC1B,CAAC;IAED,GAAG,CAAI,GAAW,EAAE,KAAQ,EAAE,KAAa;QACzC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5D,qBAAqB;YACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAC7C,IAAI,KAAK,KAAK,SAAS;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC9B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,MAAc;QAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa;QACX,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,KAAK;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtC,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO;QACL,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { DatabaseSummaryJSON, DatabaseDumpJSON, TaskJSON, TaskWithChildrenJSON, ProjectJSON, FolderJSON, FolderWithChildrenJSON, TagJSON, TagWithChildrenJSON, PerspectiveJSON, TaskNotificationJSON, ListTasksArgs, CreateTaskArgs, UpdateTaskArgs, GetTaskArgs, MoveTasksArgs, DuplicateTasksArgs, SetTaskTagsArgs, AddTaskNotificationArgs, BatchCreateTasksArgs, BatchDeleteTasksArgs, BatchCompleteTasksArgs, ListPerspectivesArgs, ListProjectsArgs, CreateProjectArgs, UpdateProjectArgs, GetProjectTasksArgs, DumpDatabaseArgs, CreateFolderArgs, UpdateFolderArgs, CreateTagArgs, UpdateTagArgs } from "../types/omnifocus.js";
|
|
2
|
+
export declare class OmniFocusClient {
|
|
3
|
+
private cache;
|
|
4
|
+
private invalidateAfterMutation;
|
|
5
|
+
getDatabaseSummary(): Promise<DatabaseSummaryJSON>;
|
|
6
|
+
search(query: string, limit?: number): Promise<Array<{
|
|
7
|
+
type: string;
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
note?: string;
|
|
11
|
+
}>>;
|
|
12
|
+
dumpDatabase(args?: DumpDatabaseArgs): Promise<DatabaseDumpJSON>;
|
|
13
|
+
saveDatabase(): Promise<{
|
|
14
|
+
saved: boolean;
|
|
15
|
+
}>;
|
|
16
|
+
listTasks(args?: ListTasksArgs): Promise<TaskJSON[]>;
|
|
17
|
+
getTask(idOrArgs: string | GetTaskArgs): Promise<TaskJSON | TaskWithChildrenJSON>;
|
|
18
|
+
createTask(args: CreateTaskArgs): Promise<TaskJSON>;
|
|
19
|
+
updateTask(args: UpdateTaskArgs): Promise<TaskJSON>;
|
|
20
|
+
completeTask(id: string): Promise<TaskJSON>;
|
|
21
|
+
uncompleteTask(id: string): Promise<TaskJSON>;
|
|
22
|
+
dropTask(id: string): Promise<TaskJSON>;
|
|
23
|
+
deleteTask(id: string): Promise<{
|
|
24
|
+
deleted: boolean;
|
|
25
|
+
id: string;
|
|
26
|
+
}>;
|
|
27
|
+
moveTasks(args: MoveTasksArgs): Promise<TaskJSON[]>;
|
|
28
|
+
duplicateTasks(args: DuplicateTasksArgs): Promise<TaskJSON[]>;
|
|
29
|
+
setTaskTags(args: SetTaskTagsArgs): Promise<TaskJSON>;
|
|
30
|
+
addTaskNotification(args: AddTaskNotificationArgs): Promise<TaskJSON>;
|
|
31
|
+
appendTaskNote(taskId: string, text: string): Promise<TaskJSON>;
|
|
32
|
+
convertTaskToProject(taskId: string): Promise<ProjectJSON>;
|
|
33
|
+
getTodayCompletedTasks(): Promise<TaskJSON[]>;
|
|
34
|
+
listTaskNotifications(taskId: string): Promise<TaskNotificationJSON[]>;
|
|
35
|
+
removeTaskNotification(taskId: string, notificationId: string): Promise<{
|
|
36
|
+
removed: boolean;
|
|
37
|
+
taskId: string;
|
|
38
|
+
notificationId: string;
|
|
39
|
+
}>;
|
|
40
|
+
batchCreateTasks(args: BatchCreateTasksArgs): Promise<TaskJSON[]>;
|
|
41
|
+
batchDeleteTasks(args: BatchDeleteTasksArgs): Promise<{
|
|
42
|
+
deleted: boolean;
|
|
43
|
+
id: string;
|
|
44
|
+
}[]>;
|
|
45
|
+
batchCompleteTasks(args: BatchCompleteTasksArgs): Promise<TaskJSON[]>;
|
|
46
|
+
getTaskCount(args?: ListTasksArgs): Promise<{
|
|
47
|
+
count: number;
|
|
48
|
+
}>;
|
|
49
|
+
listProjects(args?: ListProjectsArgs): Promise<ProjectJSON[]>;
|
|
50
|
+
getProject(idOrName: string): Promise<ProjectJSON>;
|
|
51
|
+
createProject(args: CreateProjectArgs): Promise<ProjectJSON>;
|
|
52
|
+
updateProject(args: UpdateProjectArgs): Promise<ProjectJSON>;
|
|
53
|
+
completeProject(id: string): Promise<ProjectJSON>;
|
|
54
|
+
dropProject(id: string): Promise<ProjectJSON>;
|
|
55
|
+
moveProject(projectId: string, folderId: string): Promise<ProjectJSON>;
|
|
56
|
+
deleteProject(id: string): Promise<{
|
|
57
|
+
deleted: boolean;
|
|
58
|
+
id: string;
|
|
59
|
+
}>;
|
|
60
|
+
getReviewQueue(): Promise<ProjectJSON[]>;
|
|
61
|
+
markReviewed(id: string): Promise<ProjectJSON>;
|
|
62
|
+
getProjectTasks(args: GetProjectTasksArgs): Promise<TaskJSON[]>;
|
|
63
|
+
listFolders(): Promise<FolderJSON[]>;
|
|
64
|
+
getFolder(id: string): Promise<FolderWithChildrenJSON>;
|
|
65
|
+
createFolder(args: CreateFolderArgs): Promise<FolderJSON>;
|
|
66
|
+
updateFolder(args: UpdateFolderArgs): Promise<FolderJSON>;
|
|
67
|
+
deleteFolder(id: string): Promise<{
|
|
68
|
+
deleted: boolean;
|
|
69
|
+
id: string;
|
|
70
|
+
}>;
|
|
71
|
+
listTags(): Promise<TagJSON[]>;
|
|
72
|
+
getTag(id: string): Promise<TagWithChildrenJSON>;
|
|
73
|
+
createTag(args: CreateTagArgs): Promise<TagJSON>;
|
|
74
|
+
updateTag(args: UpdateTagArgs): Promise<TagJSON>;
|
|
75
|
+
deleteTag(id: string): Promise<{
|
|
76
|
+
deleted: boolean;
|
|
77
|
+
id: string;
|
|
78
|
+
}>;
|
|
79
|
+
listPerspectives(args?: ListPerspectivesArgs): Promise<PerspectiveJSON[]>;
|
|
80
|
+
getPerspectiveTasks(name: string): Promise<TaskJSON[]>;
|
|
81
|
+
invalidateCache(prefix?: string): void;
|
|
82
|
+
destroy(): void;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/omnifocus/client.ts"],"names":[],"mappings":"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"}
|