@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,95 @@
1
+ /**
2
+ * MYN API Client
3
+ * Shared HTTP client for all MYN tools with X-API-KEY authentication
4
+ */
5
+ export class MynApiClient {
6
+ baseUrl;
7
+ apiKey;
8
+ constructor(baseUrl, apiKey) {
9
+ this.baseUrl = baseUrl.replace(/\/$/, ''); // Remove trailing slash
10
+ this.apiKey = apiKey;
11
+ }
12
+ async request(method, path, body) {
13
+ const url = `${this.baseUrl}${path}`;
14
+ const headers = {
15
+ 'X-API-KEY': this.apiKey,
16
+ 'Content-Type': 'application/json',
17
+ 'Accept': 'application/json'
18
+ };
19
+ const fetchOptions = {
20
+ method,
21
+ headers
22
+ };
23
+ if (body !== undefined && method !== 'GET') {
24
+ fetchOptions.body = JSON.stringify(body);
25
+ }
26
+ let response;
27
+ try {
28
+ response = await fetch(url, fetchOptions);
29
+ }
30
+ catch (error) {
31
+ throw new MynApiError(`Network error: ${error instanceof Error ? error.message : String(error)}`, 0);
32
+ }
33
+ // Handle 204 No Content
34
+ if (response.status === 204) {
35
+ return undefined;
36
+ }
37
+ // Handle error responses
38
+ if (!response.ok) {
39
+ let errorBody;
40
+ try {
41
+ errorBody = await response.text();
42
+ }
43
+ catch {
44
+ errorBody = 'Unable to read error response';
45
+ }
46
+ throw new MynApiError(`HTTP ${response.status}: ${errorBody || response.statusText}`, response.status, errorBody);
47
+ }
48
+ // Parse JSON response
49
+ try {
50
+ return await response.json();
51
+ }
52
+ catch (error) {
53
+ // Handle non-JSON success responses
54
+ return undefined;
55
+ }
56
+ }
57
+ async get(path) {
58
+ return this.request('GET', path);
59
+ }
60
+ async post(path, body) {
61
+ return this.request('POST', path, body);
62
+ }
63
+ async put(path, body) {
64
+ return this.request('PUT', path, body);
65
+ }
66
+ async patch(path, body) {
67
+ return this.request('PATCH', path, body);
68
+ }
69
+ async delete(path) {
70
+ return this.request('DELETE', path);
71
+ }
72
+ }
73
+ export class MynApiError extends Error {
74
+ statusCode;
75
+ responseBody;
76
+ constructor(message, statusCode, responseBody) {
77
+ super(message);
78
+ this.statusCode = statusCode;
79
+ this.responseBody = responseBody;
80
+ this.name = 'MynApiError';
81
+ }
82
+ }
83
+ /**
84
+ * Helper to create a standardized tool result
85
+ */
86
+ export function jsonResult(data) {
87
+ return { success: true, data };
88
+ }
89
+ /**
90
+ * Helper to create a standardized error result
91
+ */
92
+ export function errorResult(message, details) {
93
+ return { success: false, error: message, details };
94
+ }
95
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * myn_briefing tool - Compass briefing generation and corrections
3
+ */
4
+ import type { MynApiClient } from '../client.js';
5
+ export declare const BriefingInputSchema: import("@sinclair/typebox").TObject<{
6
+ action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"status">, import("@sinclair/typebox").TLiteral<"generate">, import("@sinclair/typebox").TLiteral<"get">, import("@sinclair/typebox").TLiteral<"apply_correction">, import("@sinclair/typebox").TLiteral<"complete_session">]>;
7
+ context: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
8
+ focusAreas: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
9
+ briefingId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
10
+ correctionId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
11
+ correctionType: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"TASK_COMPLETED">, import("@sinclair/typebox").TLiteral<"TASK_MISSED">, import("@sinclair/typebox").TLiteral<"TASK_RESCHEDULED">, import("@sinclair/typebox").TLiteral<"TASK_ADDED">, import("@sinclair/typebox").TLiteral<"PRIORITY_CHANGED">, import("@sinclair/typebox").TLiteral<"OTHER">]>>;
12
+ correctionData: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
13
+ reason: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
14
+ sessionSummary: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
15
+ decisions: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
16
+ }>;
17
+ export type BriefingInput = typeof BriefingInputSchema.static;
18
+ export declare function executeBriefing(client: MynApiClient, input: BriefingInput): Promise<{
19
+ success: true;
20
+ data: unknown;
21
+ } | {
22
+ success: false;
23
+ error: string;
24
+ details?: unknown;
25
+ }>;
26
+ export declare function registerBriefingTool(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=briefing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"briefing.d.ts","sourceRoot":"","sources":["../../../src/tools/briefing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,eAAO,MAAM,mBAAmB;;;;;;;;;;;EA4B9B,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,CAsBlG;AAiFD,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,116 @@
1
+ /**
2
+ * myn_briefing tool - Compass briefing generation and corrections
3
+ */
4
+ import { Type } from '@sinclair/typebox';
5
+ import { jsonResult, errorResult } from '../client.js';
6
+ export const BriefingInputSchema = Type.Object({
7
+ action: Type.Union([
8
+ Type.Literal('status'),
9
+ Type.Literal('generate'),
10
+ Type.Literal('get'),
11
+ Type.Literal('apply_correction'),
12
+ Type.Literal('complete_session')
13
+ ]),
14
+ // generate parameters
15
+ context: Type.Optional(Type.String({ description: 'Additional context for briefing generation' })),
16
+ focusAreas: Type.Optional(Type.Array(Type.String())),
17
+ // get parameters
18
+ briefingId: Type.Optional(Type.String({ format: 'uuid' })),
19
+ // apply_correction parameters
20
+ correctionId: Type.Optional(Type.String({ format: 'uuid' })),
21
+ correctionType: Type.Optional(Type.Union([
22
+ Type.Literal('TASK_COMPLETED'),
23
+ Type.Literal('TASK_MISSED'),
24
+ Type.Literal('TASK_RESCHEDULED'),
25
+ Type.Literal('TASK_ADDED'),
26
+ Type.Literal('PRIORITY_CHANGED'),
27
+ Type.Literal('OTHER')
28
+ ])),
29
+ correctionData: Type.Optional(Type.Record(Type.String(), Type.Unknown())),
30
+ reason: Type.Optional(Type.String()),
31
+ // complete_session parameters
32
+ sessionSummary: Type.Optional(Type.String()),
33
+ decisions: Type.Optional(Type.Array(Type.String()))
34
+ });
35
+ export async function executeBriefing(client, input) {
36
+ try {
37
+ switch (input.action) {
38
+ case 'status':
39
+ return await getBriefingStatus(client);
40
+ case 'generate':
41
+ return await generateBriefing(client, input);
42
+ case 'get':
43
+ return await getBriefing(client, input);
44
+ case 'apply_correction':
45
+ return await applyCorrection(client, input);
46
+ case 'complete_session':
47
+ return await completeSession(client, input);
48
+ default:
49
+ return errorResult(`Unknown action: ${input.action}`);
50
+ }
51
+ }
52
+ catch (error) {
53
+ if (error instanceof Error) {
54
+ return errorResult(error.message);
55
+ }
56
+ return errorResult('Unknown error occurred');
57
+ }
58
+ }
59
+ async function getBriefingStatus(client) {
60
+ const data = await client.get('/api/v2/compass/status');
61
+ return jsonResult(data);
62
+ }
63
+ async function generateBriefing(client, input) {
64
+ const body = {};
65
+ if (input.context)
66
+ body.context = input.context;
67
+ if (input.focusAreas && input.focusAreas.length > 0)
68
+ body.focusAreas = input.focusAreas;
69
+ const data = await client.post('/api/v2/compass/generate', body);
70
+ return jsonResult(data);
71
+ }
72
+ async function getBriefing(client, input) {
73
+ if (!input.briefingId) {
74
+ // Get the latest briefing if no ID provided
75
+ const data = await client.get('/api/v2/compass/current');
76
+ return jsonResult(data);
77
+ }
78
+ // No per-ID endpoint exists; use /current for the active briefing or /history for past ones
79
+ const data = await client.get('/api/v2/compass/current');
80
+ return jsonResult(data);
81
+ }
82
+ async function applyCorrection(client, input) {
83
+ if (!input.correctionType) {
84
+ return errorResult('correctionType is required for apply_correction action');
85
+ }
86
+ const body = {
87
+ type: input.correctionType
88
+ };
89
+ if (input.correctionData)
90
+ body.data = input.correctionData;
91
+ if (input.reason)
92
+ body.reason = input.reason;
93
+ const data = await client.post('/api/v2/compass/corrections/apply', body);
94
+ return jsonResult(data);
95
+ }
96
+ async function completeSession(client, input) {
97
+ const body = {};
98
+ if (input.sessionSummary)
99
+ body.summary = input.sessionSummary;
100
+ if (input.decisions)
101
+ body.decisions = input.decisions;
102
+ const data = await client.post('/api/v2/compass/complete', body);
103
+ return jsonResult(data);
104
+ }
105
+ export function registerBriefingTool(api, client) {
106
+ api.registerTool({
107
+ id: 'myn_briefing',
108
+ name: 'MYN Briefing',
109
+ description: 'Generate and manage Compass briefings. Actions: status, generate, get, apply_correction, complete_session.',
110
+ inputSchema: BriefingInputSchema,
111
+ async execute(input) {
112
+ return executeBriefing(client, input);
113
+ }
114
+ });
115
+ }
116
+ //# sourceMappingURL=briefing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"briefing.js","sourceRoot":"","sources":["../../../src/tools/briefing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * myn_calendar tool - Calendar events and meetings
3
+ */
4
+ import type { MynApiClient } from '../client.js';
5
+ export declare const CalendarInputSchema: import("@sinclair/typebox").TObject<{
6
+ action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"list_events">, import("@sinclair/typebox").TLiteral<"create_event">, import("@sinclair/typebox").TLiteral<"delete_event">, import("@sinclair/typebox").TLiteral<"meetings">]>;
7
+ startDate: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
8
+ endDate: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
9
+ calendarId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
10
+ includeAllDay: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
11
+ limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
12
+ title: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
13
+ description: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
14
+ startTime: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
15
+ endTime: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
16
+ isAllDay: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
17
+ location: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
18
+ attendees: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
19
+ recurrence: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
20
+ reminders: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
21
+ minutes: import("@sinclair/typebox").TNumber;
22
+ method: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"popup">, import("@sinclair/typebox").TLiteral<"email">]>;
23
+ }>>>;
24
+ timezone: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
25
+ eventId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
26
+ includePast: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
27
+ daysAhead: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
28
+ }>;
29
+ export type CalendarInput = typeof CalendarInputSchema.static;
30
+ export declare function executeCalendar(client: MynApiClient, input: CalendarInput): Promise<{
31
+ success: true;
32
+ data: unknown;
33
+ } | {
34
+ success: false;
35
+ error: string;
36
+ details?: unknown;
37
+ }>;
38
+ export declare function registerCalendarTool(api: OpenClawPluginApi, client: MynApiClient): void;
39
+ interface OpenClawPluginApi {
40
+ registerTool(tool: {
41
+ id: string;
42
+ name: string;
43
+ description: string;
44
+ inputSchema: unknown;
45
+ execute: (input: unknown) => Promise<unknown>;
46
+ }): void;
47
+ logger: {
48
+ debug(message: string): void;
49
+ info(message: string): void;
50
+ warn(message: string): void;
51
+ error(message: string): void;
52
+ };
53
+ pluginConfig?: Record<string, unknown>;
54
+ }
55
+ export {};
56
+ //# sourceMappingURL=calendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../../src/tools/calendar.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;EAiC9B,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;AAmJD,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,206 @@
1
+ /**
2
+ * myn_calendar tool - Calendar events and meetings
3
+ */
4
+ import { Type } from '@sinclair/typebox';
5
+ import { jsonResult, errorResult } from '../client.js';
6
+ export const CalendarInputSchema = Type.Object({
7
+ action: Type.Union([
8
+ Type.Literal('list_events'),
9
+ Type.Literal('create_event'),
10
+ Type.Literal('delete_event'),
11
+ Type.Literal('meetings')
12
+ ]),
13
+ // list_events parameters
14
+ startDate: Type.Optional(Type.String({ format: 'date-time' })),
15
+ endDate: Type.Optional(Type.String({ format: 'date-time' })),
16
+ calendarId: Type.Optional(Type.String()),
17
+ includeAllDay: Type.Optional(Type.Boolean({ default: true })),
18
+ limit: Type.Optional(Type.Number({ default: 50 })),
19
+ // create_event parameters — startTime must be ISO 8601 (e.g. "2026-03-08T16:30:00")
20
+ title: Type.Optional(Type.String({ minLength: 1, maxLength: 200 })),
21
+ description: Type.Optional(Type.String({ maxLength: 2000 })),
22
+ startTime: Type.Optional(Type.String({ format: 'date-time' })),
23
+ endTime: Type.Optional(Type.String({ format: 'date-time' })),
24
+ isAllDay: Type.Optional(Type.Boolean({ default: false })),
25
+ location: Type.Optional(Type.String()),
26
+ // attendees: email addresses OR first names of household members (resolved automatically)
27
+ attendees: Type.Optional(Type.Array(Type.String())),
28
+ recurrence: Type.Optional(Type.String()), // RRULE format
29
+ reminders: Type.Optional(Type.Array(Type.Object({
30
+ minutes: Type.Number(),
31
+ method: Type.Union([Type.Literal('popup'), Type.Literal('email')])
32
+ }))),
33
+ timezone: Type.Optional(Type.String()), // e.g. "America/New_York"
34
+ // delete_event parameters
35
+ eventId: Type.Optional(Type.String()),
36
+ // meetings parameters
37
+ includePast: Type.Optional(Type.Boolean({ default: false })),
38
+ daysAhead: Type.Optional(Type.Number({ default: 7 }))
39
+ });
40
+ export async function executeCalendar(client, input) {
41
+ try {
42
+ switch (input.action) {
43
+ case 'list_events':
44
+ return await listEvents(client, input);
45
+ case 'create_event':
46
+ return await createEvent(client, input);
47
+ case 'delete_event':
48
+ return await deleteEvent(client, input);
49
+ case 'meetings':
50
+ return await getMeetings(client, input);
51
+ default:
52
+ return errorResult(`Unknown action: ${input.action}`);
53
+ }
54
+ }
55
+ catch (error) {
56
+ if (error instanceof Error) {
57
+ return errorResult(error.message);
58
+ }
59
+ return errorResult('Unknown error occurred');
60
+ }
61
+ }
62
+ async function listEvents(client, input) {
63
+ const params = new URLSearchParams();
64
+ if (input.startDate)
65
+ params.append('start', input.startDate);
66
+ if (input.endDate)
67
+ params.append('end', input.endDate);
68
+ if (input.calendarId)
69
+ params.append('calendarId', input.calendarId);
70
+ if (input.includeAllDay !== undefined)
71
+ params.append('allDay', input.includeAllDay.toString());
72
+ if (input.limit)
73
+ params.append('limit', input.limit.toString());
74
+ const queryString = params.toString() ? `?${params.toString()}` : '';
75
+ const data = await client.get(`/api/v2/calendar/events${queryString}`);
76
+ return jsonResult(data);
77
+ }
78
+ /**
79
+ * Normalize a time value to ISO 8601 datetime.
80
+ * Handles cases where the LLM passes a bare time like "16:30" alongside a startDate.
81
+ */
82
+ function toIsoDateTime(time, date) {
83
+ // Already a full datetime (has 'T' separator or full date prefix like "2026-")
84
+ if (time.includes('T') || /^\d{4}-\d{2}-\d{2}/.test(time)) {
85
+ return time;
86
+ }
87
+ // Bare time like "16:30" or "16:30:00" — combine with the provided date
88
+ if (date && /^\d{2}:\d{2}/.test(time)) {
89
+ const normalizedDate = date.length >= 10 ? date.substring(0, 10) : date;
90
+ const normalizedTime = /^\d{2}:\d{2}$/.test(time) ? `${time}:00` : time;
91
+ return `${normalizedDate}T${normalizedTime}`;
92
+ }
93
+ return time;
94
+ }
95
+ /**
96
+ * Resolve attendee strings to email addresses.
97
+ * Items containing '@' are used as-is; everything else is looked up in household members by name.
98
+ */
99
+ async function resolveAttendeesToEmails(client, attendees) {
100
+ const emails = [];
101
+ const namesToResolve = [];
102
+ for (const attendee of attendees) {
103
+ if (attendee.includes('@')) {
104
+ emails.push(attendee);
105
+ }
106
+ else {
107
+ namesToResolve.push(attendee.toLowerCase());
108
+ }
109
+ }
110
+ if (namesToResolve.length === 0) {
111
+ return emails;
112
+ }
113
+ try {
114
+ const household = await client.get('/api/v1/households/current');
115
+ if (household?.id) {
116
+ const membersData = await client.get(`/api/v1/households/${household.id}/members`);
117
+ const members = membersData?.members ?? [];
118
+ for (const name of namesToResolve) {
119
+ const matched = members.find(m => {
120
+ const memberName = m.name.toLowerCase();
121
+ const firstName = memberName.split(' ')[0];
122
+ return memberName.includes(name) || name.includes(firstName);
123
+ });
124
+ if (matched?.email) {
125
+ emails.push(matched.email);
126
+ }
127
+ }
128
+ }
129
+ }
130
+ catch {
131
+ // Household lookup failed; proceed with email-only list
132
+ }
133
+ return emails;
134
+ }
135
+ async function createEvent(client, input) {
136
+ if (!input.title) {
137
+ return errorResult('title is required for create_event action');
138
+ }
139
+ if (!input.startTime) {
140
+ return errorResult('startTime is required for create_event action (ISO 8601 format, e.g. "2026-03-08T16:30:00")');
141
+ }
142
+ if (!input.isAllDay && !input.endTime) {
143
+ return errorResult('endTime is required for non-all-day events');
144
+ }
145
+ // Normalize datetime strings — handle bare times like "16:30" alongside a startDate
146
+ const effectiveDate = input.startDate?.substring(0, 10);
147
+ const startTime = toIsoDateTime(input.startTime, effectiveDate);
148
+ const endTime = input.endTime ? toIsoDateTime(input.endTime, effectiveDate) : undefined;
149
+ // Resolve attendees: names → emails via household members API
150
+ const resolvedAttendees = input.attendees && input.attendees.length > 0
151
+ ? await resolveAttendeesToEmails(client, input.attendees)
152
+ : undefined;
153
+ const body = {
154
+ title: input.title,
155
+ startTime,
156
+ isAllDay: input.isAllDay ?? false
157
+ };
158
+ if (!input.isAllDay && endTime)
159
+ body.endTime = endTime;
160
+ if (input.description)
161
+ body.description = input.description;
162
+ if (input.location)
163
+ body.location = input.location;
164
+ if (input.calendarId)
165
+ body.calendarId = input.calendarId;
166
+ if (input.timezone)
167
+ body.timezone = input.timezone;
168
+ if (resolvedAttendees && resolvedAttendees.length > 0)
169
+ body.attendees = resolvedAttendees;
170
+ if (input.recurrence)
171
+ body.recurrence = input.recurrence;
172
+ const data = await client.post('/api/v2/calendar/standalone-events', body);
173
+ return jsonResult(data);
174
+ }
175
+ async function deleteEvent(client, input) {
176
+ if (!input.eventId) {
177
+ return errorResult('eventId is required for delete_event action');
178
+ }
179
+ await client.delete(`/api/v2/calendar/events/${input.eventId}`);
180
+ return jsonResult({ deleted: true, eventId: input.eventId });
181
+ }
182
+ async function getMeetings(client, input) {
183
+ const params = new URLSearchParams();
184
+ if (input.includePast)
185
+ params.append('includePast', 'true');
186
+ if (input.daysAhead)
187
+ params.append('daysAhead', input.daysAhead.toString());
188
+ if (input.limit)
189
+ params.append('limit', input.limit.toString());
190
+ const queryString = params.toString() ? `?${params.toString()}` : '';
191
+ // No dedicated meetings list endpoint — use events endpoint
192
+ const data = await client.get(`/api/v2/calendar/events${queryString}`);
193
+ return jsonResult(data);
194
+ }
195
+ export function registerCalendarTool(api, client) {
196
+ api.registerTool({
197
+ id: 'myn_calendar',
198
+ name: 'MYN Calendar',
199
+ description: 'Manage calendar events and meetings. Actions: list_events, create_event, delete_event, meetings. For create_event: startTime must be ISO 8601 (e.g. "2026-03-08T16:30:00"). Attendees can be email addresses or household member first names.',
200
+ inputSchema: CalendarInputSchema,
201
+ async execute(input) {
202
+ return executeCalendar(client, input);
203
+ }
204
+ });
205
+ }
206
+ //# sourceMappingURL=calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../../src/tools/calendar.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC7C,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;QACjB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;QAC3B,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;KACzB,CAAC;IACF,yBAAyB;IACzB,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAC9D,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5D,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACxC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAClD,oFAAoF;IACpF,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IACnE,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAC9D,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5D,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACtC,0FAA0F;IAC1F,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACnD,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,eAAe;IACzD,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;QAC9C,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE;QACtB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;KACnE,CAAC,CAAC,CAAC;IACJ,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,0BAA0B;IAClE,0BAA0B;IAC1B,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACrC,sBAAsB;IACtB,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5D,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;CACtD,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAoB,EACpB,KAAoB;IAEpB,IAAI,CAAC;QACH,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;YACrB,KAAK,aAAa;gBAChB,OAAO,MAAM,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzC,KAAK,cAAc;gBACjB,OAAO,MAAM,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC1C,KAAK,cAAc;gBACjB,OAAO,MAAM,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC1C,KAAK,UAAU;gBACb,OAAO,MAAM,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC1C;gBACE,OAAO,WAAW,CAAC,mBAAoB,KAA4B,CAAC,MAAM,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,WAAW,CAAC,wBAAwB,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,MAAoB,EAAE,KAAoB;IAClE,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IAErC,IAAI,KAAK,CAAC,SAAS;QAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7D,IAAI,KAAK,CAAC,OAAO;QAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,KAAK,CAAC,UAAU;QAAE,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACpE,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS;QAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/F,IAAI,KAAK,CAAC,KAAK;QAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEhE,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAG1B,0BAA0B,WAAW,EAAE,CAAC,CAAC;IAC5C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,IAAY,EAAE,IAAa;IAChD,+EAA+E;IAC/E,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,wEAAwE;IACxE,IAAI,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACxE,MAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACxE,OAAO,GAAG,cAAc,IAAI,cAAc,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,wBAAwB,CACrC,MAAoB,EACpB,SAAmB;IAEnB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,GAAG,CAAiB,4BAA4B,CAAC,CAAC;QACjF,IAAI,SAAS,EAAE,EAAE,EAAE,CAAC;YAClB,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,GAAG,CAEjC,sBAAsB,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC;YAEjD,MAAM,OAAO,GAAG,WAAW,EAAE,OAAO,IAAI,EAAE,CAAC;YAC3C,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;gBAClC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;oBAC/B,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;oBACxC,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC3C,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAC/D,CAAC,CAAC,CAAC;gBACH,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;oBACnB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wDAAwD;IAC1D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAoB,EAAE,KAAoB;IACnE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,WAAW,CAAC,2CAA2C,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,WAAW,CAAC,6FAA6F,CAAC,CAAC;IACpH,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACtC,OAAO,WAAW,CAAC,4CAA4C,CAAC,CAAC;IACnE,CAAC;IAED,oFAAoF;IACpF,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAExF,8DAA8D;IAC9D,MAAM,iBAAiB,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QACrE,CAAC,CAAC,MAAM,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC;QACzD,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,IAAI,GAA4B;QACpC,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,SAAS;QACT,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK;KAClC,CAAC;IAEF,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,OAAO;QAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACvD,IAAI,KAAK,CAAC,WAAW;QAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;IAC5D,IAAI,KAAK,CAAC,QAAQ;QAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IACnD,IAAI,KAAK,CAAC,UAAU;QAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACzD,IAAI,KAAK,CAAC,QAAQ;QAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IACnD,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,SAAS,GAAG,iBAAiB,CAAC;IAC1F,IAAI,KAAK,CAAC,UAAU;QAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IAEzD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAU,oCAAoC,EAAE,IAAI,CAAC,CAAC;IACpF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAoB,EAAE,KAAoB;IACnE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,WAAW,CAAC,6CAA6C,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,MAAM,CAAC,MAAM,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAChE,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAoB,EAAE,KAAoB;IACnE,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IAErC,IAAI,KAAK,CAAC,WAAW;QAAE,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,SAAS;QAAE,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5E,IAAI,KAAK,CAAC,KAAK;QAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEhE,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,4DAA4D;IAC5D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAU,0BAA0B,WAAW,EAAE,CAAC,CAAC;IAChF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAsB,EAAE,MAAoB;IAC/E,GAAG,CAAC,YAAY,CAAC;QACf,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,+OAA+O;QAC5P,WAAW,EAAE,mBAAmB;QAChC,KAAK,CAAC,OAAO,CAAC,KAAc;YAC1B,OAAO,eAAe,CAAC,MAAM,EAAE,KAAsB,CAAC,CAAC;QACzD,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * MIN-734: Deterministic capability manifest hash computation.
3
+ *
4
+ * Matches the server-side CapabilityHashService.java implementation:
5
+ * - Deep-sort all object keys alphabetically (recursive)
6
+ * - Serialize to JSON string
7
+ * - SHA-256 hex digest
8
+ *
9
+ * Uses the same approach as fast-json-stable-stringify for cross-platform consistency.
10
+ */
11
+ /**
12
+ * Compute a deterministic SHA-256 hash of a capability manifest.
13
+ *
14
+ * @param manifest - The capability manifest object (any structure)
15
+ * @returns lowercase hex SHA-256 string
16
+ *
17
+ * @example
18
+ * const hash = computeCapabilityHash({
19
+ * schemaVersion: '1.0',
20
+ * capabilities: [{ id: 'web-search', name: 'Web Search' }],
21
+ * agentInfo: { name: 'my-agent', version: '1.0.0' },
22
+ * });
23
+ * // => "a3f2...c8d1" (64 hex chars)
24
+ */
25
+ export declare function computeCapabilityHash(manifest: unknown): string;
26
+ //# sourceMappingURL=capabilityHash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilityHash.d.ts","sourceRoot":"","sources":["../../../src/tools/capabilityHash.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAsBH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAI/D"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * MIN-734: Deterministic capability manifest hash computation.
3
+ *
4
+ * Matches the server-side CapabilityHashService.java implementation:
5
+ * - Deep-sort all object keys alphabetically (recursive)
6
+ * - Serialize to JSON string
7
+ * - SHA-256 hex digest
8
+ *
9
+ * Uses the same approach as fast-json-stable-stringify for cross-platform consistency.
10
+ */
11
+ import { createHash } from 'crypto';
12
+ /**
13
+ * Deep-sort an object's keys alphabetically (recursive).
14
+ * Arrays are left in their natural order; only object keys are sorted.
15
+ */
16
+ function deepSortKeys(value) {
17
+ if (Array.isArray(value)) {
18
+ return value.map(deepSortKeys);
19
+ }
20
+ if (value !== null && typeof value === 'object') {
21
+ const sorted = {};
22
+ for (const key of Object.keys(value).sort()) {
23
+ sorted[key] = deepSortKeys(value[key]);
24
+ }
25
+ return sorted;
26
+ }
27
+ return value;
28
+ }
29
+ /**
30
+ * Compute a deterministic SHA-256 hash of a capability manifest.
31
+ *
32
+ * @param manifest - The capability manifest object (any structure)
33
+ * @returns lowercase hex SHA-256 string
34
+ *
35
+ * @example
36
+ * const hash = computeCapabilityHash({
37
+ * schemaVersion: '1.0',
38
+ * capabilities: [{ id: 'web-search', name: 'Web Search' }],
39
+ * agentInfo: { name: 'my-agent', version: '1.0.0' },
40
+ * });
41
+ * // => "a3f2...c8d1" (64 hex chars)
42
+ */
43
+ export function computeCapabilityHash(manifest) {
44
+ const sorted = deepSortKeys(manifest);
45
+ const json = JSON.stringify(sorted);
46
+ return createHash('sha256').update(json, 'utf8').digest('hex');
47
+ }
48
+ //# sourceMappingURL=capabilityHash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilityHash.js","sourceRoot":"","sources":["../../../src/tools/capabilityHash.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;;GAGG;AACH,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACvE,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAE,KAAiC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAiB;IACrD,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC"}