惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Attack and Defense Labs
Attack and Defense Labs
T
The Blog of Author Tim Ferriss
V
Visual Studio Blog
GbyAI
GbyAI
B
Blog RSS Feed
H
Help Net Security
美团技术团队
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
The Cloudflare Blog
Security Latest
Security Latest
F
Fortinet All Blogs
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - Franky
P
Privacy & Cybersecurity Law Blog
J
Java Code Geeks
博客园 - 【当耐特】
Last Week in AI
Last Week in AI
Y
Y Combinator Blog
人人都是产品经理
人人都是产品经理
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Threatpost
Schneier on Security
Schneier on Security
T
Tenable Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Latest news
Latest news
P
Proofpoint News Feed
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Know Your Adversary
Know Your Adversary
W
WeLiveSecurity
G
GRAHAM CLULEY
P
Palo Alto Networks Blog
The Hacker News
The Hacker News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
Recent Commits to openclaw:main
Recent Commits to openclaw:main
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V2EX - 技术
V2EX - 技术
MongoDB | Blog
MongoDB | Blog
博客园_首页
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Threat Research - Cisco Blogs
T
Tor Project blog
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
Hacker News - Newest:
Hacker News - Newest: "LLM"
Google DeepMind News
Google DeepMind News
The GitHub Blog
The GitHub Blog
月光博客
月光博客

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
I Automated Work-Life Calendar Sync With Two AI Agents That Talk to Each Other
Hector Flore · 2026-05-01 · via DEV Community

The Two-Calendar Problem

Every developer with a day job and a personal life has two calendars. My work Outlook has team syncs, 1:1s, and planning meetings. My personal Google Calendar has doctor appointments, NICU visits for my premature twins, kid pickups, recording sessions, and the occasional oil change.

The problem isn't having two calendars. The problem is that nobody at work can see the personal one. So a coworker schedules a meeting at 10 AM on Tuesday — right on top of my wife's OB appointment. I catch it at 9:45, scramble to decline, and look unprofessional. Or worse, I don't catch it.

The manual fix is tedious: open Google Calendar, find the event, open Outlook, create a matching "Out of Office" block, repeat for every new event, every change, every cancellation. I was doing this three or four times a week. Then I stopped doing it because humans are bad at repetitive cross-system data entry. Then I missed more meetings.

So I built a system where two AI agents handle it automatically. My home assistant reads Google Calendar, talks to my work assistant through a mesh network, and the work assistant creates Out of Office blocks on Outlook. Zero manual effort. Five times a day, every weekday.

The Setup: Two Agents, Two Worlds

I've written about the multi-agent home assistant that runs my household — over 30 agents managing tasks, meals, finances, health, and more, all running on GitHub Copilot CLI. That system lives in one repo (rocha-family), runs in one terminal, and talks to my family through Telegram.

But I also have a work assistant — a separate Copilot CLI session in a different repo (msix-home) with its own agents, its own tools, and its own domain knowledge. It has access to Microsoft Graph for Outlook, MSX Dataverse for sales data, Power BI for analytics, and WorkIQ for M365 Copilot queries. It's a completely independent system.

These two assistants couldn't talk to each other. They're in different terminals, different repos, different Git repositories. From each agent's perspective, the other one doesn't exist.

Until the agent mesh.

The Agent Mesh: Cross-Session IPC for Copilot CLI

The agent mesh is a Copilot CLI extension I built that lets any number of CLI sessions discover each other and exchange messages. It's deliberately simple — a shared SQLite database on my machine, WAL mode for lock-free concurrency, and a polling loop that checks for new messages every 10 seconds.

Here's the architecture:

┌──────────────────┐         ┌──────────────────┐
│  Terminal 1       │         │  Terminal 2       │
│  rocha-family     │         │  msix-home        │
│  (Home Assistant) │         │  (Work Assistant)  │
└────────┬─────────┘         └────────┬─────────┘
         │                            │
         └──────────┬─────────────────┘
                    │
          ┌─────────┴─────────┐
          │  agent-mesh.db    │
          │  (SQLite, WAL)    │
          │  ┌─────────────┐  │
          │  │ agent_sessions │  │
          │  │ agent_messages │  │
          │  └─────────────┘  │
          └───────────────────┘

