@mulmoclaude/core 4.10.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,8 +4,8 @@ const require_dist = require("../../dist-Gj7ygaW2.cjs");
4
4
  const require_root = require("../../root-BvwBUcol.cjs");
5
5
  const require_itemId = require("../../itemId-CGT2J7YK.cjs");
6
6
  const require_project = require("../../project-C1ep9pvo.cjs");
7
- const require_discovery = require("../../discovery-DhS4JWzq.cjs");
8
- const require_server = require("../../server-B__-VpRz.cjs");
7
+ const require_discovery = require("../../discovery-DCMW05Bp.cjs");
8
+ const require_server = require("../../server-rA9FSkl2.cjs");
9
9
  const require_feeds_paths = require("../paths.cjs");
10
10
  const require_ingestTypes = require("../../ingestTypes-DsVH9BYy.cjs");
11
11
  const require_notifier = require("../../notifier-B65Mvngb.cjs");
@@ -2,8 +2,8 @@ import { a as isErrorWithCode, l as isUnknownArray, s as isRecord$1 } from "../.
2
2
  import { t as canonicalRoot } from "../../root-BcS4-Kge.js";
3
3
  import { G as INGEST_KINDS, W as FEED_SCHEDULES } from "../../itemId-4P9S_ehz.js";
4
4
  import { t as mergeIntoExisting } from "../../project-B0j_Vf_Q.js";
5
- import { W as resolveDataDir, _t as createForwardingLogger, d as storeFor, k as listItems, n as discoverCollections, q as safeSlugName, vt as createHostSlot } from "../../discovery-BR8gifOX.js";
6
- import { F as buildCollectionActionSeedPrompt, I as promptPathsFor, z as readSkillTemplate } from "../../server-BgPlo-HZ.js";
5
+ import { W as resolveDataDir, _t as createForwardingLogger, d as storeFor, k as listItems, n as discoverCollections, q as safeSlugName, vt as createHostSlot } from "../../discovery-CBjI1lx9.js";
6
+ import { F as buildCollectionActionSeedPrompt, I as promptPathsFor, z as readSkillTemplate } from "../../server-BMZ_BcPH.js";
7
7
  import { FEEDS_DIR, feedDir, feedStatePath, feedsRoot, ingestStateDir, ingestStatePath } from "../paths.js";
8
8
  import { n as DEFAULT_FEED_MAX_ITEMS, r as isFeedSchedule, t as AGENT_INGEST_KIND } from "../../ingestTypes-GkG7bJdB.js";
9
9
  import { d as publish, n as clear } from "../../notifier-vAp5t6wL.js";
@@ -96,6 +96,27 @@ export interface CalendarEventSummary {
96
96
  * belongs to whatever displays it. */
97
97
  description: string;
98
98
  location: string;
99
+ /** The series an expanded instance belongs to, "" for a one-off. The sync
100
+ * expands recurrences, so a weekly meeting arrives once per occurrence; with
101
+ * no key pointing back, one edit to the series is indistinguishable from a
102
+ * batch of unrelated changes. */
103
+ recurringEventId: string;
104
+ /** Where an expanded instance sat BEFORE anyone moved it, so a dragged
105
+ * occurrence reads as a move rather than a delete plus an insert. Flattened
106
+ * to the instant like `start`/`end`, so an all-day series yields the date. */
107
+ originalStartTime: string;
108
+ /** Google's last-modified time (RFC3339). Google sets it on every write, so
109
+ * it is readable and never pushable. */
110
+ updated: string;
111
+ /** "transparent" when the event does not consume the attendee's time. Google
112
+ * omits the default, so "" reads as opaque. */
113
+ transparency: string;
114
+ /** Which KIND of entry this is, and how the ones Google generates get kept out
115
+ * of a mirror. Google's whole set: "default", "birthday", "focusTime",
116
+ * "fromGmail", "outOfOffice", "workingLocation". */
117
+ eventType: string;
118
+ /** Google Meet URL, "" when nothing is attached. */
119
+ hangoutLink: string;
99
120
  }
