@elizaos/plugin-simple-views 2.0.3-beta.5 → 2.0.3-beta.6

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/dist/storage.d.ts CHANGED
@@ -25,6 +25,7 @@ export declare const SIMPLE_VIEWS_EVENT = "eliza:simple-views:update";
25
25
  export declare const NOTES_KEY = "eliza.simpleViews.notes.v2";
26
26
  export declare const CALENDAR_EVENTS_KEY = "eliza.simpleViews.calendar.events.v2";
27
27
  export declare const CALENDAR_CURSOR_KEY = "eliza.simpleViews.calendar.cursor.v2";
28
+ export declare function clearSimpleViewsStorageForTests(): void;
28
29
  export declare function normalizeColor(value: unknown): StickyColor;
29
30
  export declare function readNotes(): StickyNote[];
30
31
  export declare function writeNotes(notes: StickyNote[]): void;
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,kBAAkB,8BAA8B,CAAC;AAC9D,eAAO,MAAM,SAAS,+BAA+B,CAAC;AACtD,eAAO,MAAM,mBAAmB,yCAAyC,CAAC;AAC1E,eAAO,MAAM,mBAAmB,yCAAyC,CAAC;AA0F1E,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAS1D;AAmCD,wBAAgB,SAAS,IAAI,UAAU,EAAE,CAExC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,CAEpD;AAED,wBAAgB,UAAU,IAAI,mBAAmB,EAAE,CAElD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAE/D;AAED,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ7C;AAED,wBAAgB,YAAY,CAAC,IAAI,OAAa,GAAG,MAAM,CAEtD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAqB9D;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,wBAAgB,mBAAmB,IAAI,mBAAmB,CAMzD;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,GAAE;IAAE,wBAAwB,CAAC,EAAE,OAAO,CAAA;CAAO,GACnD,IAAI,CAcN;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,mBAAmB,CAO9B"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,kBAAkB,8BAA8B,CAAC;AAC9D,eAAO,MAAM,SAAS,+BAA+B,CAAC;AACtD,eAAO,MAAM,mBAAmB,yCAAyC,CAAC;AAC1E,eAAO,MAAM,mBAAmB,yCAAyC,CAAC;AAQ1E,wBAAgB,+BAA+B,IAAI,IAAI,CAUtD;AAoFD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAS1D;AAmCD,wBAAgB,SAAS,IAAI,UAAU,EAAE,CAExC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,CAEpD;AAED,wBAAgB,UAAU,IAAI,mBAAmB,EAAE,CAElD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAE/D;AAED,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ7C;AAED,wBAAgB,YAAY,CAAC,IAAI,OAAa,GAAG,MAAM,CAEtD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAqB9D;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,wBAAgB,mBAAmB,IAAI,mBAAmB,CAMzD;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,GAAE;IAAE,wBAAwB,CAAC,EAAE,OAAO,CAAA;CAAO,GACnD,IAAI,CAcN;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,mBAAmB,CAO9B"}
package/dist/storage.js CHANGED
@@ -7,6 +7,15 @@ const DEFAULT_EVENTS = [];
7
7
  const DATE_KEY_PATTERN = /^(\d{4})-(\d{2})-(\d{2})$/;
8
8
  const serverJsonStore = /* @__PURE__ */ new Map();
9
9
  const serverTextStore = /* @__PURE__ */ new Map();
