feat: journal dashboard widgets, agent polish, and edit-mode live previews
CI / checks (push) Failing after 2m7s
CI / build (push) Successful in 4m36s

Journal dashboard widgets and quick-add; rich-text quick-add dialogs.

Dashboard draft sync for live edit previews; assistant bubble + API tools.

Journal UX: stress slider, mood grid, query cap fix.
This commit is contained in:
ginnoir
2026-07-04 22:03:45 -05:00
parent 4a924a4107
commit a09747c314
76 changed files with 4594 additions and 611 deletions
+286
View File
@@ -314,6 +314,103 @@ components:
properties:
occurredOn: { type: string, format: date }
CareLog:
type: object
properties:
id: { type: string, format: uuid }
careType: { type: string }
notes: { type: string, nullable: true }
performedAt: { type: string, format: date-time }
performedBy: { type: string, format: uuid, nullable: true }
CareLogInput:
type: object
required: [careType]
properties:
careType: { type: string }
notes: { type: string, nullable: true }
performedAt: { type: string, format: date-time }
CareSchedule:
type: object
properties:
id: { type: string, format: uuid }
careType: { type: string }
intervalDays: { type: integer }
lastPerformedAt: { type: string, format: date-time, nullable: true }
nextDueAt: { type: string, format: date-time, nullable: true }
enabled: { type: boolean }
daysUntilDue: { type: integer, nullable: true }
isOverdue: { type: boolean }
CareScheduleInput:
type: object
required: [careType, intervalDays]
properties:
careType: { type: string }
intervalDays: { type: integer, minimum: 1, maximum: 365 }
enabled: { type: boolean }
CareScheduleToggleInput:
type: object
required: [enabled]
properties:
enabled: { type: boolean }
ScheduleOnCalendarInput:
type: object
required: [calendarId]
properties:
calendarId: { type: string, format: uuid }
reminderMinutesBefore: { type: integer, nullable: true }
ShareableEntityType:
type: object
properties:
type: { type: string }
label: { type: string }
defaultCapabilities:
type: array
items: { type: string }
ShareLink:
type: object
properties:
id: { type: string, format: uuid }
entityType: { type: string }
entityId: { type: string, format: uuid }
createdAt: { type: string, format: date-time }
expiresAt: { type: string, format: date-time, nullable: true }
capabilities:
type: object
properties:
read: { type: boolean }
write: { type: boolean }
ShareLinkCreateInput:
type: object
required: [entityType, entityId]
properties:
entityType: { type: string }
entityId: { type: string, format: uuid }
expiresAt: { type: string, format: date-time, nullable: true }
capabilities:
type: object
properties:
read: { type: boolean }
write: { type: boolean }
ShareLinkCreated:
type: object
properties:
url: { type: string, format: uri }
expiresAt: { type: string, format: date-time, nullable: true }
PushOverdueResult:
type: object
properties:
added: { type: integer }
paths:
/api/v1/calendars:
get:
@@ -791,6 +888,193 @@ paths:
application/json:
schema: { $ref: "#/components/schemas/OkResponse" }
/api/v1/garden/plants/{id}/care-logs:
parameters:
- name: id
in: path
required: true
schema: { type: string, format: uuid }
get:
summary: List care logs for a plant
tags: [Garden]
parameters:
- name: limit
in: query
schema: { type: integer, minimum: 1, maximum: 100, default: 20 }
responses:
"200":
content:
application/json:
schema:
type: array
items: { $ref: "#/components/schemas/CareLog" }
post:
summary: Log care performed on a plant
tags: [Garden]
requestBody:
required: true
content:
application/json:
schema: { $ref: "#/components/schemas/CareLogInput" }
responses:
"201":
content:
application/json:
schema: { $ref: "#/components/schemas/CareLog" }
/api/v1/garden/plants/{id}/care-schedules:
parameters:
- name: id
in: path
required: true
schema: { type: string, format: uuid }
get:
summary: List care schedules for a plant
tags: [Garden]
responses:
"200":
content:
application/json:
schema:
type: array
items: { $ref: "#/components/schemas/CareSchedule" }
post:
summary: Create or update a care schedule
tags: [Garden]
requestBody:
required: true
content:
application/json:
schema: { $ref: "#/components/schemas/CareScheduleInput" }
responses:
"201":
content:
application/json:
schema: { $ref: "#/components/schemas/CareSchedule" }
/api/v1/garden/care-schedules/{id}:
parameters:
- name: id
in: path
required: true
schema: { type: string, format: uuid }
patch:
summary: Enable or disable a care schedule
tags: [Garden]
requestBody:
required: true
content:
application/json:
schema: { $ref: "#/components/schemas/CareScheduleToggleInput" }
responses:
"200":
content:
application/json:
schema: { $ref: "#/components/schemas/OkResponse" }
delete:
summary: Delete a care schedule
tags: [Garden]
responses:
"200":
content:
application/json:
schema: { $ref: "#/components/schemas/OkResponse" }
/api/v1/garden/care-schedules/{id}/calendar:
parameters:
- name: id
in: path
required: true
schema: { type: string, format: uuid }
post:
summary: Add next due care to calendar
tags: [Garden]
requestBody:
required: true
content:
application/json:
schema: { $ref: "#/components/schemas/ScheduleOnCalendarInput" }
responses:
"201":
content:
application/json:
schema: { $ref: "#/components/schemas/OkResponse" }
/api/v1/garden/overdue-care/push:
post:
summary: Push overdue care items to task list
tags: [Garden]
responses:
"201":
content:
application/json:
schema: { $ref: "#/components/schemas/PushOverdueResult" }
/api/v1/share-links:
get:
summary: List share links or shareable entity types
tags: [Sharing]
parameters:
- name: entityTypes
in: query
schema: { type: string, enum: ["true"] }
description: When true, returns shareable entity types instead of links
- name: entityType
in: query
schema: { type: string }
- name: entityId
in: query
schema: { type: string, format: uuid }
responses:
"200":
content:
application/json:
schema:
oneOf:
- type: array
items: { $ref: "#/components/schemas/ShareLink" }
- type: array
items: { $ref: "#/components/schemas/ShareableEntityType" }
post:
summary: Create a share link
tags: [Sharing]
requestBody:
required: true
content:
application/json:
schema: { $ref: "#/components/schemas/ShareLinkCreateInput" }
responses:
"201":
content:
application/json:
schema: { $ref: "#/components/schemas/ShareLinkCreated" }
/api/v1/share-links/{id}:
parameters:
- name: id
in: path
required: true
schema: { type: string, format: uuid }
delete:
summary: Revoke a share link
tags: [Sharing]
responses:
"200":
content:
application/json:
schema: { $ref: "#/components/schemas/OkResponse" }
/api/v1/openapi:
get:
summary: OpenAPI specification (YAML)
tags: [Meta]
responses:
"200":
description: OpenAPI 3.1 YAML document
content:
application/yaml:
schema: { type: string }
/api/v1/bangs:
get:
summary: Bang stats (total + recent)
@@ -916,4 +1200,6 @@ tags:
- name: Notes
- name: Journal
- name: Garden
- name: Sharing
- name: Bangs
- name: Meta