{"server":"com.youspot/youspot","count":50,"changes":[{"tool":"what_your_day_did","kind":"added","observed_at":"2026-10-09T14:02:46.301Z","fields":[],"description_before":null,"description_after":"What Your day did for the user over the last `days` days (default 7): the briefs it wrote, every note it sent and how ('sent_from_gmail' went out from their Gmail; 'opened_in_gmail' opened a prefilled Gmail window, so the user pressed send there or not), which of those it sent without asking because the user had let that kind of note go unasked, notes that failed, waited too long and were not sent, or are still waiting, and every yes, edit, dismiss and answer the user gave on an item. Call this for 'what did Your day send?', 'did anything go out for me?' and 'what did I approve this week?'. Read-only.","description_similarity":null,"before_hash":null,"after_hash":"1b12aa008d67cd3bae84236e784b0235"},{"tool":"my_day","kind":"added","observed_at":"2026-10-09T14:02:46.301Z","fields":[],"description_before":null,"description_after":"Today's Your day brief as it was written this morning: the Do list (each person, who they are to the user, why now, its state: 'ready' to send, 'question' waiting on one answer, or 'headsup' to read, the drafted note and what the user already decided on it), the Know lines, Coming up, What ran, and the page link, and `brand`: today's LinkedIn post and up to three conversations worth joining, each with a drafted comment. Pass `date` (YYYY-MM-DD) for an earlier day. Pass `person` (a name, email or Brain object id) to get every item about that person from the last seven days of briefs instead. Call this for 'what do I need to do today?' and 'what's on my plate?' before anything else, and answer with the Do list first. Read-only: it never runs the brief again.","description_similarity":null,"before_hash":null,"after_hash":"06a1b504c4cfd49702d06e4a6c4cbe4d"},{"tool":"save_text_file","kind":"added","observed_at":"2026-10-09T14:02:46.301Z","fields":[],"description_before":null,"description_after":"Save text as a file the user can download from their Second Brain, most often a CSV: a contact list, an export, a table they want in a spreadsheet or another tool. Also .tsv, .txt, .md and .json. Files written anywhere else (a sandbox, a temp folder) are gone when you finish and the user never sees them, so this is the only way to hand over a file. Never tell the user a file is ready unless this returned saved: true. Link it in your reply as [filename](download_url).","description_similarity":null,"before_hash":null,"after_hash":"4211878d038467d6505b9a54d12a8cc8"},{"tool":"start_your_day","kind":"added","observed_at":"2026-10-09T08:01:37.901Z","fields":[],"description_before":null,"description_after":"Turn Your day on for the user and start writing their first brief now, from their inbox. Call this when they ask to start Your day, their morning brief, their relationship brief or their personal branding brief, or say yes to one. Pass `brief` when they named one: 'relationship' (who needs a reply or a nudge today, note written) or 'branding' (who engaged with their posts, next post drafted). The first brief takes a few minutes; the brief card under your reply waits for it and fills in, so say it is being written and stop.","description_similarity":null,"before_hash":null,"after_hash":"4572fc8b94e505db8641da072c04a439"},{"tool":"draft_slack_message","kind":"added","observed_at":"2026-10-09T08:01:37.901Z","fields":[],"description_before":null,"description_after":"Write a Slack message for the user, to a person (`to`: their name, email or Slack id) or a channel (`channel_id`). Nothing posts: the draft is saved in the user's own Slack, in that DM or channel, for them to send from Slack. If their Slack install predates drafts, chat shows the message with Copy, Open in Slack and a Reconnect link, and for a channel the bot is in, a Send button posts it as YouSpot. Use this whenever the user asks you to write, draft or prepare a Slack message, and call it again with the revised text when they want changes. Write in the user's voice: short paragraphs, '- ' bullets, **bold** for the one thing that matters, [label](url) links, and <@U…> to mention someone by Slack id.","description_similarity":null,"before_hash":null,"after_hash":"a27d1d5723a917493dad6b7350bc2b1b"},{"tool":"send_slack_message","kind":"changed","observed_at":"2026-10-09T08:01:37.901Z","fields":["description"],"description_before":"Post a message to a Slack channel or DM as YouSpot, optionally as a reply in a thread. Only channels the bot has been invited to work; use list_slack_channels to find ids. Write it the way you would write anything else: '## ' headings, '- ' bullets, **bold**, and [label](url) links all render, and Slack's own *bold* and <url|label> do too. Confirm with the user before posting anywhere others can see it.","description_after":"Post a message to a Slack channel as YouSpot right now, optionally as a reply in a thread. Only for text the user already approved word for word in this conversation, or for an agent delivering its own report. When the user asks you to write, draft or prepare a Slack message, use draft_slack_message instead: nothing posts until they tap Send on the card. Only channels the bot has been invited to work; use list_slack_channels to find ids. '## ' headings, '- ' bullets, **bold** and [label](url) links all render.","description_similarity":0.463,"before_hash":"cdea9c2886991c308854379e74c025ad","after_hash":"3908aaac0a28e872884f35bb51a30fe5"},{"tool":"create_gmail_draft","kind":"changed","observed_at":"2026-10-09T08:01:37.901Z","fields":["description"],"description_before":"Create a DRAFT email in the user's connected Gmail mailbox, addressed to anyone ('draft an email to jane@acme.com about X'). Nothing is sent: the draft lands in Gmail's Drafts folder for the user to review, edit, and send themselves. Compose a specific subject and a plain-text body (no HTML or markdown) in the user's voice. Use this whenever the user wants an email written to someone else; send_email remains only for mailing the user their own address. Only works on mailboxes connected under a legacy modify grant; current connections are read-only and cannot create drafts; the tool says so if not.","description_after":"Draft an email in Gmail to anyone ('draft an email to jane@acme.com about X'). Nothing is sent. Chat shows the draft as a card with the recipients, subject and body, and Open in Gmail opens it as a Gmail draft, filled in, for the user to review and send. Works with or without a connected mailbox. Write a specific subject and a plain-text body in the user's voice: short paragraphs separated by a blank line, '- ' for a list, no markdown emphasis or headings. Use this whenever the user wants an email written to someone else; send_email remains only for mailing the user their own address.","description_similarity":0.511,"before_hash":"a5dd4f8bb40de4a9214075e3da7acf30","after_hash":"beea8249c0909f369a2341ccacd277f5"},{"tool":"update_brand_kit","kind":"changed","observed_at":"2026-10-09T01:27:12.329Z","fields":["inputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"b1e7bc058d3afb456a2e01696658188c","after_hash":"c0d2c23fe35756e70483a0cefcf3aade"},{"tool":"create_brand_kit","kind":"changed","observed_at":"2026-10-09T01:27:12.329Z","fields":["inputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"b0438cd26d5cbdbb017d8041410512c5","after_hash":"749bdecebd304e19d33f8842ccd0e8d3"},{"tool":"set_notification_emails","kind":"changed","observed_at":"2026-10-09T01:27:12.329Z","fields":["description","inputSchema"],"description_before":"Turn the recurring emails YouSpot itself sends the user off or back on, when they ask to stop getting one, unsubscribe, or resume it. The emails: exec_briefings is the daily 'Daily Briefing' built from their Second Brain; post_reports is the 'Your posts' section of that briefing (a LinkedIn post that is new or gaining traction); process_emails are the one-off notices when an import or sync finishes; agent_emails is the mail their cloud agents and LinkedIn or X watchers send (the agents keep running, only the email stops); tracker_updates is the email when a web page tracker finds a change. Pass only the settings they mean, false to stop. When they say 'this email' or 'the one I just got' without naming it, call with no arguments first: the result names the last email YouSpot sent them and the setting behind it, then call again with that setting false. This is for YouSpot's own mail only; for newsletters or senders in their Gmail use the Gmail tools. Confirm in plain words what is now off (or on) and that they can change it any time at the settings_url returned.","description_after":"Turn the recurring emails YouSpot itself sends the user off or back on, when they ask to stop getting one, unsubscribe, or resume it. The emails: exec_briefings is the daily 'Daily Briefing' built from their Second Brain; post_reports is the 'Your posts' section of that briefing (a LinkedIn post that is new or gaining traction); process_emails are the one-off notices when an import or sync finishes; agent_emails is the mail their cloud agents and LinkedIn or X watchers send (the agents keep running, only the email stops); tracker_updates is the email when a web page tracker finds a change; checkout_reminders are the at most two notes after they leave a checkout unfinished. Pass only the settings they mean, false to stop. When they say 'this email' or 'the one I just got' without naming it, call with no arguments first: the result names the last email YouSpot sent them and the setting behind it, then call again with that setting false. This is for YouSpot's own mail only; for newsletters or senders in their Gmail use the Gmail tools. Confirm in plain words what is now off (or on) and that they can change it any time at the settings_url returned.","description_similarity":0.935,"before_hash":"658cd0f756ef9611a4570688385cb65c","after_hash":"a48b83090ac949c0c0f68dc603c6b176"},{"tool":"manage_web_watch","kind":"changed","observed_at":"2026-10-08T19:52:38.778Z","fields":["description"],"description_before":"Change one of this person's web watches, named by monitor_key from get_web_watches. action check_now: check it right away instead of waiting for its schedule; anything new arrives as a change in a minute or two, read it with get_web_watches. pause or resume: the watch and its agent together. stop: stop for good and pause its agent; what it found stays readable. update: a new frequency, or what is watched: watch for a page (a fresh first read follows; Pages only. What to watch: 'everything' (the default) for any meaningful change on the page, a preset (pricing, team, products, jobs, headline) for those fields only, or the person's own words, e.g. 'the number of open engineering roles'.), query or domains for a topic.","description_after":"Change one of this person's web watches, named by monitor_key from get_web_watches. action check_now: check it right away instead of waiting for its schedule; anything new arrives as a change in a minute or two, read it with get_web_watches. A paused watch is not checked, and one still taking its first read answers status baseline. pause or resume: the watch and its agent together. stop: stop for good and pause its agent; what it found stays readable. update: a new frequency, or what is watched: watch for a page (a fresh first read follows; Pages only. What to watch: 'everything' (the default) for any meaningful change on the page, a preset (pricing, team, products, jobs, headline) for those fields only, or the person's own words, e.g. 'the number of open engineering roles'.), query or domains for a topic.","description_similarity":0.913,"before_hash":"56d9811da337380fee81dba48d3c8f18","after_hash":"cc42f68a875faebaf894c5ca9066c5e9"},{"tool":"analyze_recent_posts","kind":"changed","observed_at":"2026-10-08T08:38:08.685Z","fields":["description"],"description_before":"The raw material for an engagement analysis of the user's most recent LinkedIn posts: per-post stats, a sample of the actual comments left on them (who said what), and the LinkedIn headlines of everyone who engaged. Use when they ask for an analysis of their recent posts, what people are saying about them, or who their audience is. From the returned data, cover: what's getting traction, one or two key insights from the commentary including its overall sentiment, and an audience breakdown (roles, seniority, industries) drawn from the headlines. top_engagers ranks the commenters and reactors by LinkedIn follower count, for questions like who the most-followed people engaging were; people whose profile we have not fetched are left out of it. Pass activity_id (from a linkedin_post object's json_data) to look at one post. When comments_synced is false the engagement sync has not run for them yet: analyze the stats alone and say the comment data is still syncing.","description_after":"The raw material for an engagement analysis of the user's most recent LinkedIn posts: per-post stats, a sample of the actual comments left on them (who said what), and the LinkedIn headlines of everyone who engaged. Use when they ask for an analysis of their recent posts, what people are saying about them, or who their audience is. From the returned data, cover: what's getting traction, one or two key insights from the commentary including its overall sentiment, and an audience breakdown (roles, seniority, industries) drawn from the headlines. top_engagers ranks the commenters and reactors by LinkedIn follower count, for questions like who the most-followed people engaging were; people whose profile we have not fetched are left out of it. Pass activity_id (from a linkedin_post object's json_data) to look at one post. engagement_sync says why no engagers came back: 'off' means the comments and reactions sync is not turned on, so give them setup_url to turn it on; 'blocked' means it cannot run, and note says why; 'outside_window' means only posts from the last week are read, so these have none; 'pending' means the first sync has not run yet, so ask them to try again shortly; 'no_engagement_yet' means it ran and found no one. In every case analyze the stats alone and pass the note on; never say the data is still syncing unless engagement_sync is 'pending'.","description_similarity":0.716,"before_hash":"331870faeae05ba5393537afbe168d5f","after_hash":"ebc213a5e24528869b29c03549b3ccb6"},{"tool":"search_graph_objects","kind":"changed","observed_at":"2026-10-08T08:38:08.685Z","fields":["description","inputSchema"],"description_before":"Search the user's graph by matching a term against object names and descriptions — plus semantic matching over text-bearing objects (notes, facts, posts, links, files, emails), so a search finds what the user means, not just exact words. Use this to find a specific thing they mentioned — a person, company, file, saved web link, or fact — when you don't have its object_id. Optionally restrict to one type. Returns matches with their object_id for follow-up with get_graph_object.","description_after":"Search the user's graph by matching a term against object names and descriptions, plus semantic matching over text-bearing objects (notes, facts, posts, links, files, emails), so a search finds what the user means, not just exact words. Use this to find a specific thing they mentioned (a person, company, file, saved web link, or fact) when you don't have its object_id. Optionally restrict to one type. A reply the user saved from chat is type 'chat', not 'note': search without a type, or with type 'chat', to find one. Returns matches with their object_id for follow-up with get_graph_object.","description_similarity":0.92,"before_hash":"f5a6ca085aacbfc44ccdf45f0a3668da","after_hash":"5a44c1f536d7eb643a4235800c369331"},{"tool":"save_file_from_url","kind":"changed","observed_at":"2026-10-08T08:38:08.685Z","fields":["description"],"description_before":"Download a file from a public http(s) URL and store it in the user's Second Brain as a file object — use when the user shares a direct link to a PDF, image, spreadsheet, or other file and asks to save, download, or keep it. The saved file shows up with their uploads and can be read afterwards with read_file. Not for web pages (that is read_web_page with save=true) and not for files behind a sign-in. Files over 50MB are refused.","description_after":"Download a file from a public http(s) URL and store it in the user's Second Brain as a file object. Use it when the user shares a direct link to a PDF, image, spreadsheet, or other file and asks to save, download, or keep it. The saved file shows up with their uploads and can be read afterwards with read_file. Not for web pages (that is read_web_page with save=true) and not for files behind a sign-in. Files over 50MB are refused.","description_similarity":1,"before_hash":"fb4f8a0bfb968ec87e14da85f1de5e75","after_hash":"5ac3aac6bc891338433218e758c78ef0"},{"tool":"read_file","kind":"changed","observed_at":"2026-10-08T08:38:08.685Z","fields":["description"],"description_before":"Read the content of a file the user uploaded, use this when the answer may live in a document in their Second Brain: schedules, itineraries, contracts, exports, scans. PDFs and images are returned as the actual document, so tables and scanned pages read correctly. Find the file first with search_graph_objects (type 'file') and pass its object_id, or pass part of the filename as name.","description_after":"Read the content of a file the user uploaded, use this when the answer may live in a document in their Second Brain: schedules, itineraries, contracts, exports, scans, decks. PDFs and images are returned as the actual document, so tables and scanned pages read correctly. Word (.docx), PowerPoint (.pptx) and Excel (.xlsx) files come back as their extracted text; text and Markdown files as written. Long text is cut after about 200 KB. Find the file first with search_graph_objects (type 'file') and pass its object_id, or pass part of the filename as name.","description_similarity":0.708,"before_hash":"df8efede84b108bcc50adb459ffdd831","after_hash":"6c640998ec47e466e58e0d562b12855f"},{"tool":"purge_graph_object","kind":"changed","observed_at":"2026-10-07T20:44:42.211Z","fields":["description"],"description_before":"Permanently delete one object from the user's graph, along with every connection touching it. Hard delete, no undo — confirm with the user before calling, and only when they asked for the deletion. Prefer delete_graph_object, which is reversible and asks the user to confirm on a card; use this one only when they have said they want the data gone. To remove a single connection and keep both objects, use disconnect_graph_objects instead.","description_after":"Permanently delete one object from the user's graph, along with every connection touching it. Hard delete, no undo — confirm with the user before calling, and only when they asked for the deletion. Prefer delete_graph_object, which is reversible and asks the user to confirm on a card; use this one only when they have said they want the data gone. Purging a file or image also deletes the stored file from their Files. To remove a single connection and keep both objects, use disconnect_graph_objects instead.","description_similarity":0.85,"before_hash":"dfb804c71a5b0418caba049bc699fa19","after_hash":"c95c3ec844cbba7d6c594dd682362f29"},{"tool":"delete_graph_objects","kind":"changed","observed_at":"2026-10-07T20:44:42.211Z","fields":["description","inputSchema"],"description_before":"Delete EVERY object of one type from the user's graph, however many there are: what to reach for when they ask to clear out a whole category ('delete all my HubSpot contacts') rather than one record. Deleting one object is delete_graph_object instead. This delete is permanent, and at this scale it is the only kind that helps: a synced portal can be millions of records. Use only when the user explicitly asked for a category to go, never on your own initiative, and name one type per call (contacts and companies are two calls). In chat this tool deletes nothing: it counts the records and returns instructions for a confirmation card, and the user's click starts the deletion.","description_after":"Delete EVERY object of one type from the user's graph, however many there are: what to reach for when they ask to clear out a whole category ('delete all my HubSpot contacts') rather than one record. Pass import_id instead to delete everything one import added (its contacts, companies, notes and files, the uploaded file and the import itself); imports are graph objects of type 'import_run'. Pass source 'linkedin_import' instead to delete every connection a LinkedIn export loaded and the people made from them. Deleting one object is delete_graph_object instead. This delete is permanent, and at this scale it is the only kind that helps: a synced portal can be millions of records. Use only when the user explicitly asked for these to go, never on your own initiative, and name one type, import or source per call. In chat this tool deletes nothing: it counts the records and returns what to tell the user, and their click starts the deletion.","description_similarity":0.71,"before_hash":"185b9652822e113d0acca6d1d9816a2b","after_hash":"d63a27c8c1edc87f6d5f4bbd25def52a"},{"tool":"manage_web_watch","kind":"added","observed_at":"2026-10-07T02:07:17.915Z","fields":[],"description_before":null,"description_after":"Change one of this person's web watches, named by monitor_key from get_web_watches. action check_now: check it right away instead of waiting for its schedule; anything new arrives as a change in a minute or two, read it with get_web_watches. pause or resume: the watch and its agent together. stop: stop for good and pause its agent; what it found stays readable. update: a new frequency, or what is watched: watch for a page (a fresh first read follows; Pages only. What to watch: 'everything' (the default) for any meaningful change on the page, a preset (pricing, team, products, jobs, headline) for those fields only, or the person's own words, e.g. 'the number of open engineering roles'.), query or domains for a topic.","description_similarity":null,"before_hash":null,"after_hash":"56d9811da337380fee81dba48d3c8f18"},{"tool":"get_web_watches","kind":"added","observed_at":"2026-10-07T02:07:17.915Z","fields":[],"description_before":null,"description_after":"Read this person's web watches and what they found. No arguments: every page and topic watch with what it watches, how often, its status and when it last checked and last found something. monitor_key alone: that watch and its ten latest changes. changes: true: the change and finding history, newest first, narrowed by monitor_key, domain (e.g. 'acme.com', every watched page there), since (YYYY-MM-DD), kind and limit; use it for 'what changed on competitor sites this week'. Topic findings carry their date, text and sources. change_id: one change in full, with its line diff (- removed, + added) or the fields' before and after values.","description_similarity":null,"before_hash":null,"after_hash":"d391f5f2903046038d2e2bdf2d84b8f9"},{"tool":"watch_web","kind":"added","observed_at":"2026-10-07T02:07:17.915Z","fields":[],"description_before":null,"description_after":"Start watching the web for this person: a page (url) for changes, or a topic (query, optionally limited to some domains) for anything new published about it. Creates a Cloud Agent that runs `prompt` each time something turns up. Use it, not draft_cloud_agent, for 'tell me when <page> changes' or 'let me know about <topic>'. Pass exactly one of url or query; a topic finds only what appears after it starts. preview: true reads a page the way a watch would and saves nothing (1 credit): 'everything' answers at once, a preset or description returns a preview_key while the read runs (a minute or two); call again with preview: true and that preview_key for the read, and pass the same preview_key when starting the watch to reuse it. Returns the monitor and the agent; a preset's first read shows status pending_baseline. In the YouSpot chat it creates nothing: it returns a draft_id for the confirmation card, which creates the agent when the person taps. The card shows the page as read, so in chat a page watch reads the page once for 1 credit unless preview_key is passed.","description_similarity":null,"before_hash":null,"after_hash":"0ffcc6606ccb19e6784a8b79b1141e03"},{"tool":"send_daily_briefing","kind":"added","observed_at":"2026-10-07T02:07:17.915Z","fields":[],"description_before":null,"description_after":"Write the user's Daily Briefing now and email it to them, when they ask for it: 'send me my daily briefing', 'brief me', 'email me my briefing'. It covers what is new since the last briefing they were sent, and is sent even if the daily email is turned off. Queues the work and returns; the email arrives in a minute or two, so say it is on its way, not that it arrived. Pass focus only when they name a topic to lead with.","description_similarity":null,"before_hash":null,"after_hash":"5453cf6defec46798d12376c9705e355"},{"tool":"get_my_plan","kind":"changed","observed_at":"2026-10-07T02:07:17.915Z","fields":["description"],"description_before":"The user's current YouSpot plan and credit balance, plus which plan they could move to. Call it before answering anything about pricing, plans, upgrading, credits or limits (brain cap, mailboxes, model). The response names the upgrade_plan value to emit; the card that renders from it does the purchase, so never say a payment happened.","description_after":"The user's current YouSpot plan and credit balance, plus which plan they could move to. Call it before answering anything about pricing, plans, upgrading, credits or limits (brain cap, mailboxes, model, watched pages: Free 3 checked weekly, Solo and Pro unlimited). The response names the upgrade_plan value to emit; the card that renders from it does the purchase, so never say a payment happened.","description_similarity":0.842,"before_hash":"51b883f88136e4dd080b68af0ae98fcb","after_hash":"4c63645f1f002cd8f9a68f434e0bb407"},{"tool":"extract_web_page","kind":"added","observed_at":"2026-10-07T02:07:17.915Z","fields":[],"description_before":null,"description_after":"Read up to five public pages at once and get back the passages that answer an objective, e.g. 'the price of each plan' or 'who is on the leadership team'. Faster and cheaper than read_web_page for pulling specific facts, and handles PDFs. Pass full_content=true for the whole page as Markdown. Costs 1 credit per call.","description_similarity":null,"before_hash":null,"after_hash":"2eab124eda7e975122627dc2ecb3b437"},{"tool":"check_page_changes","kind":"changed","observed_at":"2026-10-07T02:07:17.915Z","fields":["description","inputSchema"],"description_before":"Check whether a public web page has changed since the last time this was called for it, and get the diff. Use for watching one page over time: a company's team or leadership page, a pricing page, a careers page — anything where the change is the news. The first call records a baseline and reports no change, which is normal. Pass your own agent id as `tag` so two watchers on the same page do not consume each other's changes. For the contents of a page use read_web_page; for the open web use web_search.","description_after":"Check whether a public web page has changed since the last time this was called for it, and get the diff. Use for watching one page over time: a company's team or leadership page, a pricing page, a careers page, anything where the change is the news. The first call records a baseline and reports no change, which is normal. Pass your own agent id as `tag` so two watchers on the same page do not consume each other's changes. For the contents of a page use read_web_page; for the open web use web_search.","description_similarity":1,"before_hash":"dd17113a131854e7b28bc7d2eb8fc907","after_hash":"751a92b698291f0c861301c4d4d24fa6"},{"tool":"get_object_card","kind":"added","observed_at":"2026-10-06T20:27:50.912Z","fields":[],"description_before":null,"description_after":"One brain object by id, for a view drawing an object_card.","description_similarity":null,"before_hash":null,"after_hash":"87c4996d9f224b5ac26915ba4a2ca3cf"},{"tool":"get_company_card","kind":"added","observed_at":"2026-10-06T20:27:50.912Z","fields":[],"description_before":null,"description_after":"The relationship card for one company, for a view drawing a company_card.","description_similarity":null,"before_hash":null,"after_hash":"86d592140f707f17ac84d1cfb1f97c30"},{"tool":"get_person_card","kind":"added","observed_at":"2026-10-06T20:27:50.912Z","fields":[],"description_before":null,"description_after":"The relationship card for one person, for a view drawing a person_card.","description_similarity":null,"before_hash":null,"after_hash":"779ee3c77b865092b14819be158fef9c"},{"tool":"list_duplicate_suggestions","kind":"added","observed_at":"2026-10-05T00:42:26.150Z","fields":[],"description_before":null,"description_after":"List pairs of contacts in the user's graph that look like the same person, as found by the duplicate scan. status 'to_review' (default) is the pairs nobody has answered yet; 'linked' is the pairs the user said are the same person, each marked merged or not. Read-only. To merge a linked pair, call merge_graph_objects with preview=true first, then let the user confirm.","description_similarity":null,"before_hash":null,"after_hash":"adaac28e6bb506356d2c60603e7c50a0"},{"tool":"get_calendar_events","kind":"changed","observed_at":"2026-10-05T00:42:26.150Z","fields":["description","inputSchema"],"description_before":"List events from the user's connected calendars, Google and Outlook together, ordered by start time: summary, start/end, location, organizer, attendees and their RSVP status, a meeting link when there is one, and which provider and account each event came from (Outlook events carry a web_link that opens them in Outlook). With no time range it returns upcoming events from now. `time_min` and `time_max` are RFC3339 timestamps ('2026-08-19T00:00:00Z'), so 'what's on my calendar tomorrow' is time_min/time_max spanning that day; past ranges work too. `query` free-text matches event titles, descriptions, and attendees. For 'how many meetings' questions over long ranges (a quarter, a year), set count_only=true; it sweeps the whole range and returns the total plus a per-month breakdown instead of the events themselves, so a 12-month count is one call. By default this reads each account's main calendar; to read a named calendar ('my Family calendar'), get its id from list_google_calendars or list_outlook_calendars, then pass calendar_id together with that account. If the result says no calendar is connected (or the account lacks calendar access), show the user the message and link them to https://youspot.com/user/integrations/gmail.","description_after":"List events from the user's connected calendars, Google and Outlook together, ordered by start time: summary, start/end, location, organizer, attendees and their RSVP status, a meeting link when there is one, and which provider and account each event came from (Outlook events carry a web_link that opens them in Outlook). With no time range it returns upcoming events from now. `time_min` and `time_max` are RFC3339 timestamps ('2026-08-19T00:00:00Z'), so 'what's on my calendar tomorrow' is time_min/time_max spanning that day; past ranges work too. `query` free-text matches event titles, descriptions, and attendees. For 'how many meetings' questions over long ranges (a quarter, a year), set count_only=true; it sweeps the whole range and returns the total plus a per-month breakdown instead of the events themselves, so a 12-month count is one call. By default this reads each account's main calendar. When a Google account can list its calendars, the result carries available_calendars (name, id, access role), shared calendars included: pass a calendar's name or id as calendar_id ('Family') to read it, or all_calendars=true to read every calendar at once. For an Outlook calendar, get its id from list_outlook_calendars. If the result says no calendar is connected (or the account lacks calendar access), show the user the message and link them to https://youspot.com/user/integrations/gmail.","description_similarity":0.894,"before_hash":"2ade2da590ebb62cf703fe85d9472099","after_hash":"aa9bd0e7ba7157a6caf53af972d408f7"},{"tool":"agent_reply","kind":"added","observed_at":"2026-10-05T00:42:26.150Z","fields":[],"description_before":null,"description_after":"Read what an agent answered to a message_agent call. Returns status 'running' while it works, 'replied' with the reply text once it has answered, or 'failed'. Wait at least a minute between checks.","description_similarity":null,"before_hash":null,"after_hash":"6fdd78278b07ef8fdc8e58498562593d"},{"tool":"message_agent","kind":"added","observed_at":"2026-10-05T00:42:26.150Z","fields":[],"description_before":null,"description_after":"Send a message to one of the user's own agents by its handle (the name after the @ on its page) and start a run with it. Use this when the user asks you to hand something to a named agent: '@research, what changed at Acme?'. It returns at once with a trace_id; the agent's answer takes a minute or more, so read it later with agent_reply. Pass conversation_id to keep the exchange in one thread.","description_similarity":null,"before_hash":null,"after_hash":"40c5677529407ec1cc6c0883d97d637f"},{"tool":"read_artifact","kind":"changed","observed_at":"2026-10-05T00:42:26.150Z","fields":["description"],"description_before":"Return a generated item itself, for showing it where a YouSpot link cannot be opened: a social image comes back as the PNG, a PDF as an image of each page, an email, document or Substack post as its text. Takes an artifact_id from a generator or list_artifacts. A draft comes back watermarked; the user unlocks the clean copy for a credit.","description_after":"Return a generated item itself, for showing it where a YouSpot link cannot be opened: a social image comes back as the PNG, a PDF as an image of each page, an email, document or Substack post as its text. Takes an artifact_id from a generator or list_artifacts. A draft comes back watermarked; the user unlocks the clean copy for a credit, or at no charge on a Solo or Pro plan.","description_similarity":0.87,"before_hash":"6b76ecf6feb5ad54f8f1a9ec59ff35fa","after_hash":"b91c51113f1466eb3dcb4ecabc87e224"},{"tool":"generate_pdf","kind":"changed","observed_at":"2026-10-05T00:42:26.150Z","fields":["description"],"description_before":"Render one branded PDF in a brand kit and save it to the user's files: any document the user describes, from an invoice or a statement to a one-pager, a proposal, a memo, a case study, an agenda or a report. Drafts are limited to 20 per day. Templates: 'invoice' takes items of description, quantity, unit_price, up to 30 plus props invoice_number, issued_on, due_on, bill_to, currency, tax_rate, notes; 'statement' takes items of description, date, amount, up to 30 plus props account, account_of, period_start, period_end, currency, opening_balance, notes; 'report' takes markdown or blocks plus props subtitle, author, dated; 'letter' takes markdown or blocks plus props recipient, dated, signoff; 'proposal' takes markdown or blocks plus props client, valid_until, prepared_by. A document template renders whatever markdown you give it, so an unfamiliar ask (a press release, a checklist, a brief) is still a report, letter or proposal with the right headings. Line item fields are all strings, and every date is YYYY-MM-DD. Write a document as markdown (headings, lists, tables) or as blocks, never both, and its first heading becomes the title unless you pass a title. Leave brand_kit_id out to use the space's default brand. Returns the artifact id and how many pages it came to. It costs 1 credit. Do not call this again to retry.","description_after":"Render one branded PDF in a brand kit and save it to the user's files: any document the user describes, from an invoice or a statement to a one-pager, a proposal, a memo, a case study, an agenda or a report. Drafts are limited to 20 per day. Templates: 'invoice' takes items of description, quantity, unit_price, up to 30 plus props invoice_number, issued_on, due_on, bill_to, currency, tax_rate, notes; 'statement' takes items of description, date, amount, up to 30 plus props account, account_of, period_start, period_end, currency, opening_balance, notes; 'report' takes markdown or blocks plus props subtitle, author, dated; 'letter' takes markdown or blocks plus props recipient, dated, signoff; 'proposal' takes markdown or blocks plus props client, valid_until, prepared_by. A document template renders whatever markdown you give it, so an unfamiliar ask (a press release, a checklist, a brief) is still a report, letter or proposal with the right headings. Line item fields are all strings, and every date is YYYY-MM-DD. Write a document as markdown (headings, lists, tables) or as blocks, never both, and its first heading becomes the title unless you pass a title. Leave brand_kit_id out to use the space's default brand. Returns the artifact id and how many pages it came to. It costs 1 credit, or nothing on a Solo or Pro plan. Do not call this again to retry.","description_similarity":0.972,"before_hash":"01a2118328fe11bfaa4de1d962e62bf7","after_hash":"db6484196702bd94458a66c78ef141f9"},{"tool":"show_view","kind":"added","observed_at":"2026-10-05T00:42:26.150Z","fields":[],"description_before":null,"description_after":"Draw a view in the conversation for hosts that show MCP Apps: a saved view by artifact_id, or view source you wrote after calling view_components. The view runs its own Queries through the host, so call data tools first only to learn the shapes they return. Saves nothing; call generate_view to keep it.","description_similarity":null,"before_hash":null,"after_hash":"ca73de169556ef6673a46caef864e432"},{"tool":"generate_substack_post","kind":"changed","observed_at":"2026-10-05T00:42:26.150Z","fields":["description"],"description_before":"Draft one Substack post and save it to the user's files, ready to paste into their Substack editor. Nothing is published and nothing is sent. Drafts are limited to 20 per day. Templates: 'post' takes signoff; 'digest' takes intro, signoff. Write the body as markdown (paragraphs, lists, links) or as blocks, never both. The title and subtitle are the post's own headline and standfirst. audience is everyone, paid or founding. It costs 1 credit. Do not call this again to retry.","description_after":"Draft one Substack post and save it to the user's files, ready to paste into their Substack editor. Nothing is published and nothing is sent. Drafts are limited to 20 per day. Templates: 'post' takes signoff; 'digest' takes intro, signoff. Write the body as markdown (paragraphs, lists, links) or as blocks, never both. The title and subtitle are the post's own headline and standfirst. audience is everyone, paid or founding. It costs 1 credit, or nothing on a Solo or Pro plan. Do not call this again to retry.","description_similarity":0.924,"before_hash":"9ff92a894cb0a65742ab3044b763dbc1","after_hash":"5c295701f2b531e4e532171edb59dc54"},{"tool":"generate_email","kind":"changed","observed_at":"2026-10-05T00:42:26.150Z","fields":["description"],"description_before":"Render one branded email in a brand kit and save it to the user's files: any email the user describes, from a cold intro or a follow-up to a newsletter, an invitation, a launch note or a receipt. Nothing is sent. Drafts are limited to 20 per day. Templates: 'letter' takes preheader, signoff, footer_note; 'announcement' takes headline (required), preheader, cta_label, cta_url, signoff, footer_note; 'newsletter' takes issue_label, headline (required), preheader, cta_label, cta_url, signoff, footer_note; 'invitation' takes invite_label, event_name (required), when, where, preheader, cta_label, cta_url, signoff, footer_note; 'notification' takes status_label, headline (required), cta_label, cta_url, footer_note; 'onboarding' takes headline (required), preheader, cta_label, cta_url, signoff, footer_note; 'receipt' takes headline (required), order_label, order_date, cta_label, cta_url, footer_note. Pick the template whose shape fits the job and write the subject, props and body yourself in the user's voice; the template is a layout, not a limit on what the email can say. Write the body as markdown (paragraphs, lists, links, tables) or as blocks, never both. header 'band' paints the header in the brand color, 'plain' keeps it white; align is left or center; both default to the template's layout. Leave brand_kit_id out to use the space's default brand. It costs 1 credit. Returns the artifact id; call draft_email_in_gmail with it. Do not call this again to retry.","description_after":"Render one branded email in a brand kit and save it to the user's files: any email the user describes, from a cold intro or a follow-up to a newsletter, an invitation, a launch note or a receipt. Nothing is sent. Drafts are limited to 20 per day. Templates: 'letter' takes preheader, signoff, footer_note; 'announcement' takes headline (required), preheader, cta_label, cta_url, signoff, footer_note; 'newsletter' takes issue_label, headline (required), preheader, cta_label, cta_url, signoff, footer_note; 'invitation' takes invite_label, event_name (required), when, where, preheader, cta_label, cta_url, signoff, footer_note; 'notification' takes status_label, headline (required), cta_label, cta_url, footer_note; 'onboarding' takes headline (required), preheader, cta_label, cta_url, signoff, footer_note; 'receipt' takes headline (required), order_label, order_date, cta_label, cta_url, footer_note. Pick the template whose shape fits the job and write the subject, props and body yourself in the user's voice; the template is a layout, not a limit on what the email can say. Write the body as markdown (paragraphs, lists, links, tables) or as blocks, never both. header 'band' paints the header in the brand color, 'plain' keeps it white; align is left or center; both default to the template's layout. Leave brand_kit_id out to use the space's default brand. It costs 1 credit, or nothing on a Solo or Pro plan. Returns the artifact id; call draft_email_in_gmail with it. Do not call this again to retry.","description_similarity":0.975,"before_hash":"4b6a0dfc6b095f2146e8155f4202affb","after_hash":"60bbc5740a464addf802fbdc86eba17f"},{"tool":"generate_og_image","kind":"changed","observed_at":"2026-10-05T00:42:26.150Z","fields":["description"],"description_before":"Render one branded image in a brand kit for 1 credit and save it to the user's files: a link preview card, a social post, a story, a cover photo, a profile banner or a thumbnail. Drafts are limited to 20 per day. template_id 'simple' takes props label, title and description; 'blog' takes category, title, excerpt, author and meta; 'image' draws only the background and takes title, a name for the image. title is required. size picks the canvas for where it will be posted: 'og' 1200x630 (The card X, LinkedIn, Slack and iMessage show under a link); 'square' 1080x1080 (An Instagram, LinkedIn or Facebook feed post); 'portrait' 1080x1350 (A taller Instagram or LinkedIn feed post); 'story' 1080x1920 (An Instagram or Facebook story, or a Reels cover); 'landscape' 1280x720 (A YouTube thumbnail or a 16:9 slide); 'facebook_cover' 1640x624 (A Facebook page or profile cover photo, shown at 820 by 312); 'linkedin_banner' 1584x396 (The background image on a LinkedIn profile); 'x_header' 1500x500 (The header image on an X profile). Write the text yourself from what the user said and their brand; never leave a field blank because they did not dictate it. Leave brand_kit_id out to use the space's default brand. background_file_id puts a photo behind the text: an id from generate_image_background or an image the user uploaded. Do not call this again to retry. Returns the artifact id.","description_after":"Render one branded image in a brand kit for 1 credit, or nothing on a Solo or Pro plan, and save it to the user's files: a link preview card, a social post, a story, a cover photo, a profile banner or a thumbnail. Drafts are limited to 20 per day. template_id 'simple' takes props label, title and description; 'blog' takes category, title, excerpt, author and meta; 'image' draws only the background and takes title, a name for the image. title is required. size picks the canvas for where it will be posted: 'og' 1200x630 (The card X, LinkedIn, Slack and iMessage show under a link); 'square' 1080x1080 (An Instagram, LinkedIn or Facebook feed post); 'portrait' 1080x1350 (A taller Instagram or LinkedIn feed post); 'story' 1080x1920 (An Instagram or Facebook story, or a Reels cover); 'landscape' 1280x720 (A YouTube thumbnail or a 16:9 slide); 'facebook_cover' 1640x624 (A Facebook page or profile cover photo, shown at 820 by 312); 'linkedin_banner' 1584x396 (The background image on a LinkedIn profile); 'x_header' 1500x500 (The header image on an X profile). Write the text yourself from what the user said and their brand; never leave a field blank because they did not dictate it. Leave brand_kit_id out to use the space's default brand. background_file_id puts a photo behind the text: an id from generate_image_background or an image the user uploaded. Do not call this again to retry. Returns the artifact id.","description_similarity":0.97,"before_hash":"84a4ab81ea991a1f7fb47f3957ab1a3f","after_hash":"0ec19de3183f6f46facccef532e7dd03"},{"tool":"set_notification_emails","kind":"changed","observed_at":"2026-10-03T06:02:48.714Z","fields":["description","inputSchema"],"description_before":"Turn the recurring emails YouSpot itself sends the user off or back on, when they ask to stop getting one, unsubscribe, or resume it. The emails: exec_briefings is the daily 'Exec Briefing' built from their Second Brain; post_reports is the 'Your posts' section of that briefing (a LinkedIn post that is new or gaining traction); process_emails are the one-off notices when an import or sync finishes; agent_emails is the mail their cloud agents and LinkedIn or X watchers send (the agents keep running, only the email stops); tracker_updates is the email when a web page tracker finds a change. Pass only the settings they mean, false to stop. When they say 'this email' or 'the one I just got' without naming it, call with no arguments first: the result names the last email YouSpot sent them and the setting behind it, then call again with that setting false. This is for YouSpot's own mail only; for newsletters or senders in their Gmail use the Gmail tools. Confirm in plain words what is now off (or on) and that they can change it any time at the settings_url returned.","description_after":"Turn the recurring emails YouSpot itself sends the user off or back on, when they ask to stop getting one, unsubscribe, or resume it. The emails: exec_briefings is the daily 'Daily Briefing' built from their Second Brain; post_reports is the 'Your posts' section of that briefing (a LinkedIn post that is new or gaining traction); process_emails are the one-off notices when an import or sync finishes; agent_emails is the mail their cloud agents and LinkedIn or X watchers send (the agents keep running, only the email stops); tracker_updates is the email when a web page tracker finds a change. Pass only the settings they mean, false to stop. When they say 'this email' or 'the one I just got' without naming it, call with no arguments first: the result names the last email YouSpot sent them and the setting behind it, then call again with that setting false. This is for YouSpot's own mail only; for newsletters or senders in their Gmail use the Gmail tools. Confirm in plain words what is now off (or on) and that they can change it any time at the settings_url returned.","description_similarity":1,"before_hash":"8ffc8ce1b3d3bf2d2178a61d5df2a8c1","after_hash":"658cd0f756ef9611a4570688385cb65c"},{"tool":"view_components","kind":"changed","observed_at":"2026-10-02T23:59:15.431Z","fields":["description"],"description_before":"Every component and builtin a view can use, with its arguments, how Query, Mutation and Action work, the edit rules for a view patch, and the tools a Query may run for this user. Call it before writing any view source or view patch, including the source for generate_view or update_view. Takes no arguments.","description_after":"Every component and builtin a view can use (layout, charts, tables, Markdown, post cards, images and live cards), with its arguments, how Query, Mutation and Action work, the edit rules for a view patch, and the tools a Query may run for this user. Call it before writing any view source or view patch, including the source for generate_view or update_view. Takes no arguments.","description_similarity":0.826,"before_hash":"cb0867a9144d0995eafecbec8f5bbc3e","after_hash":"20913a0f73d0a47058ab79247f1f1150"},{"tool":"generate_view","kind":"changed","observed_at":"2026-10-02T23:59:15.431Z","fields":["description"],"description_before":"Save a view the user wants to keep: UI in the view language that renders with live data. Takes the source, the spec_version it was written against, an optional title and optional state. saved_template_id starts from a view template saved earlier; anything you pass replaces its value. Views are free: no watermark and nothing to unlock. Returns the artifact_id.","description_after":"Save a view the user wants to keep: a page in the view language that renders with live data, like a dashboard, a Markdown document, a feed of posts or a page of generated emails and images. Takes the source, the spec_version it was written against, an optional title and optional state. saved_template_id starts from a view template saved earlier; anything you pass replaces its value. Views are free: no watermark and nothing to unlock. Returns the artifact_id.","description_similarity":0.79,"before_hash":"75985deb8d4b765523ce45b22f456db4","after_hash":"bcbb0a1e4c246e754854a65c0aad3e82"},{"tool":"search_linkedin_posts","kind":"changed","observed_at":"2026-10-02T23:59:15.431Z","fields":["description"],"description_before":"Search public LinkedIn posts by keywords and store the matches in the user's brain automatically — do not re-save them with graph tools. LinkedIn search matches loosely and returns posts that never say the keywords; those are verified away here and never stored, so what you get back has been checked, and discarded_count says how many were thrown out. The response splits posts into 'new' (never seen by this user before) and 'seen' (already stored on an earlier run). When running as a scheduled watcher, only report or email when 'new' is non-empty, and never include 'seen' posts. Link a post with [label](object:<object_id>) using the returned object ids. Pass found_by_object_id (your own agent node id, the id inside the [object:...] marker at the end of your instructions) so finds are filed under that agent.","description_after":"Search public LinkedIn posts by keywords. In chat, and for a watcher agent that collects posts, the matches are stored in the user's brain automatically, so do not re-save them with graph tools; an agent that only reads posts gets them back unstored, with no object ids. LinkedIn search matches loosely and returns posts that never say the keywords; those are verified away here and never stored, so what you get back has been checked, and discarded_count says how many were thrown out. The response splits posts into 'new' (never seen by this user before) and 'seen' (already stored on an earlier run). When running as a scheduled watcher, only report or email when 'new' is non-empty, and never include 'seen' posts. Link a post with [label](object:<object_id>) using the returned object ids. Pass found_by_object_id (your own agent node id, the id inside the [object:...] marker at the end of your instructions) so finds are filed under that agent.","description_similarity":0.925,"before_hash":"2009fb94fd5e9a4bb3c3fb4159c6b553","after_hash":"5a1dc008440cdf5526cce4ffb34df56c"},{"tool":"set_linkedin_manager","kind":"added","observed_at":"2026-10-02T17:54:05.365Z","fields":[],"description_before":null,"description_after":"Turn the user's LinkedIn manager on, pause it, or say what it is set to. On, it runs daily: plans the week from their recent work when there is no plan, drafts the posts in it, checks what went up against it, nudges once on a quiet Thursday, and names people they know who engaged, by email and only when there is something to say. It never posts. Use for 'turn on the LinkedIn manager', 'pause my LinkedIn emails', 'is my LinkedIn manager on'. The same switch is on its card in Agents and on the Scheduled tab.","description_similarity":null,"before_hash":null,"after_hash":"13340cb76a4881bb77386d7f47e9cc29"},{"tool":"draft_my_planned_posts","kind":"added","observed_at":"2026-10-02T17:54:05.365Z","fields":[],"description_before":null,"description_after":"Write every post in this week's post plan as a draft, in the user's own voice, saved to their brain as a note per post and linked to the plan. Posts that already have a draft are left as they are. Use for 'write the posts in my plan', 'draft this week's posts', 'write them all'. For one post from finished work that is not on a plan, use the restate skill instead. Nothing is posted to LinkedIn: the user copies the draft and posts it. error no_plan means there is no plan this week, so offer to make one first. Link each draft as [subject](/graph/object/<object_id> \"note\") and say they can edit anything, then end with [See your week](/linkedin/manager), the page where they can read, copy and schedule each one.","description_similarity":null,"before_hash":null,"after_hash":"bcb3c2939214186be2607b2ef7cf91ce"},{"tool":"my_linkedin_week","kind":"added","observed_at":"2026-10-02T17:54:05.365Z","fields":[],"description_before":null,"description_after":"How this week is going on LinkedIn against the user's own post plan: the plan's subjects and whether each has a draft, what they posted this week and which plan subject each post was, the people they already know who reacted or commented (dormant first), and whether a nudge is due on Thursday. Use for 'how's my LinkedIn week going', 'did I post what I planned', 'who engaged with my post', 'who saw my post'. It never names strangers and has no impressions or follower counts; do not offer those. When plan is null, there is no plan for this week: offer to make one (the post-plan skill). When a subject has a draft_id, link it as [the draft](/graph/object/<draft_id> \"note\"). When plan is set, end with [See your week](/linkedin/manager), the page with the plan, its drafts, what went up and who noticed. switch says whether the daily LinkedIn manager is on, paused or off.","description_similarity":null,"before_hash":null,"after_hash":"6d370c9b6cbb1cf281f48ee6b1723dd9"},{"tool":"restore_graph_objects","kind":"added","observed_at":"2026-10-02T17:54:05.365Z","fields":[],"description_before":null,"description_after":"Bring back objects the user deleted, up to 200 object_ids in one call: the undo for delete_graph_object and delete_selected_graph_objects. Only the user's own deleted objects come back. A record that was merged into another is not restored here; unmerge_graph_objects undoes a merge. Permanently purged objects are gone and cannot be restored.","description_similarity":null,"before_hash":null,"after_hash":"7a1fd65cb6119ea08a8ba1fb389cd9fb"},{"tool":"delete_selected_graph_objects","kind":"added","observed_at":"2026-10-02T17:54:05.365Z","fields":[],"description_before":null,"description_after":"Delete a given list of objects from the user's graph, up to 200 object_ids in one call. Use only when the user explicitly asked for these particular objects to go, never to tidy up on your own initiative. The delete is soft and reversible: the objects drop out of lists, search and chat, and restore_graph_objects with the returned deleted_ids brings them back. One object is delete_graph_object; every object of a type is delete_graph_objects. Only objects the user owns are deleted, never their root user node; the rest come back as skipped. Not available in the YouSpot chat, where the user ticks the rows in their lists instead.","description_similarity":null,"before_hash":null,"after_hash":"9368094effe1ff70d753be4d21e46e4b"},{"tool":"view_components","kind":"added","observed_at":"2026-10-02T00:06:36.903Z","fields":[],"description_before":null,"description_after":"Every component and builtin a view can use, with its arguments, how Query, Mutation and Action work, the edit rules for a view patch, and the tools a Query may run for this user. Call it before writing any view source or view patch, including the source for generate_view or update_view. Takes no arguments.","description_similarity":null,"before_hash":null,"after_hash":"cb0867a9144d0995eafecbec8f5bbc3e"},{"tool":"update_view","kind":"added","observed_at":"2026-10-02T00:06:36.903Z","fields":[],"description_before":null,"description_after":"Change a saved view in place: new source, title, spec_version or state. Pass only what changes. The artifact_id, its brain object and any share link stay the same.","description_similarity":null,"before_hash":null,"after_hash":"087831863ddef236be2953dc06d8aff1"},{"tool":"generate_view","kind":"added","observed_at":"2026-10-02T00:06:36.903Z","fields":[],"description_before":null,"description_after":"Save a view the user wants to keep: UI in the view language that renders with live data. Takes the source, the spec_version it was written against, an optional title and optional state. saved_template_id starts from a view template saved earlier; anything you pass replaces its value. Views are free: no watermark and nothing to unlock. Returns the artifact_id.","description_similarity":null,"before_hash":null,"after_hash":"75985deb8d4b765523ce45b22f456db4"},{"tool":"generate_image_background","kind":"added","observed_at":"2026-10-02T00:06:36.903Z","fields":[],"description_before":null,"description_after":"Generate a photo for 1 credit to go behind a social image, from a description of the scene. Only when the user asks for a photo, picture or background. Describe the scene, the light and where to leave empty space for the headline; never ask for text, words or logos in it. size is the canvas it will go on. Returns a file_id for generate_og_image's background_file_id.","description_similarity":null,"before_hash":null,"after_hash":"9cc3cd69beb4503a93d1f7a77957d10f"}],"next_before":"259886","next_actions":[{"action":"list_changes","description":"Older changes","href":"/v1/servers/com.youspot%2Fyouspot/changes?before=259886&limit=50"}]}