10
+ function clearSimpleViewsStorageForTests() {
11
+ serverJsonStore.clear();
12
+ serverTextStore.clear();
13
+ const storage = browserStorage();
14
+ if (!storage) return;
15
+ storage.removeItem(NOTES_KEY);
16
+ storage.removeItem(CALENDAR_EVENTS_KEY);
17
+ storage.removeItem(CALENDAR_CURSOR_KEY);
18
+ }
10
19
  function browserStorage() {
11
20
  if (typeof window === "undefined") return null;
12
21
  try {
@@ -162,6 +171,7 @@ export {
162
171
  NOTES_KEY,
163
172
  SIMPLE_VIEWS_EVENT,
164
173
  applySimpleViewsSnapshot,
174
+ clearSimpleViewsStorageForTests,
165
175
  isSimpleViewsSnapshot,
166
176
  makeId,
167
177
  normalizeColor,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/storage.ts"],"sourcesContent":["export type StickyColor = \"yellow\" | \"green\" | \"rose\" | \"slate\";\n\nexport interface StickyNote {\n id: string;\n title: string;\n body: string;\n color: StickyColor;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface SimpleCalendarEvent {\n id: string;\n title: string;\n date: string;\n time: string;\n notes: string;\n color: StickyColor;\n createdAt: string;\n}\n\nexport interface SimpleViewsSnapshot {\n notes: StickyNote[];\n events: SimpleCalendarEvent[];\n selectedDate: string;\n}\n\nexport const SIMPLE_VIEWS_EVENT = \"eliza:simple-views:update\";\nexport const NOTES_KEY = \"eliza.simpleViews.notes.v2\";\nexport const CALENDAR_EVENTS_KEY = \"eliza.simpleViews.calendar.events.v2\";\nexport const CALENDAR_CURSOR_KEY = \"eliza.simpleViews.calendar.cursor.v2\";\n\nconst DEFAULT_NOTES: StickyNote[] = [];\nconst DEFAULT_EVENTS: SimpleCalendarEvent[] = [];\nconst DATE_KEY_PATTERN = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst serverJsonStore = new Map<string, unknown>();\nconst serverTextStore = new Map<string, string>();\n\nfunction browserStorage(): Storage | null {\n if (typeof window === \"undefined\") return null;\n try {\n return window.localStorage ?? null;\n } catch {\n return null;\n }\n}\n\nfunction emitSimpleViewsUpdate(key: string): void {\n if (typeof window === \"undefined\") return;\n window.dispatchEvent(\n new CustomEvent(SIMPLE_VIEWS_EVENT, { detail: { key } }),\n );\n}\n\nfunction readJson<T>(\n key: string,\n fallback: T,\n isValid: (value: unknown) => value is T,\n): T {\n const storage = browserStorage();\n if (!storage) {\n const value = serverJsonStore.get(key);\n return isValid(value) ? value : fallback;\n }\n\n try {\n const raw = storage.getItem(key);\n if (!raw) return fallback;\n const parsed = JSON.parse(raw) as unknown;\n return isValid(parsed) ? parsed : fallback;\n } catch {\n return fallback;\n }\n}\n\nfunction writeJson<T>(key: string, value: T): void {\n const storage = browserStorage();\n if (!storage) {\n serverJsonStore.set(key, value);\n return;\n }\n\n try {\n storage.setItem(key, JSON.stringify(value));\n emitSimpleViewsUpdate(key);\n } catch {\n // Storage can be unavailable or quota-limited; keep the UI alive.\n }\n}\n\nfunction readText(key: string, fallback: string): string {\n const storage = browserStorage();\n if (!storage) return serverTextStore.get(key) ?? fallback;\n\n try {\n return storage.getItem(key) ?? fallback;\n } catch {\n return fallback;\n }\n}\n\nfunction writeText(key: string, value: string): void {\n const storage = browserStorage();\n if (!storage) {\n serverTextStore.set(key, value);\n return;\n }\n\n try {\n storage.setItem(key, value);\n emitSimpleViewsUpdate(key);\n } catch {\n // Storage can be unavailable or quota-limited; keep the UI alive.\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function normalizeColor(value: unknown): StickyColor {\n return value === \"green\" ||\n value === \"rose\" ||\n value === \"pink\" ||\n value === \"slate\"\n ? value === \"pink\"\n ? \"rose\"\n : value\n : \"yellow\";\n}\n\nfunction isStickyNote(value: unknown): value is StickyNote {\n if (!isRecord(value)) return false;\n return (\n typeof value.id === \"string\" &&\n typeof value.title === \"string\" &&\n typeof value.body === \"string\" &&\n typeof value.createdAt === \"string\" &&\n typeof value.updatedAt === \"string\" &&\n normalizeColor(value.color) === value.color\n );\n}\n\nfunction isCalendarEvent(value: unknown): value is SimpleCalendarEvent {\n if (!isRecord(value)) return false;\n return (\n typeof value.id === \"string\" &&\n typeof value.title === \"string\" &&\n normalizeDateKey(value.date) === value.date &&\n typeof value.time === \"string\" &&\n typeof value.notes === \"string\" &&\n typeof value.createdAt === \"string\" &&\n normalizeColor(value.color) === value.color\n );\n}\n\nfunction isStickyNoteArray(value: unknown): value is StickyNote[] {\n return Array.isArray(value) && value.every(isStickyNote);\n}\n\nfunction isCalendarEventArray(value: unknown): value is SimpleCalendarEvent[] {\n return Array.isArray(value) && value.every(isCalendarEvent);\n}\n\nexport function readNotes(): StickyNote[] {\n return readJson(NOTES_KEY, DEFAULT_NOTES, isStickyNoteArray);\n}\n\nexport function writeNotes(notes: StickyNote[]): void {\n writeJson(NOTES_KEY, notes);\n}\n\nexport function readEvents(): SimpleCalendarEvent[] {\n return readJson(CALENDAR_EVENTS_KEY, DEFAULT_EVENTS, isCalendarEventArray);\n}\n\nexport function writeEvents(events: SimpleCalendarEvent[]): void {\n writeJson(CALENDAR_EVENTS_KEY, events);\n}\n\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n\nexport function makeId(prefix: string): string {\n const cryptoObject = globalThis.crypto;\n if (typeof cryptoObject?.randomUUID === \"function\") {\n return `${prefix}-${cryptoObject.randomUUID()}`;\n }\n return `${prefix}-${Date.now().toString(36)}-${Math.random()\n .toString(36)\n .slice(2, 8)}`;\n}\n\nexport function todayDateKey(date = new Date()): string {\n return date.toISOString().slice(0, 10);\n}\n\nexport function normalizeDateKey(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const match = DATE_KEY_PATTERN.exec(value.trim());\n if (!match) return null;\n\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n if (year < 1000 || month < 1 || month > 12 || day < 1 || day > 31) {\n return null;\n }\n\n const date = new Date(Date.UTC(year, month - 1, day));\n if (\n date.getUTCFullYear() !== year ||\n date.getUTCMonth() !== month - 1 ||\n date.getUTCDate() !== day\n ) {\n return null;\n }\n return date.toISOString().slice(0, 10);\n}\n\nexport function readSelectedDate(): string {\n return normalizeDateKey(readText(CALENDAR_CURSOR_KEY, \"\")) ?? todayDateKey();\n}\n\nexport function writeSelectedDate(date: string): void {\n writeText(CALENDAR_CURSOR_KEY, date);\n}\n\nexport function simpleViewsSnapshot(): SimpleViewsSnapshot {\n return {\n notes: readNotes(),\n events: readEvents(),\n selectedDate: readSelectedDate(),\n };\n}\n\nexport function applySimpleViewsSnapshot(\n snapshot: SimpleViewsSnapshot,\n options: { preserveLocalDataOnEmpty?: boolean } = {},\n): void {\n const hasLocalData = readNotes().length > 0 || readEvents().length > 0;\n if (\n options.preserveLocalDataOnEmpty &&\n hasLocalData &&\n snapshot.notes.length === 0 &&\n snapshot.events.length === 0\n ) {\n return;\n }\n\n writeNotes(snapshot.notes);\n writeEvents(snapshot.events);\n writeSelectedDate(snapshot.selectedDate);\n}\n\nexport function isSimpleViewsSnapshot(\n value: unknown,\n): value is SimpleViewsSnapshot {\n if (!isRecord(value)) return false;\n return (\n isStickyNoteArray(value.notes) &&\n isCalendarEventArray(value.events) &&\n normalizeDateKey(value.selectedDate) === value.selectedDate\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/storage.ts"],"sourcesContent":["export type StickyColor = \"yellow\" | \"green\" | \"rose\" | \"slate\";\n\nexport interface StickyNote {\n id: string;\n title: string;\n body: string;\n color: StickyColor;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface SimpleCalendarEvent {\n id: string;\n title: string;\n date: string;\n time: string;\n notes: string;\n color: StickyColor;\n createdAt: string;\n}\n\nexport interface SimpleViewsSnapshot {\n notes: StickyNote[];\n events: SimpleCalendarEvent[];\n selectedDate: string;\n}\n\nexport const SIMPLE_VIEWS_EVENT = \"eliza:simple-views:update\";\nexport const NOTES_KEY = \"eliza.simpleViews.notes.v2\";\nexport const CALENDAR_EVENTS_KEY = \"eliza.simpleViews.calendar.events.v2\";\nexport const CALENDAR_CURSOR_KEY = \"eliza.simpleViews.calendar.cursor.v2\";\n\nconst DEFAULT_NOTES: StickyNote[] = [];\nconst DEFAULT_EVENTS: SimpleCalendarEvent[] = [];\nconst DATE_KEY_PATTERN = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst serverJsonStore = new Map<string, unknown>();\nconst serverTextStore = new Map<string, string>();\n\nexport function clearSimpleViewsStorageForTests(): void {\n serverJsonStore.clear();\n serverTextStore.clear();\n\n const storage = browserStorage();\n if (!storage) return;\n\n storage.removeItem(NOTES_KEY);\n storage.removeItem(CALENDAR_EVENTS_KEY);\n storage.removeItem(CALENDAR_CURSOR_KEY);\n}\n\nfunction browserStorage(): Storage | null {\n if (typeof window === \"undefined\") return null;\n try {\n return window.localStorage ?? null;\n } catch {\n return null;\n }\n}\n\nfunction emitSimpleViewsUpdate(key: string): void {\n if (typeof window === \"undefined\") return;\n window.dispatchEvent(\n new CustomEvent(SIMPLE_VIEWS_EVENT, { detail: { key } }),\n );\n}\n\nfunction readJson<T>(\n key: string,\n fallback: T,\n isValid: (value: unknown) => value is T,\n): T {\n const storage = browserStorage();\n if (!storage) {\n const value = serverJsonStore.get(key);\n return isValid(value) ? value : fallback;\n }\n\n try {\n const raw = storage.getItem(key);\n if (!raw) return fallback;\n const parsed = JSON.parse(raw) as unknown;\n return isValid(parsed) ? parsed : fallback;\n } catch {\n return fallback;\n }\n}\n\nfunction writeJson<T>(key: string, value: T): void {\n const storage = browserStorage();\n if (!storage) {\n serverJsonStore.set(key, value);\n return;\n }\n\n try {\n storage.setItem(key, JSON.stringify(value));\n emitSimpleViewsUpdate(key);\n } catch {\n // Storage can be unavailable or quota-limited; keep the UI alive.\n }\n}\n\nfunction readText(key: string, fallback: string): string {\n const storage = browserStorage();\n if (!storage) return serverTextStore.get(key) ?? fallback;\n\n try {\n return storage.getItem(key) ?? fallback;\n } catch {\n return fallback;\n }\n}\n\nfunction writeText(key: string, value: string): void {\n const storage = browserStorage();\n if (!storage) {\n serverTextStore.set(key, value);\n return;\n }\n\n try {\n storage.setItem(key, value);\n emitSimpleViewsUpdate(key);\n } catch {\n // Storage can be unavailable or quota-limited; keep the UI alive.\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function normalizeColor(value: unknown): StickyColor {\n return value === \"green\" ||\n value === \"rose\" ||\n value === \"pink\" ||\n value === \"slate\"\n ? value === \"pink\"\n ? \"rose\"\n : value\n : \"yellow\";\n}\n\nfunction isStickyNote(value: unknown): value is StickyNote {\n if (!isRecord(value)) return false;\n return (\n typeof value.id === \"string\" &&\n typeof value.title === \"string\" &&\n typeof value.body === \"string\" &&\n typeof value.createdAt === \"string\" &&\n typeof value.updatedAt === \"string\" &&\n normalizeColor(value.color) === value.color\n );\n}\n\nfunction isCalendarEvent(value: unknown): value is SimpleCalendarEvent {\n if (!isRecord(value)) return false;\n return (\n typeof value.id === \"string\" &&\n typeof value.title === \"string\" &&\n normalizeDateKey(value.date) === value.date &&\n typeof value.time === \"string\" &&\n typeof value.notes === \"string\" &&\n typeof value.createdAt === \"string\" &&\n normalizeColor(value.color) === value.color\n );\n}\n\nfunction isStickyNoteArray(value: unknown): value is StickyNote[] {\n return Array.isArray(value) && value.every(isStickyNote);\n}\n\nfunction isCalendarEventArray(value: unknown): value is SimpleCalendarEvent[] {\n return Array.isArray(value) && value.every(isCalendarEvent);\n}\n\nexport function readNotes(): StickyNote[] {\n return readJson(NOTES_KEY, DEFAULT_NOTES, isStickyNoteArray);\n}\n\nexport function writeNotes(notes: StickyNote[]): void {\n writeJson(NOTES_KEY, notes);\n}\n\nexport function readEvents(): SimpleCalendarEvent[] {\n return readJson(CALENDAR_EVENTS_KEY, DEFAULT_EVENTS, isCalendarEventArray);\n}\n\nexport function writeEvents(events: SimpleCalendarEvent[]): void {\n writeJson(CALENDAR_EVENTS_KEY, events);\n}\n\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n\nexport function makeId(prefix: string): string {\n const cryptoObject = globalThis.crypto;\n if (typeof cryptoObject?.randomUUID === \"function\") {\n return `${prefix}-${cryptoObject.randomUUID()}`;\n }\n return `${prefix}-${Date.now().toString(36)}-${Math.random()\n .toString(36)\n .slice(2, 8)}`;\n}\n\nexport function todayDateKey(date = new Date()): string {\n return date.toISOString().slice(0, 10);\n}\n\nexport function normalizeDateKey(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const match = DATE_KEY_PATTERN.exec(value.trim());\n if (!match) return null;\n\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n if (year < 1000 || month < 1 || month > 12 || day < 1 || day > 31) {\n return null;\n }\n\n const date = new Date(Date.UTC(year, month - 1, day));\n if (\n date.getUTCFullYear() !== year ||\n date.getUTCMonth() !== month - 1 ||\n date.getUTCDate() !== day\n ) {\n return null;\n }\n return date.toISOString().slice(0, 10);\n}\n\nexport function readSelectedDate(): string {\n return normalizeDateKey(readText(CALENDAR_CURSOR_KEY, \"\")) ?? todayDateKey();\n}\n\nexport function writeSelectedDate(date: string): void {\n writeText(CALENDAR_CURSOR_KEY, date);\n}\n\nexport function simpleViewsSnapshot(): SimpleViewsSnapshot {\n return {\n notes: readNotes(),\n events: readEvents(),\n selectedDate: readSelectedDate(),\n };\n}\n\nexport function applySimpleViewsSnapshot(\n snapshot: SimpleViewsSnapshot,\n options: { preserveLocalDataOnEmpty?: boolean } = {},\n): void {\n const hasLocalData = readNotes().length > 0 || readEvents().length > 0;\n if (\n options.preserveLocalDataOnEmpty &&\n hasLocalData &&\n snapshot.notes.length === 0 &&\n snapshot.events.length === 0\n ) {\n return;\n }\n\n writeNotes(snapshot.notes);\n writeEvents(snapshot.events);\n writeSelectedDate(snapshot.selectedDate);\n}\n\nexport function isSimpleViewsSnapshot(\n value: unknown,\n): value is SimpleViewsSnapshot {\n if (!isRecord(value)) return false;\n return (\n isStickyNoteArray(value.notes) &&\n isCalendarEventArray(value.events) &&\n normalizeDateKey(value.selectedDate) === value.selectedDate\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.js","names":[],"sources":["../../src/storage.ts","../../src/simple-views.interact.ts","../../src/ui.tsx"],"sourcesContent":["export type StickyColor = \"yellow\" | \"green\" | \"rose\" | \"slate\";\n\nexport interface StickyNote {\n id: string;\n title: string;\n body: string;\n color: StickyColor;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface SimpleCalendarEvent {\n id: string;\n title: string;\n date: string;\n time: string;\n notes: string;\n color: StickyColor;\n createdAt: string;\n}\n\nexport interface SimpleViewsSnapshot {\n notes: StickyNote[];\n events: SimpleCalendarEvent[];\n selectedDate: string;\n}\n\nexport const SIMPLE_VIEWS_EVENT = \"eliza:simple-views:update\";\nexport const NOTES_KEY = \"eliza.simpleViews.notes.v2\";\nexport const CALENDAR_EVENTS_KEY = \"eliza.simpleViews.calendar.events.v2\";\nexport const CALENDAR_CURSOR_KEY = \"eliza.simpleViews.calendar.cursor.v2\";\n\nconst DEFAULT_NOTES: StickyNote[] = [];\nconst DEFAULT_EVENTS: SimpleCalendarEvent[] = [];\nconst DATE_KEY_PATTERN = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst serverJsonStore = new Map<string, unknown>();\nconst serverTextStore = new Map<string, string>();\n\nfunction browserStorage(): Storage | null {\n if (typeof window === \"undefined\") return null;\n try {\n return window.localStorage ?? null;\n } catch {\n return null;\n }\n}\n\nfunction emitSimpleViewsUpdate(key: string): void {\n if (typeof window === \"undefined\") return;\n window.dispatchEvent(\n new CustomEvent(SIMPLE_VIEWS_EVENT, { detail: { key } }),\n );\n}\n\nfunction readJson<T>(\n key: string,\n fallback: T,\n isValid: (value: unknown) => value is T,\n): T {\n const storage = browserStorage();\n if (!storage) {\n const value = serverJsonStore.get(key);\n return isValid(value) ? value : fallback;\n }\n\n try {\n const raw = storage.getItem(key);\n if (!raw) return fallback;\n const parsed = JSON.parse(raw) as unknown;\n return isValid(parsed) ? parsed : fallback;\n } catch {\n return fallback;\n }\n}\n\nfunction writeJson<T>(key: string, value: T): void {\n const storage = browserStorage();\n if (!storage) {\n serverJsonStore.set(key, value);\n return;\n }\n\n try {\n storage.setItem(key, JSON.stringify(value));\n emitSimpleViewsUpdate(key);\n } catch {\n // Storage can be unavailable or quota-limited; keep the UI alive.\n }\n}\n\nfunction readText(key: string, fallback: string): string {\n const storage = browserStorage();\n if (!storage) return serverTextStore.get(key) ?? fallback;\n\n try {\n return storage.getItem(key) ?? fallback;\n } catch {\n return fallback;\n }\n}\n\nfunction writeText(key: string, value: string): void {\n const storage = browserStorage();\n if (!storage) {\n serverTextStore.set(key, value);\n return;\n }\n\n try {\n storage.setItem(key, value);\n emitSimpleViewsUpdate(key);\n } catch {\n // Storage can be unavailable or quota-limited; keep the UI alive.\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function normalizeColor(value: unknown): StickyColor {\n return value === \"green\" ||\n value === \"rose\" ||\n value === \"pink\" ||\n value === \"slate\"\n ? value === \"pink\"\n ? \"rose\"\n : value\n : \"yellow\";\n}\n\nfunction isStickyNote(value: unknown): value is StickyNote {\n if (!isRecord(value)) return false;\n return (\n typeof value.id === \"string\" &&\n typeof value.title === \"string\" &&\n typeof value.body === \"string\" &&\n typeof value.createdAt === \"string\" &&\n typeof value.updatedAt === \"string\" &&\n normalizeColor(value.color) === value.color\n );\n}\n\nfunction isCalendarEvent(value: unknown): value is SimpleCalendarEvent {\n if (!isRecord(value)) return false;\n return (\n typeof value.id === \"string\" &&\n typeof value.title === \"string\" &&\n normalizeDateKey(value.date) === value.date &&\n typeof value.time === \"string\" &&\n typeof value.notes === \"string\" &&\n typeof value.createdAt === \"string\" &&\n normalizeColor(value.color) === value.color\n );\n}\n\nfunction isStickyNoteArray(value: unknown): value is StickyNote[] {\n return Array.isArray(value) && value.every(isStickyNote);\n}\n\nfunction isCalendarEventArray(value: unknown): value is SimpleCalendarEvent[] {\n return Array.isArray(value) && value.every(isCalendarEvent);\n}\n\nexport function readNotes(): StickyNote[] {\n return readJson(NOTES_KEY, DEFAULT_NOTES, isStickyNoteArray);\n}\n\nexport function writeNotes(notes: StickyNote[]): void {\n writeJson(NOTES_KEY, notes);\n}\n\nexport function readEvents(): SimpleCalendarEvent[] {\n return readJson(CALENDAR_EVENTS_KEY, DEFAULT_EVENTS, isCalendarEventArray);\n}\n\nexport function writeEvents(events: SimpleCalendarEvent[]): void {\n writeJson(CALENDAR_EVENTS_KEY, events);\n}\n\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n\nexport function makeId(prefix: string): string {\n const cryptoObject = globalThis.crypto;\n if (typeof cryptoObject?.randomUUID === \"function\") {\n return `${prefix}-${cryptoObject.randomUUID()}`;\n }\n return `${prefix}-${Date.now().toString(36)}-${Math.random()\n .toString(36)\n .slice(2, 8)}`;\n}\n\nexport function todayDateKey(date = new Date()): string {\n return date.toISOString().slice(0, 10);\n}\n\nexport function normalizeDateKey(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const match = DATE_KEY_PATTERN.exec(value.trim());\n if (!match) return null;\n\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n if (year < 1000 || month < 1 || month > 12 || day < 1 || day > 31) {\n return null;\n }\n\n const date = new Date(Date.UTC(year, month - 1, day));\n if (\n date.getUTCFullYear() !== year ||\n date.getUTCMonth() !== month - 1 ||\n date.getUTCDate() !== day\n ) {\n return null;\n }\n return date.toISOString().slice(0, 10);\n}\n\nexport function readSelectedDate(): string {\n return normalizeDateKey(readText(CALENDAR_CURSOR_KEY, \"\")) ?? todayDateKey();\n}\n\nexport function writeSelectedDate(date: string): void {\n writeText(CALENDAR_CURSOR_KEY, date);\n}\n\nexport function simpleViewsSnapshot(): SimpleViewsSnapshot {\n return {\n notes: readNotes(),\n events: readEvents(),\n selectedDate: readSelectedDate(),\n };\n}\n\nexport function applySimpleViewsSnapshot(\n snapshot: SimpleViewsSnapshot,\n options: { preserveLocalDataOnEmpty?: boolean } = {},\n): void {\n const hasLocalData = readNotes().length > 0 || readEvents().length > 0;\n if (\n options.preserveLocalDataOnEmpty &&\n hasLocalData &&\n snapshot.notes.length === 0 &&\n snapshot.events.length === 0\n ) {\n return;\n }\n\n writeNotes(snapshot.notes);\n writeEvents(snapshot.events);\n writeSelectedDate(snapshot.selectedDate);\n}\n\nexport function isSimpleViewsSnapshot(\n value: unknown,\n): value is SimpleViewsSnapshot {\n if (!isRecord(value)) return false;\n return (\n isStickyNoteArray(value.notes) &&\n isCalendarEventArray(value.events) &&\n normalizeDateKey(value.selectedDate) === value.selectedDate\n );\n}\n","import {\n makeId,\n normalizeColor,\n normalizeDateKey,\n nowIso,\n readEvents,\n readNotes,\n readSelectedDate,\n type SimpleCalendarEvent,\n type SimpleViewsSnapshot,\n type StickyNote,\n simpleViewsSnapshot,\n todayDateKey,\n writeEvents,\n writeNotes,\n writeSelectedDate,\n} from \"./storage.js\";\n\nexport interface SimpleViewsInteractResult {\n success: boolean;\n text: string;\n state: SimpleViewsSnapshot;\n [key: string]: unknown;\n}\n\ntype SimpleViewsInteractFields = {\n success: boolean;\n text: string;\n} & Record<string, unknown>;\n\nfunction textParam(\n params: Record<string, unknown> | undefined,\n key: string,\n): string {\n const value = params?.[key];\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction normalizeLookup(value: string): string {\n return value.toLowerCase().replace(/\\s+/g, \" \").trim();\n}\n\nfunction summarizeNotes(notes: StickyNote[]): string {\n if (notes.length === 0) return \"No sticky notes yet.\";\n return notes.map((note) => `${note.title}: ${note.body}`).join(\"\\n\");\n}\n\nfunction summarizeEvents(events: SimpleCalendarEvent[], date?: string): string {\n const filtered = date\n ? events.filter((event) => event.date === date)\n : events;\n if (filtered.length === 0) {\n return date ? `No calendar events for ${date}.` : \"No calendar events yet.\";\n }\n return filtered\n .map(\n (event) =>\n `${event.date} ${event.time} - ${event.title}${event.notes ? `: ${event.notes}` : \"\"}`,\n )\n .join(\"\\n\");\n}\n\nfunction resolveNoteDeleteTarget(\n notes: StickyNote[],\n target: string,\n): StickyNote | { ambiguous: StickyNote[] } | null {\n const normalized = normalizeLookup(target);\n if (!normalized) return null;\n\n const exact = notes.filter(\n (note) =>\n normalizeLookup(note.id) === normalized ||\n normalizeLookup(note.title) === normalized,\n );\n if (exact.length === 1) return exact[0];\n if (exact.length > 1) return { ambiguous: exact };\n\n const titleMatches = notes.filter((note) =>\n normalizeLookup(note.title).includes(normalized),\n );\n if (titleMatches.length === 1) return titleMatches[0];\n if (titleMatches.length > 1) return { ambiguous: titleMatches };\n\n const bodyMatches = notes.filter((note) =>\n normalizeLookup(note.body).includes(normalized),\n );\n if (bodyMatches.length === 1) return bodyMatches[0];\n if (bodyMatches.length > 1) return { ambiguous: bodyMatches };\n\n return null;\n}\n\nfunction result(fields: SimpleViewsInteractFields): SimpleViewsInteractResult {\n return { ...fields, state: simpleViewsSnapshot() };\n}\n\nexport async function interact(\n capability: string,\n params?: Record<string, unknown>,\n): Promise<SimpleViewsInteractResult> {\n if (capability === \"get-notes\") {\n const notes = readNotes();\n return result({\n success: true,\n text: summarizeNotes(notes),\n notes,\n });\n }\n\n if (capability === \"create-note\") {\n const now = nowIso();\n const note: StickyNote = {\n id: makeId(\"note\"),\n title: textParam(params, \"title\") || \"Untitled\",\n body:\n textParam(params, \"body\") || textParam(params, \"content\") || \"New note\",\n color: normalizeColor(params?.color),\n createdAt: now,\n updatedAt: now,\n };\n writeNotes([note, ...readNotes()]);\n return result({\n success: true,\n text: `Created sticky note \"${note.title}\".`,\n created: true,\n note,\n });\n }\n\n if (capability === \"delete-note\") {\n const target =\n textParam(params, \"id\") ||\n textParam(params, \"title\") ||\n textParam(params, \"query\") ||\n textParam(params, \"name\");\n if (!target) {\n return result({\n success: false,\n text: \"Note id, title, or query is required.\",\n deleted: false,\n reason: \"target is required\",\n });\n }\n\n const before = readNotes();\n const resolved = resolveNoteDeleteTarget(before, target);\n if (!resolved) {\n return result({\n success: false,\n text: `No sticky note found for \"${target}\".`,\n deleted: false,\n target,\n });\n }\n if (\"ambiguous\" in resolved) {\n return result({\n success: false,\n text: `\"${target}\" matches multiple sticky notes: ${resolved.ambiguous\n .map((note) => note.title)\n .join(\", \")}.`,\n deleted: false,\n target,\n candidates: resolved.ambiguous,\n });\n }\n\n writeNotes(before.filter((note) => note.id !== resolved.id));\n return result({\n success: true,\n text: `Deleted sticky note \"${resolved.title}\".`,\n deleted: true,\n id: resolved.id,\n note: resolved,\n });\n }\n\n if (capability === \"clear-notes\") {\n writeNotes([]);\n return result({\n success: true,\n text: \"Cleared all sticky notes.\",\n cleared: true,\n });\n }\n\n if (capability === \"get-calendar-state\") {\n const requestedDate = textParam(params, \"date\");\n const selectedDate = requestedDate\n ? normalizeDateKey(requestedDate)\n : readSelectedDate();\n if (!selectedDate) {\n return result({\n success: false,\n text: \"Date must be YYYY-MM-DD.\",\n reason: \"date must be YYYY-MM-DD\",\n });\n }\n const events = readEvents();\n return result({\n success: true,\n text: summarizeEvents(events, selectedDate),\n selectedDate,\n events,\n });\n }\n\n if (capability === \"select-calendar-date\") {\n const date = normalizeDateKey(textParam(params, \"date\"));\n if (!date) {\n return result({\n success: false,\n text: \"Date must be YYYY-MM-DD.\",\n selected: false,\n reason: \"date must be YYYY-MM-DD\",\n });\n }\n writeSelectedDate(date);\n return result({\n success: true,\n text: `Selected ${date}.`,\n selected: true,\n date,\n });\n }\n\n if (capability === \"create-calendar-event\") {\n const requestedDate = textParam(params, \"date\");\n const date = requestedDate\n ? normalizeDateKey(requestedDate)\n : readSelectedDate() || todayDateKey();\n if (!date) {\n return result({\n success: false,\n text: \"Date must be YYYY-MM-DD.\",\n created: false,\n reason: \"date must be YYYY-MM-DD\",\n });\n }\n\n const event: SimpleCalendarEvent = {\n id: makeId(\"event\"),\n title: textParam(params, \"title\") || \"Untitled event\",\n date,\n time: textParam(params, \"time\") || \"09:00\",\n notes: textParam(params, \"notes\"),\n color: normalizeColor(params?.color),\n createdAt: nowIso(),\n };\n writeEvents([...readEvents(), event]);\n writeSelectedDate(date);\n return result({\n success: true,\n text: `Created calendar event \"${event.title}\" for ${event.date} at ${event.time}.`,\n created: true,\n event,\n });\n }\n\n if (capability === \"delete-calendar-event\") {\n const id = textParam(params, \"id\");\n if (!id) {\n return result({\n success: false,\n text: \"Event id is required.\",\n deleted: false,\n reason: \"id is required\",\n });\n }\n\n const before = readEvents();\n const event = before.find((candidate) => candidate.id === id);\n if (!event) {\n return result({\n success: false,\n text: `No calendar event found for \"${id}\".`,\n deleted: false,\n id,\n });\n }\n\n writeEvents(before.filter((candidate) => candidate.id !== id));\n return result({\n success: true,\n text: `Deleted calendar event \"${event.title}\".`,\n deleted: true,\n id,\n event,\n });\n }\n\n throw new Error(`Simple views do not support capability \"${capability}\".`);\n}\n","import { AgentButton, useAgentElement } from \"@elizaos/ui/agent-surface\";\nimport {\n CalendarDays,\n ChevronLeft,\n ChevronRight,\n Plus,\n Settings,\n StickyNote,\n Trash2,\n} from \"lucide-react\";\nimport {\n type CSSProperties,\n type FormEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { interact } from \"./simple-views.interact.js\";\nimport {\n applySimpleViewsSnapshot,\n isSimpleViewsSnapshot,\n normalizeDateKey,\n readSelectedDate,\n SIMPLE_VIEWS_EVENT,\n type SimpleCalendarEvent,\n type SimpleViewsSnapshot,\n type StickyColor,\n type StickyNote as StickyNoteModel,\n simpleViewsSnapshot,\n todayDateKey,\n} from \"./storage.js\";\n\nconst COLORS: StickyColor[] = [\"yellow\", \"green\", \"rose\", \"slate\"];\n\nconst NOTE_COLORS: Record<StickyColor, CSSProperties> = {\n yellow: { background: \"#fff5bf\", borderColor: \"#d9b84b\" },\n green: { background: \"#dff6df\", borderColor: \"#7dbb77\" },\n rose: { background: \"#ffe4ec\", borderColor: \"#d991aa\" },\n slate: { background: \"#e8edf2\", borderColor: \"#9aa8b5\" },\n};\n\nconst EVENT_DOTS: Record<StickyColor, string> = {\n yellow: \"#b88719\",\n green: \"#2f7d46\",\n rose: \"#b84065\",\n slate: \"#586879\",\n};\n\nconst shellStyle: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n minHeight: \"100%\",\n color: \"#15171c\",\n background: \"#f6f7f4\",\n fontFamily:\n \"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, sans-serif\",\n};\n\nconst headerStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 16,\n padding: \"18px 20px 14px\",\n borderBottom: \"1px solid #dde1d8\",\n background: \"#ffffff\",\n};\n\nconst titleWrapStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n minWidth: 0,\n};\n\nconst iconBoxStyle: CSSProperties = {\n display: \"grid\",\n placeItems: \"center\",\n width: 34,\n height: 34,\n border: \"1px solid #d6dbd2\",\n borderRadius: 8,\n background: \"#f2f4ef\",\n color: \"#263326\",\n};\n\nconst h1Style: CSSProperties = {\n margin: 0,\n fontSize: 20,\n lineHeight: \"26px\",\n fontWeight: 700,\n letterSpacing: 0,\n};\n\nconst subTextStyle: CSSProperties = {\n margin: 0,\n color: \"#60695d\",\n fontSize: 13,\n lineHeight: \"18px\",\n};\n\nconst toolbarStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n flexWrap: \"wrap\",\n gap: 8,\n justifyContent: \"flex-end\",\n};\n\nconst buttonStyle: CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 7,\n minHeight: 34,\n border: \"1px solid #c9d0c4\",\n borderRadius: 8,\n padding: \"0 12px\",\n background: \"#ffffff\",\n color: \"#1f271e\",\n fontSize: 13,\n fontWeight: 600,\n cursor: \"pointer\",\n};\n\nconst iconButtonStyle: CSSProperties = {\n ...buttonStyle,\n width: 34,\n padding: 0,\n};\n\nconst primaryButtonStyle: CSSProperties = {\n ...buttonStyle,\n borderColor: \"#476b3b\",\n background: \"#476b3b\",\n color: \"#ffffff\",\n};\n\nconst fieldStyle: CSSProperties = {\n width: \"100%\",\n minHeight: 36,\n border: \"1px solid #c9d0c4\",\n borderRadius: 8,\n padding: \"8px 10px\",\n background: \"#ffffff\",\n color: \"#15171c\",\n font: \"inherit\",\n fontSize: 14,\n lineHeight: \"20px\",\n boxSizing: \"border-box\",\n};\n\nconst panelStyle: CSSProperties = {\n border: \"1px solid #dde1d8\",\n borderRadius: 8,\n background: \"#ffffff\",\n};\n\nasync function fetchSimpleViewsSnapshot(): Promise<SimpleViewsSnapshot | null> {\n if (typeof fetch !== \"function\") return null;\n try {\n const response = await fetch(\"/api/simple-views/state\", {\n headers: { Accept: \"application/json\" },\n });\n if (!response.ok) return null;\n const body = (await response.json()) as unknown;\n return isSimpleViewsSnapshot(body) ? body : null;\n } catch {\n return null;\n }\n}\n\nasync function callSimpleViewsCapability(\n capability: string,\n params?: Record<string, unknown>,\n): Promise<void> {\n if (typeof fetch === \"function\") {\n try {\n const response = await fetch(\"/api/simple-views/interact\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n },\n body: JSON.stringify({ capability, params }),\n });\n if (response.ok) {\n const body = (await response.json()) as unknown;\n if (\n body &&\n typeof body === \"object\" &&\n \"state\" in body &&\n isSimpleViewsSnapshot((body as { state: unknown }).state)\n ) {\n applySimpleViewsSnapshot(\n (body as { state: SimpleViewsSnapshot }).state,\n );\n return;\n }\n }\n } catch {\n // Fall back to local storage below when the optional backend is absent.\n }\n }\n\n await interact(capability, params);\n}\n\nfunction useSimpleViewsSnapshot(): SimpleViewsSnapshot {\n const [snapshot, setSnapshot] = useState(() => simpleViewsSnapshot());\n\n useEffect(() => {\n const refresh = () => setSnapshot(simpleViewsSnapshot());\n const onStorage = () => refresh();\n const onUpdate = () => refresh();\n const onSharedViewEvent = (event: Event) => {\n const detail = (event as CustomEvent<{ type?: unknown }>).detail;\n if (\n detail?.type === \"simple-views:update\" ||\n detail?.type === \"view:notes:updated\" ||\n detail?.type === \"view:simple-calendar:updated\"\n ) {\n refresh();\n }\n };\n\n window.addEventListener(SIMPLE_VIEWS_EVENT, onUpdate);\n window.addEventListener(\"storage\", onStorage);\n window.addEventListener(\"elizaos-view-event\", onSharedViewEvent);\n void fetchSimpleViewsSnapshot().then((next) => {\n if (next) {\n applySimpleViewsSnapshot(next, { preserveLocalDataOnEmpty: true });\n refresh();\n }\n });\n return () => {\n window.removeEventListener(SIMPLE_VIEWS_EVENT, onUpdate);\n window.removeEventListener(\"storage\", onStorage);\n window.removeEventListener(\"elizaos-view-event\", onSharedViewEvent);\n };\n }, []);\n\n return snapshot;\n}\n\ninterface AgentTextInputProps {\n id: string;\n label: string;\n value: string;\n onFill: (value: string) => void;\n group: string;\n placeholder?: string;\n style?: CSSProperties;\n}\n\nfunction AgentTextInput({\n id,\n label,\n value,\n onFill,\n group,\n placeholder,\n style,\n}: AgentTextInputProps) {\n const { ref, agentProps } = useAgentElement<HTMLInputElement>({\n id,\n label,\n role: \"text-input\",\n group,\n fillable: true,\n getValue: () => value,\n onFill,\n });\n return (\n <input\n ref={ref}\n aria-label={label}\n {...agentProps}\n value={value}\n onChange={(event) => onFill(event.target.value)}\n placeholder={placeholder}\n style={{ ...fieldStyle, ...style }}\n />\n );\n}\n\nfunction AgentTextarea({\n id,\n label,\n value,\n onFill,\n group,\n}: AgentTextInputProps) {\n const { ref, agentProps } = useAgentElement<HTMLTextAreaElement>({\n id,\n label,\n role: \"textarea\",\n group,\n fillable: true,\n getValue: () => value,\n onFill,\n });\n return (\n <textarea\n ref={ref}\n aria-label={label}\n {...agentProps}\n value={value}\n onChange={(event) => onFill(event.target.value)}\n rows={5}\n style={{ ...fieldStyle, minHeight: 112, resize: \"vertical\" }}\n />\n );\n}\n\nfunction openSettings(): void {\n if (typeof window === \"undefined\") return;\n window.history.pushState(null, \"\", \"/settings\");\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n}\n\nfunction NoteCard({\n note,\n onDelete,\n}: {\n note: StickyNoteModel;\n onDelete: (id: string) => void;\n}) {\n const cardElement = useAgentElement<HTMLDivElement>({\n id: `note-card-${note.id}`,\n label: `Note: ${note.title}`,\n role: \"card\",\n group: \"notes-list\",\n description: note.body,\n status: note.color,\n });\n const deleteElement = useAgentElement<HTMLButtonElement>({\n id: `delete-note-${note.id}`,\n label: `Delete note ${note.title}`,\n role: \"button\",\n group: \"notes-list\",\n onActivate: () => onDelete(note.id),\n });\n\n return (\n <div\n ref={cardElement.ref}\n {...cardElement.agentProps}\n style={{\n ...NOTE_COLORS[note.color],\n minHeight: 180,\n border: \"1px solid\",\n borderRadius: 8,\n padding: 16,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n boxShadow: \"0 8px 20px rgba(31, 39, 30, 0.08)\",\n }}\n >\n <div\n style={{ display: \"flex\", justifyContent: \"space-between\", gap: 10 }}\n >\n <h2\n style={{\n margin: 0,\n fontSize: 16,\n lineHeight: \"22px\",\n fontWeight: 700,\n overflowWrap: \"anywhere\",\n }}\n >\n {note.title}\n </h2>\n <button\n ref={deleteElement.ref}\n type=\"button\"\n {...deleteElement.agentProps}\n onClick={() => onDelete(note.id)}\n style={{\n ...iconButtonStyle,\n width: 30,\n height: 30,\n minHeight: 30,\n background: \"rgba(255,255,255,0.68)\",\n }}\n title=\"Delete note\"\n >\n <Trash2 size={16} aria-hidden />\n </button>\n </div>\n <p\n style={{\n margin: 0,\n color: \"#253025\",\n fontSize: 14,\n lineHeight: \"21px\",\n whiteSpace: \"pre-wrap\",\n overflowWrap: \"anywhere\",\n }}\n >\n {note.body}\n </p>\n </div>\n );\n}\n\nexport function NotesView() {\n const { notes } = useSimpleViewsSnapshot();\n const [title, setTitle] = useState(\"\");\n const [body, setBody] = useState(\"\");\n const [color, setColor] = useState<StickyColor>(\"yellow\");\n const titleRef = useRef(title);\n const bodyRef = useRef(body);\n\n const setTitleValue = useCallback((value: string) => {\n titleRef.current = value;\n setTitle(value);\n }, []);\n\n const setBodyValue = useCallback((value: string) => {\n bodyRef.current = value;\n setBody(value);\n }, []);\n\n const addNote = useCallback(async () => {\n const nextTitle = titleRef.current.trim();\n const nextBody = bodyRef.current.trim();\n if (!nextTitle && !nextBody) return;\n await callSimpleViewsCapability(\"create-note\", {\n title: nextTitle || \"Untitled\",\n body: nextBody || \"New note\",\n color,\n });\n setTitleValue(\"\");\n setBodyValue(\"\");\n }, [color, setBodyValue, setTitleValue]);\n\n const deleteNote = useCallback((id: string) => {\n void callSimpleViewsCapability(\"delete-note\", { id });\n }, []);\n\n const clearNotes = useCallback(() => {\n void callSimpleViewsCapability(\"clear-notes\");\n }, []);\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n void addNote();\n };\n\n return (\n <main data-testid=\"simple-notes-view\" style={shellStyle}>\n <header style={headerStyle}>\n <div style={titleWrapStyle}>\n <div style={iconBoxStyle}>\n <StickyNote size={18} aria-hidden />\n </div>\n <div>\n <h1 style={h1Style}>Notes</h1>\n <p style={subTextStyle}>{notes.length} sticky notes</p>\n </div>\n </div>\n <div style={toolbarStyle}>\n <AgentButton\n agentId=\"notes-clear\"\n agentLabel=\"Clear notes\"\n onClick={clearNotes}\n style={buttonStyle}\n >\n Clear\n </AgentButton>\n <AgentButton\n agentId=\"notes-open-settings\"\n agentLabel=\"Open settings\"\n onClick={openSettings}\n style={iconButtonStyle}\n title=\"Open settings\"\n >\n <Settings size={16} aria-hidden />\n </AgentButton>\n </div>\n </header>\n\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns:\n \"repeat(auto-fit, minmax(min(100%, 280px), 1fr))\",\n gap: 18,\n padding: 20,\n alignItems: \"start\",\n }}\n >\n <form\n onSubmit={handleSubmit}\n style={{\n ...panelStyle,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n padding: 16,\n }}\n >\n <AgentTextInput\n id=\"note-title\"\n label=\"Note title\"\n value={title}\n onFill={setTitleValue}\n placeholder=\"Title\"\n group=\"note-compose\"\n />\n <AgentTextarea\n id=\"note-body\"\n label=\"Note body\"\n value={body}\n onFill={setBodyValue}\n group=\"note-compose\"\n />\n <div style={{ display: \"flex\", gap: 8, flexWrap: \"wrap\" }}>\n {COLORS.map((option) => (\n <AgentButton\n key={option}\n agentId={`note-color-${option}`}\n agentLabel={`Set note color ${option}`}\n agentRole=\"toggle\"\n agentStatus={color === option ? \"active\" : undefined}\n onClick={() => setColor(option)}\n style={{\n ...buttonStyle,\n background: NOTE_COLORS[option].background,\n borderColor:\n color === option\n ? \"#15171c\"\n : NOTE_COLORS[option].borderColor,\n minWidth: 72,\n textTransform: \"capitalize\",\n }}\n >\n {option}\n </AgentButton>\n ))}\n </div>\n <AgentButton\n agentId=\"add-note\"\n agentLabel=\"Add note\"\n onClick={addNote}\n style={primaryButtonStyle}\n >\n <Plus size={16} aria-hidden />\n Add note\n </AgentButton>\n </form>\n\n <section\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(220px, 1fr))\",\n gap: 16,\n }}\n aria-label=\"Sticky note wall\"\n >\n {notes.map((note) => (\n <NoteCard key={note.id} note={note} onDelete={deleteNote} />\n ))}\n </section>\n </div>\n </main>\n );\n}\n\nfunction dateKey(date: Date): string {\n return todayDateKey(date);\n}\n\nfunction parseDateKey(value: string): Date {\n const normalized = normalizeDateKey(value) ?? todayDateKey();\n const [year, month, day] = normalized.split(\"-\").map((part) => Number(part));\n return new Date(Date.UTC(year, month - 1, day));\n}\n\nfunction monthLabel(date: Date): string {\n return new Intl.DateTimeFormat(\"en\", {\n month: \"long\",\n year: \"numeric\",\n timeZone: \"UTC\",\n }).format(date);\n}\n\nfunction startOfMonth(date: Date): Date {\n return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1));\n}\n\nfunction addMonths(date: Date, amount: number): Date {\n return new Date(\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + amount, 1),\n );\n}\n\nfunction buildCalendarDays(cursor: Date): Date[] {\n const monthStart = startOfMonth(cursor);\n const startOffset = monthStart.getUTCDay();\n const gridStart = new Date(monthStart);\n gridStart.setUTCDate(monthStart.getUTCDate() - startOffset);\n return Array.from({ length: 42 }, (_, index) => {\n const day = new Date(gridStart);\n day.setUTCDate(gridStart.getUTCDate() + index);\n return day;\n });\n}\n\nfunction eventsForDate(\n events: SimpleCalendarEvent[],\n date: string,\n): SimpleCalendarEvent[] {\n return events\n .filter((event) => event.date === date)\n .sort((a: SimpleCalendarEvent, b: SimpleCalendarEvent) =>\n `${a.time} ${a.title}`.localeCompare(`${b.time} ${b.title}`),\n );\n}\n\nfunction CalendarDayButton({\n day,\n selectedDate,\n cursorMonth,\n events,\n onSelect,\n}: {\n day: Date;\n selectedDate: string;\n cursorMonth: number;\n events: SimpleCalendarEvent[];\n onSelect: (date: string) => void;\n}) {\n const key = dateKey(day);\n const isSelected = key === selectedDate;\n const inMonth = day.getUTCMonth() === cursorMonth;\n const dayEvents = eventsForDate(events, key);\n const dayElement = useAgentElement<HTMLButtonElement>({\n id: `calendar-day-${key}`,\n label: `Select ${key}`,\n role: \"button\",\n group: \"simple-calendar-grid\",\n description:\n dayEvents.length > 0\n ? `${dayEvents.length} event${dayEvents.length === 1 ? \"\" : \"s\"}`\n : \"No events\",\n status: isSelected\n ? \"selected\"\n : inMonth\n ? \"current-month\"\n : \"outside-month\",\n onActivate: () => onSelect(key),\n });\n\n return (\n <button\n ref={dayElement.ref}\n type=\"button\"\n {...dayElement.agentProps}\n onClick={() => onSelect(key)}\n style={{\n minWidth: 0,\n minHeight: 78,\n border: isSelected ? \"2px solid #476b3b\" : \"1px solid #dde1d8\",\n borderRadius: 8,\n padding: 6,\n background: inMonth ? \"#ffffff\" : \"#eef1eb\",\n color: inMonth ? \"#15171c\" : \"#687264\",\n textAlign: \"left\",\n cursor: \"pointer\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n }}\n >\n <span style={{ fontWeight: 700, fontSize: 13 }}>{day.getUTCDate()}</span>\n <span style={{ display: \"flex\", gap: 4, flexWrap: \"wrap\" }}>\n {dayEvents.slice(0, 4).map((event) => (\n <span\n key={event.id}\n style={{\n width: 7,\n height: 7,\n borderRadius: 999,\n background: EVENT_DOTS[event.color],\n }}\n />\n ))}\n </span>\n {dayEvents[0] ? (\n <span\n style={{\n fontSize: 11,\n lineHeight: \"15px\",\n color: \"#505b4d\",\n overflowWrap: \"anywhere\",\n }}\n >\n {dayEvents[0].title}\n </span>\n ) : null}\n </button>\n );\n}\n\nfunction EventRow({\n event,\n onDelete,\n}: {\n event: SimpleCalendarEvent;\n onDelete: (id: string) => void;\n}) {\n const rowElement = useAgentElement<HTMLDivElement>({\n id: `calendar-event-${event.id}`,\n label: `Event: ${event.title}`,\n role: \"card\",\n group: \"simple-calendar-events\",\n description: `${event.date} ${event.time}. ${event.notes}`,\n status: event.color,\n });\n const deleteElement = useAgentElement<HTMLButtonElement>({\n id: `delete-calendar-event-${event.id}`,\n label: `Delete calendar event ${event.title}`,\n role: \"button\",\n group: \"simple-calendar-events\",\n onActivate: () => onDelete(event.id),\n });\n\n return (\n <div\n ref={rowElement.ref}\n {...rowElement.agentProps}\n style={{\n display: \"grid\",\n gridTemplateColumns: \"10px minmax(0, 1fr) 32px\",\n gap: 10,\n alignItems: \"center\",\n padding: \"10px 0\",\n borderBottom: \"1px solid #ecefe9\",\n }}\n >\n <span\n style={{\n width: 8,\n height: 34,\n borderRadius: 999,\n background: EVENT_DOTS[event.color],\n }}\n />\n <div style={{ minWidth: 0 }}>\n <div\n style={{\n fontWeight: 700,\n fontSize: 14,\n lineHeight: \"20px\",\n overflowWrap: \"anywhere\",\n }}\n >\n {event.time} - {event.title}\n </div>\n {event.notes ? (\n <div\n style={{\n color: \"#60695d\",\n fontSize: 12,\n lineHeight: \"17px\",\n overflowWrap: \"anywhere\",\n }}\n >\n {event.notes}\n </div>\n ) : null}\n </div>\n <button\n ref={deleteElement.ref}\n type=\"button\"\n {...deleteElement.agentProps}\n onClick={() => onDelete(event.id)}\n style={iconButtonStyle}\n title=\"Delete event\"\n >\n <Trash2 size={16} aria-hidden />\n </button>\n </div>\n );\n}\n\nexport function SimpleCalendarView() {\n const snapshot = useSimpleViewsSnapshot();\n const [selectedDate, setSelectedDate] = useState(() => readSelectedDate());\n const [title, setTitle] = useState(\"\");\n const [time, setTime] = useState(\"09:00\");\n const [notes, setNotes] = useState(\"\");\n const [color, setColor] = useState<StickyColor>(\"green\");\n const selectedDateRef = useRef(selectedDate);\n const titleRef = useRef(title);\n const timeRef = useRef(time);\n const notesRef = useRef(notes);\n const colorRef = useRef(color);\n\n useEffect(() => {\n selectedDateRef.current = snapshot.selectedDate;\n setSelectedDate(snapshot.selectedDate);\n }, [snapshot.selectedDate]);\n\n const setTitleValue = useCallback((value: string) => {\n titleRef.current = value;\n setTitle(value);\n }, []);\n\n const setTimeValue = useCallback((value: string) => {\n timeRef.current = value;\n setTime(value);\n }, []);\n\n const setNotesValue = useCallback((value: string) => {\n notesRef.current = value;\n setNotes(value);\n }, []);\n\n const setColorValue = useCallback((value: StickyColor) => {\n colorRef.current = value;\n setColor(value);\n }, []);\n\n const cursor = useMemo(\n () => startOfMonth(parseDateKey(selectedDate)),\n [selectedDate],\n );\n const days = useMemo(() => buildCalendarDays(cursor), [cursor]);\n const selectedEvents = useMemo(\n () => eventsForDate(snapshot.events, selectedDate),\n [snapshot.events, selectedDate],\n );\n\n const selectDate = useCallback((date: string) => {\n const normalizedDate = normalizeDateKey(date);\n if (!normalizedDate) return;\n selectedDateRef.current = normalizedDate;\n setSelectedDate(normalizedDate);\n void callSimpleViewsCapability(\"select-calendar-date\", {\n date: normalizedDate,\n });\n }, []);\n\n const moveMonth = useCallback(\n (amount: number) => {\n selectDate(dateKey(addMonths(cursor, amount)));\n },\n [cursor, selectDate],\n );\n\n const selectToday = useCallback(() => {\n selectDate(dateKey(new Date()));\n }, [selectDate]);\n\n const addEvent = useCallback(async () => {\n const eventTitle = titleRef.current.trim();\n if (!eventTitle) return;\n await callSimpleViewsCapability(\"create-calendar-event\", {\n title: eventTitle,\n date: selectedDateRef.current,\n time: timeRef.current || \"09:00\",\n notes: notesRef.current.trim(),\n color: colorRef.current,\n });\n setTitleValue(\"\");\n setNotesValue(\"\");\n }, [setNotesValue, setTitleValue]);\n\n const deleteEvent = useCallback((id: string) => {\n void callSimpleViewsCapability(\"delete-calendar-event\", { id });\n }, []);\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n void addEvent();\n };\n\n return (\n <main data-testid=\"simple-calendar-view\" style={shellStyle}>\n <header style={headerStyle}>\n <div style={titleWrapStyle}>\n <div style={iconBoxStyle}>\n <CalendarDays size={18} aria-hidden />\n </div>\n <div>\n <h1 style={h1Style}>Simple Calendar</h1>\n <p style={subTextStyle}>\n {monthLabel(cursor)} - {snapshot.events.length} events\n </p>\n </div>\n </div>\n <div style={toolbarStyle}>\n <AgentButton\n agentId=\"calendar-prev-month\"\n agentLabel=\"Previous month\"\n onClick={() => moveMonth(-1)}\n style={iconButtonStyle}\n title=\"Previous month\"\n >\n <ChevronLeft size={16} aria-hidden />\n </AgentButton>\n <AgentButton\n agentId=\"calendar-today\"\n agentLabel=\"Go to today\"\n onClick={selectToday}\n style={buttonStyle}\n >\n Today\n </AgentButton>\n <AgentButton\n agentId=\"calendar-next-month\"\n agentLabel=\"Next month\"\n onClick={() => moveMonth(1)}\n style={iconButtonStyle}\n title=\"Next month\"\n >\n <ChevronRight size={16} aria-hidden />\n </AgentButton>\n <AgentButton\n agentId=\"calendar-open-settings\"\n agentLabel=\"Open settings\"\n onClick={openSettings}\n style={iconButtonStyle}\n title=\"Open settings\"\n >\n <Settings size={16} aria-hidden />\n </AgentButton>\n </div>\n </header>\n\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns:\n \"repeat(auto-fit, minmax(min(100%, 320px), 1fr))\",\n gap: 18,\n padding: 20,\n alignItems: \"start\",\n }}\n >\n <section style={{ ...panelStyle, padding: 14 }}>\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(7, minmax(0, 1fr))\",\n gap: 8,\n marginBottom: 8,\n color: \"#60695d\",\n fontSize: 12,\n fontWeight: 700,\n textAlign: \"center\",\n }}\n >\n {[\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"].map((day) => (\n <div key={day}>{day}</div>\n ))}\n </div>\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(7, minmax(0, 1fr))\",\n gap: 8,\n }}\n >\n {days.map((day) => (\n <CalendarDayButton\n key={dateKey(day)}\n day={day}\n selectedDate={selectedDate}\n cursorMonth={cursor.getUTCMonth()}\n events={snapshot.events}\n onSelect={selectDate}\n />\n ))}\n </div>\n </section>\n\n <aside\n style={{\n ...panelStyle,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n padding: 16,\n }}\n >\n <div>\n <h2 style={{ ...h1Style, fontSize: 17, lineHeight: \"23px\" }}>\n {selectedDate}\n </h2>\n <p style={subTextStyle}>\n {selectedEvents.length} event\n {selectedEvents.length === 1 ? \"\" : \"s\"}\n </p>\n </div>\n\n <form onSubmit={handleSubmit} style={{ display: \"grid\", gap: 10 }}>\n <AgentTextInput\n id=\"calendar-event-title\"\n label=\"Calendar event title\"\n value={title}\n onFill={setTitleValue}\n placeholder=\"Event title\"\n group=\"simple-calendar-compose\"\n />\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"minmax(0, 1fr) minmax(88px, 112px)\",\n gap: 8,\n }}\n >\n <AgentTextInput\n id=\"calendar-event-date\"\n label=\"Calendar event date\"\n value={selectedDate}\n onFill={selectDate}\n group=\"simple-calendar-compose\"\n />\n <AgentTextInput\n id=\"calendar-event-time\"\n label=\"Calendar event time\"\n value={time}\n onFill={setTimeValue}\n group=\"simple-calendar-compose\"\n />\n </div>\n <AgentTextarea\n id=\"calendar-event-notes\"\n label=\"Calendar event notes\"\n value={notes}\n onFill={setNotesValue}\n group=\"simple-calendar-compose\"\n />\n <div style={{ display: \"flex\", gap: 8, flexWrap: \"wrap\" }}>\n {COLORS.map((option) => (\n <AgentButton\n key={option}\n agentId={`calendar-event-color-${option}`}\n agentLabel={`Set calendar event color ${option}`}\n agentRole=\"toggle\"\n agentStatus={color === option ? \"active\" : undefined}\n onClick={() => setColorValue(option)}\n style={{\n ...buttonStyle,\n background: NOTE_COLORS[option].background,\n borderColor:\n color === option\n ? \"#15171c\"\n : NOTE_COLORS[option].borderColor,\n minWidth: 72,\n textTransform: \"capitalize\",\n }}\n >\n {option}\n </AgentButton>\n ))}\n </div>\n <AgentButton\n agentId=\"add-calendar-event\"\n agentLabel=\"Add calendar event\"\n onClick={addEvent}\n style={primaryButtonStyle}\n >\n <Plus size={16} aria-hidden />\n Add event\n </AgentButton>\n </form>\n\n <div>\n {selectedEvents.map((event) => (\n <EventRow key={event.id} event={event} onDelete={deleteEvent} />\n ))}\n </div>\n </aside>\n </div>\n </main>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"bundle.js","names":[],"sources":["../../src/storage.ts","../../src/simple-views.interact.ts","../../src/ui.tsx"],"sourcesContent":["export type StickyColor = \"yellow\" | \"green\" | \"rose\" | \"slate\";\n\nexport interface StickyNote {\n id: string;\n title: string;\n body: string;\n color: StickyColor;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface SimpleCalendarEvent {\n id: string;\n title: string;\n date: string;\n time: string;\n notes: string;\n color: StickyColor;\n createdAt: string;\n}\n\nexport interface SimpleViewsSnapshot {\n notes: StickyNote[];\n events: SimpleCalendarEvent[];\n selectedDate: string;\n}\n\nexport const SIMPLE_VIEWS_EVENT = \"eliza:simple-views:update\";\nexport const NOTES_KEY = \"eliza.simpleViews.notes.v2\";\nexport const CALENDAR_EVENTS_KEY = \"eliza.simpleViews.calendar.events.v2\";\nexport const CALENDAR_CURSOR_KEY = \"eliza.simpleViews.calendar.cursor.v2\";\n\nconst DEFAULT_NOTES: StickyNote[] = [];\nconst DEFAULT_EVENTS: SimpleCalendarEvent[] = [];\nconst DATE_KEY_PATTERN = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst serverJsonStore = new Map<string, unknown>();\nconst serverTextStore = new Map<string, string>();\n\nexport function clearSimpleViewsStorageForTests(): void {\n serverJsonStore.clear();\n serverTextStore.clear();\n\n const storage = browserStorage();\n if (!storage) return;\n\n storage.removeItem(NOTES_KEY);\n storage.removeItem(CALENDAR_EVENTS_KEY);\n storage.removeItem(CALENDAR_CURSOR_KEY);\n}\n\nfunction browserStorage(): Storage | null {\n if (typeof window === \"undefined\") return null;\n try {\n return window.localStorage ?? null;\n } catch {\n return null;\n }\n}\n\nfunction emitSimpleViewsUpdate(key: string): void {\n if (typeof window === \"undefined\") return;\n window.dispatchEvent(\n new CustomEvent(SIMPLE_VIEWS_EVENT, { detail: { key } }),\n );\n}\n\nfunction readJson<T>(\n key: string,\n fallback: T,\n isValid: (value: unknown) => value is T,\n): T {\n const storage = browserStorage();\n if (!storage) {\n const value = serverJsonStore.get(key);\n return isValid(value) ? value : fallback;\n }\n\n try {\n const raw = storage.getItem(key);\n if (!raw) return fallback;\n const parsed = JSON.parse(raw) as unknown;\n return isValid(parsed) ? parsed : fallback;\n } catch {\n return fallback;\n }\n}\n\nfunction writeJson<T>(key: string, value: T): void {\n const storage = browserStorage();\n if (!storage) {\n serverJsonStore.set(key, value);\n return;\n }\n\n try {\n storage.setItem(key, JSON.stringify(value));\n emitSimpleViewsUpdate(key);\n } catch {\n // Storage can be unavailable or quota-limited; keep the UI alive.\n }\n}\n\nfunction readText(key: string, fallback: string): string {\n const storage = browserStorage();\n if (!storage) return serverTextStore.get(key) ?? fallback;\n\n try {\n return storage.getItem(key) ?? fallback;\n } catch {\n return fallback;\n }\n}\n\nfunction writeText(key: string, value: string): void {\n const storage = browserStorage();\n if (!storage) {\n serverTextStore.set(key, value);\n return;\n }\n\n try {\n storage.setItem(key, value);\n emitSimpleViewsUpdate(key);\n } catch {\n // Storage can be unavailable or quota-limited; keep the UI alive.\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function normalizeColor(value: unknown): StickyColor {\n return value === \"green\" ||\n value === \"rose\" ||\n value === \"pink\" ||\n value === \"slate\"\n ? value === \"pink\"\n ? \"rose\"\n : value\n : \"yellow\";\n}\n\nfunction isStickyNote(value: unknown): value is StickyNote {\n if (!isRecord(value)) return false;\n return (\n typeof value.id === \"string\" &&\n typeof value.title === \"string\" &&\n typeof value.body === \"string\" &&\n typeof value.createdAt === \"string\" &&\n typeof value.updatedAt === \"string\" &&\n normalizeColor(value.color) === value.color\n );\n}\n\nfunction isCalendarEvent(value: unknown): value is SimpleCalendarEvent {\n if (!isRecord(value)) return false;\n return (\n typeof value.id === \"string\" &&\n typeof value.title === \"string\" &&\n normalizeDateKey(value.date) === value.date &&\n typeof value.time === \"string\" &&\n typeof value.notes === \"string\" &&\n typeof value.createdAt === \"string\" &&\n normalizeColor(value.color) === value.color\n );\n}\n\nfunction isStickyNoteArray(value: unknown): value is StickyNote[] {\n return Array.isArray(value) && value.every(isStickyNote);\n}\n\nfunction isCalendarEventArray(value: unknown): value is SimpleCalendarEvent[] {\n return Array.isArray(value) && value.every(isCalendarEvent);\n}\n\nexport function readNotes(): StickyNote[] {\n return readJson(NOTES_KEY, DEFAULT_NOTES, isStickyNoteArray);\n}\n\nexport function writeNotes(notes: StickyNote[]): void {\n writeJson(NOTES_KEY, notes);\n}\n\nexport function readEvents(): SimpleCalendarEvent[] {\n return readJson(CALENDAR_EVENTS_KEY, DEFAULT_EVENTS, isCalendarEventArray);\n}\n\nexport function writeEvents(events: SimpleCalendarEvent[]): void {\n writeJson(CALENDAR_EVENTS_KEY, events);\n}\n\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n\nexport function makeId(prefix: string): string {\n const cryptoObject = globalThis.crypto;\n if (typeof cryptoObject?.randomUUID === \"function\") {\n return `${prefix}-${cryptoObject.randomUUID()}`;\n }\n return `${prefix}-${Date.now().toString(36)}-${Math.random()\n .toString(36)\n .slice(2, 8)}`;\n}\n\nexport function todayDateKey(date = new Date()): string {\n return date.toISOString().slice(0, 10);\n}\n\nexport function normalizeDateKey(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const match = DATE_KEY_PATTERN.exec(value.trim());\n if (!match) return null;\n\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n if (year < 1000 || month < 1 || month > 12 || day < 1 || day > 31) {\n return null;\n }\n\n const date = new Date(Date.UTC(year, month - 1, day));\n if (\n date.getUTCFullYear() !== year ||\n date.getUTCMonth() !== month - 1 ||\n date.getUTCDate() !== day\n ) {\n return null;\n }\n return date.toISOString().slice(0, 10);\n}\n\nexport function readSelectedDate(): string {\n return normalizeDateKey(readText(CALENDAR_CURSOR_KEY, \"\")) ?? todayDateKey();\n}\n\nexport function writeSelectedDate(date: string): void {\n writeText(CALENDAR_CURSOR_KEY, date);\n}\n\nexport function simpleViewsSnapshot(): SimpleViewsSnapshot {\n return {\n notes: readNotes(),\n events: readEvents(),\n selectedDate: readSelectedDate(),\n };\n}\n\nexport function applySimpleViewsSnapshot(\n snapshot: SimpleViewsSnapshot,\n options: { preserveLocalDataOnEmpty?: boolean } = {},\n): void {\n const hasLocalData = readNotes().length > 0 || readEvents().length > 0;\n if (\n options.preserveLocalDataOnEmpty &&\n hasLocalData &&\n snapshot.notes.length === 0 &&\n snapshot.events.length === 0\n ) {\n return;\n }\n\n writeNotes(snapshot.notes);\n writeEvents(snapshot.events);\n writeSelectedDate(snapshot.selectedDate);\n}\n\nexport function isSimpleViewsSnapshot(\n value: unknown,\n): value is SimpleViewsSnapshot {\n if (!isRecord(value)) return false;\n return (\n isStickyNoteArray(value.notes) &&\n isCalendarEventArray(value.events) &&\n normalizeDateKey(value.selectedDate) === value.selectedDate\n );\n}\n","import {\n makeId,\n normalizeColor,\n normalizeDateKey,\n nowIso,\n readEvents,\n readNotes,\n readSelectedDate,\n type SimpleCalendarEvent,\n type SimpleViewsSnapshot,\n type StickyNote,\n simpleViewsSnapshot,\n todayDateKey,\n writeEvents,\n writeNotes,\n writeSelectedDate,\n} from \"./storage.js\";\n\nexport interface SimpleViewsInteractResult {\n success: boolean;\n text: string;\n state: SimpleViewsSnapshot;\n [key: string]: unknown;\n}\n\ntype SimpleViewsInteractFields = {\n success: boolean;\n text: string;\n} & Record<string, unknown>;\n\nfunction textParam(\n params: Record<string, unknown> | undefined,\n key: string,\n): string {\n const value = params?.[key];\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction normalizeLookup(value: string): string {\n return value.toLowerCase().replace(/\\s+/g, \" \").trim();\n}\n\nfunction summarizeNotes(notes: StickyNote[]): string {\n if (notes.length === 0) return \"No sticky notes yet.\";\n return notes.map((note) => `${note.title}: ${note.body}`).join(\"\\n\");\n}\n\nfunction summarizeEvents(events: SimpleCalendarEvent[], date?: string): string {\n const filtered = date\n ? events.filter((event) => event.date === date)\n : events;\n if (filtered.length === 0) {\n return date ? `No calendar events for ${date}.` : \"No calendar events yet.\";\n }\n return filtered\n .map(\n (event) =>\n `${event.date} ${event.time} - ${event.title}${event.notes ? `: ${event.notes}` : \"\"}`,\n )\n .join(\"\\n\");\n}\n\nfunction resolveNoteDeleteTarget(\n notes: StickyNote[],\n target: string,\n): StickyNote | { ambiguous: StickyNote[] } | null {\n const normalized = normalizeLookup(target);\n if (!normalized) return null;\n\n const exact = notes.filter(\n (note) =>\n normalizeLookup(note.id) === normalized ||\n normalizeLookup(note.title) === normalized,\n );\n if (exact.length === 1) return exact[0];\n if (exact.length > 1) return { ambiguous: exact };\n\n const titleMatches = notes.filter((note) =>\n normalizeLookup(note.title).includes(normalized),\n );\n if (titleMatches.length === 1) return titleMatches[0];\n if (titleMatches.length > 1) return { ambiguous: titleMatches };\n\n const bodyMatches = notes.filter((note) =>\n normalizeLookup(note.body).includes(normalized),\n );\n if (bodyMatches.length === 1) return bodyMatches[0];\n if (bodyMatches.length > 1) return { ambiguous: bodyMatches };\n\n return null;\n}\n\nfunction result(fields: SimpleViewsInteractFields): SimpleViewsInteractResult {\n return { ...fields, state: simpleViewsSnapshot() };\n}\n\nexport async function interact(\n capability: string,\n params?: Record<string, unknown>,\n): Promise<SimpleViewsInteractResult> {\n if (capability === \"get-notes\") {\n const notes = readNotes();\n return result({\n success: true,\n text: summarizeNotes(notes),\n notes,\n });\n }\n\n if (capability === \"create-note\") {\n const now = nowIso();\n const note: StickyNote = {\n id: makeId(\"note\"),\n title: textParam(params, \"title\") || \"Untitled\",\n body:\n textParam(params, \"body\") || textParam(params, \"content\") || \"New note\",\n color: normalizeColor(params?.color),\n createdAt: now,\n updatedAt: now,\n };\n writeNotes([note, ...readNotes()]);\n return result({\n success: true,\n text: `Created sticky note \"${note.title}\".`,\n created: true,\n note,\n });\n }\n\n if (capability === \"delete-note\") {\n const target =\n textParam(params, \"id\") ||\n textParam(params, \"title\") ||\n textParam(params, \"query\") ||\n textParam(params, \"name\");\n if (!target) {\n return result({\n success: false,\n text: \"Note id, title, or query is required.\",\n deleted: false,\n reason: \"target is required\",\n });\n }\n\n const before = readNotes();\n const resolved = resolveNoteDeleteTarget(before, target);\n if (!resolved) {\n return result({\n success: false,\n text: `No sticky note found for \"${target}\".`,\n deleted: false,\n target,\n });\n }\n if (\"ambiguous\" in resolved) {\n return result({\n success: false,\n text: `\"${target}\" matches multiple sticky notes: ${resolved.ambiguous\n .map((note) => note.title)\n .join(\", \")}.`,\n deleted: false,\n target,\n candidates: resolved.ambiguous,\n });\n }\n\n writeNotes(before.filter((note) => note.id !== resolved.id));\n return result({\n success: true,\n text: `Deleted sticky note \"${resolved.title}\".`,\n deleted: true,\n id: resolved.id,\n note: resolved,\n });\n }\n\n if (capability === \"clear-notes\") {\n writeNotes([]);\n return result({\n success: true,\n text: \"Cleared all sticky notes.\",\n cleared: true,\n });\n }\n\n if (capability === \"get-calendar-state\") {\n const requestedDate = textParam(params, \"date\");\n const selectedDate = requestedDate\n ? normalizeDateKey(requestedDate)\n : readSelectedDate();\n if (!selectedDate) {\n return result({\n success: false,\n text: \"Date must be YYYY-MM-DD.\",\n reason: \"date must be YYYY-MM-DD\",\n });\n }\n const events = readEvents();\n return result({\n success: true,\n text: summarizeEvents(events, selectedDate),\n selectedDate,\n events,\n });\n }\n\n if (capability === \"select-calendar-date\") {\n const date = normalizeDateKey(textParam(params, \"date\"));\n if (!date) {\n return result({\n success: false,\n text: \"Date must be YYYY-MM-DD.\",\n selected: false,\n reason: \"date must be YYYY-MM-DD\",\n });\n }\n writeSelectedDate(date);\n return result({\n success: true,\n text: `Selected ${date}.`,\n selected: true,\n date,\n });\n }\n\n if (capability === \"create-calendar-event\") {\n const requestedDate = textParam(params, \"date\");\n const date = requestedDate\n ? normalizeDateKey(requestedDate)\n : readSelectedDate() || todayDateKey();\n if (!date) {\n return result({\n success: false,\n text: \"Date must be YYYY-MM-DD.\",\n created: false,\n reason: \"date must be YYYY-MM-DD\",\n });\n }\n\n const event: SimpleCalendarEvent = {\n id: makeId(\"event\"),\n title: textParam(params, \"title\") || \"Untitled event\",\n date,\n time: textParam(params, \"time\") || \"09:00\",\n notes: textParam(params, \"notes\"),\n color: normalizeColor(params?.color),\n createdAt: nowIso(),\n };\n writeEvents([...readEvents(), event]);\n writeSelectedDate(date);\n return result({\n success: true,\n text: `Created calendar event \"${event.title}\" for ${event.date} at ${event.time}.`,\n created: true,\n event,\n });\n }\n\n if (capability === \"delete-calendar-event\") {\n const id = textParam(params, \"id\");\n if (!id) {\n return result({\n success: false,\n text: \"Event id is required.\",\n deleted: false,\n reason: \"id is required\",\n });\n }\n\n const before = readEvents();\n const event = before.find((candidate) => candidate.id === id);\n if (!event) {\n return result({\n success: false,\n text: `No calendar event found for \"${id}\".`,\n deleted: false,\n id,\n });\n }\n\n writeEvents(before.filter((candidate) => candidate.id !== id));\n return result({\n success: true,\n text: `Deleted calendar event \"${event.title}\".`,\n deleted: true,\n id,\n event,\n });\n }\n\n throw new Error(`Simple views do not support capability \"${capability}\".`);\n}\n","import { AgentButton, useAgentElement } from \"@elizaos/ui/agent-surface\";\nimport {\n CalendarDays,\n ChevronLeft,\n ChevronRight,\n Plus,\n Settings,\n StickyNote,\n Trash2,\n} from \"lucide-react\";\nimport {\n type CSSProperties,\n type FormEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { interact } from \"./simple-views.interact.js\";\nimport {\n applySimpleViewsSnapshot,\n isSimpleViewsSnapshot,\n normalizeDateKey,\n readSelectedDate,\n SIMPLE_VIEWS_EVENT,\n type SimpleCalendarEvent,\n type SimpleViewsSnapshot,\n type StickyColor,\n type StickyNote as StickyNoteModel,\n simpleViewsSnapshot,\n todayDateKey,\n} from \"./storage.js\";\n\nconst COLORS: StickyColor[] = [\"yellow\", \"green\", \"rose\", \"slate\"];\n\nconst NOTE_COLORS: Record<StickyColor, CSSProperties> = {\n yellow: { background: \"#fff5bf\", borderColor: \"#d9b84b\" },\n green: { background: \"#dff6df\", borderColor: \"#7dbb77\" },\n rose: { background: \"#ffe4ec\", borderColor: \"#d991aa\" },\n slate: { background: \"#e8edf2\", borderColor: \"#9aa8b5\" },\n};\n\nconst EVENT_DOTS: Record<StickyColor, string> = {\n yellow: \"#b88719\",\n green: \"#2f7d46\",\n rose: \"#b84065\",\n slate: \"#586879\",\n};\n\nconst shellStyle: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n minHeight: \"100%\",\n color: \"#15171c\",\n background: \"#f6f7f4\",\n fontFamily:\n \"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, sans-serif\",\n};\n\nconst headerStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 16,\n padding: \"18px 20px 14px\",\n borderBottom: \"1px solid #dde1d8\",\n background: \"#ffffff\",\n};\n\nconst titleWrapStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n minWidth: 0,\n};\n\nconst iconBoxStyle: CSSProperties = {\n display: \"grid\",\n placeItems: \"center\",\n width: 34,\n height: 34,\n border: \"1px solid #d6dbd2\",\n borderRadius: 8,\n background: \"#f2f4ef\",\n color: \"#263326\",\n};\n\nconst h1Style: CSSProperties = {\n margin: 0,\n fontSize: 20,\n lineHeight: \"26px\",\n fontWeight: 700,\n letterSpacing: 0,\n};\n\nconst subTextStyle: CSSProperties = {\n margin: 0,\n color: \"#60695d\",\n fontSize: 13,\n lineHeight: \"18px\",\n};\n\nconst toolbarStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n flexWrap: \"wrap\",\n gap: 8,\n justifyContent: \"flex-end\",\n};\n\nconst buttonStyle: CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 7,\n minHeight: 34,\n border: \"1px solid #c9d0c4\",\n borderRadius: 8,\n padding: \"0 12px\",\n background: \"#ffffff\",\n color: \"#1f271e\",\n fontSize: 13,\n fontWeight: 600,\n cursor: \"pointer\",\n};\n\nconst iconButtonStyle: CSSProperties = {\n ...buttonStyle,\n width: 34,\n padding: 0,\n};\n\nconst primaryButtonStyle: CSSProperties = {\n ...buttonStyle,\n borderColor: \"#476b3b\",\n background: \"#476b3b\",\n color: \"#ffffff\",\n};\n\nconst fieldStyle: CSSProperties = {\n width: \"100%\",\n minHeight: 36,\n border: \"1px solid #c9d0c4\",\n borderRadius: 8,\n padding: \"8px 10px\",\n background: \"#ffffff\",\n color: \"#15171c\",\n font: \"inherit\",\n fontSize: 14,\n lineHeight: \"20px\",\n boxSizing: \"border-box\",\n};\n\nconst panelStyle: CSSProperties = {\n border: \"1px solid #dde1d8\",\n borderRadius: 8,\n background: \"#ffffff\",\n};\n\nasync function fetchSimpleViewsSnapshot(): Promise<SimpleViewsSnapshot | null> {\n if (typeof fetch !== \"function\") return null;\n try {\n const response = await fetch(\"/api/simple-views/state\", {\n headers: { Accept: \"application/json\" },\n });\n if (!response.ok) return null;\n const body = (await response.json()) as unknown;\n return isSimpleViewsSnapshot(body) ? body : null;\n } catch {\n return null;\n }\n}\n\nasync function callSimpleViewsCapability(\n capability: string,\n params?: Record<string, unknown>,\n): Promise<void> {\n if (typeof fetch === \"function\") {\n try {\n const response = await fetch(\"/api/simple-views/interact\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n },\n body: JSON.stringify({ capability, params }),\n });\n if (response.ok) {\n const body = (await response.json()) as unknown;\n if (\n body &&\n typeof body === \"object\" &&\n \"state\" in body &&\n isSimpleViewsSnapshot((body as { state: unknown }).state)\n ) {\n applySimpleViewsSnapshot(\n (body as { state: SimpleViewsSnapshot }).state,\n );\n return;\n }\n }\n } catch {\n // Fall back to local storage below when the optional backend is absent.\n }\n }\n\n await interact(capability, params);\n}\n\nfunction useSimpleViewsSnapshot(): SimpleViewsSnapshot {\n const [snapshot, setSnapshot] = useState(() => simpleViewsSnapshot());\n\n useEffect(() => {\n const refresh = () => setSnapshot(simpleViewsSnapshot());\n const onStorage = () => refresh();\n const onUpdate = () => refresh();\n const onSharedViewEvent = (event: Event) => {\n const detail = (event as CustomEvent<{ type?: unknown }>).detail;\n if (\n detail?.type === \"simple-views:update\" ||\n detail?.type === \"view:notes:updated\" ||\n detail?.type === \"view:simple-calendar:updated\"\n ) {\n refresh();\n }\n };\n\n window.addEventListener(SIMPLE_VIEWS_EVENT, onUpdate);\n window.addEventListener(\"storage\", onStorage);\n window.addEventListener(\"elizaos-view-event\", onSharedViewEvent);\n void fetchSimpleViewsSnapshot().then((next) => {\n if (next) {\n applySimpleViewsSnapshot(next, { preserveLocalDataOnEmpty: true });\n refresh();\n }\n });\n return () => {\n window.removeEventListener(SIMPLE_VIEWS_EVENT, onUpdate);\n window.removeEventListener(\"storage\", onStorage);\n window.removeEventListener(\"elizaos-view-event\", onSharedViewEvent);\n };\n }, []);\n\n return snapshot;\n}\n\ninterface AgentTextInputProps {\n id: string;\n label: string;\n value: string;\n onFill: (value: string) => void;\n group: string;\n placeholder?: string;\n style?: CSSProperties;\n}\n\nfunction AgentTextInput({\n id,\n label,\n value,\n onFill,\n group,\n placeholder,\n style,\n}: AgentTextInputProps) {\n const { ref, agentProps } = useAgentElement<HTMLInputElement>({\n id,\n label,\n role: \"text-input\",\n group,\n fillable: true,\n getValue: () => value,\n onFill,\n });\n return (\n <input\n ref={ref}\n aria-label={label}\n {...agentProps}\n value={value}\n onChange={(event) => onFill(event.target.value)}\n placeholder={placeholder}\n style={{ ...fieldStyle, ...style }}\n />\n );\n}\n\nfunction AgentTextarea({\n id,\n label,\n value,\n onFill,\n group,\n}: AgentTextInputProps) {\n const { ref, agentProps } = useAgentElement<HTMLTextAreaElement>({\n id,\n label,\n role: \"textarea\",\n group,\n fillable: true,\n getValue: () => value,\n onFill,\n });\n return (\n <textarea\n ref={ref}\n aria-label={label}\n {...agentProps}\n value={value}\n onChange={(event) => onFill(event.target.value)}\n rows={5}\n style={{ ...fieldStyle, minHeight: 112, resize: \"vertical\" }}\n />\n );\n}\n\nfunction openSettings(): void {\n if (typeof window === \"undefined\") return;\n window.history.pushState(null, \"\", \"/settings\");\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n}\n\nfunction NoteCard({\n note,\n onDelete,\n}: {\n note: StickyNoteModel;\n onDelete: (id: string) => void;\n}) {\n const cardElement = useAgentElement<HTMLDivElement>({\n id: `note-card-${note.id}`,\n label: `Note: ${note.title}`,\n role: \"card\",\n group: \"notes-list\",\n description: note.body,\n status: note.color,\n });\n const deleteElement = useAgentElement<HTMLButtonElement>({\n id: `delete-note-${note.id}`,\n label: `Delete note ${note.title}`,\n role: \"button\",\n group: \"notes-list\",\n onActivate: () => onDelete(note.id),\n });\n\n return (\n <div\n ref={cardElement.ref}\n {...cardElement.agentProps}\n style={{\n ...NOTE_COLORS[note.color],\n minHeight: 180,\n border: \"1px solid\",\n borderRadius: 8,\n padding: 16,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n boxShadow: \"0 8px 20px rgba(31, 39, 30, 0.08)\",\n }}\n >\n <div\n style={{ display: \"flex\", justifyContent: \"space-between\", gap: 10 }}\n >\n <h2\n style={{\n margin: 0,\n fontSize: 16,\n lineHeight: \"22px\",\n fontWeight: 700,\n overflowWrap: \"anywhere\",\n }}\n >\n {note.title}\n </h2>\n <button\n ref={deleteElement.ref}\n type=\"button\"\n {...deleteElement.agentProps}\n onClick={() => onDelete(note.id)}\n style={{\n ...iconButtonStyle,\n width: 30,\n height: 30,\n minHeight: 30,\n background: \"rgba(255,255,255,0.68)\",\n }}\n title=\"Delete note\"\n >\n <Trash2 size={16} aria-hidden />\n </button>\n </div>\n <p\n style={{\n margin: 0,\n color: \"#253025\",\n fontSize: 14,\n lineHeight: \"21px\",\n whiteSpace: \"pre-wrap\",\n overflowWrap: \"anywhere\",\n }}\n >\n {note.body}\n </p>\n </div>\n );\n}\n\nexport function NotesView() {\n const { notes } = useSimpleViewsSnapshot();\n const [title, setTitle] = useState(\"\");\n const [body, setBody] = useState(\"\");\n const [color, setColor] = useState<StickyColor>(\"yellow\");\n const titleRef = useRef(title);\n const bodyRef = useRef(body);\n\n const setTitleValue = useCallback((value: string) => {\n titleRef.current = value;\n setTitle(value);\n }, []);\n\n const setBodyValue = useCallback((value: string) => {\n bodyRef.current = value;\n setBody(value);\n }, []);\n\n const addNote = useCallback(async () => {\n const nextTitle = titleRef.current.trim();\n const nextBody = bodyRef.current.trim();\n if (!nextTitle && !nextBody) return;\n await callSimpleViewsCapability(\"create-note\", {\n title: nextTitle || \"Untitled\",\n body: nextBody || \"New note\",\n color,\n });\n setTitleValue(\"\");\n setBodyValue(\"\");\n }, [color, setBodyValue, setTitleValue]);\n\n const deleteNote = useCallback((id: string) => {\n void callSimpleViewsCapability(\"delete-note\", { id });\n }, []);\n\n const clearNotes = useCallback(() => {\n void callSimpleViewsCapability(\"clear-notes\");\n }, []);\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n void addNote();\n };\n\n return (\n <main data-testid=\"simple-notes-view\" style={shellStyle}>\n <header style={headerStyle}>\n <div style={titleWrapStyle}>\n <div style={iconBoxStyle}>\n <StickyNote size={18} aria-hidden />\n </div>\n <div>\n <h1 style={h1Style}>Notes</h1>\n <p style={subTextStyle}>{notes.length} sticky notes</p>\n </div>\n </div>\n <div style={toolbarStyle}>\n <AgentButton\n agentId=\"notes-clear\"\n agentLabel=\"Clear notes\"\n onClick={clearNotes}\n style={buttonStyle}\n >\n Clear\n </AgentButton>\n <AgentButton\n agentId=\"notes-open-settings\"\n agentLabel=\"Open settings\"\n onClick={openSettings}\n style={iconButtonStyle}\n title=\"Open settings\"\n >\n <Settings size={16} aria-hidden />\n </AgentButton>\n </div>\n </header>\n\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns:\n \"repeat(auto-fit, minmax(min(100%, 280px), 1fr))\",\n gap: 18,\n padding: 20,\n alignItems: \"start\",\n }}\n >\n <form\n onSubmit={handleSubmit}\n style={{\n ...panelStyle,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n padding: 16,\n }}\n >\n <AgentTextInput\n id=\"note-title\"\n label=\"Note title\"\n value={title}\n onFill={setTitleValue}\n placeholder=\"Title\"\n group=\"note-compose\"\n />\n <AgentTextarea\n id=\"note-body\"\n label=\"Note body\"\n value={body}\n onFill={setBodyValue}\n group=\"note-compose\"\n />\n <div style={{ display: \"flex\", gap: 8, flexWrap: \"wrap\" }}>\n {COLORS.map((option) => (\n <AgentButton\n key={option}\n agentId={`note-color-${option}`}\n agentLabel={`Set note color ${option}`}\n agentRole=\"toggle\"\n agentStatus={color === option ? \"active\" : undefined}\n onClick={() => setColor(option)}\n style={{\n ...buttonStyle,\n background: NOTE_COLORS[option].background,\n borderColor:\n color === option\n ? \"#15171c\"\n : NOTE_COLORS[option].borderColor,\n minWidth: 72,\n textTransform: \"capitalize\",\n }}\n >\n {option}\n </AgentButton>\n ))}\n </div>\n <AgentButton\n agentId=\"add-note\"\n agentLabel=\"Add note\"\n onClick={addNote}\n style={primaryButtonStyle}\n >\n <Plus size={16} aria-hidden />\n Add note\n </AgentButton>\n </form>\n\n <section\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(220px, 1fr))\",\n gap: 16,\n }}\n aria-label=\"Sticky note wall\"\n >\n {notes.map((note) => (\n <NoteCard key={note.id} note={note} onDelete={deleteNote} />\n ))}\n </section>\n </div>\n </main>\n );\n}\n\nfunction dateKey(date: Date): string {\n return todayDateKey(date);\n}\n\nfunction parseDateKey(value: string): Date {\n const normalized = normalizeDateKey(value) ?? todayDateKey();\n const [year, month, day] = normalized.split(\"-\").map((part) => Number(part));\n return new Date(Date.UTC(year, month - 1, day));\n}\n\nfunction monthLabel(date: Date): string {\n return new Intl.DateTimeFormat(\"en\", {\n month: \"long\",\n year: \"numeric\",\n timeZone: \"UTC\",\n }).format(date);\n}\n\nfunction startOfMonth(date: Date): Date {\n return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1));\n}\n\nfunction addMonths(date: Date, amount: number): Date {\n return new Date(\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + amount, 1),\n );\n}\n\nfunction buildCalendarDays(cursor: Date): Date[] {\n const monthStart = startOfMonth(cursor);\n const startOffset = monthStart.getUTCDay();\n const gridStart = new Date(monthStart);\n gridStart.setUTCDate(monthStart.getUTCDate() - startOffset);\n return Array.from({ length: 42 }, (_, index) => {\n const day = new Date(gridStart);\n day.setUTCDate(gridStart.getUTCDate() + index);\n return day;\n });\n}\n\nfunction eventsForDate(\n events: SimpleCalendarEvent[],\n date: string,\n): SimpleCalendarEvent[] {\n return events\n .filter((event) => event.date === date)\n .sort((a: SimpleCalendarEvent, b: SimpleCalendarEvent) =>\n `${a.time} ${a.title}`.localeCompare(`${b.time} ${b.title}`),\n );\n}\n\nfunction CalendarDayButton({\n day,\n selectedDate,\n cursorMonth,\n events,\n onSelect,\n}: {\n day: Date;\n selectedDate: string;\n cursorMonth: number;\n events: SimpleCalendarEvent[];\n onSelect: (date: string) => void;\n}) {\n const key = dateKey(day);\n const isSelected = key === selectedDate;\n const inMonth = day.getUTCMonth() === cursorMonth;\n const dayEvents = eventsForDate(events, key);\n const dayElement = useAgentElement<HTMLButtonElement>({\n id: `calendar-day-${key}`,\n label: `Select ${key}`,\n role: \"button\",\n group: \"simple-calendar-grid\",\n description:\n dayEvents.length > 0\n ? `${dayEvents.length} event${dayEvents.length === 1 ? \"\" : \"s\"}`\n : \"No events\",\n status: isSelected\n ? \"selected\"\n : inMonth\n ? \"current-month\"\n : \"outside-month\",\n onActivate: () => onSelect(key),\n });\n\n return (\n <button\n ref={dayElement.ref}\n type=\"button\"\n {...dayElement.agentProps}\n onClick={() => onSelect(key)}\n style={{\n minWidth: 0,\n minHeight: 78,\n border: isSelected ? \"2px solid #476b3b\" : \"1px solid #dde1d8\",\n borderRadius: 8,\n padding: 6,\n background: inMonth ? \"#ffffff\" : \"#eef1eb\",\n color: inMonth ? \"#15171c\" : \"#687264\",\n textAlign: \"left\",\n cursor: \"pointer\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n }}\n >\n <span style={{ fontWeight: 700, fontSize: 13 }}>{day.getUTCDate()}</span>\n <span style={{ display: \"flex\", gap: 4, flexWrap: \"wrap\" }}>\n {dayEvents.slice(0, 4).map((event) => (\n <span\n key={event.id}\n style={{\n width: 7,\n height: 7,\n borderRadius: 999,\n background: EVENT_DOTS[event.color],\n }}\n />\n ))}\n </span>\n {dayEvents[0] ? (\n <span\n style={{\n fontSize: 11,\n lineHeight: \"15px\",\n color: \"#505b4d\",\n overflowWrap: \"anywhere\",\n }}\n >\n {dayEvents[0].title}\n </span>\n ) : null}\n </button>\n );\n}\n\nfunction EventRow({\n event,\n onDelete,\n}: {\n event: SimpleCalendarEvent;\n onDelete: (id: string) => void;\n}) {\n const rowElement = useAgentElement<HTMLDivElement>({\n id: `calendar-event-${event.id}`,\n label: `Event: ${event.title}`,\n role: \"card\",\n group: \"simple-calendar-events\",\n description: `${event.date} ${event.time}. ${event.notes}`,\n status: event.color,\n });\n const deleteElement = useAgentElement<HTMLButtonElement>({\n id: `delete-calendar-event-${event.id}`,\n label: `Delete calendar event ${event.title}`,\n role: \"button\",\n group: \"simple-calendar-events\",\n onActivate: () => onDelete(event.id),\n });\n\n return (\n <div\n ref={rowElement.ref}\n {...rowElement.agentProps}\n style={{\n display: \"grid\",\n gridTemplateColumns: \"10px minmax(0, 1fr) 32px\",\n gap: 10,\n alignItems: \"center\",\n padding: \"10px 0\",\n borderBottom: \"1px solid #ecefe9\",\n }}\n >\n <span\n style={{\n width: 8,\n height: 34,\n borderRadius: 999,\n background: EVENT_DOTS[event.color],\n }}\n />\n <div style={{ minWidth: 0 }}>\n <div\n style={{\n fontWeight: 700,\n fontSize: 14,\n lineHeight: \"20px\",\n overflowWrap: \"anywhere\",\n }}\n >\n {event.time} - {event.title}\n </div>\n {event.notes ? (\n <div\n style={{\n color: \"#60695d\",\n fontSize: 12,\n lineHeight: \"17px\",\n overflowWrap: \"anywhere\",\n }}\n >\n {event.notes}\n </div>\n ) : null}\n </div>\n <button\n ref={deleteElement.ref}\n type=\"button\"\n {...deleteElement.agentProps}\n onClick={() => onDelete(event.id)}\n style={iconButtonStyle}\n title=\"Delete event\"\n >\n <Trash2 size={16} aria-hidden />\n </button>\n </div>\n );\n}\n\nexport function SimpleCalendarView() {\n const snapshot = useSimpleViewsSnapshot();\n const [selectedDate, setSelectedDate] = useState(() => readSelectedDate());\n const [title, setTitle] = useState(\"\");\n const [time, setTime] = useState(\"09:00\");\n const [notes, setNotes] = useState(\"\");\n const [color, setColor] = useState<StickyColor>(\"green\");\n const selectedDateRef = useRef(selectedDate);\n const titleRef = useRef(title);\n const timeRef = useRef(time);\n const notesRef = useRef(notes);\n const colorRef = useRef(color);\n\n useEffect(() => {\n selectedDateRef.current = snapshot.selectedDate;\n setSelectedDate(snapshot.selectedDate);\n }, [snapshot.selectedDate]);\n\n const setTitleValue = useCallback((value: string) => {\n titleRef.current = value;\n setTitle(value);\n }, []);\n\n const setTimeValue = useCallback((value: string) => {\n timeRef.current = value;\n setTime(value);\n }, []);\n\n const setNotesValue = useCallback((value: string) => {\n notesRef.current = value;\n setNotes(value);\n }, []);\n\n const setColorValue = useCallback((value: StickyColor) => {\n colorRef.current = value;\n setColor(value);\n }, []);\n\n const cursor = useMemo(\n () => startOfMonth(parseDateKey(selectedDate)),\n [selectedDate],\n );\n const days = useMemo(() => buildCalendarDays(cursor), [cursor]);\n const selectedEvents = useMemo(\n () => eventsForDate(snapshot.events, selectedDate),\n [snapshot.events, selectedDate],\n );\n\n const selectDate = useCallback((date: string) => {\n const normalizedDate = normalizeDateKey(date);\n if (!normalizedDate) return;\n selectedDateRef.current = normalizedDate;\n setSelectedDate(normalizedDate);\n void callSimpleViewsCapability(\"select-calendar-date\", {\n date: normalizedDate,\n });\n }, []);\n\n const moveMonth = useCallback(\n (amount: number) => {\n selectDate(dateKey(addMonths(cursor, amount)));\n },\n [cursor, selectDate],\n );\n\n const selectToday = useCallback(() => {\n selectDate(dateKey(new Date()));\n }, [selectDate]);\n\n const addEvent = useCallback(async () => {\n const eventTitle = titleRef.current.trim();\n if (!eventTitle) return;\n await callSimpleViewsCapability(\"create-calendar-event\", {\n title: eventTitle,\n date: selectedDateRef.current,\n time: timeRef.current || \"09:00\",\n notes: notesRef.current.trim(),\n color: colorRef.current,\n });\n setTitleValue(\"\");\n setNotesValue(\"\");\n }, [setNotesValue, setTitleValue]);\n\n const deleteEvent = useCallback((id: string) => {\n void callSimpleViewsCapability(\"delete-calendar-event\", { id });\n }, []);\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n void addEvent();\n };\n\n return (\n <main data-testid=\"simple-calendar-view\" style={shellStyle}>\n <header style={headerStyle}>\n <div style={titleWrapStyle}>\n <div style={iconBoxStyle}>\n <CalendarDays size={18} aria-hidden />\n </div>\n <div>\n <h1 style={h1Style}>Simple Calendar</h1>\n <p style={subTextStyle}>\n {monthLabel(cursor)} - {snapshot.events.length} events\n </p>\n </div>\n </div>\n <div style={toolbarStyle}>\n <AgentButton\n agentId=\"calendar-prev-month\"\n agentLabel=\"Previous month\"\n onClick={() => moveMonth(-1)}\n style={iconButtonStyle}\n title=\"Previous month\"\n >\n <ChevronLeft size={16} aria-hidden />\n </AgentButton>\n <AgentButton\n agentId=\"calendar-today\"\n agentLabel=\"Go to today\"\n onClick={selectToday}\n style={buttonStyle}\n >\n Today\n </AgentButton>\n <AgentButton\n agentId=\"calendar-next-month\"\n agentLabel=\"Next month\"\n onClick={() => moveMonth(1)}\n style={iconButtonStyle}\n title=\"Next month\"\n >\n <ChevronRight size={16} aria-hidden />\n </AgentButton>\n <AgentButton\n agentId=\"calendar-open-settings\"\n agentLabel=\"Open settings\"\n onClick={openSettings}\n style={iconButtonStyle}\n title=\"Open settings\"\n >\n <Settings size={16} aria-hidden />\n </AgentButton>\n </div>\n </header>\n\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns:\n \"repeat(auto-fit, minmax(min(100%, 320px), 1fr))\",\n gap: 18,\n padding: 20,\n alignItems: \"start\",\n }}\n >\n <section style={{ ...panelStyle, padding: 14 }}>\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(7, minmax(0, 1fr))\",\n gap: 8,\n marginBottom: 8,\n color: \"#60695d\",\n fontSize: 12,\n fontWeight: 700,\n textAlign: \"center\",\n }}\n >\n {[\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"].map((day) => (\n <div key={day}>{day}</div>\n ))}\n </div>\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(7, minmax(0, 1fr))\",\n gap: 8,\n }}\n >\n {days.map((day) => (\n <CalendarDayButton\n key={dateKey(day)}\n day={day}\n selectedDate={selectedDate}\n cursorMonth={cursor.getUTCMonth()}\n events={snapshot.events}\n onSelect={selectDate}\n />\n ))}\n </div>\n </section>\n\n <aside\n style={{\n ...panelStyle,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n padding: 16,\n }}\n >\n <div>\n <h2 style={{ ...h1Style, fontSize: 17, lineHeight: \"23px\" }}>\n {selectedDate}\n </h2>\n <p style={subTextStyle}>\n {selectedEvents.length} event\n {selectedEvents.length === 1 ? \"\" : \"s\"}\n </p>\n </div>\n\n <form onSubmit={handleSubmit} style={{ display: \"grid\", gap: 10 }}>\n <AgentTextInput\n id=\"calendar-event-title\"\n label=\"Calendar event title\"\n value={title}\n onFill={setTitleValue}\n placeholder=\"Event title\"\n group=\"simple-calendar-compose\"\n />\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"minmax(0, 1fr) minmax(88px, 112px)\",\n gap: 8,\n }}\n >\n <AgentTextInput\n id=\"calendar-event-date\"\n label=\"Calendar event date\"\n value={selectedDate}\n onFill={selectDate}\n group=\"simple-calendar-compose\"\n />\n <AgentTextInput\n id=\"calendar-event-time\"\n label=\"Calendar event time\"\n value={time}\n onFill={setTimeValue}\n group=\"simple-calendar-compose\"\n />\n </div>\n <AgentTextarea\n id=\"calendar-event-notes\"\n label=\"Calendar event notes\"\n value={notes}\n onFill={setNotesValue}\n group=\"simple-calendar-compose\"\n />\n <div style={{ display: \"flex\", gap: 8, flexWrap: \"wrap\" }}>\n {COLORS.map((option) => (\n <AgentButton\n key={option}\n agentId={`calendar-event-color-${option}`}\n agentLabel={`Set calendar event color ${option}`}\n agentRole=\"toggle\"\n agentStatus={color === option ? \"active\" : undefined}\n onClick={() => setColorValue(option)}\n style={{\n ...buttonStyle,\n background: NOTE_COLORS[option].background,\n borderColor:\n color === option\n ? \"#15171c\"\n : NOTE_COLORS[option].borderColor,\n minWidth: 72,\n textTransform: \"capitalize\",\n }}\n >\n {option}\n </AgentButton>\n ))}\n </div>\n <AgentButton\n agentId=\"add-calendar-event\"\n agentLabel=\"Add calendar event\"\n onClick={addEvent}\n style={primaryButtonStyle}\n >\n <Plus size={16} aria-hidden />\n Add event\n </AgentButton>\n </form>\n\n <div>\n {selectedEvents.map((event) => (\n <EventRow key={event.id} event={event} onDelete={deleteEvent} />\n ))}\n </div>\n </aside>\n </div>\n </main>\n );\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elizaos/plugin-simple-views",
3
- "version": "2.0.3-beta.5",
3
+ "version": "2.0.3-beta.6",
4
4
  "type": "module",
5
5
  "description": "Small agent-drivable Notes and Simple Calendar app views for view switching, split-pane, and capability QA.",
6
6
  "main": "./dist/index.js",
@@ -79,8 +79,8 @@
79
79
  "build:types": "tsc --noCheck -p tsconfig.build.json"
80
80
  },
81
81
  "dependencies": {
82
- "@elizaos/core": "2.0.3-beta.5",
83
- "@elizaos/ui": "2.0.3-beta.5",
82
+ "@elizaos/core": "2.0.3-beta.6",
83
+ "@elizaos/ui": "2.0.3-beta.6",
84
84
  "lucide-react": "^1.0.0"
85
85
  },
86
86
  "peerDependencies": {
@@ -111,5 +111,5 @@
111
111
  "dist",
112
112
  "assets"
113
113
  ],
114
- "gitHead": "ff6157011c9459670021cc28a6797592a78b8817"
114
+ "gitHead": "990dc996172b3e0fb525a75052a5ac28a4cd4de5"
115
115
  }