@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.
Files changed (86) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +318 -0
  3. package/dist/index.d.ts +77 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +147 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/src/client.d.ts +40 -0
  8. package/dist/src/client.d.ts.map +1 -0
  9. package/dist/src/client.js +95 -0
  10. package/dist/src/client.js.map +1 -0
  11. package/dist/src/tools/briefing.d.ts +44 -0
  12. package/dist/src/tools/briefing.d.ts.map +1 -0
  13. package/dist/src/tools/briefing.js +116 -0
  14. package/dist/src/tools/briefing.js.map +1 -0
  15. package/dist/src/tools/calendar.d.ts +56 -0
  16. package/dist/src/tools/calendar.d.ts.map +1 -0
  17. package/dist/src/tools/calendar.js +206 -0
  18. package/dist/src/tools/calendar.js.map +1 -0
  19. package/dist/src/tools/capabilityHash.d.ts +26 -0
  20. package/dist/src/tools/capabilityHash.d.ts.map +1 -0
  21. package/dist/src/tools/capabilityHash.js +48 -0
  22. package/dist/src/tools/capabilityHash.js.map +1 -0
  23. package/dist/src/tools/habits.d.ts +43 -0
  24. package/dist/src/tools/habits.d.ts.map +1 -0
  25. package/dist/src/tools/habits.js +123 -0
  26. package/dist/src/tools/habits.js.map +1 -0
  27. package/dist/src/tools/household.d.ts +44 -0
  28. package/dist/src/tools/household.d.ts.map +1 -0
  29. package/dist/src/tools/household.js +146 -0
  30. package/dist/src/tools/household.js.map +1 -0
  31. package/dist/src/tools/lists.d.ts +45 -0
  32. package/dist/src/tools/lists.d.ts.map +1 -0
  33. package/dist/src/tools/lists.js +167 -0
  34. package/dist/src/tools/lists.js.map +1 -0
  35. package/dist/src/tools/memory.d.ts +45 -0
  36. package/dist/src/tools/memory.d.ts.map +1 -0
  37. package/dist/src/tools/memory.js +131 -0
  38. package/dist/src/tools/memory.js.map +1 -0
  39. package/dist/src/tools/myn_a2a_pairing.d.ts +42 -0
  40. package/dist/src/tools/myn_a2a_pairing.d.ts.map +1 -0
  41. package/dist/src/tools/myn_a2a_pairing.js +166 -0
  42. package/dist/src/tools/myn_a2a_pairing.js.map +1 -0
  43. package/dist/src/tools/planning.d.ts +56 -0
  44. package/dist/src/tools/planning.d.ts.map +1 -0
  45. package/dist/src/tools/planning.js +94 -0
  46. package/dist/src/tools/planning.js.map +1 -0
  47. package/dist/src/tools/profile.d.ts +47 -0
  48. package/dist/src/tools/profile.d.ts.map +1 -0
  49. package/dist/src/tools/profile.js +125 -0
  50. package/dist/src/tools/profile.js.map +1 -0
  51. package/dist/src/tools/projects.d.ts +45 -0
  52. package/dist/src/tools/projects.d.ts.map +1 -0
  53. package/dist/src/tools/projects.js +106 -0
  54. package/dist/src/tools/projects.js.map +1 -0
  55. package/dist/src/tools/search.d.ts +46 -0
  56. package/dist/src/tools/search.d.ts.map +1 -0
  57. package/dist/src/tools/search.js +93 -0
  58. package/dist/src/tools/search.js.map +1 -0
  59. package/dist/src/tools/syncOnMismatch.d.ts +48 -0
  60. package/dist/src/tools/syncOnMismatch.d.ts.map +1 -0
  61. package/dist/src/tools/syncOnMismatch.js +94 -0
  62. package/dist/src/tools/syncOnMismatch.js.map +1 -0
  63. package/dist/src/tools/tasks.d.ts +52 -0
  64. package/dist/src/tools/tasks.d.ts.map +1 -0
  65. package/dist/src/tools/tasks.js +200 -0
  66. package/dist/src/tools/tasks.js.map +1 -0
  67. package/dist/src/tools/timers.d.ts +48 -0
  68. package/dist/src/tools/timers.d.ts.map +1 -0
  69. package/dist/src/tools/timers.js +138 -0
  70. package/dist/src/tools/timers.js.map +1 -0
  71. package/openclaw.plugin.json +30 -0
  72. package/package.json +74 -0
  73. package/skills/myn/SKILL.md +54 -0
  74. package/skills/myn/references/authentication.md +83 -0
  75. package/skills/myn/references/briefing-api.md +187 -0
  76. package/skills/myn/references/calendar-api.md +139 -0
  77. package/skills/myn/references/habits-api.md +257 -0
  78. package/skills/myn/references/household-api.md +175 -0
  79. package/skills/myn/references/lists-api.md +180 -0
  80. package/skills/myn/references/memory-api.md +95 -0
  81. package/skills/myn/references/planning-api.md +191 -0
  82. package/skills/myn/references/profile-api.md +148 -0
  83. package/skills/myn/references/projects-api.md +127 -0
  84. package/skills/myn/references/search-api.md +97 -0
  85. package/skills/myn/references/tasks-api.md +187 -0
  86. package/skills/myn/references/timers-api.md +171 -0
