attach_file_to_time_log
ChatGPTAttach a file to an existing time log, by id (from list_time_logs or the id returned by create_time_log). Pass exactly one source: file, a file the user has put in this chat (a photo, screenshot or PDF), or upload_id, a file you uploaded yourself via create_attachment_upload (optionally with file_name). Same limits as the REPSLog app: JPEG, PNG or GIF images, PDF, Word or Excel files, up to 10 MB each (HEIC/WebP photos are not supported). It adds the file; nothing existing is changed or removed. Only attach files the user wants on that entry, after confirming which time log each belongs to.
create_attachment_upload
ChatGPTStep 1 of attaching a file that YOU (the client) hold, such as a file on disk or in your own storage, to a time log. Returns a private, write-only upload_url valid for 15 minutes. Upload the file bytes with an HTTP PUT to upload_url, sending the returned headers exactly as given (max 10 MB), then call attach_file_to_time_log with the time log id and this upload_id. One upload_id per file; it can be attached once. Do NOT use this for a file the user attached in a ChatGPT chat: pass that file to attach_file_to_time_log directly as file.
create_time_log
ChatGPTCreate a REPS work time log (task) for the authenticated user. Requires a propertyId, a description, and durationMinutes.
create_time_logs
ChatGPTCreate several REPS work time logs in one call (1 to 50 entries). Use it when the user wants to log many entries at once, such as a whole week; for a single entry use create_time_log. Each entry takes the same fields as create_time_log (propertyId, description, durationMinutes, optional categoryId, performedOn, performedBy), with ids from list_properties / list_categories. Each entry is validated and created independently, so partial success is possible: the result lists what was created (with each entry's index and id) and what failed (index, code, message). Indexes are 0-based positions in the entries array you sent. Report the failures to the user and only retry the failed entries, never the whole batch (code 'not-attempted' entries were skipped after an unexpected error and are safe to retry; for 'internal-server-error' check list_time_logs first). An entry identical to one logged moments ago is not duplicated. Show the user the full list of entries and get their approval before calling.
delete_time_log
ChatGPTDelete a time log by id (from list_time_logs). Removes it from the user's logs immediately. There is no in-app undo, so treat it as permanent and always confirm with the user before calling.
get_breakdown
ChatGPTBreak down a year of logged hours by property, category, and participant (defaults to the current year), read from precomputed stats so totals match the REPSLog app. Optional propertyType (str|ltr) filter. Renders a tabbed card with bars and a category pie.
get_dashboard
ChatGPTA full REPS dashboard for the year (defaults to the current year): goal ring + totals + breakdowns by property / category / participant, in one card. Returns pre-aggregated stats read from the REPSLog app's own stat tree (no raw entries) so it is accurate and cheap.
get_goal_progress
ChatGPTProgress toward the user's REPS hour goal for the year. Adapts to their case: LTR combined (500 material-participation incl. you/spouse split, or 750 total REPS hours) and/or STR per-property (100/500). Renders a goal ring.
get_hours_summary
ChatGPTAggregate logged hours for a year (defaults to the current year), read from precomputed stats so totals match the REPSLog app exactly. Optionally scope to ONE of property / category / participant, and narrow by propertyType (str|ltr). Returns total/LTR/STR hours + per-property breakdown. For arbitrary date ranges, use list_time_logs.
get_stats
ChatGPTFlexible, precomputed REPS hour stats — use this for ANY aggregation instead of listing entries. Period: a year (default current), optionally narrowed to one month (1-12), or allTime. groupBy returns a breakdown by property, category (year only), participant, or month (every month of the year); omit for a single total. Optionally scope to one propertyId or participantId, and narrow STR vs LTR with propertyType. Every result is read from precomputed stats (one cheap read). Unsupported combinations (category per-month/all-time, category with a property or participant filter, or any all-time breakdown) are rejected — do NOT fall back to listing time logs for those.
get_time_log_attachments
ChatGPTShow the attachments (photos, PDFs, documents) of ONE time log, by id (from list_time_logs), in a card with image thumbnails and file links. Use this whenever the user wants to see or open an entry's attachments or pick one to remove; list_time_logs only reports which entries have attachments. The card already displays the images and file links itself, so do NOT embed images, image markdown or the attachment URLs in your reply (ChatGPT blocks them and shows a broken image); just mention file names and link to the time log. The links in the card are fresh and expire after 1 hour, so call this again instead of reusing old links. Each attachment has an id for remove_attachment_from_time_log.
get_user_settings
ChatGPTReturn the whitelisted subset of the user's settings (propertiesType, international properties flag).
list_categories
ChatGPTList the user's work categories (id + name).
list_participants
ChatGPTList the user's participants (id + name).
list_properties
ChatGPTList all of the user's properties (id, nickname, address, isSTR). Takes no arguments; users have only a handful of properties.
list_time_logs
ChatGPTList INDIVIDUAL time-log entries, newest first, with optional date / property / category / propertyType (str|ltr) filters and cursor pagination. Use ONLY when the user explicitly wants to see, find, edit, or delete specific entries, or for an arbitrary day-level date range or keyword search. NEVER use this to total, count, or break down hours — use get_stats for any aggregation (it is accurate and cheap; summing listed entries is not).
remove_attachment_from_time_log
ChatGPTRemove one attachment (photo, PDF, Word or Excel file) from a time log. Pass the time log id and the attachment id (not the name or url) exactly as returned in the attachments array of list_time_logs; list again first if you do not have them. Show the user which file it is (its name) before removing. The file is deleted from the entry and from REPSLog storage, the same as removing it in the app, and cannot be undone. Always confirm with the user which attachment to remove before calling.
update_time_log
ChatGPTEdit an existing time log by id (from list_time_logs). Pass only the fields to change: propertyId, durationMinutes, description, categoryId, performedOn, performedBy. STR/LTR is re-derived from the property.
whoami
ChatGPTIdentify the connected REPSLog account (email, display name, plan/entitlement, and STR/LTR property mode). Use to confirm who you are acting for.