Enter fullscreen mode Exit fullscreen mode

Each session auto-registers on startup with its workspace name (derived from the Git repo folder). Sessions heartbeat every 10 seconds. Messages are inserted into a queue table and picked up by the recipient's polling loop, which routes them via session.send() for the LLM to process.

The tools are minimal — four in total:

  • get_agents — discover who's online
  • send_message — send to a workspace or session ID
  • reply_to_message — threaded responses
  • get_message — check for replies

Installation is one step: clone the repo into ~/.copilot/extensions/agent-mesh/ and restart your sessions. You'll need Node.js 22+ (for the built-in node:sqlite module), but beyond that — no npm install, no config files, no environment variables. The database creates itself.

The Sync Agent: Personal Calendar → Outlook OOF

With the mesh in place, I created a dedicated work-life-sync agent in my home assistant. Its job description fits in one sentence: read Google Calendar, send OOF instructions to the work agent via mesh, track what's been synced.

Here's the actual flow, five times a day on weekdays:

  1. Wake up on cron (6 AM, 9 AM, noon, 3 PM, 6 PM CT)
  2. Check Google OAuth — if tokens expired, create a re-auth task and stop
  3. Fetch upcoming events from Google Calendar (next 3 days)
  4. Filter — weekday events only, time-bound or PTO-keyword all-day events, future only
  5. Compute delta against previously synced events in memory
  6. Send mesh message to msix-home with structured instructions
  7. Update sync state and log the run

The cron entry in cron.json is straightforward:

{
  "id": "work-life-sync",
  "schedule": "0 6,9,12,15,18 * * 1-5",
  "enabled": true,
  "agent": "work-life-sync"
}

Enter fullscreen mode Exit fullscreen mode

Five runs per weekday. Monday at 6 AM catches anything added over the weekend. The midday runs catch same-day changes. The 6 PM run catches tomorrow's additions.

The Mesh Message

When the sync agent detects new, changed, or cancelled events, it sends a structured message through the mesh. Here's what an actual message looks like:

WORK_LIFE_SYNC — Availability Block Request

BLOCKS:
1. [CREATE] "Personal — Medical" | 2026-05-02 10:00 AM – 11:00 AM CT
   | showAs=oof, private, no attendees, no Teams | block_key=evt_abc123
2. [CREATE] "Personal — Childcare" | 2026-05-02 3:00 PM – 3:30 PM CT
   | showAs=oof, private, no attendees, no Teams | block_key=evt_def456
3. [DELETE] block_key=evt_ghi789 | (event cancelled on personal calendar)

CONTEXT: Automated sync from Hector's personal Google Calendar.
Create/update/delete Outlook calendar events as specified.
All blocks: showAs=oof, sensitivity=private, no attendees,
no Teams/online meeting. Timezone: America/Chicago.

Enter fullscreen mode Exit fullscreen mode

The work assistant receives this, parses the instructions, and creates the corresponding Outlook events via Microsoft Graph. Every block is marked Out of Office and Private — coworkers see I'm unavailable, but they don't see the details. A doctor appointment shows up as "Personal — Medical" on my work calendar. That's all anyone needs to know.

Smart Category Detection

The agent maps event titles to categories using keyword matching, so the OOF blocks are descriptive without leaking details:

Category Keywords OOF Subject
Medical doctor, dentist, NICU, OB, therapy Personal — Medical
Family birthday party, graduation, wedding Personal — Family
Childcare pickup, daycare, soccer, practice Personal — Childcare
Errands repair, mechanic, DMV, delivery Personal — Errands
Time Off vacation, PTO, travel, holiday Personal — Time Off
Default (no match) Personal

