@mulmoclaude/core 1.9.0 → 1.11.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.
Files changed (49) hide show
  1. package/assets/helps/error-recovery.md +85 -0
  2. package/assets/helps/google-calendar-collection.md +41 -18
  3. package/dist/collection/core/schemaZ.d.ts +10 -1
  4. package/dist/collection/registry/server/index.cjs +2 -2
  5. package/dist/collection/registry/server/index.js +2 -2
  6. package/dist/collection/server/index.cjs +2 -2
  7. package/dist/collection/server/index.js +2 -2
  8. package/dist/collection-watchers/index.cjs +2 -2
  9. package/dist/collection-watchers/index.js +2 -2
  10. package/dist/{discovery-_fjsluLx.js → discovery-B4CZvrXR.js} +11 -3
  11. package/dist/{discovery-_fjsluLx.js.map → discovery-B4CZvrXR.js.map} +1 -1
  12. package/dist/{discovery-DYcR83qx.cjs → discovery-NRy3tyUA.cjs} +11 -3
  13. package/dist/{discovery-DYcR83qx.cjs.map → discovery-NRy3tyUA.cjs.map} +1 -1
  14. package/dist/feeds/server/index.cjs +2 -2
  15. package/dist/feeds/server/index.js +2 -2
  16. package/dist/google/calendar.d.ts +9 -0
  17. package/dist/google/calendarLock.d.ts +16 -0
  18. package/dist/google/calendarPushState.d.ts +1 -1
  19. package/dist/google/collectionProjection.d.ts +18 -0
  20. package/dist/google/collectionPush.d.ts +62 -0
  21. package/dist/google/collectionSync.d.ts +51 -23
  22. package/dist/google/index.cjs +833 -567
  23. package/dist/google/index.cjs.map +1 -1
  24. package/dist/google/index.d.ts +4 -2
  25. package/dist/google/index.js +825 -568
  26. package/dist/google/index.js.map +1 -1
  27. package/dist/google/pushPlan.d.ts +1 -1
  28. package/dist/remote-host/health.d.ts +13 -0
  29. package/dist/remote-host/index.cjs +11 -30
  30. package/dist/remote-host/index.d.ts +2 -0
  31. package/dist/remote-host/index.js +2 -24
  32. package/dist/remote-host/server/index.cjs +223 -8
  33. package/dist/remote-host/server/index.cjs.map +1 -1
  34. package/dist/remote-host/server/index.d.ts +4 -0
  35. package/dist/remote-host/server/index.js +214 -5
  36. package/dist/remote-host/server/index.js.map +1 -1
  37. package/dist/remote-host/server/presenceProbe.d.ts +23 -0
  38. package/dist/remote-host/server/resilientRunner.d.ts +24 -0
  39. package/dist/remote-host-D_BRFHcI.js +36 -0
  40. package/dist/remote-host-D_BRFHcI.js.map +1 -0
  41. package/dist/remote-host-DkDVxNim.cjs +95 -0
  42. package/dist/remote-host-DkDVxNim.cjs.map +1 -0
  43. package/dist/{server-l4TZ5Lbf.cjs → server-7U-3DE2e.cjs} +2 -2
  44. package/dist/{server-l4TZ5Lbf.cjs.map → server-7U-3DE2e.cjs.map} +1 -1
  45. package/dist/{server-BlIrtGKl.js → server-DdyIvFhz.js} +2 -2
  46. package/dist/{server-BlIrtGKl.js.map → server-DdyIvFhz.js.map} +1 -1
  47. package/package.json +5 -5
  48. package/dist/remote-host/index.cjs.map +0 -1
  49. package/dist/remote-host/index.js.map +0 -1
@@ -225,6 +225,91 @@ shipped registry repo's README. Common rejections:
225
225
  - `name` reuses the reserved value `official`.
226
226
  - `name` doesn't match `[A-Za-z0-9][A-Za-z0-9_-]{0,31}`.
227
227
 