@@ -0,0 +1,125 @@
1
+ /**
2
+ * myn_profile tool - User info, goals, and preferences
3
+ */
4
+ import { Type } from '@sinclair/typebox';
5
+ import { jsonResult, errorResult } from '../client.js';
6
+ export const ProfileInputSchema = Type.Object({
7
+ action: Type.Union([
8
+ Type.Literal('get_info'),
9
+ Type.Literal('get_goals'),
10
+ Type.Literal('update_goals'),
11
+ Type.Literal('preferences')
12
+ ]),
13
+ // update_goals parameters
14
+ goals: Type.Optional(Type.Array(Type.Object({
15
+ id: Type.Optional(Type.String()),
16
+ title: Type.String(),
17
+ description: Type.Optional(Type.String()),
18
+ targetDate: Type.Optional(Type.String({ format: 'date' })),
19
+ priority: Type.Optional(Type.Union([
20
+ Type.Literal('low'),
21
+ Type.Literal('medium'),
22
+ Type.Literal('high')
23
+ ])),
24
+ status: Type.Optional(Type.Union([
25
+ Type.Literal('active'),
26
+ Type.Literal('completed'),
27
+ Type.Literal('paused'),
28
+ Type.Literal('abandoned')
29
+ ]))
30
+ }))),
31
+ goalId: Type.Optional(Type.String()),
32
+ // preferences parameters
33
+ preferenceKey: Type.Optional(Type.String()),
34
+ preferenceValue: Type.Optional(Type.Unknown()),
35
+ preferenceCategory: Type.Optional(Type.Union([
36
+ Type.Literal('notifications'),
37
+ Type.Literal('display'),
38
+ Type.Literal('ai'),
39
+ Type.Literal('privacy'),
40
+ Type.Literal('integrations')
41
+ ]))
42
+ });
43
+ export async function executeProfile(client, input) {
44
+ try {
45
+ switch (input.action) {
46
+ case 'get_info':
47
+ return await getInfo(client);
48
+ case 'get_goals':
49
+ return await getGoals(client);
50
+ case 'update_goals':
51
+ return await updateGoals(client, input);
52
+ case 'preferences':
53
+ return await managePreferences(client, input);
54
+ default:
55
+ return errorResult(`Unknown action: ${input.action}`);
56
+ }
57
+ }
58
+ catch (error) {
59
+ if (error instanceof Error) {
60
+ return errorResult(error.message);
61
+ }
62
+ return errorResult('Unknown error occurred');
63
+ }
64
+ }
65
+ async function getInfo(client) {
66
+ const data = await client.get('/api/v1/customers');
67
+ return jsonResult(data);
68
+ }
69
+ async function getGoals(client) {
70
+ const data = await client.get('/api/v1/customers/goals');
71
+ return jsonResult(data);
72
+ }
73
+ async function updateGoals(client, input) {
74
+ if (!input.goals || input.goals.length === 0) {
75
+ return errorResult('goals array is required for update_goals action');
76
+ }
77
+ // PUT /api/v1/customers/goals — sends the full goals object
78
+ const data = await client.put('/api/v1/customers/goals', { goals: input.goals });
79
+ return jsonResult(data);
80
+ }
81
+ // Maps preferenceKey to the actual API endpoint path
82
+ const PREFERENCE_ENDPOINTS = {
83
+ 'notification-preferences': '/api/v1/customers/notification-preferences',
84
+ 'coaching-intensity': '/api/v1/customers/coaching-intensity',
85
+ 'theme-preference': '/api/v1/customers/theme-preference',
86
+ };
87
+ async function managePreferences(client, input) {
88
+ if (input.preferenceKey !== undefined) {
89
+ const endpoint = PREFERENCE_ENDPOINTS[input.preferenceKey];
90
+ if (!endpoint) {
91
+ return errorResult(`Unknown preferenceKey: ${input.preferenceKey}. Valid keys: ${Object.keys(PREFERENCE_ENDPOINTS).join(', ')}`);
92
+ }
93
+ if (input.preferenceValue !== undefined) {
94
+ // Update preference
95
+ const data = await client.put(endpoint, input.preferenceValue);
96
+ return jsonResult(data);
97
+ }
98
+ // Get preference
99
+ const data = await client.get(endpoint);
100
+ return jsonResult(data);
101
+ }
102
+ // No preferenceKey — return all preferences by fetching each endpoint
103
+ const results = {};
104
+ for (const [key, endpoint] of Object.entries(PREFERENCE_ENDPOINTS)) {
105
+ try {
106
+ results[key] = await client.get(endpoint);
107
+ }
108
+ catch {
109
+ results[key] = null;
110
+ }
111
+ }
112
+ return jsonResult({ preferences: results });
113
+ }
114
+ export function registerProfileTool(api, client) {
115
+ api.registerTool({
116
+ id: 'myn_profile',
117
+ name: 'MYN Profile',
118
+ description: 'Manage user profile, goals, and preferences. Actions: get_info, get_goals, update_goals, preferences.',
119
+ inputSchema: ProfileInputSchema,
120
+ async execute(input) {
121
+ return executeProfile(client, input);
122
+ }
123
+ });
124
+ }
125
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../../src/tools/profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * myn_projects tool - Project/category management
3
+ */
4
+ import type { MynApiClient } from '../client.js';
5
+ export declare const ProjectsInputSchema: import("@sinclair/typebox").TObject<{
6
+ action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"list">, import("@sinclair/typebox").TLiteral<"get">, import("@sinclair/typebox").TLiteral<"create">, import("@sinclair/typebox").TLiteral<"move_task">]>;
7
+ projectId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
8
+ name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
9
+ description: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
10
+ color: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
11
+ icon: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
12
+ parentProjectId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
13
+ taskId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
14
+ targetProjectId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
15
+ includeArchived: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
16
+ includeStats: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
17
+ }>;
18
+ export type ProjectsInput = typeof ProjectsInputSchema.static;
19
+ export declare function executeProjects(client: MynApiClient, input: ProjectsInput): Promise<{
20
+ success: true;
21
+ data: unknown;
22
+ } | {
23
+ success: false;
24
+ error: string;
25
+ details?: unknown;
26
+ }>;
27
+ export declare function registerProjectsTool(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=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../../src/tools/projects.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;EAqB9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,OAAO,mBAAmB,CAAC,MAAM,CAAC;AAE9D,wBAAsB,eAAe,CACnC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,aAAa,GACnB,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,CAoBlG;AAsGD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAUvF;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,106 @@
1
+ /**
2
+ * myn_projects tool - Project/category management
3
+ */
4
+ import { Type } from '@sinclair/typebox';
5
+ import { jsonResult, errorResult } from '../client.js';
6
+ export const ProjectsInputSchema = Type.Object({
7
+ action: Type.Union([
8
+ Type.Literal('list'),
9
+ Type.Literal('get'),
10
+ Type.Literal('create'),
11
+ Type.Literal('move_task')
12
+ ]),
13
+ // get parameters
14
+ projectId: Type.Optional(Type.String({ format: 'uuid' })),
15
+ // create parameters
16
+ name: Type.Optional(Type.String({ minLength: 1, maxLength: 100 })),
17
+ description: Type.Optional(Type.String({ maxLength: 500 })),
18
+ color: Type.Optional(Type.String({ pattern: '^#[0-9A-Fa-f]{6}$' })),
19
+ icon: Type.Optional(Type.String()),
20
+ parentProjectId: Type.Optional(Type.String({ format: 'uuid' })),
21
+ // move_task parameters
22
+ taskId: Type.Optional(Type.String({ format: 'uuid' })),
23
+ targetProjectId: Type.Optional(Type.String({ format: 'uuid' })),
24
+ // list parameters
25
+ includeArchived: Type.Optional(Type.Boolean({ default: false })),
26
+ includeStats: Type.Optional(Type.Boolean({ default: true }))
27
+ });
28
+ export async function executeProjects(client, input) {
29
+ try {
30
+ switch (input.action) {
31
+ case 'list':
32
+ return await listProjects(client, input);
33
+ case 'get':
34
+ return await getProject(client, input);
35
+ case 'create':
36
+ return await createProject(client, input);
37
+ case 'move_task':
38
+ return await moveTask(client, input);
39
+ default:
40
+ return errorResult(`Unknown action: ${input.action}`);
41
+ }
42
+ }
43
+ catch (error) {
44
+ if (error instanceof Error) {
45
+ return errorResult(error.message);
46
+ }
47
+ return errorResult('Unknown error occurred');
48
+ }
49
+ }
50
+ async function listProjects(client, input) {
51
+ const params = new URLSearchParams();
52
+ if (input.includeArchived)
53
+ params.append('includeArchived', 'true');
54
+ if (input.includeStats)
55
+ params.append('includeStats', 'true');
56
+ const queryString = params.toString() ? `?${params.toString()}` : '';
57
+ const data = await client.get(`/api/project/defaults${queryString}`);
58
+ return jsonResult(data);
59
+ }
60
+ async function getProject(client, input) {
61
+ if (!input.projectId) {
62
+ return errorResult('projectId is required for get action');
63
+ }
64
+ const data = await client.get(`/api/project/${input.projectId}`);
65
+ return jsonResult(data);
66
+ }
67
+ async function createProject(client, input) {
68
+ if (!input.name) {
69
+ return errorResult('name is required for create action');
70
+ }
71
+ const body = {
72
+ name: input.name
73
+ };
74
+ if (input.description)
75
+ body.description = input.description;
76
+ if (input.color)
77
+ body.color = input.color;
78
+ if (input.icon)
79
+ body.icon = input.icon;
80
+ if (input.parentProjectId)
81
+ body.parentId = input.parentProjectId;
82
+ const data = await client.post('/api/project/create', body);
83
+ return jsonResult(data);
84
+ }
85
+ async function moveTask(client, input) {
86
+ if (!input.taskId) {
87
+ return errorResult('taskId is required for move_task action');
88
+ }
89
+ if (!input.targetProjectId) {
90
+ return errorResult('targetProjectId is required for move_task action');
91
+ }
92
+ const data = await client.put(`/api/project/${input.targetProjectId}/moveTaskToProject/${input.taskId}`);
93
+ return jsonResult(data);
94
+ }
95
+ export function registerProjectsTool(api, client) {
96
+ api.registerTool({
97
+ id: 'myn_projects',
98
+ name: 'MYN Projects',
99
+ description: 'Manage projects and categories. Actions: list, get, create, move_task.',
100
+ inputSchema: ProjectsInputSchema,
101
+ async execute(input) {
102
+ return executeProjects(client, input);
103
+ }
104
+ });
105
+ }
106
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../../src/tools/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * myn_search tool - Unified search across tasks, events, notes, and more
3
+ */
4
+ import type { MynApiClient } from '../client.js';
5
+ export declare const SearchInputSchema: import("@sinclair/typebox").TObject<{
6
+ action: import("@sinclair/typebox").TLiteral<"search">;
7
+ query: import("@sinclair/typebox").TString;
8
+ types: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"task">, import("@sinclair/typebox").TLiteral<"habit">, import("@sinclair/typebox").TLiteral<"chore">, import("@sinclair/typebox").TLiteral<"event">, import("@sinclair/typebox").TLiteral<"project">, import("@sinclair/typebox").TLiteral<"note">, import("@sinclair/typebox").TLiteral<"memory">]>>>;
9
+ filters: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
10
+ status: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"PENDING">, import("@sinclair/typebox").TLiteral<"IN_PROGRESS">, import("@sinclair/typebox").TLiteral<"COMPLETED">, import("@sinclair/typebox").TLiteral<"ARCHIVED">]>>;
11
+ 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">]>>;
12
+ projectId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
13
+ dateFrom: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
14
+ dateTo: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
15
+ }>>;
16
+ limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
17
+ offset: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
18
+ }>;
19
+ export type SearchInput = typeof SearchInputSchema.static;
20
+ export declare function executeSearch(client: MynApiClient, input: SearchInput): Promise<{
21
+ success: true;
22
+ data: unknown;
23
+ } | {
24
+ success: false;
25
+ error: string;
26
+ details?: unknown;
27
+ }>;
28
+ export declare function registerSearchTool(api: OpenClawPluginApi, client: MynApiClient): void;
29
+ interface OpenClawPluginApi {
30
+ registerTool(tool: {
31
+ id: string;
32
+ name: string;
33
+ description: string;
34
+ inputSchema: unknown;
35
+ execute: (input: unknown) => Promise<unknown>;
36
+ }): void;
37
+ logger: {
38
+ debug(message: string): void;
39
+ info(message: string): void;
40
+ warn(message: string): void;
41
+ error(message: string): void;
42
+ };
43
+ pluginConfig?: Record<string, unknown>;
44
+ }
45
+ export {};
46
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;EA+B5B,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,CAclG;AAgDD,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,93 @@
1
+ /**
2
+ * myn_search tool - Unified search across tasks, events, notes, and more
3
+ */
4
+ import { Type } from '@sinclair/typebox';
5
+ import { jsonResult, errorResult } from '../client.js';
6
+ export const SearchInputSchema = Type.Object({
7
+ action: Type.Literal('search'),
8
+ query: Type.String({ minLength: 1, description: 'Search query string' }),
9
+ types: Type.Optional(Type.Array(Type.Union([
10
+ Type.Literal('task'),
11
+ Type.Literal('habit'),
12
+ Type.Literal('chore'),
13
+ Type.Literal('event'),
14
+ Type.Literal('project'),
15
+ Type.Literal('note'),
16
+ Type.Literal('memory')
17
+ ]))),
18
+ filters: Type.Optional(Type.Object({
19
+ status: Type.Optional(Type.Union([
20
+ Type.Literal('PENDING'),
21
+ Type.Literal('IN_PROGRESS'),
22
+ Type.Literal('COMPLETED'),
23
+ Type.Literal('ARCHIVED')
24
+ ])),
25
+ priority: Type.Optional(Type.Union([
26
+ Type.Literal('CRITICAL'),
27
+ Type.Literal('OPPORTUNITY_NOW'),
28
+ Type.Literal('OVER_THE_HORIZON'),
29
+ Type.Literal('PARKING_LOT')
30
+ ])),
31
+ projectId: Type.Optional(Type.String()),
32
+ dateFrom: Type.Optional(Type.String({ format: 'date' })),
33
+ dateTo: Type.Optional(Type.String({ format: 'date' }))
34
+ })),
35
+ limit: Type.Optional(Type.Number({ default: 20, maximum: 100 })),
36
+ offset: Type.Optional(Type.Number({ default: 0 }))
37
+ });
38
+ export async function executeSearch(client, input) {
39
+ try {
40
+ switch (input.action) {
41
+ case 'search':
42
+ return await performSearch(client, input);
43
+ default:
44
+ return errorResult(`Unknown action: ${input.action}`);
45
+ }
46
+ }
47
+ catch (error) {
48
+ if (error instanceof Error) {
49
+ return errorResult(error.message);
50
+ }
51
+ return errorResult('Unknown error occurred');
52
+ }
53
+ }
54
+ async function performSearch(client, input) {
55
+ const params = new URLSearchParams();
56
+ params.append('query', input.query);
57
+ if (input.types && input.types.length > 0) {
58
+ for (const t of input.types) {
59
+ params.append('types', t);
60
+ }
61
+ }
62
+ if (input.filters) {
63
+ if (input.filters.status)
64
+ params.append('status', input.filters.status);
65
+ if (input.filters.priority)
66
+ params.append('priority', input.filters.priority);
67
+ if (input.filters.projectId)
68
+ params.append('projectId', input.filters.projectId);
69
+ if (input.filters.dateFrom)
70
+ params.append('dateFrom', input.filters.dateFrom);
71
+ if (input.filters.dateTo)
72
+ params.append('dateTo', input.filters.dateTo);
73
+ }
74
+ if (input.limit)
75
+ params.append('limit', String(input.limit));
76
+ if (input.offset)
77
+ params.append('offset', String(input.offset));
78
+ const queryString = params.toString() ? `?${params.toString()}` : '';
79
+ const data = await client.get(`/api/v2/search${queryString}`);
80
+ return jsonResult(data);
81
+ }
82
+ export function registerSearchTool(api, client) {
83
+ api.registerTool({
84
+ id: 'myn_search',
85
+ name: 'MYN Search',
86
+ description: 'Unified search across tasks, events, notes, and memories. Action: search.',
87
+ inputSchema: SearchInputSchema,
88
+ async execute(input) {
89
+ return executeSearch(client, input);
90
+ }
91
+ });
92
+ }
93
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/tools/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * syncOnMismatch — capability sync middleware for the A2A protocol.
3
+ *
4
+ * MIN-734: openclaw-a2a-lite-v1
5
+ *
6
+ * When MYN returns `capabilityUpdatePending: true` on any A2A response it means
7
+ * the stored hash on the server side no longer matches OpenClaw's current
8
+ * capabilities. This middleware wraps every A2A fetch call and automatically
9
+ * re-sends the capability manifest whenever the flag is set.
10
+ *
11
+ * A per-key dedup guard prevents concurrent duplicate syncs from firing when
12
+ * multiple requests arrive at nearly the same time.
13
+ */
14
+ /** Shape of the A2A response body that carries the mismatch flag */
15
+ interface A2AResponseWithPending {
16
+ capabilityUpdatePending?: boolean;
17
+ [key: string]: unknown;
18
+ }
19
+ /** Minimal capability manifest shape — matches the server schema */
20
+ interface CapabilityManifest {
21
+ schemaVersion: string;
22
+ agentInfo: {
23
+ name: string;
24
+ version: string;
25
+ };
26
+ capabilities: unknown[];
27
+ }
28
+ /**
29
+ * withSyncOnMismatch — wraps an A2A fetch call with automatic capability re-sync.
30
+ *
31
+ * @param fetchFn Function that performs the A2A request and returns the parsed JSON body.
32
+ * @param mynBaseUrl MYN API base URL (e.g. https://api.mindyournow.com).
33
+ * @param agentKey Current X-Agent-Key for authenticated requests.
34
+ * @param manifest Current capability manifest to send if a mismatch is detected.
35
+ * @returns The original response from fetchFn (the sync is a side-effect).
36
+ */
37
+ export declare function withSyncOnMismatch<T extends A2AResponseWithPending>(fetchFn: () => Promise<T>, mynBaseUrl: string, agentKey: string, manifest: CapabilityManifest): Promise<T>;
38
+ /**
39
+ * checkAndSync — standalone helper to check a response and trigger a sync
40
+ * if capabilityUpdatePending is true. Use this when you already have the
41
+ * response object and want to retrofit sync behaviour without restructuring
42
+ * the call site.
43
+ */
44
+ export declare function checkAndSync(response: A2AResponseWithPending | null | undefined, mynBaseUrl: string, agentKey: string, manifest: CapabilityManifest): void;
45
+ /** Exposed for testing only — clears the dedup set between tests */
46
+ export declare function _clearInFlightSyncsForTest(): void;
47
+ export {};
48
+ //# sourceMappingURL=syncOnMismatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncOnMismatch.d.ts","sourceRoot":"","sources":["../../../src/tools/syncOnMismatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,oEAAoE;AACpE,UAAU,sBAAsB;IAC9B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,oEAAoE;AACpE,UAAU,kBAAkB;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,YAAY,EAAE,OAAO,EAAE,CAAC;CACzB;AAuDD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,SAAS,sBAAsB,EACvE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,kBAAkB,GAC3B,OAAO,CAAC,CAAC,CAAC,CAWZ;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,sBAAsB,GAAG,IAAI,GAAG,SAAS,EACnD,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,kBAAkB,GAC3B,IAAI,CAMN;AAED,oEAAoE;AACpE,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * syncOnMismatch — capability sync middleware for the A2A protocol.
3
+ *
4
+ * MIN-734: openclaw-a2a-lite-v1
5
+ *
6
+ * When MYN returns `capabilityUpdatePending: true` on any A2A response it means
7
+ * the stored hash on the server side no longer matches OpenClaw's current
8
+ * capabilities. This middleware wraps every A2A fetch call and automatically
9
+ * re-sends the capability manifest whenever the flag is set.
10
+ *
11
+ * A per-key dedup guard prevents concurrent duplicate syncs from firing when
12
+ * multiple requests arrive at nearly the same time.
13
+ */
14
+ import { computeCapabilityHash } from './capabilityHash.js';
15
+ /**
16
+ * In-flight dedup set: tracks `${agentKey}@${base}` to avoid sending duplicate
17
+ * capability syncs when multiple A2A responses with capabilityUpdatePending=true
18
+ * arrive before the first sync completes.
19
+ */
20
+ const inFlightSyncs = new Set();
21
+ /**
22
+ * sendCapabilityUpdate — POST the current capability manifest to MYN.
23
+ * Called automatically by syncOnMismatch when capabilityUpdatePending is true.
24
+ */
25
+ async function sendCapabilityUpdate(mynBaseUrl, agentKey, manifest) {
26
+ const base = mynBaseUrl.replace(/\/$/, '');
27
+ const dedupKey = `${agentKey}@${base}`;
28
+ if (inFlightSyncs.has(dedupKey)) {
29
+ return; // already syncing — skip duplicate
30
+ }
31
+ inFlightSyncs.add(dedupKey);
32
+ try {
33
+ const capabilityHash = computeCapabilityHash(manifest);
34
+ const body = {
35
+ from: manifest.agentInfo.name,
36
+ intent: 'briefing',
37
+ meta: { type: 'capability-update' },
38
+ capabilityHash,
39
+ capabilityManifest: manifest,
40
+ };
41
+ const response = await fetch(`${base}/a2a/message`, {
42
+ method: 'POST',
43
+ headers: {
44
+ 'Content-Type': 'application/json',
45
+ 'X-Agent-Key': agentKey,
46
+ },
47
+ body: JSON.stringify(body),
48
+ });
49
+ if (!response.ok) {
50
+ const text = await response.text().catch(() => response.statusText);
51
+ throw new Error(`Capability sync failed: HTTP ${response.status}: ${text}`);
52
+ }
53
+ }
54
+ finally {
55
+ inFlightSyncs.delete(dedupKey);
56
+ }
57
+ }
58
+ /**
59
+ * withSyncOnMismatch — wraps an A2A fetch call with automatic capability re-sync.
60
+ *
61
+ * @param fetchFn Function that performs the A2A request and returns the parsed JSON body.
62
+ * @param mynBaseUrl MYN API base URL (e.g. https://api.mindyournow.com).
63
+ * @param agentKey Current X-Agent-Key for authenticated requests.
64
+ * @param manifest Current capability manifest to send if a mismatch is detected.
65
+ * @returns The original response from fetchFn (the sync is a side-effect).
66
+ */
67
+ export async function withSyncOnMismatch(fetchFn, mynBaseUrl, agentKey, manifest) {
68
+ const result = await fetchFn();
69
+ if (result?.capabilityUpdatePending === true) {
70
+ // Fire-and-forget: don't block the caller on the sync
71
+ sendCapabilityUpdate(mynBaseUrl, agentKey, manifest).catch((err) => {
72
+ console.warn('[syncOnMismatch] Capability sync failed:', err?.message ?? err);
73
+ });
74
+ }
75
+ return result;
76
+ }
77
+ /**
78
+ * checkAndSync — standalone helper to check a response and trigger a sync
79
+ * if capabilityUpdatePending is true. Use this when you already have the
80
+ * response object and want to retrofit sync behaviour without restructuring
81
+ * the call site.
82
+ */
83
+ export function checkAndSync(response, mynBaseUrl, agentKey, manifest) {
84
+ if (response?.capabilityUpdatePending === true) {
85
+ sendCapabilityUpdate(mynBaseUrl, agentKey, manifest).catch((err) => {
86
+ console.warn('[syncOnMismatch] Capability sync failed:', err?.message ?? err);
87
+ });
88
+ }
89
+ }
90
+ /** Exposed for testing only — clears the dedup set between tests */
91
+ export function _clearInFlightSyncsForTest() {
92
+ inFlightSyncs.clear();
93
+ }
94
+ //# sourceMappingURL=syncOnMismatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncOnMismatch.js","sourceRoot":"","sources":["../../../src/tools/syncOnMismatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAe5D;;;;GAIG;AACH,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;AAExC;;;GAGG;AACH,KAAK,UAAU,oBAAoB,CACjC,UAAkB,EAClB,QAAgB,EAChB,QAA4B;IAE5B,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;IAEvC,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,mCAAmC;IAC7C,CAAC;IAED,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAEvD,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI;YAC7B,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE;YACnC,cAAc;YACd,kBAAkB,EAAE,QAAQ;SAC7B,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,cAAc,EAAE;YAClD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,QAAQ;aACxB;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;YAAS,CAAC;QACT,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAyB,EACzB,UAAkB,EAClB,QAAgB,EAChB,QAA4B;IAE5B,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;IAE/B,IAAI,MAAM,EAAE,uBAAuB,KAAK,IAAI,EAAE,CAAC;QAC7C,sDAAsD;QACtD,oBAAoB,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACjE,OAAO,CAAC,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAC1B,QAAmD,EACnD,UAAkB,EAClB,QAAgB,EAChB,QAA4B;IAE5B,IAAI,QAAQ,EAAE,uBAAuB,KAAK,IAAI,EAAE,CAAC;QAC/C,oBAAoB,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACjE,OAAO,CAAC,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,0BAA0B;IACxC,aAAa,CAAC,KAAK,EAAE,CAAC;AACxB,CAAC"}