@mind-your-now/myn 0.4.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 +318 -0
- package/dist/index.d.ts +77 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +147 -0
- package/dist/index.js.map +1 -0
- package/dist/src/client.d.ts +40 -0
- package/dist/src/client.d.ts.map +1 -0
- package/dist/src/client.js +95 -0
- package/dist/src/client.js.map +1 -0
- package/dist/src/tools/briefing.d.ts +44 -0
- package/dist/src/tools/briefing.d.ts.map +1 -0
- package/dist/src/tools/briefing.js +116 -0
- package/dist/src/tools/briefing.js.map +1 -0
- package/dist/src/tools/calendar.d.ts +56 -0
- package/dist/src/tools/calendar.d.ts.map +1 -0
- package/dist/src/tools/calendar.js +206 -0
- package/dist/src/tools/calendar.js.map +1 -0
- package/dist/src/tools/capabilityHash.d.ts +26 -0
- package/dist/src/tools/capabilityHash.d.ts.map +1 -0
- package/dist/src/tools/capabilityHash.js +48 -0
- package/dist/src/tools/capabilityHash.js.map +1 -0
- package/dist/src/tools/habits.d.ts +43 -0
- package/dist/src/tools/habits.d.ts.map +1 -0
- package/dist/src/tools/habits.js +123 -0
- package/dist/src/tools/habits.js.map +1 -0
- package/dist/src/tools/household.d.ts +44 -0
- package/dist/src/tools/household.d.ts.map +1 -0
- package/dist/src/tools/household.js +146 -0
- package/dist/src/tools/household.js.map +1 -0
- package/dist/src/tools/lists.d.ts +45 -0
- package/dist/src/tools/lists.d.ts.map +1 -0
- package/dist/src/tools/lists.js +167 -0
- package/dist/src/tools/lists.js.map +1 -0
- package/dist/src/tools/memory.d.ts +45 -0
- package/dist/src/tools/memory.d.ts.map +1 -0
- package/dist/src/tools/memory.js +131 -0
- package/dist/src/tools/memory.js.map +1 -0
- package/dist/src/tools/myn_a2a_pairing.d.ts +42 -0
- package/dist/src/tools/myn_a2a_pairing.d.ts.map +1 -0
- package/dist/src/tools/myn_a2a_pairing.js +166 -0
- package/dist/src/tools/myn_a2a_pairing.js.map +1 -0
- package/dist/src/tools/planning.d.ts +56 -0
- package/dist/src/tools/planning.d.ts.map +1 -0
- package/dist/src/tools/planning.js +94 -0
- package/dist/src/tools/planning.js.map +1 -0
- package/dist/src/tools/profile.d.ts +47 -0
- package/dist/src/tools/profile.d.ts.map +1 -0
- package/dist/src/tools/profile.js +125 -0
- package/dist/src/tools/profile.js.map +1 -0
- package/dist/src/tools/projects.d.ts +45 -0
- package/dist/src/tools/projects.d.ts.map +1 -0
- package/dist/src/tools/projects.js +106 -0
- package/dist/src/tools/projects.js.map +1 -0
- package/dist/src/tools/search.d.ts +46 -0
- package/dist/src/tools/search.d.ts.map +1 -0
- package/dist/src/tools/search.js +93 -0
- package/dist/src/tools/search.js.map +1 -0
- package/dist/src/tools/syncOnMismatch.d.ts +48 -0
- package/dist/src/tools/syncOnMismatch.d.ts.map +1 -0
- package/dist/src/tools/syncOnMismatch.js +94 -0
- package/dist/src/tools/syncOnMismatch.js.map +1 -0
- package/dist/src/tools/tasks.d.ts +52 -0
- package/dist/src/tools/tasks.d.ts.map +1 -0
- package/dist/src/tools/tasks.js +200 -0
- package/dist/src/tools/tasks.js.map +1 -0
- package/dist/src/tools/timers.d.ts +48 -0
- package/dist/src/tools/timers.d.ts.map +1 -0
- package/dist/src/tools/timers.js +138 -0
- package/dist/src/tools/timers.js.map +1 -0
- package/openclaw.plugin.json +30 -0
- package/package.json +74 -0
- package/skills/myn/SKILL.md +54 -0
- package/skills/myn/references/authentication.md +83 -0
- package/skills/myn/references/briefing-api.md +187 -0
- package/skills/myn/references/calendar-api.md +139 -0
- package/skills/myn/references/habits-api.md +257 -0
- package/skills/myn/references/household-api.md +175 -0
- package/skills/myn/references/lists-api.md +180 -0
- package/skills/myn/references/memory-api.md +95 -0
- package/skills/myn/references/planning-api.md +191 -0
- package/skills/myn/references/profile-api.md +148 -0
- package/skills/myn/references/projects-api.md +127 -0
- package/skills/myn/references/search-api.md +97 -0
- package/skills/myn/references/tasks-api.md +187 -0
- package/skills/myn/references/timers-api.md +171 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* myn_habits tool - Habit tracking, streaks, and reminders
|
|
3
|
+
*/
|
|
4
|
+
import type { MynApiClient } from '../client.js';
|
|
5
|
+
export declare const HabitsInputSchema: import("@sinclair/typebox").TObject<{
|
|
6
|
+
action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"streaks">, import("@sinclair/typebox").TLiteral<"skip">, import("@sinclair/typebox").TLiteral<"chains">, import("@sinclair/typebox").TLiteral<"schedule">, import("@sinclair/typebox").TLiteral<"reminders">]>;
|
|
7
|
+
habitId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
8
|
+
includeHistory: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
9
|
+
skipDate: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
10
|
+
skipReason: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
11
|
+
chainId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
12
|
+
dateRange: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
13
|
+
enableReminders: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
14
|
+
reminderTime: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
15
|
+
}>;
|
|
16
|
+
export type HabitsInput = typeof HabitsInputSchema.static;
|
|
17
|
+
export declare function executeHabits(client: MynApiClient, input: HabitsInput): Promise<{
|
|
18
|
+
success: true;
|
|
19
|
+
data: unknown;
|
|
20
|
+
} | {
|
|
21
|
+
success: false;
|
|
22
|
+
error: string;
|
|
23
|
+
details?: unknown;
|
|
24
|
+
}>;
|
|
25
|
+
export declare function registerHabitsTool(api: OpenClawPluginApi, client: MynApiClient): void;
|
|
26
|
+
interface OpenClawPluginApi {
|
|
27
|
+
registerTool(tool: {
|
|
28
|
+
id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
description: string;
|
|
31
|
+
inputSchema: unknown;
|
|
32
|
+
execute: (input: unknown) => Promise<unknown>;
|
|
33
|
+
}): void;
|
|
34
|
+
logger: {
|
|
35
|
+
debug(message: string): void;
|
|
36
|
+
info(message: string): void;
|
|
37
|
+
warn(message: string): void;
|
|
38
|
+
error(message: string): void;
|
|
39
|
+
};
|
|
40
|
+
pluginConfig?: Record<string, unknown>;
|
|
41
|
+
}
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=habits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"habits.d.ts","sourceRoot":"","sources":["../../../src/tools/habits.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,eAAO,MAAM,iBAAiB;;;;;;;;;;EAqB5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,OAAO,iBAAiB,CAAC,MAAM,CAAC;AAE1D,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAsBlG;AAsID,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAUrF;AAGD,UAAU,iBAAiB;IACzB,YAAY,CAAC,IAAI,EAAE;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,OAAO,CAAC;QACrB,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KAC/C,GAAG,IAAI,CAAC;IACT,MAAM,EAAE;QACN,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* myn_habits tool - Habit tracking, streaks, and reminders
|
|
3
|
+
*/
|
|
4
|
+
import { Type } from '@sinclair/typebox';
|
|
5
|
+
import { jsonResult, errorResult } from '../client.js';
|
|
6
|
+
export const HabitsInputSchema = Type.Object({
|
|
7
|
+
action: Type.Union([
|
|
8
|
+
Type.Literal('streaks'),
|
|
9
|
+
Type.Literal('skip'),
|
|
10
|
+
Type.Literal('chains'),
|
|
11
|
+
Type.Literal('schedule'),
|
|
12
|
+
Type.Literal('reminders')
|
|
13
|
+
]),
|
|
14
|
+
// streaks parameters
|
|
15
|
+
habitId: Type.Optional(Type.String({ format: 'uuid' })),
|
|
16
|
+
includeHistory: Type.Optional(Type.Boolean({ default: false })),
|
|
17
|
+
// skip parameters
|
|
18
|
+
skipDate: Type.Optional(Type.String({ format: 'date' })),
|
|
19
|
+
skipReason: Type.Optional(Type.String()),
|
|
20
|
+
// chains parameters
|
|
21
|
+
chainId: Type.Optional(Type.String({ format: 'uuid' })),
|
|
22
|
+
// schedule parameters
|
|
23
|
+
dateRange: Type.Optional(Type.Number({ default: 7, description: 'Number of days to look ahead' })),
|
|
24
|
+
// reminders parameters
|
|
25
|
+
enableReminders: Type.Optional(Type.Boolean()),
|
|
26
|
+
reminderTime: Type.Optional(Type.String({ pattern: '^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$' }))
|
|
27
|
+
});
|
|
28
|
+
export async function executeHabits(client, input) {
|
|
29
|
+
try {
|
|
30
|
+
switch (input.action) {
|
|
31
|
+
case 'streaks':
|
|
32
|
+
return await getStreaks(client, input);
|
|
33
|
+
case 'skip':
|
|
34
|
+
return await skipHabit(client, input);
|
|
35
|
+
case 'chains':
|
|
36
|
+
return await getChains(client, input);
|
|
37
|
+
case 'schedule':
|
|
38
|
+
return await getSchedule(client, input);
|
|
39
|
+
case 'reminders':
|
|
40
|
+
return await manageReminders(client, input);
|
|
41
|
+
default:
|
|
42
|
+
return errorResult(`Unknown action: ${input.action}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
if (error instanceof Error) {
|
|
47
|
+
return errorResult(error.message);
|
|
48
|
+
}
|
|
49
|
+
return errorResult('Unknown error occurred');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async function getStreaks(client, input) {
|
|
53
|
+
if (input.habitId) {
|
|
54
|
+
// Get specific habit streak
|
|
55
|
+
const data = await client.get(`/api/v2/unified-tasks/${input.habitId}/streak${input.includeHistory ? '?includeHistory=true' : ''}`);
|
|
56
|
+
return jsonResult(data);
|
|
57
|
+
}
|
|
58
|
+
// No bulk streaks endpoint — use schedule to see all habits
|
|
59
|
+
return errorResult('habitId is required for streaks action. Use the schedule action to see all habits.');
|
|
60
|
+
}
|
|
61
|
+
async function skipHabit(client, input) {
|
|
62
|
+
if (!input.habitId) {
|
|
63
|
+
return errorResult('habitId is required for skip action');
|
|
64
|
+
}
|
|
65
|
+
const body = {};
|
|
66
|
+
if (input.skipDate)
|
|
67
|
+
body.skipDate = input.skipDate;
|
|
68
|
+
if (input.skipReason)
|
|
69
|
+
body.reason = input.skipReason;
|
|
70
|
+
const data = await client.post(`/api/v2/unified-tasks/${input.habitId}/skip`, body);
|
|
71
|
+
return jsonResult(data);
|
|
72
|
+
}
|
|
73
|
+
async function getChains(client, input) {
|
|
74
|
+
if (input.chainId) {
|
|
75
|
+
// Get specific chain details
|
|
76
|
+
const data = await client.get(`/api/habits/chains/${input.chainId}/status`);
|
|
77
|
+
return jsonResult(data);
|
|
78
|
+
}
|
|
79
|
+
// List all chains
|
|
80
|
+
const data = await client.get('/api/habits/chains');
|
|
81
|
+
return jsonResult(data);
|
|
82
|
+
}
|
|
83
|
+
async function getSchedule(client, input) {
|
|
84
|
+
const params = new URLSearchParams();
|
|
85
|
+
if (input.dateRange)
|
|
86
|
+
params.append('days', input.dateRange.toString());
|
|
87
|
+
const queryString = params.toString() ? `?${params.toString()}` : '';
|
|
88
|
+
const data = await client.get(`/api/v2/unified-tasks/schedule${queryString}`);
|
|
89
|
+
return jsonResult(data);
|
|
90
|
+
}
|
|
91
|
+
async function manageReminders(client, input) {
|
|
92
|
+
if (input.habitId) {
|
|
93
|
+
// Manage reminders for specific habit
|
|
94
|
+
if (input.enableReminders === undefined && !input.reminderTime) {
|
|
95
|
+
// Get current reminder settings
|
|
96
|
+
const data = await client.get(`/api/habits/reminders/${input.habitId}`);
|
|
97
|
+
return jsonResult(data);
|
|
98
|
+
}
|
|
99
|
+
// Update reminder settings
|
|
100
|
+
const body = {};
|
|
101
|
+
if (input.enableReminders !== undefined)
|
|
102
|
+
body.enabled = input.enableReminders;
|
|
103
|
+
if (input.reminderTime)
|
|
104
|
+
body.time = input.reminderTime;
|
|
105
|
+
const data = await client.put(`/api/habits/reminders/${input.habitId}`, body);
|
|
106
|
+
return jsonResult(data);
|
|
107
|
+
}
|
|
108
|
+
// List all habit reminders
|
|
109
|
+
const data = await client.get('/api/habits/reminders');
|
|
110
|
+
return jsonResult(data);
|
|
111
|
+
}
|
|
112
|
+
export function registerHabitsTool(api, client) {
|
|
113
|
+
api.registerTool({
|
|
114
|
+
id: 'myn_habits',
|
|
115
|
+
name: 'MYN Habits',
|
|
116
|
+
description: 'Track habits, streaks, and reminders. Actions: streaks, skip, chains, schedule, reminders.',
|
|
117
|
+
inputSchema: HabitsInputSchema,
|
|
118
|
+
async execute(input) {
|
|
119
|
+
return executeHabits(client, input);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=habits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"habits.js","sourceRoot":"","sources":["../../../src/tools/habits.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* myn_household tool - Members, invites, chores
|
|
3
|
+
*/
|
|
4
|
+
import type { MynApiClient } from '../client.js';
|
|
5
|
+
export declare const HouseholdInputSchema: import("@sinclair/typebox").TObject<{
|
|
6
|
+
action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"members">, import("@sinclair/typebox").TLiteral<"invite">, import("@sinclair/typebox").TLiteral<"chores">, import("@sinclair/typebox").TLiteral<"chore_schedule">, import("@sinclair/typebox").TLiteral<"chore_complete">]>;
|
|
7
|
+
householdId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
8
|
+
email: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
9
|
+
role: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"member">, import("@sinclair/typebox").TLiteral<"admin">]>>;
|
|
10
|
+
message: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
11
|
+
choreId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
12
|
+
completedBy: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
13
|
+
note: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
14
|
+
date: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
15
|
+
weekStart: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
16
|
+
}>;
|
|
17
|
+
export type HouseholdInput = typeof HouseholdInputSchema.static;
|
|
18
|
+
export declare function executeHousehold(client: MynApiClient, input: HouseholdInput): Promise<{
|
|
19
|
+
success: true;
|
|
20
|
+
data: unknown;
|
|
21
|
+
} | {
|
|
22
|
+
success: false;
|
|
23
|
+
error: string;
|
|
24
|
+
details?: unknown;
|
|
25
|
+
}>;
|
|
26
|
+
export declare function registerHouseholdTool(api: OpenClawPluginApi, client: MynApiClient): void;
|
|
27
|
+
interface OpenClawPluginApi {
|
|
28
|
+
registerTool(tool: {
|
|
29
|
+
id: string;
|
|
30
|
+
name: string;
|
|
31
|
+
description: string;
|
|
32
|
+
inputSchema: unknown;
|
|
33
|
+
execute: (input: unknown) => Promise<unknown>;
|
|
34
|
+
}): void;
|
|
35
|
+
logger: {
|
|
36
|
+
debug(message: string): void;
|
|
37
|
+
info(message: string): void;
|
|
38
|
+
warn(message: string): void;
|
|
39
|
+
error(message: string): void;
|
|
40
|
+
};
|
|
41
|
+
pluginConfig?: Record<string, unknown>;
|
|
42
|
+
}
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=household.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"household.d.ts","sourceRoot":"","sources":["../../../src/tools/household.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,eAAO,MAAM,oBAAoB;;;;;;;;;;;EAwB/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,OAAO,oBAAoB,CAAC,MAAM,CAAC;AAEhE,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAsBlG;AA4JD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAUxF;AAGD,UAAU,iBAAiB;IACzB,YAAY,CAAC,IAAI,EAAE;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,OAAO,CAAC;QACrB,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KAC/C,GAAG,IAAI,CAAC;IACT,MAAM,EAAE;QACN,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* myn_household tool - Members, invites, chores
|
|
3
|
+
*/
|
|
4
|
+
import { Type } from '@sinclair/typebox';
|
|
5
|
+
import { jsonResult, errorResult } from '../client.js';
|
|
6
|
+
export const HouseholdInputSchema = Type.Object({
|
|
7
|
+
action: Type.Union([
|
|
8
|
+
Type.Literal('members'),
|
|
9
|
+
Type.Literal('invite'),
|
|
10
|
+
Type.Literal('chores'),
|
|
11
|
+
Type.Literal('chore_schedule'),
|
|
12
|
+
Type.Literal('chore_complete')
|
|
13
|
+
]),
|
|
14
|
+
// Common parameters
|
|
15
|
+
householdId: Type.Optional(Type.String({ format: 'uuid' })),
|
|
16
|
+
// invite parameters
|
|
17
|
+
email: Type.Optional(Type.String({ format: 'email' })),
|
|
18
|
+
role: Type.Optional(Type.Union([
|
|
19
|
+
Type.Literal('member'),
|
|
20
|
+
Type.Literal('admin')
|
|
21
|
+
])),
|
|
22
|
+
message: Type.Optional(Type.String()),
|
|
23
|
+
// chore_complete parameters
|
|
24
|
+
choreId: Type.Optional(Type.String({ format: 'uuid' })),
|
|
25
|
+
completedBy: Type.Optional(Type.String({ format: 'uuid' })),
|
|
26
|
+
note: Type.Optional(Type.String()),
|
|
27
|
+
// chore_schedule parameters
|
|
28
|
+
date: Type.Optional(Type.String({ format: 'date' })),
|
|
29
|
+
weekStart: Type.Optional(Type.String({ format: 'date' }))
|
|
30
|
+
});
|
|
31
|
+
export async function executeHousehold(client, input) {
|
|
32
|
+
try {
|
|
33
|
+
switch (input.action) {
|
|
34
|
+
case 'members':
|
|
35
|
+
return await getMembers(client, input);
|
|
36
|
+
case 'invite':
|
|
37
|
+
return await inviteMember(client, input);
|
|
38
|
+
case 'chores':
|
|
39
|
+
return await getChores(client, input);
|
|
40
|
+
case 'chore_schedule':
|
|
41
|
+
return await getChoreSchedule(client, input);
|
|
42
|
+
case 'chore_complete':
|
|
43
|
+
return await completeChore(client, input);
|
|
44
|
+
default:
|
|
45
|
+
return errorResult(`Unknown action: ${input.action}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (error instanceof Error) {
|
|
50
|
+
return errorResult(error.message);
|
|
51
|
+
}
|
|
52
|
+
return errorResult('Unknown error occurred');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async function getHouseholdId(client, providedId) {
|
|
56
|
+
if (providedId)
|
|
57
|
+
return providedId;
|
|
58
|
+
const household = await client.get('/api/v1/households/current');
|
|
59
|
+
if (!household || !household.id) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
return household.id;
|
|
63
|
+
}
|
|
64
|
+
async function getMembers(client, input) {
|
|
65
|
+
const householdId = await getHouseholdId(client, input.householdId);
|
|
66
|
+
if (!householdId) {
|
|
67
|
+
return errorResult('No household found. Please specify householdId.');
|
|
68
|
+
}
|
|
69
|
+
const data = await client.get(`/api/v1/households/${householdId}/members`);
|
|
70
|
+
return jsonResult(data);
|
|
71
|
+
}
|
|
72
|
+
async function inviteMember(client, input) {
|
|
73
|
+
if (!input.email) {
|
|
74
|
+
return errorResult('email is required for invite action');
|
|
75
|
+
}
|
|
76
|
+
const householdId = await getHouseholdId(client, input.householdId);
|
|
77
|
+
if (!householdId) {
|
|
78
|
+
return errorResult('No household found. Please specify householdId.');
|
|
79
|
+
}
|
|
80
|
+
const body = {
|
|
81
|
+
email: input.email
|
|
82
|
+
};
|
|
83
|
+
if (input.role)
|
|
84
|
+
body.role = input.role;
|
|
85
|
+
if (input.message)
|
|
86
|
+
body.message = input.message;
|
|
87
|
+
const data = await client.post(`/api/v1/households/${householdId}/invites`, body);
|
|
88
|
+
return jsonResult(data);
|
|
89
|
+
}
|
|
90
|
+
async function getChores(client, input) {
|
|
91
|
+
const householdId = await getHouseholdId(client, input.householdId);
|
|
92
|
+
if (!householdId) {
|
|
93
|
+
return errorResult('No household found. Please specify householdId.');
|
|
94
|
+
}
|
|
95
|
+
const data = await client.get(`/api/v2/chores/today?householdId=${householdId}`);
|
|
96
|
+
return jsonResult(data);
|
|
97
|
+
}
|
|
98
|
+
async function getChoreSchedule(client, input) {
|
|
99
|
+
const householdId = await getHouseholdId(client, input.householdId);
|
|
100
|
+
if (!householdId) {
|
|
101
|
+
return errorResult('No household found. Please specify householdId.');
|
|
102
|
+
}
|
|
103
|
+
const params = new URLSearchParams();
|
|
104
|
+
params.append('householdId', householdId);
|
|
105
|
+
// Default date range: today + 7 days if no specific dates provided
|
|
106
|
+
const today = new Date().toISOString().split('T')[0];
|
|
107
|
+
const startDate = input.date ?? input.weekStart ?? today;
|
|
108
|
+
params.append('startDate', startDate);
|
|
109
|
+
if (input.date) {
|
|
110
|
+
// Single date: use same date as end
|
|
111
|
+
params.append('endDate', input.date);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
// Range: weekStart + 7 days, or default 7 days from today
|
|
115
|
+
const end = new Date(startDate);
|
|
116
|
+
end.setDate(end.getDate() + 7);
|
|
117
|
+
params.append('endDate', end.toISOString().split('T')[0]);
|
|
118
|
+
}
|
|
119
|
+
const queryString = params.toString() ? `?${params.toString()}` : '';
|
|
120
|
+
const data = await client.get(`/api/v2/chores/schedule/range${queryString}`);
|
|
121
|
+
return jsonResult(data);
|
|
122
|
+
}
|
|
123
|
+
async function completeChore(client, input) {
|
|
124
|
+
if (!input.choreId) {
|
|
125
|
+
return errorResult('choreId is required for chore_complete action');
|
|
126
|
+
}
|
|
127
|
+
const body = {};
|
|
128
|
+
if (input.completedBy)
|
|
129
|
+
body.completedBy = input.completedBy;
|
|
130
|
+
if (input.note)
|
|
131
|
+
body.note = input.note;
|
|
132
|
+
const data = await client.post(`/api/v2/chores/instances/${input.choreId}/complete`, body);
|
|
133
|
+
return jsonResult(data);
|
|
134
|
+
}
|
|
135
|
+
export function registerHouseholdTool(api, client) {
|
|
136
|
+
api.registerTool({
|
|
137
|
+
id: 'myn_household',
|
|
138
|
+
name: 'MYN Household',
|
|
139
|
+
description: 'Manage household members, invites, and chores. Actions: members, invite, chores, chore_schedule, chore_complete.',
|
|
140
|
+
inputSchema: HouseholdInputSchema,
|
|
141
|
+
async execute(input) {
|
|
142
|
+
return executeHousehold(client, input);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=household.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"household.js","sourceRoot":"","sources":["../../../src/tools/household.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* myn_lists tool - Grocery/shopping list management
|
|
3
|
+
*/
|
|
4
|
+
import type { MynApiClient } from '../client.js';
|
|
5
|
+
export declare const ListsInputSchema: import("@sinclair/typebox").TObject<{
|
|
6
|
+
action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"get">, import("@sinclair/typebox").TLiteral<"add">, import("@sinclair/typebox").TLiteral<"toggle">, import("@sinclair/typebox").TLiteral<"bulk_add">, import("@sinclair/typebox").TLiteral<"convert_to_tasks">]>;
|
|
7
|
+
householdId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
8
|
+
item: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
9
|
+
items: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
|
|
10
|
+
category: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
11
|
+
quantity: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
12
|
+
notes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
13
|
+
itemId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
14
|
+
checked: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
15
|
+
uncheckedOnly: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
16
|
+
priority: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"CRITICAL">, import("@sinclair/typebox").TLiteral<"OPPORTUNITY_NOW">, import("@sinclair/typebox").TLiteral<"OVER_THE_HORIZON">, import("@sinclair/typebox").TLiteral<"PARKING_LOT">]>>;
|
|
17
|
+
}>;
|
|
18
|
+
export type ListsInput = typeof ListsInputSchema.static;
|
|
19
|
+
export declare function executeLists(client: MynApiClient, input: ListsInput): Promise<{
|
|
20
|
+
success: true;
|
|
21
|
+
data: unknown;
|
|
22
|
+
} | {
|
|
23
|
+
success: false;
|
|
24
|
+
error: string;
|
|
25
|
+
details?: unknown;
|
|
26
|
+
}>;
|
|
27
|
+
export declare function registerListsTool(api: OpenClawPluginApi, client: MynApiClient): void;
|
|
28
|
+
interface OpenClawPluginApi {
|
|
29
|
+
registerTool(tool: {
|
|
30
|
+
id: string;
|
|
31
|
+
name: string;
|
|
32
|
+
description: string;
|
|
33
|
+
inputSchema: unknown;
|
|
34
|
+
execute: (input: unknown) => Promise<unknown>;
|
|
35
|
+
}): void;
|
|
36
|
+
logger: {
|
|
37
|
+
debug(message: string): void;
|
|
38
|
+
info(message: string): void;
|
|
39
|
+
warn(message: string): void;
|
|
40
|
+
error(message: string): void;
|
|
41
|
+
};
|
|
42
|
+
pluginConfig?: Record<string, unknown>;
|
|
43
|
+
}
|
|
44
|
+
export {};
|
|
45
|
+
//# sourceMappingURL=lists.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lists.d.ts","sourceRoot":"","sources":["../../../src/tools/lists.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;EA2B3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,OAAO,gBAAgB,CAAC,MAAM,CAAC;AAExD,wBAAsB,YAAY,CAChC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAsBlG;AAiJD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAUpF;AAGD,UAAU,iBAAiB;IACzB,YAAY,CAAC,IAAI,EAAE;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,OAAO,CAAC;QACrB,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KAC/C,GAAG,IAAI,CAAC;IACT,MAAM,EAAE;QACN,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* myn_lists tool - Grocery/shopping list management
|
|
3
|
+
*/
|
|
4
|
+
import { Type } from '@sinclair/typebox';
|
|
5
|
+
import { jsonResult, errorResult } from '../client.js';
|
|
6
|
+
export const ListsInputSchema = Type.Object({
|
|
7
|
+
action: Type.Union([
|
|
8
|
+
Type.Literal('get'),
|
|
9
|
+
Type.Literal('add'),
|
|
10
|
+
Type.Literal('toggle'),
|
|
11
|
+
Type.Literal('bulk_add'),
|
|
12
|
+
Type.Literal('convert_to_tasks')
|
|
13
|
+
]),
|
|
14
|
+
// Common parameters
|
|
15
|
+
householdId: Type.Optional(Type.String({ format: 'uuid' })),
|
|
16
|
+
// add/bulk_add parameters
|
|
17
|
+
item: Type.Optional(Type.String({ minLength: 1 })),
|
|
18
|
+
items: Type.Optional(Type.Array(Type.String())),
|
|
19
|
+
category: Type.Optional(Type.String()), // e.g., "produce", "dairy", "pantry"
|
|
20
|
+
quantity: Type.Optional(Type.String()), // e.g., "2", "1 lb", "3 bunches"
|
|
21
|
+
notes: Type.Optional(Type.String()),
|
|
22
|
+
// toggle parameters
|
|
23
|
+
itemId: Type.Optional(Type.String({ format: 'uuid' })),
|
|
24
|
+
checked: Type.Optional(Type.Boolean()),
|
|
25
|
+
// convert_to_tasks parameters
|
|
26
|
+
uncheckedOnly: Type.Optional(Type.Boolean({ default: true })),
|
|
27
|
+
priority: Type.Optional(Type.Union([
|
|
28
|
+
Type.Literal('CRITICAL'),
|
|
29
|
+
Type.Literal('OPPORTUNITY_NOW'),
|
|
30
|
+
Type.Literal('OVER_THE_HORIZON'),
|
|
31
|
+
Type.Literal('PARKING_LOT')
|
|
32
|
+
]))
|
|
33
|
+
});
|
|
34
|
+
export async function executeLists(client, input) {
|
|
35
|
+
try {
|
|
36
|
+
switch (input.action) {
|
|
37
|
+
case 'get':
|
|
38
|
+
return await getList(client, input);
|
|
39
|
+
case 'add':
|
|
40
|
+
return await addItem(client, input);
|
|
41
|
+
case 'toggle':
|
|
42
|
+
return await toggleItem(client, input);
|
|
43
|
+
case 'bulk_add':
|
|
44
|
+
return await bulkAddItems(client, input);
|
|
45
|
+
case 'convert_to_tasks':
|
|
46
|
+
return await convertToTasks(client, input);
|
|
47
|
+
default:
|
|
48
|
+
return errorResult(`Unknown action: ${input.action}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (error instanceof Error) {
|
|
53
|
+
return errorResult(error.message);
|
|
54
|
+
}
|
|
55
|
+
return errorResult('Unknown error occurred');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async function getList(client, input) {
|
|
59
|
+
// Get current user's household if not specified
|
|
60
|
+
let householdId = input.householdId;
|
|
61
|
+
if (!householdId) {
|
|
62
|
+
const household = await client.get('/api/v1/households/current');
|
|
63
|
+
if (!household?.id) {
|
|
64
|
+
return errorResult('No household found. Please specify householdId.');
|
|
65
|
+
}
|
|
66
|
+
householdId = household.id;
|
|
67
|
+
}
|
|
68
|
+
const data = await client.get(`/api/v1/households/${householdId}/grocery-list`);
|
|
69
|
+
return jsonResult(data);
|
|
70
|
+
}
|
|
71
|
+
async function addItem(client, input) {
|
|
72
|
+
if (!input.item) {
|
|
73
|
+
return errorResult('item is required for add action');
|
|
74
|
+
}
|
|
75
|
+
// Get household ID if not provided
|
|
76
|
+
let householdId = input.householdId;
|
|
77
|
+
if (!householdId) {
|
|
78
|
+
const household = await client.get('/api/v1/households/current');
|
|
79
|
+
if (!household?.id) {
|
|
80
|
+
return errorResult('No household found. Please specify householdId.');
|
|
81
|
+
}
|
|
82
|
+
householdId = household.id;
|
|
83
|
+
}
|
|
84
|
+
const body = {
|
|
85
|
+
name: input.item
|
|
86
|
+
};
|
|
87
|
+
if (input.category)
|
|
88
|
+
body.category = input.category;
|
|
89
|
+
if (input.quantity)
|
|
90
|
+
body.quantity = input.quantity;
|
|
91
|
+
if (input.notes)
|
|
92
|
+
body.notes = input.notes;
|
|
93
|
+
const data = await client.post(`/api/v1/households/${householdId}/grocery-list`, body);
|
|
94
|
+
return jsonResult(data);
|
|
95
|
+
}
|
|
96
|
+
async function toggleItem(client, input) {
|
|
97
|
+
if (!input.itemId) {
|
|
98
|
+
return errorResult('itemId is required for toggle action');
|
|
99
|
+
}
|
|
100
|
+
// Get household ID if not provided
|
|
101
|
+
let householdId = input.householdId;
|
|
102
|
+
if (!householdId) {
|
|
103
|
+
const household = await client.get('/api/v1/households/current');
|
|
104
|
+
if (!household?.id) {
|
|
105
|
+
return errorResult('No household found. Please specify householdId.');
|
|
106
|
+
}
|
|
107
|
+
householdId = household.id;
|
|
108
|
+
}
|
|
109
|
+
const body = {};
|
|
110
|
+
if (input.checked !== undefined)
|
|
111
|
+
body.checked = input.checked;
|
|
112
|
+
const data = await client.patch(`/api/v1/households/${householdId}/grocery-list/${input.itemId}/toggle`, body);
|
|
113
|
+
return jsonResult(data);
|
|
114
|
+
}
|
|
115
|
+
async function bulkAddItems(client, input) {
|
|
116
|
+
if (!input.items || input.items.length === 0) {
|
|
117
|
+
return errorResult('items array is required for bulk_add action');
|
|
118
|
+
}
|
|
119
|
+
// Get household ID if not provided
|
|
120
|
+
let householdId = input.householdId;
|
|
121
|
+
if (!householdId) {
|
|
122
|
+
const household = await client.get('/api/v1/households/current');
|
|
123
|
+
if (!household?.id) {
|
|
124
|
+
return errorResult('No household found. Please specify householdId.');
|
|
125
|
+
}
|
|
126
|
+
householdId = household.id;
|
|
127
|
+
}
|
|
128
|
+
const body = {
|
|
129
|
+
items: input.items.map(item => ({
|
|
130
|
+
name: item,
|
|
131
|
+
category: input.category,
|
|
132
|
+
quantity: input.quantity
|
|
133
|
+
}))
|
|
134
|
+
};
|
|
135
|
+
const data = await client.post(`/api/v1/households/${householdId}/grocery-list/bulk`, body);
|
|
136
|
+
return jsonResult(data);
|
|
137
|
+
}
|
|
138
|
+
async function convertToTasks(client, input) {
|
|
139
|
+
// Get household ID if not provided
|
|
140
|
+
let householdId = input.householdId;
|
|
141
|
+
if (!householdId) {
|
|
142
|
+
const household = await client.get('/api/v1/households/current');
|
|
143
|
+
if (!household?.id) {
|
|
144
|
+
return errorResult('No household found. Please specify householdId.');
|
|
145
|
+
}
|
|
146
|
+
householdId = household.id;
|
|
147
|
+
}
|
|
148
|
+
const body = {
|
|
149
|
+
uncheckedOnly: input.uncheckedOnly ?? true
|
|
150
|
+
};
|
|
151
|
+
if (input.priority)
|
|
152
|
+
body.priority = input.priority;
|
|
153
|
+
const data = await client.post(`/api/v1/households/${householdId}/grocery-list/convert-to-tasks`, body);
|
|
154
|
+
return jsonResult(data);
|
|
155
|
+
}
|
|
156
|
+
export function registerListsTool(api, client) {
|
|
157
|
+
api.registerTool({
|
|
158
|
+
id: 'myn_lists',
|
|
159
|
+
name: 'MYN Lists',
|
|
160
|
+
description: 'Manage grocery and shopping lists. Actions: get, add, toggle, bulk_add, convert_to_tasks.',
|
|
161
|
+
inputSchema: ListsInputSchema,
|
|
162
|
+
async execute(input) {
|
|
163
|
+
return executeLists(client, input);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=lists.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lists.js","sourceRoot":"","sources":["../../../src/tools/lists.ts"],"names":[],"mappings":"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"}
|