228
+ ## A hand-placed custom role never appears in the list
229
+
230
+ ### Symptoms
231
+
232
+ - The user put a file in `config/roles/` themselves (not via Settings →
233
+ Roles / `manageRoles`) and the role is absent from the role list.
234
+ - Nothing failed in tool output — `manageRoles` with `action: "list"`
235
+ simply doesn't include it.
236
+
237
+ ### Cause + fix
238
+
239
+ The loader reads **`config/roles/<id>.json` only**, and a file it cannot
240
+ use is skipped rather than fatal — so one broken file can't take the
241
+ whole list down. The reason is in the server log as a `[roles]` warning
242
+ naming the file:
243
+
244
+ - `role file is not valid JSON, skipping` — trailing comma, single
245
+ quotes, unquoted key.
246
+ - `role file does not match the role schema, skipping` — the `issues`
247
+ field names each field, e.g. `icon: Invalid input: expected string,
248
+ received undefined`. All of `id`, `name`, `icon`, `prompt`,
249
+ `availablePlugins` are required; `availablePlugins` must be an array
250
+ even for one entry.
251
+ - `role file is empty, skipping` — zero-length or whitespace only.
252
+ - `role file could not be read, skipping` — permissions, or the path is
253
+ a directory.
254
+ - `role file disappeared while loading, skipping` — the file was renamed
255
+ or deleted while the list was being read, or it is a broken symlink.
256
+ Re-running the load is enough if the file is there now.
257
+ - `ignoring entries that are not .json files` — a `.md` / `.jsonc` /
258
+ `.json.txt` file is never read as a role.
259
+
260
+ Ask the user for that warning line (or the file's contents) rather than
261
+ guessing which of the six it is. Writing the role through
262
+ `manageRoles` instead sidesteps all of them — it serializes the role, so
263
+ the file is always valid.
264
+
265
+ ## A custom role is in the list but delete / update says it doesn't exist
266
+
267
+ ### Symptoms
268
+
269
+ - `manageRoles` with `action: "list"` includes the role, but `delete` or
270
+ `update` on that same id returns `Role '<id>' not found.`
271
+ - Or: `Cannot delete built-in roles.` for a role the user created.
272
+ - Or: the user edited a role and the change had no effect, because
273
+ another file with the same id is the one that id resolves to.
274
+
275
+ ### Cause + fix
276
+
277
+ The list shows the `id` from **inside** the file, while delete / update
278
+ address the role by its **file name** — so `config/roles/designer.json`
279
+ containing `"id": "myrole"` is listed as `myrole` but delete / update
280
+ only accept `designer`. Two `[roles]` warnings in the server log name
281
+ it:
282
+
283
+ - `role id does not match its file name` — `fileName` and `id` are both in
284
+ the warning. Which repair is safe depends on which side is malformed:
285
+ role ids must match `[a-zA-Z0-9_-]+`, and nothing enforces that on a
286
+ hand-placed file. **Follow the variant the warning gives you** rather
287
+ than picking a repair yourself — the wrong one can leave the role
288
+ reachable under no name at all:
289
+ - no extra clause — both names are usable. Rename the file to
290
+ `<id>.json`, or change the `id` to the file's own name. Until then the
291
+ **file name** is a working handle: `delete <file name>` removes it.
292
+ - `… the file name is not a usable role id either` — e.g.
293
+ `my role.json`, rejected as `Invalid role id 'my role'.` Neither name
294
+ reaches the role. Renaming is the only fix.
295
+ - `… the id is not a usable role id` — the reverse, e.g. `"id": "my
296
+ role"` in `designer.json`. `delete designer` still works, and renaming
297
+ to `my role.json` would take that away. Change the `id`.
298
+ - `… neither is a usable role id` — pick one id that matches the pattern
299
+ and use it for the file name and the `id` together.
300
+ - an inner `id` equal to a built-in role's id — the file also shadows
301
+ that built-in, and `delete` on the listed id refuses it as built-in.
302
+ Renaming is the way out.
303
+ - `more than one role file declares the same id` — both files load and
304
+ both appear in the list; `used` is the one that id resolves to
305
+ (readdir order, not a choice the user made) and `ignored` lists the
306
+ rest. Give each role a distinct id, or remove the extra file.
307
+
308
+ Ask the user for the warning line rather than guessing which of the two
309
+ it is. Both only happen to hand-placed or hand-renamed files:
310
+ `manageRoles` writes `config/roles/<role.id>.json`, so file name and
311
+ `id` always agree.
312
+
228
313
  ## Marp slide PDF — empty / image / font issues
229
314
 
230
315
  ### Symptoms
@@ -10,17 +10,22 @@ for deleting events, use the `google` tool — see
10
10
  [The `google` tool](google.md). There is no bundled calendar collection: you
11
11
  author the schema when the user asks for one.
12
12
 
13
- ## Both directions, but only one of them automatic
13
+ ## Both directions
14
14
 
15
15
  | Direction | How | When it runs |
16
16
  | --- | --- | --- |
17
17
  | Google → collection | the `googleCalendar` block | hourly, on creation, and on the **Sync** button |
18
- | collection → Google | the **Push to Google** button in the collection view | only when the user clicks it |
18
+ | collection → Google | the **Push to Google** button | whenever the user clicks it |
19
+ | collection → Google | `"autoPush": true` in the block | hourly, immediately before each pull |
19
20
 
20
- There is no automatic write-back and no setting that enables one. If a user
21
- asks for "two-way sync", tell them plainly: the pull is automatic, the push is
22
- a button they press. Do not go looking for a config key for it — there isn't
23
- one, and hunting for it is what makes this conversation go in circles.
21
+ When a user asks for "two-way sync", `autoPush` is the answer: set it and each
22
+ scheduled run pushes local edits up and then pulls Google's changes down, as one
23
+ cycle. Without it the pull is automatic and the push is a button they must
24
+ remember to press — which is why the order used to matter so much.
25
+
26
+ It is **opt-in and off by default**, and that is deliberate: a push writes to a
27
+ calendar other people may be reading, so turning it on is the user's call. Ask
28
+ before you add it.
24
29
 
25
30
  ## Requirements
26
31
 
@@ -45,7 +50,8 @@ it isn't, sync silently does nothing until they link it in settings.
45
50
 
46
51
  "googleCalendar": {
47
52
  "calendarId": "primary",
48
- "map": { "title": "summary", "on": "start", "until": "end" }
53
+ "map": { "title": "summary", "on": "start", "until": "end" },
54
+ "autoPush": true
49
55
  }
50
56
  }