A "Pediatrician — Leilani" event becomes "Personal — Medical." A "Soccer practice — HJ" becomes "Personal — Childcare." A "Family trip to San Antonio" becomes "Personal — Time Off" with OOF blocks on every weekday it spans.

Delta Sync, Not Full Replace

The agent doesn't blindly recreate everything each run. It maintains a sync state table in its working memory — mapping Google event IDs to Outlook block IDs — and computes a delta:

  • New event in Google, not in sync table → CREATE on Outlook
  • Changed event (time or title differs) → UPDATE on Outlook
  • Deleted event (in sync table, gone from Google) → DELETE from Outlook
  • Unchanged → skip entirely

Most runs produce zero changes. The agent logs "zero delta" and exits silently. When a doctor appointment gets rescheduled from 10 AM to 2 PM, the next sync cycle catches the change and sends an UPDATE. When I cancel a haircut, the next cycle sends a DELETE. The Outlook calendar stays accurate without me touching it.

Why This Matters: Real Multi-Agent Orchestration

There's no shortage of multi-agent demos — chatbots that delegate to sub-agents, retrieval pipelines with planning loops, code review chains. Most of them solve problems that exist only inside the demo.

This solves a problem I had every week. And the architecture that makes it work — two independent AI agents communicating asynchronously through a shared database — is the same pattern you'd use for:

  • Frontend ↔ backend coordination — "Hey API agent, I'm getting a 403 on /api/users. What middleware guards that endpoint?"
  • Multi-repo deploys — "Tell the infra agent to update the Terraform config for the new service the API agent just added"
  • Cross-team tooling — any scenario where knowledge lives in different repos and different terminal sessions

The mesh doesn't care what the agents are doing. It's pure infrastructure — a single-file extension that gives every Copilot CLI session the ability to discover peers and exchange messages. What you build on top of it is up to you.

The Boring Parts That Make It Work

A few design decisions that prevent this from being a fragile demo:

One-way sync only. Personal → Work. Never the reverse. I already see work meetings on Google via an ICS subscription. The system has one direction and no feedback loops.

Silent when healthy. The agent only messages me on errors — expired OAuth tokens, mesh delivery failures, the work agent being offline for 24+ hours. Successful syncs produce a one-line log entry and nothing else. I don't need a notification that the system I built is working.

Graceful degradation. If my work terminal is offline, the mesh queues the message. Unread messages to stopped sessions persist for up to 24 hours — plenty of time for msix-home to come back online and pick up the queued instructions. If Google OAuth expires, the agent creates one task asking me to re-authenticate, then stops — no spam, no retries, no crashes.

Privacy by default. Every OOF block is marked private with no attendees and no Teams link. Coworkers see "Personal — Medical" and know not to schedule over it. They don't see "Pediatrician — Leilani follow-up re: ROP screening."

Build Your Own

The agent mesh is open source and takes two minutes to install. If you're running Copilot CLI in multiple terminals — which you probably are if you work across repos — you already have the foundation. The mesh just lets those sessions talk.

The work-life sync agent is specific to my setup (Google Calendar + Outlook), but the pattern isn't. Any cross-system data flow that requires two different tool sets is a candidate: CRM to project tracker, personal notes to team wiki, monitoring alerts to incident response. Two agents, each with access to their own world, connected by a 10-second polling loop and a SQLite database.

I covered the full home assistant architecture, the extension system that powers it, and the crisis that stress-tested it. The agent mesh is the next layer — the one that lets these systems stop being islands and start being a network.

The Bottom Line

I spent months manually copying calendar events between Google and Outlook. I'd forget, miss meetings, look unprofessional. Now two AI agents handle it automatically — one reads my personal calendar, sends a structured message through the mesh, and the other creates Out of Office blocks on my work calendar. Five times a day, every weekday, zero effort.

That's not a demo. That's Tuesday. And it's the kind of mundane, boring, life-improving automation that multi-agent systems should be solving — not generating blog posts about themselves, but quietly keeping two calendars in sync so I can focus on the things that actually matter.