100
121
  export interface CalendarSummary {
101
122
  id: string;
@@ -7,7 +7,7 @@ const require_root = require("../root-BvwBUcol.cjs");
7
7
  const require_utils_fetch = require("../utils/fetch.cjs");
8
8
  const require_itemId = require("../itemId-CGT2J7YK.cjs");
9
9
  const require_project = require("../project-C1ep9pvo.cjs");
10
- const require_discovery = require("../discovery-DhS4JWzq.cjs");
10
+ const require_discovery = require("../discovery-DCMW05Bp.cjs");
11
11
  const require_paths = require("../paths-C8-jxR0s.cjs");
12
12
  let node_fs = require("node:fs");
13
13
  let node_path = require("node:path");
@@ -633,7 +633,13 @@ var toEventSummary = (value) => {
633
633
  status: stringField(record, "status"),
634
634
  colorId: stringField(record, "colorId"),
635
635
  description: stringField(record, "description"),
636
- location: stringField(record, "location")
636
+ location: stringField(record, "location"),
637
+ recurringEventId: stringField(record, "recurringEventId"),
638
+ originalStartTime: eventTime$1(record.originalStartTime),
639
+ updated: stringField(record, "updated"),
640
+ transparency: stringField(record, "transparency"),
641
+ eventType: stringField(record, "eventType"),
642
+ hangoutLink: stringField(record, "hangoutLink")
637
643
  };
638
644
  };
639
645
  var toCalendarSummary = (value) => {
@@ -1439,10 +1445,14 @@ function toCollectionRecord(event, map, primaryKey, fields) {
1439
1445
  }
1440
1446
  //#endregion
1441
1447
  //#region src/google/pushPlan.ts
1442
- /** The event fields Google lets a caller write. `htmlLink` and `status` are
1443
- * read-only, so a record column mapped to either is ignored here rather than
1444
- * rejected — the mapping was authored for the pull, and a push has no business
1445
- * invalidating it. */
1448
+ /** The event fields Google lets a caller write — a SUBSET of what the pull can
1449
+ * read (`GOOGLE_CALENDAR_SOURCE_FIELDS`). A column mapped to one of the
1450
+ * pull-only fields is ignored here rather than rejected: the mapping was
1451
+ * authored for the pull, and a push has no business invalidating it.
1452
+ *
1453
+ * `satisfies` is what keeps the two lists honest. A field pushable but not
1454
+ * pullable could never have its baseline rebuilt from a pull, so "unchanged"
1455
+ * would stop meaning anything — this fails the build instead of shipping. */
1446
1456
  var PUSHABLE_SOURCE_FIELDS = [
1447
1457
  "summary",
1448
1458
  "start",
@@ -1500,13 +1510,28 @@ var comparableText = (value) => {
1500
1510
  const text = fieldText(value);
1501
1511
  return SECONDLESS_DATETIME_RE.test(text) ? `${text}${WHOLE_MINUTE}` : text;
1502
1512
  };
1513
+ /** The event fields a baseline does NOT carry, because none of them is pushable
1514
+ * — the baseline exists to answer "did the local side change a field we could
1515
+ * send?", and a pull-only field is by definition not one.
1516
+ *
1517
+ * Typed as the exact complement of `ShadowEvent` + `id`, so a field added to
1518
+ * `CalendarEventSummary` without being made pushable must be zeroed here or
1519
+ * the build fails. */
1520
+ var UNPUSHABLE_EVENT_FIELDS = {
1521
+ htmlLink: "",
1522
+ status: "",
1523
+ recurringEventId: "",
1524
+ originalStartTime: "",
1525
+ updated: "",
1526
+ transparency: "",
1527
+ eventType: "",
1528
+ hangoutLink: ""
1529
+ };
1503
1530
  /** A baseline shaped as the event it came from, so the comparison can run
1504
- * through the very projection that wrote the record. `htmlLink`/`status` are
1505
- * never pushable, so their absence from the baseline cannot matter. */
1531
+ * through the very projection that wrote the record. */
1506
1532
  var asEventSummary = (eventId, shadow) => ({
1507
1533
  id: eventId,
1508
- htmlLink: "",
1509
- status: "",
1534
+ ...UNPUSHABLE_EVENT_FIELDS,
1510
1535
  ...shadow
1511
1536
  });
1512
1537
  /** What the record WOULD hold if nobody had edited it since the baseline.