51
57
  ```
@@ -58,9 +64,20 @@ it isn't, sync silently does nothing until they link it in settings.
58
64
  names suit the collection; the map absorbs the difference. Map at least one
59
65
  field: an empty map syncs records that carry only the event id, so the user
60
66
  would see rows with no content.
67
+ - `autoPush` — push local edits on the sync schedule, just before each pull.
68
+ Omit it (the default) and the push stays a button. See "Both directions".
69
+
70
+ Mappable event fields: `summary`, `start`, `end`, `description`, `location`,
71
+ `htmlLink`, `colorId`, `status`.
72
+
73
+ `description` is the event body, and Google stores limited **HTML** in it. It is
74
+ kept verbatim — mirroring it through a plain-text field and pushing it back would
75
+ strip the user's formatting. Give it a `text` field, and do not "clean it up" on
76
+ the way in.
61
77
 
62
- Mappable event fields: `summary`, `start`, `end`, `htmlLink`, `colorId`,
63
- `status`.
78
+ Mapping a column the user already filled by hand (a `notes` column, say) onto
79
+ `description` means the next push sends that text to Google. That is usually what
80
+ they want, but say so before you write the map.
64
81
 
65
82
  ## The primary field is the event id
66
83
 
@@ -82,8 +99,10 @@ the calendar day view then draws each record as a proportional time block.
82
99
 
83
100
  ## What sync does
84
101
 
85
- - New or edited events are written, keyed by event id (existing records are
86
- replaced in place).
102
+ - New or edited events are written, keyed by event id. Only the mapped columns
103
+ are overwritten: a column the map does not name (a local note the user keeps
104
+ next to the event) survives the pull. The flip side is that a field you REMOVE
105
+ from `map` keeps its last synced value rather than disappearing.
87
106
  - Events deleted in Google are **deleted** from the collection.
88
107
  - Only what changed since the last run is fetched, so a big calendar stays
89
108
  cheap after the first sync.
@@ -100,10 +119,10 @@ them like any other.
100
119
  The collection view has a **Push to Google** button next to Sync. It creates
101
120
  events for records added locally and updates events for records edited locally.
102
121
 
103
- **Order matters, and this is the one thing to warn users about.** A pull
104
- overwrites a locally edited record as soon as Google reports any change to that
105
- event. So: push first, then sync. Syncing first can discard the edit that was
106
- waiting to be pushed.
122
+ **Order matters when the push is manual.** A pull overwrites a locally edited
123
+ record as soon as Google reports any change to that event, so: push first, then
124
+ sync. Syncing first can discard the edit that was waiting to be pushed. This is
125
+ exactly the trap `autoPush` closes — it runs the two in that order for the user.
107
126
 
108
127
  What the button does and deliberately does not do:
109
128
 
@@ -115,9 +134,13 @@ What the button does and deliberately does not do:
115
134
  The count is reported so the user knows it was skipped; deleting for real is
116
135
  the `google` tool's `calendarDeleteEvent`, after confirming with them.
117
136
  - **Skips a record edited on both sides** and reports it, rather than picking a
118
- winner. The user resolves it by editing one side to match.
119
- - Pushes only `summary`, `start`, `end` and `colorId` — `htmlLink` and `status`
120
- are read-only in Google, so a column mapped to either is ignored.
137
+ winner. The user resolves it by editing one side to match. Under `autoPush`
138
+ the pull that follows leaves that record alone too, so the local edit is not
139
+ destroyed while it waits — the cost is that the record stays behind Google
140
+ until someone resolves it, and the host logs which records those are.
141
+ - Pushes `summary`, `start`, `end`, `description`, `location` and `colorId` —
142
+ everything the pull can read except `htmlLink` and `status`, which are
143
+ read-only in Google, so a column mapped to either is ignored.
121
144
 
122
145
  Reasons a record can be reported as skipped:
123
146
 
@@ -504,7 +504,7 @@ export declare const AgentIngestZ: z.ZodObject<{
504
504
  /** The Google event fields a collection may pull from. `id` is absent on
505
505
  * purpose — it always lands in the primary field, since upsert-by-event-id
506
506
  * is what makes the sync idempotent. */
507
- export declare const GOOGLE_CALENDAR_SOURCE_FIELDS: readonly ["summary", "start", "end", "htmlLink", "colorId", "status"];
507
+ export declare const GOOGLE_CALENDAR_SOURCE_FIELDS: readonly ["summary", "start", "end", "htmlLink", "colorId", "status", "description", "location"];
508
508
  /** Marks a collection as the destination of the LLM-free Google Calendar
509
509
  * sync (#2095). `map` is collectionField → Google event field, so the user's
510
510
  * collection keeps whatever field names it already uses. */
@@ -517,7 +517,10 @@ export declare const GoogleCalendarSyncZ: z.ZodObject<{
517
517
  htmlLink: "htmlLink";
518
518
  colorId: "colorId";
519
519
  status: "status";
520
+ description: "description";
521
+ location: "location";
520
522
  }>>;
523
+ autoPush: z.ZodOptional<z.ZodBoolean>;
521
524
  }, z.core.$strip>;
522
525
  /** `ingest` is a discriminated union on `kind`: the three declarative
523
526
  * retrievers fetch-and-map; `agent` dispatches a hidden worker. Optional on
@@ -1102,7 +1105,10 @@ declare const CollectionObjectZ: z.ZodObject<{
1102
1105
  htmlLink: "htmlLink";
1103
1106
  colorId: "colorId";
1104
1107
  status: "status";
1108
+ description: "description";
1109
+ location: "location";
1105
1110
  }>>;
1111
+ autoPush: z.ZodOptional<z.ZodBoolean>;
1106
1112
  }, z.core.$strip>>;
1107
1113
  dynamicIcon: z.ZodOptional<z.ZodObject<{
1108
1114
  source: z.ZodObject<{
@@ -1578,7 +1584,10 @@ export declare const CollectionSchemaZ: z.ZodPreprocess<z.ZodObject<{
1578
1584
  htmlLink: "htmlLink";
1579
1585
  colorId: "colorId";
1580
1586
  status: "status";
1587
+ description: "description";
1588
+ location: "location";
1581
1589
  }>>;
1590
+ autoPush: z.ZodOptional<z.ZodBoolean>;
1582
1591
  }, z.core.$strip>>;
1583
1592
  dynamicIcon: z.ZodOptional<z.ZodObject<{
1584
1593
  source: z.ZodObject<{
@@ -4,9 +4,9 @@ const require_dist = require("../../../dist-pWpC-b04.cjs");
4
4
  const require_atomic = require("../../../atomic-C_7YpMiM.cjs");
5
5
  const require_relPath = require("../../../relPath-CgGi4-Nv.cjs");
6
6
  const require_utils_fetch = require("../../../utils/fetch.cjs");
7
- const require_discovery = require("../../../discovery-DYcR83qx.cjs");
7
+ const require_discovery = require("../../../discovery-NRy3tyUA.cjs");
8
8
  const require_templatePath = require("../../../templatePath-27vUZowm.cjs");
9
- const require_server = require("../../../server-l4TZ5Lbf.cjs");
9
+ const require_server = require("../../../server-7U-3DE2e.cjs");
10
10
  const require_skill_bridge_index = require("../../../skill-bridge/index.cjs");
11
11
  const require_types = require("../../../types-CNqkLT4M.cjs");
12
12
  let node_fs = require("node:fs");
@@ -2,9 +2,9 @@ import { t as errorMessage } from "../../../dist-Cwk0e12G.js";
2
2
  import { t as writeFileAtomic } from "../../../atomic-DPpdrJzO.js";
3
3
  import { n as toPosixRelPath } from "../../../relPath-DW8MC8VO.js";
4
4
  import { fetchWithTimeout } from "../../../utils/fetch.js";
5
- import { K as collectionsRegistriesConfigPath, U as safeRecordId, X as log, r as loadCollection, s as CollectionSchemaZ, t as acceptParsedSchema } from "../../../discovery-_fjsluLx.js";
5
+ import { K as collectionsRegistriesConfigPath, U as safeRecordId, X as log, r as loadCollection, s as CollectionSchemaZ, t as acceptParsedSchema } from "../../../discovery-B4CZvrXR.js";
6
6
  import { t as isSafeActionTemplatePath } from "../../../templatePath-k_WNbL_Q.js";
7
- import { g as ONE_SECOND_MS } from "../../../server-BlIrtGKl.js";
7
+ import { g as ONE_SECOND_MS } from "../../../server-DdyIvFhz.js";
8
8
  import { claudeSkillDir, dataSkillDir, mirrorSkillWrite } from "../../../skill-bridge/index.js";
9
9
  import { n as parseRegistryIndex, r as isRecord, t as OFFICIAL_REGISTRY_NAME } from "../../../types-BKVZrtyc.js";
10
10
  import { readFileSync } from "node:fs";
@@ -1,8 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_calendarGrid = require("../../calendarGrid-CaS9er8i.cjs");
3
- const require_discovery = require("../../discovery-DYcR83qx.cjs");
3
+ const require_discovery = require("../../discovery-NRy3tyUA.cjs");
4
4
  const require_templatePath = require("../../templatePath-27vUZowm.cjs");
5
- const require_server = require("../../server-l4TZ5Lbf.cjs");
5
+ const require_server = require("../../server-7U-3DE2e.cjs");
6
6
  exports.BackendUnavailableError = require_discovery.BackendUnavailableError;
7
7
  exports.COMPUTED_TYPES = require_calendarGrid.COMPUTED_TYPES;
8
8
  exports.CollectionQueryZ = require_discovery.CollectionQueryZ;
@@ -1,5 +1,5 @@
1
1
  import { S as COMPUTED_TYPES } from "../../calendarGrid-CrGxeCOG.js";
2
- import { A as deleteItem, B as itemFilePath, C as compileCsvQuery, D as MAX_QUERY_ROWS, E as DEFAULT_QUERY_ROWS, F as resolveCreateItemId, H as resolveTemplatePath, I as writeItem, J as getWorkspaceRoot, L as SCHEMA_FILE, M as isRegularFile, N as listItems, O as BackendUnavailableError, P as readItem, Q as setCollectionChangePublisher, R as isContainedInRoot, T as CollectionQueryZ, U as safeRecordId, V as resolveDataDir, W as safeSlugName, X as log, Z as publishCollectionChange, _ as csvRowToItem, a as toDetail, b as encodeCsvRecordId, d as storeFor, h as MAX_CSV_ROWS, i as resolvePrimaryField, j as generateItemId, k as isBackendUnavailable, l as collectionWritable, m as projectItemFields, n as discoverCollections, o as toSummary, p as pageFromFullRead, q as configureCollectionHost, r as loadCollection, s as CollectionSchemaZ, t as acceptParsedSchema, u as readOnlyRefusal, v as decodeCsvRecordId, w as compileJsonlQuery, x as normalizeCsvValue, y as dedupeByRecordId, z as isContainedInWorkspace } from "../../discovery-_fjsluLx.js";
2
+ import { A as deleteItem, B as itemFilePath, C as compileCsvQuery, D as MAX_QUERY_ROWS, E as DEFAULT_QUERY_ROWS, F as resolveCreateItemId, H as resolveTemplatePath, I as writeItem, J as getWorkspaceRoot, L as SCHEMA_FILE, M as isRegularFile, N as listItems, O as BackendUnavailableError, P as readItem, Q as setCollectionChangePublisher, R as isContainedInRoot, T as CollectionQueryZ, U as safeRecordId, V as resolveDataDir, W as safeSlugName, X as log, Z as publishCollectionChange, _ as csvRowToItem, a as toDetail, b as encodeCsvRecordId, d as storeFor, h as MAX_CSV_ROWS, i as resolvePrimaryField, j as generateItemId, k as isBackendUnavailable, l as collectionWritable, m as projectItemFields, n as discoverCollections, o as toSummary, p as pageFromFullRead, q as configureCollectionHost, r as loadCollection, s as CollectionSchemaZ, t as acceptParsedSchema, u as readOnlyRefusal, v as decodeCsvRecordId, w as compileJsonlQuery, x as normalizeCsvValue, y as dedupeByRecordId, z as isContainedInWorkspace } from "../../discovery-B4CZvrXR.js";
3
3
  import { i as isSafeTemplatePath, n as isSafeCustomViewI18nPath, r as isSafeCustomViewPath, t as isSafeActionTemplatePath } from "../../templatePath-k_WNbL_Q.js";
4
- import { A as buildCollectionActionSeedPrompt, C as validateRecordObject, D as enrichItems, E as runCollectionQuery, M as readCustomViewHtml, N as readCustomViewI18n, O as runQueryOverRows, P as readSkillTemplate, S as validateCollectionRecords, T as recordFieldProblem, _ as computeCollectionIcon, a as deleteCollection, b as applyMutateAction, c as computeSuccessor, d as isTriggerDue, f as maybeSpawnSuccessor, h as successorId, i as deleteCustomView, j as promptPathsFor, k as buildActionSeedPrompt, l as daysInMonth, m as resolveEvery, n as MAX_UNSELECTIVE_ITEMS, o as deleteCollectionRefusalMessage, p as parseCivil, r as makeManageCollectionTool, s as advanceTriggerDate, t as MAX_SCHEMA_ISSUES, u as formatCivil, v as buildWorkspaceOntology, w as compileRecordZ, x as firstMutateParamProblem, y as schemaRelations } from "../../server-BlIrtGKl.js";
4
+ import { A as buildCollectionActionSeedPrompt, C as validateRecordObject, D as enrichItems, E as runCollectionQuery, M as readCustomViewHtml, N as readCustomViewI18n, O as runQueryOverRows, P as readSkillTemplate, S as validateCollectionRecords, T as recordFieldProblem, _ as computeCollectionIcon, a as deleteCollection, b as applyMutateAction, c as computeSuccessor, d as isTriggerDue, f as maybeSpawnSuccessor, h as successorId, i as deleteCustomView, j as promptPathsFor, k as buildActionSeedPrompt, l as daysInMonth, m as resolveEvery, n as MAX_UNSELECTIVE_ITEMS, o as deleteCollectionRefusalMessage, p as parseCivil, r as makeManageCollectionTool, s as advanceTriggerDate, t as MAX_SCHEMA_ISSUES, u as formatCivil, v as buildWorkspaceOntology, w as compileRecordZ, x as firstMutateParamProblem, y as schemaRelations } from "../../server-DdyIvFhz.js";
5
5
  export { BackendUnavailableError, COMPUTED_TYPES, CollectionQueryZ, CollectionSchemaZ, DEFAULT_QUERY_ROWS, MAX_CSV_ROWS, MAX_QUERY_ROWS, MAX_SCHEMA_ISSUES, MAX_UNSELECTIVE_ITEMS, SCHEMA_FILE, acceptParsedSchema, advanceTriggerDate, applyMutateAction, buildActionSeedPrompt, buildCollectionActionSeedPrompt, buildWorkspaceOntology, collectionWritable, compileCsvQuery, compileJsonlQuery, compileRecordZ, computeCollectionIcon, computeSuccessor, configureCollectionHost, csvRowToItem, daysInMonth, decodeCsvRecordId, dedupeByRecordId, deleteCollection, deleteCollectionRefusalMessage, deleteCustomView, deleteItem, discoverCollections, encodeCsvRecordId, enrichItems, firstMutateParamProblem, formatCivil, generateItemId, getWorkspaceRoot, isBackendUnavailable, isContainedInRoot, isContainedInWorkspace, isRegularFile, isSafeActionTemplatePath, isSafeCustomViewI18nPath, isSafeCustomViewPath, isSafeTemplatePath, isTriggerDue, itemFilePath, listItems, loadCollection, log, makeManageCollectionTool, maybeSpawnSuccessor, normalizeCsvValue, pageFromFullRead, parseCivil, projectItemFields, promptPathsFor, publishCollectionChange, readCustomViewHtml, readCustomViewI18n, readItem, readOnlyRefusal, readSkillTemplate, recordFieldProblem, resolveCreateItemId, resolveDataDir, resolveEvery, resolvePrimaryField, resolveTemplatePath, runCollectionQuery, runQueryOverRows, safeRecordId, safeSlugName, schemaRelations, setCollectionChangePublisher, storeFor, successorId, toDetail, toSummary, validateCollectionRecords, validateRecordObject, writeItem };
@@ -2,8 +2,8 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_calendarGrid = require("../calendarGrid-CaS9er8i.cjs");
3
3
  const require_promptSafety = require("../promptSafety-FD8cQn3e.cjs");
4
4
  require("../collection/index.cjs");
5
- const require_discovery = require("../discovery-DYcR83qx.cjs");
6
- const require_server = require("../server-l4TZ5Lbf.cjs");
5
+ const require_discovery = require("../discovery-NRy3tyUA.cjs");
6
+ const require_server = require("../server-7U-3DE2e.cjs");
7
7
  const require_notifier = require("../notifier-tMsAXyXp.cjs");
8
8
  let node_fs_promises = require("node:fs/promises");
9
9
  //#region src/collection-watchers/config.ts
@@ -1,8 +1,8 @@
1
1
  import { k as fieldText } from "../calendarGrid-CrGxeCOG.js";
2
2
  import { E as whenMatches, f as itemIsDone } from "../promptSafety-C--op_6a.js";
3
3
  import "../collection/index.js";
4
- import { B as itemFilePath, Z as publishCollectionChange, d as storeFor, n as discoverCollections, r as loadCollection } from "../discovery-_fjsluLx.js";
5
- import { d as isTriggerDue, f as maybeSpawnSuccessor } from "../server-BlIrtGKl.js";
4
+ import { B as itemFilePath, Z as publishCollectionChange, d as storeFor, n as discoverCollections, r as loadCollection } from "../discovery-B4CZvrXR.js";
5
+ import { d as isTriggerDue, f as maybeSpawnSuccessor } from "../server-DdyIvFhz.js";
6
6
  import { d as publish, m as updateForPlugin, n as clear, s as listAll } from "../notifier-BdA5qzhe.js";
7
7
  import { access } from "node:fs/promises";
8
8
  //#region src/collection-watchers/config.ts
@@ -2183,8 +2183,16 @@ var GoogleCalendarSyncZ = z.object({
2183
2183
  "end",
2184
2184
  "htmlLink",
2185
2185
  "colorId",
2186
- "status"
2187
- ])).refine((map) => Object.keys(map).length > 0, { message: "map at least one field — a `googleCalendar` sync with an empty map writes records that carry only the event id" })
2186
+ "status",
2187
+ "description",
2188
+ "location"
2189
+ ])).refine((map) => Object.keys(map).length > 0, { message: "map at least one field — a `googleCalendar` sync with an empty map writes records that carry only the event id" }),
2190
+ /** Run the push on the sync schedule too, immediately before each pull, so
2191
+ * local edits reach Google without anyone pressing a button (#2620).
2192
+ *
2193
+ * Opt-in and absent by default: a push writes to a calendar other people may
2194
+ * read, so turning it on is the user's decision, not a default. */
2195
+ autoPush: z.boolean().optional()
2188
2196
  });
2189
2197
  /** `ingest` is a discriminated union on `kind`: the three declarative
2190
2198
  * retrievers fetch-and-map; `agent` dispatches a hidden worker. Optional on
@@ -2666,4 +2674,4 @@ function toDetail(collection) {
2666
2674
  //#endregion
2667
2675
  export { skillsStagingDir as $, deleteItem as A, itemFilePath as B, compileCsvQuery as C, MAX_QUERY_ROWS as D, DEFAULT_QUERY_ROWS as E, resolveCreateItemId as F, archiveDir as G, resolveTemplatePath as H, writeItem as I, getWorkspaceRoot as J, collectionsRegistriesConfigPath as K, SCHEMA_FILE as L, isRegularFile as M, listItems as N, BackendUnavailableError as O, readItem as P, setCollectionChangePublisher as Q, isContainedInRoot as R, queryCsv as S, CollectionQueryZ as T, safeRecordId as U, resolveDataDir as V, safeSlugName as W, log as X, isPresetSlug as Y, publishCollectionChange as Z, csvRowToItem as _, toDetail as a, encodeCsvRecordId as b, resolveMutateSet as c, storeFor as d, createForwardingLogger as et, checkpointSqliteDatabase as f, cacheDir as g, MAX_CSV_ROWS as h, resolvePrimaryField as i, generateItemId as j, isBackendUnavailable as k, collectionWritable as l, projectItemFields as m, discoverCollections as n, toSummary as o, pageFromFullRead as p, configureCollectionHost as q, loadCollection as r, CollectionSchemaZ as s, acceptParsedSchema as t, createHostSlot as tt, readOnlyRefusal as u, decodeCsvRecordId as v, compileJsonlQuery as w, normalizeCsvValue as x, dedupeByRecordId as y, isContainedInWorkspace as z };
2668
2676
 
2669
- //# sourceMappingURL=discovery-_fjsluLx.js.map
2677
+ //# sourceMappingURL=discovery-B4CZvrXR.js.map