@mulmoclaude/core 5.6.0 → 5.7.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 (41) hide show
  1. package/assets/helps/collection-skills.md +1 -1
  2. package/assets/helps/error-recovery.md +25 -1
  3. package/assets/helps/google-calendar-collection.md +8 -3
  4. package/assets/helps/index.md +3 -3
  5. package/assets/helps/sandbox.md +1 -1
  6. package/dist/collection/core/calendarGrid.d.ts +24 -2
  7. package/dist/collection/index.cjs +5 -2
  8. package/dist/collection/index.js +3 -3
  9. package/dist/collection/registry/server/index.cjs +2 -2
  10. package/dist/collection/registry/server/index.js +2 -2
  11. package/dist/collection/server/index.cjs +3 -3
  12. package/dist/collection/server/index.js +3 -3
  13. package/dist/collection-watchers/index.cjs +4 -4
  14. package/dist/collection-watchers/index.js +4 -4
  15. package/dist/{discovery-B79IxEM6.cjs → discovery-CwBXvtyn.cjs} +2 -2
  16. package/dist/{discovery-B79IxEM6.cjs.map → discovery-CwBXvtyn.cjs.map} +1 -1
  17. package/dist/{discovery-DIGau7M8.js → discovery-XoYJI2Ot.js} +2 -2
  18. package/dist/{discovery-DIGau7M8.js.map → discovery-XoYJI2Ot.js.map} +1 -1
  19. package/dist/feeds/index.cjs +2 -2
  20. package/dist/feeds/index.js +2 -2
  21. package/dist/feeds/server/index.cjs +4 -4
  22. package/dist/feeds/server/index.js +4 -4
  23. package/dist/google/index.cjs +2 -2
  24. package/dist/google/index.js +2 -2
  25. package/dist/{ingestTypes-GkG7bJdB.js → ingestTypes-Bs31Xt5c.js} +2 -2
  26. package/dist/{ingestTypes-GkG7bJdB.js.map → ingestTypes-Bs31Xt5c.js.map} +1 -1
  27. package/dist/{ingestTypes-DsVH9BYy.cjs → ingestTypes-DS9HiR2I.cjs} +2 -2
  28. package/dist/{ingestTypes-DsVH9BYy.cjs.map → ingestTypes-DS9HiR2I.cjs.map} +1 -1
  29. package/dist/{itemId-4P9S_ehz.js → itemId-C9s-Jd5s.js} +58 -23
  30. package/dist/{itemId-4P9S_ehz.js.map → itemId-C9s-Jd5s.js.map} +1 -1
  31. package/dist/{itemId-CGT2J7YK.cjs → itemId-CVrNibwT.cjs} +75 -22
  32. package/dist/{itemId-CGT2J7YK.cjs.map → itemId-CVrNibwT.cjs.map} +1 -1
  33. package/dist/{promptSafety-BpBTh5xO.js → promptSafety-B5uGroik.js} +2 -2
  34. package/dist/{promptSafety-BpBTh5xO.js.map → promptSafety-B5uGroik.js.map} +1 -1
  35. package/dist/{promptSafety-caJWd1ZQ.cjs → promptSafety-BGV1wrE6.cjs} +2 -2
  36. package/dist/{promptSafety-caJWd1ZQ.cjs.map → promptSafety-BGV1wrE6.cjs.map} +1 -1
  37. package/dist/{server--34TYvGP.js → server-CM5XNicg.js} +4 -4
  38. package/dist/{server--34TYvGP.js.map → server-CM5XNicg.js.map} +1 -1
  39. package/dist/{server-DZdM2cLD.cjs → server-ObUrsDs2.cjs} +4 -4
  40. package/dist/{server-DZdM2cLD.cjs.map → server-ObUrsDs2.cjs.map} +1 -1
  41. package/package.json +1 -1
@@ -930,7 +930,7 @@ Notes:
930
930
 
931
931
  ### Custom views
932
932
 
933
- When the built-in views (table / calendar / kanban / dashboard) don't fit what
933
+ When the built-in views (table / calendar / kanban) don't fit what
934
934
  the user wants to _see_ — a year/quarter overview, a Gantt bar, a printable
935
935
  report — author a **custom view**: an HTML file the host renders in a sandboxed
936
936
  iframe over the records. Register it in `views[]` (above); it becomes a button
@@ -187,6 +187,30 @@ invalid`), what to check depends on the sandbox:
187
187
  `~/.claude`. Do not chase the environment variable here — the host login is the one
188
188
  that counts.
189
189
 
190
+ On macOS with the sandbox on, MulmoClaude copies the login from the Keychain into
191
+ `~/.claude/.credentials.json` and, when the token has expired and a refresh token exists,
192
+ launches the `claude` CLI to renew it. Each launch is a real Claude session, so it waits a
193
+ few minutes after a failed renewal and stops after a few failures in a row.
194
+ Look for one of these server log lines:
195
+
196
+ - `Keychain credentials cannot be renewed (<reason>)` — the Keychain item has no
197
+ refresh token (for example an empty item), so no renewal is attempted.
198
+ - `Token renewal failed N times in a row; not trying again` — renewals kept failing, so
199
+ they stopped for this server process.
200
+ - `Access token expired; last renewal failed, next attempt in Ns` — waiting before the
201
+ next try.
202
+
203
+ The fix is the same `claude /login` on the host; the next turn picks the new login up
204
+ without a restart. If the server itself would not start (it exited asking for this, and
205
+ `yarn dev` did not restart it), start it again after `/login`. If `/login` succeeds and
206
+ the "cannot be renewed" line keeps coming back, the Keychain may hold a second, empty
207
+ `Claude Code-credentials` item. MulmoClaude reads both the item under the user's login
208
+ name and whatever a lookup by service name returns, and uses the better one, so a stray
209
+ item only matters when the real login is stored under another account name.
210
+ `security find-generic-password -s "Claude Code-credentials"` prints the account (`acct`)
211
+ of the item a service-only lookup returns; an account such as `unknown` is the stray item,
212
+ removed with `security delete-generic-password -s "Claude Code-credentials" -a <that acct>`.
213
+
190
214
  You will usually be reading this AFTER the user re-logged in (a failing turn never
191
215
  reaches you); answer "why did that happen" with the cause above rather than
192
216
  investigating MulmoClaude's settings.
@@ -215,7 +239,7 @@ Tell the user to enable the two opt-in mounts on the next agent spawn
215
239
  ```bash
216
240
  # Forward the host's SSH agent into the container.
217
241
  # Private keys stay on the host; only the signing oracle is exposed.
218
- SANDBOX_FORWARD_SSH_AGENT=1 \
242
+ SANDBOX_SSH_AGENT_FORWARD=1 \
219
243
  # Mount allowlisted config files/dirs read-only — including ~/.config/gh.
220
244
  SANDBOX_MOUNT_CONFIGS=gh \
221
245
  yarn dev # or: npx mulmoclaude
@@ -162,7 +162,9 @@ To create an all-day event in a `datetime` column (a calendar that mixes timed
162
162
  and all-day events), write a **bare date** on both ends instead:
163
163
  `start: "2026-07-17"`, `end: "2026-07-18"`. A bare date is a valid `datetime`
164
164
  value, it is pushed as Google's `start.date` / `end.date`, and the record form
165
- edits it with a date picker. After the next sync it reads back as `…T00:00`
165
+ edits it with a date picker. In the form, the **All day** checkbox beside a
166
+ `datetime` field switches between the two shapes (checking drops the clock,
167
+ unchecking starts the day at `00:00`), so the user can also do this by hand. After the next sync it reads back as `…T00:00`
166
168
  and stays all-day.
167
169
 
168
170
  For a calendar whose events are ALL all-day, give start/end a **`date`** column
@@ -179,8 +181,11 @@ by typing two dates is pushed as a real all-day event.
179
181
 
180
182
  Google's all-day `end` is **exclusive** — it is the day AFTER the last day, so a
181
183
  single day on the 17th is `on: 2026-07-17`, `until: 2026-07-18`. Records
182
- mirrored from Google already carry it that way. Say so when the user asks why
183
- the end date "looks a day late"; do not offset it, because the push sends the
184
+ mirrored from Google already carry it that way, and the calendar view reads the
185
+ field mapped to `end` the same way: an end that is a bare date or `00:00` stops
186
+ the span on the day before, so that event shows on the 17th only. The stored
187
+ value itself stays exclusive — say so when the user asks why the end date in
188
+ the table "looks a day late", and do not offset it, because the push sends the
184
189
  stored value straight back.
185
190
 
186
191
  An existing all-day event stays all-day when its dates are edited, whatever the
@@ -20,7 +20,7 @@ Under the hood it uses the Claude Code Agent SDK as its LLM core. Claude has ful
20
20
 
21
21
  ## Key Capabilities
22
22
 
23
- - Build **collections** — schema-driven data apps (todo lists, trackers, ledgers, decks) with table / calendar / kanban / dashboard views, plus LLM-authored **custom views**; manage a calendar scheduler
23
+ - Build **collections** — schema-driven data apps (todo lists, trackers, ledgers, decks) with table / calendar / kanban views, plus LLM-authored **custom views**; manage a calendar scheduler
24
24
  - Present documents and spreadsheets with rich formatting
25
25
  - Generate and edit images
26
26
  - Create interactive mind maps
@@ -33,7 +33,7 @@ Under the hood it uses the Claude Code Agent SDK as its LLM core. Claude has ful
33
33
 
34
34
  ## Collections — Apps from Data
35
35
 
36
- Collections are MulmoClaude's most distinctive capability: a **schema-driven data app declared in a single small JSON file**, with no database, ORM, or migration tool. You describe a data model, cross-record relations, computed fields, and per-record action buttons in a `schema.json`; the host reads that DSL and renders a full app — table, calendar, kanban board, and dashboard views — over a folder of plain `<id>.json` records. The same primitives power todo lists, recipe boxes, stock portfolios, invoice ledgers, vocabulary decks, and curricula, all without any app-specific host code. This is the core philosophy made concrete: a `schema.json` plus a folder of records **is** the app.
36
+ Collections are MulmoClaude's most distinctive capability: a **schema-driven data app declared in a single small JSON file**, with no database, ORM, or migration tool. You describe a data model, cross-record relations, computed fields, and per-record action buttons in a `schema.json`; the host reads that DSL and renders a full app — table, calendar and kanban board views — over a folder of plain `<id>.json` records. The same primitives power todo lists, recipe boxes, stock portfolios, invoice ledgers, vocabulary decks, and curricula, all without any app-specific host code. This is the core philosophy made concrete: a `schema.json` plus a folder of records **is** the app.
37
37
 
38
38
  Because Claude authors and edits the schema for you in conversation, you build and reshape these apps just by talking — "add a priority field," "track this as a kanban," "make rent recur monthly" — and the collection updates live. We call this **vibe crafting**: the end-user counterpart of a developer's "vibe coding" — you describe the app you want and Claude builds it, with the schema validated and custom views sandboxed so you get the power without the pitfalls. Records stay validated, computed fields (totals, cross-collection lookups) recompute on every render, and completion bells / recurring obligations are declared in the same schema.
39
39
 
@@ -41,7 +41,7 @@ See [Collection skills](config/helps/collection-skills.md) for the full schema D
41
41
 
42
42
  ## Custom Views — Views the Built-ins Don't Cover
43
43
 
44
- When the built-in table / calendar / kanban / dashboard views don't fit what you want to _see_ — a year-at-a-glance planner, a Gantt bar, a heat-map, a printable report — Claude authors a **custom view**: a single HTML file rendered in a sandboxed iframe over the collection's records. It reads (and optionally writes) records through a scoped token, stays live as the data changes, and can hand work back to a chat — all without any view-specific host code. The view is data, just like the rest of the collection, so you can ask for an entirely new way to look at your data in plain language and get it.
44
+ When the built-in table / calendar / kanban views don't fit what you want to _see_ — a year-at-a-glance planner, a Gantt bar, a heat-map, a printable report — Claude authors a **custom view**: a single HTML file rendered in a sandboxed iframe over the collection's records. It reads (and optionally writes) records through a scoped token, stays live as the data changes, and can hand work back to a chat — all without any view-specific host code. The view is data, just like the rest of the collection, so you can ask for an entirely new way to look at your data in plain language and get it.
45
45
 
46
46
  See [Custom views](config/helps/custom-view.md) for the authoring contract. A
47
47
  view can also target the **mobile remote app** (`target: "mobile"`) — rendered
@@ -90,7 +90,7 @@ On macOS, the Docker container uses a separate credential store from the host. B
90
90
  yarn sandbox:login
91
91
  ```
92
92
 
93
- This opens an interactive `claude login` session inside the container so that the sandbox has valid credentials.
93
+ This copies the Claude Code login from the macOS Keychain to `~/.claude/.credentials.json`, which the container reads. The server also does this before each turn while the sandbox is on, and at startup when the file is missing, so the command is only needed when that fails; run `claude /login` on the host first if the login itself has expired.
94
94
 
95
95
  ## Building the Image
96
96
 
@@ -75,11 +75,33 @@ export declare function buildMonthGrid(year: number, month: number, weekStartsOn
75
75
  * 1. the clock on a `datetime` anchor/end value, else
76
76
  * 2. `timeField` — a separate free-form time-string column (e.g. "14:00-17:00").
77
77
  * A record with no resolvable clock has `startMin === endMin === null`. */
78
- export declare function recordSpan<T extends Record<string, unknown>>(item: T, anchorField: string, endField?: string, timeField?: string): RecordSpan<T> | null;
78
+ export declare function recordSpan<T extends Record<string, unknown>>(item: T, anchorField: string, endField?: string, timeField?: string, options?: SpanOptions): RecordSpan<T> | null;
79
+ /** How a collection reads its end field. */
80
+ export interface SpanOptions {
81
+ /** The end names the first moment AFTER the record, as Google Calendar's
82
+ * `end` does: an all-day event on the 17th ends on the 18th. */
83
+ endExclusive?: boolean;
84
+ }
85
+ /** The span options a collection's calendar uses for `endField`. Only a
86
+ * Google Calendar mirror reads its end as exclusive — the field its sync maps
87
+ * to `end` — because a plain collection may mean its end date inclusively. */
88
+ export declare function spanOptionsFor(schema: {
89
+ googleCalendar?: {
90
+ map: Record<string, string>;
91
+ } | undefined;
92
+ }, endField: string | undefined): SpanOptions;
93
+ /** Whether an end value names the very start of its day: a bare date, or a
94
+ * datetime at exactly `00:00`. */
95
+ export declare function endsAtDayBoundary(endRaw: unknown): boolean;
96
+ /** An exclusive end that falls at a day boundary on a later day does not
97
+ * occupy that day, so the span stops on the day before. An end with any other
98
+ * clock does occupy its day and is left alone. `endRaw` is the end field's
99
+ * own value — the span may already carry a clock from elsewhere. */
100
+ export declare function withExclusiveEnd<T>(span: RecordSpan<T>, endRaw: unknown): RecordSpan<T>;
79
101
  /** Split records into those that land on the calendar (with their spans)
80
102
  * and those with no usable anchor date (the "no date" tray). Spans are
81
103
  * sorted by start day so same-day stacking is stable across renders. */
82
- export declare function bucketRecords<T extends Record<string, unknown>>(items: readonly T[], anchorField: string, endField?: string, timeField?: string): {
104
+ export declare function bucketRecords<T extends Record<string, unknown>>(items: readonly T[], anchorField: string, endField?: string, timeField?: string, options?: SpanOptions): {
83
105
  spans: RecordSpan<T>[];
84
106
  noDate: T[];
85
107
  };
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_dist = require("../dist-Gj7ygaW2.cjs");
3
- const require_itemId = require("../itemId-CGT2J7YK.cjs");
4
- const require_promptSafety = require("../promptSafety-caJWd1ZQ.cjs");
3
+ const require_itemId = require("../itemId-CVrNibwT.cjs");
4
+ const require_promptSafety = require("../promptSafety-BGV1wrE6.cjs");
5
5
  const require_project = require("../project-C1ep9pvo.cjs");
6
6
  const require_iconGlyph = require("../iconGlyph-fSBp6k4J.cjs");
7
7
  require("../errorMessage-CT-va_Pv.cjs");
@@ -733,6 +733,7 @@ exports.embedTargetId = require_itemId.embedTargetId;
733
733
  exports.emptyRow = emptyRow;
734
734
  exports.encodeRecordTimes = require_itemId.encodeRecordTimes;
735
735
  exports.encodeServerTime = require_itemId.encodeServerTime;
736
+ exports.endsAtDayBoundary = require_itemId.endsAtDayBoundary;
736
737
  exports.enumColorClasses = enumColorClasses;
737
738
  exports.enumSortValue = enumSortValue;
738
739
  exports.enumValueIndex = enumValueIndex;
@@ -799,6 +800,7 @@ exports.snapshotEmptyEnums = snapshotEmptyEnums;
799
800
  exports.sortItems = sortItems;
800
801
  exports.sortValueOf = sortValueOf;
801
802
  exports.spanCoversDay = require_itemId.spanCoversDay;
803
+ exports.spanOptionsFor = require_itemId.spanOptionsFor;
802
804
  exports.storageKindFor = require_itemId.storageKindFor;
803
805
  exports.stringSortValue = stringSortValue;
804
806
  exports.toPresentCollectionData = toPresentCollectionData;
@@ -810,6 +812,7 @@ exports.uniqueRefTargets = require_promptSafety.uniqueRefTargets;
810
812
  exports.viaMatches = require_promptSafety.viaMatches;
811
813
  exports.whenMatches = require_promptSafety.whenMatches;
812
814
  exports.withCardScope = withCardScope;
815
+ exports.withExclusiveEnd = require_itemId.withExclusiveEnd;
813
816
  exports.ymdKey = require_itemId.ymdKey;
814
817
 
815
818
  //# sourceMappingURL=index.cjs.map
@@ -1,6 +1,6 @@
1
1
  import { t as errorMessage } from "../dist-BzoA9pDR.js";
2
- import { A as isSharedCollectionKey, B as isSafeSlug, C as encodeServerTime, D as collectionKeyId, E as serverTimeOf, F as sharedCollectionKey, G as INGEST_KINDS, H as AGENT_INGEST_KIND, I as SAFE_RECORD_ID_PATTERN, J as isReadOnlySchema, K as embedTargetId, L as SAFE_SLUG_PATTERN, M as localCollectionKeyOf, N as parseCollectionKeyId, O as collectionKeyName, P as sameCollectionKey, R as generateUniqueId, S as encodeRecordTimes, T as serverTimeMillis, U as COMPUTED_TYPES, V as nextUniqueItemId, W as FEED_SCHEDULES, X as fieldText, Y as storageKindFor, Z as fieldTextOrNull, _ as ACCENT_COLORS, a as bucketRecords, b as decodeRecordTimes, c as dateOf, d as parseIsoDate, f as parseIsoDateTime, g as ymdKey, h as spanCoversDay, i as assignLanes, j as isValidCollectionName, k as isLocalCollectionKey, l as daySlice, m as recordSpan, n as shortHexId, o as buildMonthGrid, p as parseTimeRange, q as isFieldDrivenEvery, r as MINUTES_PER_DAY, s as compareYmd, t as newItemId, u as monthAnchorDate, v as accentChipClasses, w as isCanonicalServerTime, x as decodeServerTime, y as isAccentColor, z as isSafeRecordId } from "../itemId-4P9S_ehz.js";
3
- import { C as actionVisible, D as fieldDefaultValue, E as whenMatches, O as firstUnknownDefault, S as viaMatches, T as fieldVisible, _ as uniqueRefTargets, a as evaluateDerived, b as projectBacklinkRow, c as selectDynamicRecord, d as flagFieldValue, f as itemIsDone, g as uniqueEmbedTargets, h as uniqueBacklinkSources, k as schemaDefaults, l as chipMatches, m as matchesWhere, n as deriveAll, o as firstDateField, p as toggleChecked, r as resolveRowRefs, s as resolveIcon, t as defangForPrompt, u as completionCoveredByFieldChip, v as backlinkRows, w as agentActionRunKey, x as rollupValue, y as coerceNumeric } from "../promptSafety-BpBTh5xO.js";
2
+ import { $ as fieldText, A as collectionKeyId, B as SAFE_SLUG_PATTERN, C as decodeRecordTimes, D as isCanonicalServerTime, E as encodeServerTime, F as localCollectionKeyOf, G as AGENT_INGEST_KIND, H as isSafeRecordId, I as parseCollectionKeyId, J as INGEST_KINDS, K as COMPUTED_TYPES, L as sameCollectionKey, M as isLocalCollectionKey, N as isSharedCollectionKey, O as serverTimeMillis, P as isValidCollectionName, Q as storageKindFor, R as sharedCollectionKey, S as isAccentColor, T as encodeRecordTimes, U as isSafeSlug, V as generateUniqueId, W as nextUniqueItemId, X as isFieldDrivenEvery, Y as embedTargetId, Z as isReadOnlySchema, _ as spanOptionsFor, a as bucketRecords, b as ACCENT_COLORS, c as dateOf, d as monthAnchorDate, et as fieldTextOrNull, f as parseIsoDate, g as spanCoversDay, h as recordSpan, i as assignLanes, j as collectionKeyName, k as serverTimeOf, l as daySlice, m as parseTimeRange, n as shortHexId, o as buildMonthGrid, p as parseIsoDateTime, q as FEED_SCHEDULES, r as MINUTES_PER_DAY, s as compareYmd, t as newItemId, u as endsAtDayBoundary, v as withExclusiveEnd, w as decodeServerTime, x as accentChipClasses, y as ymdKey, z as SAFE_RECORD_ID_PATTERN } from "../itemId-C9s-Jd5s.js";
3
+ import { C as actionVisible, D as fieldDefaultValue, E as whenMatches, O as firstUnknownDefault, S as viaMatches, T as fieldVisible, _ as uniqueRefTargets, a as evaluateDerived, b as projectBacklinkRow, c as selectDynamicRecord, d as flagFieldValue, f as itemIsDone, g as uniqueEmbedTargets, h as uniqueBacklinkSources, k as schemaDefaults, l as chipMatches, m as matchesWhere, n as deriveAll, o as firstDateField, p as toggleChecked, r as resolveRowRefs, s as resolveIcon, t as defangForPrompt, u as completionCoveredByFieldChip, v as backlinkRows, w as agentActionRunKey, x as rollupValue, y as coerceNumeric } from "../promptSafety-B5uGroik.js";
4
4
  import { n as projectRecordFields, t as mergeIntoExisting } from "../project-B0j_Vf_Q.js";
5
5
  import { n as resolveIconGlyph, t as DEFAULT_ICON } from "../iconGlyph-D8JeNg7R.js";
6
6
  import "../errorMessage-BQNpSYdT.js";
@@ -684,6 +684,6 @@ var buildOntologyGraph = (entries) => {
684
684
  };
685
685
  };
686
686
  //#endregion
687
- export { ACCENT_COLORS, AGENT_INGEST_KIND, COMPUTED_TYPES, DEFAULT_ICON, ENUM_ALERT, ENUM_NEUTRAL, ENUM_NUDGE, FEED_SCHEDULES, INGEST_KINDS, MINUTES_PER_DAY, SAFE_RECORD_ID_PATTERN, SAFE_SLUG_PATTERN, TOOL_DEFINITION, TOOL_NAME, accentChipClasses, actionVisible, agentActionRunKey, assignLanes, backlinkRows, boolSortValue, bucketRecords, buildMonthGrid, buildOntologyGraph, buildUpdatedRecord, cellKey, chipMatches, coerceInlineValue, coerceNumeric, collectionCardKey, collectionKeyId, collectionKeyName, compareSortValues, compareYmd, completionCoveredByFieldChip, customViewSendsChat, dateOf, dateSortValue, daySlice, decodeRecordTimes, decodeServerTime, defangForPrompt, deriveAll, derivedSortValue, draftToRecord, embedTargetId, emptyRow, encodeRecordTimes, encodeServerTime, enumColorClasses, enumSortValue, enumValueIndex, errorMessage, evaluateDerived, executePresentCollection, fieldDefaultValue, fieldText, fieldTextOrNull, fieldVisible, firstDateField, firstMissingRequiredField, firstUnknownDefault, flagFieldValue, generateUniqueId, isAccentColor, isCanonicalServerTime, isFieldDrivenEvery, isLocalCollectionKey, isReadOnlySchema, isSafeRecordId, isSafeSlug, isSharedCollectionKey, isSortableField, isValidCollectionName, itemIdOf, itemIsDone, itemLabelOf, itemMatchesQuery, labelFieldFor, localCollectionKeyOf, matchesWhere, mergeIntoExisting, monthAnchorDate, newItemId, nextSortDirection, nextUniqueItemId, numericSortValue, parseCollectionKeyId, parseIsoDate, parseIsoDateTime, parseTimeRange, projectBacklinkRow, projectRecordFields, recordSpan, resolveEnumColor, resolveIcon, resolveIconGlyph, resolveRowRefs, rollupValue, rowFromItem, rowIdOf, sameCollectionCard, sameCollectionKey, scalarSortValue, schemaDefaults, selectDynamicRecord, serverTimeMillis, serverTimeOf, sharedCollectionKey, shortHexId, skillCommandSeed, snapshotEmptyEnums, sortItems, sortValueOf, spanCoversDay, storageKindFor, stringSortValue, toPresentCollectionData, toShortcutInfo, toggleChecked, uniqueBacklinkSources, uniqueEmbedTargets, uniqueRefTargets, viaMatches, whenMatches, withCardScope, ymdKey };
687
+ export { ACCENT_COLORS, AGENT_INGEST_KIND, COMPUTED_TYPES, DEFAULT_ICON, ENUM_ALERT, ENUM_NEUTRAL, ENUM_NUDGE, FEED_SCHEDULES, INGEST_KINDS, MINUTES_PER_DAY, SAFE_RECORD_ID_PATTERN, SAFE_SLUG_PATTERN, TOOL_DEFINITION, TOOL_NAME, accentChipClasses, actionVisible, agentActionRunKey, assignLanes, backlinkRows, boolSortValue, bucketRecords, buildMonthGrid, buildOntologyGraph, buildUpdatedRecord, cellKey, chipMatches, coerceInlineValue, coerceNumeric, collectionCardKey, collectionKeyId, collectionKeyName, compareSortValues, compareYmd, completionCoveredByFieldChip, customViewSendsChat, dateOf, dateSortValue, daySlice, decodeRecordTimes, decodeServerTime, defangForPrompt, deriveAll, derivedSortValue, draftToRecord, embedTargetId, emptyRow, encodeRecordTimes, encodeServerTime, endsAtDayBoundary, enumColorClasses, enumSortValue, enumValueIndex, errorMessage, evaluateDerived, executePresentCollection, fieldDefaultValue, fieldText, fieldTextOrNull, fieldVisible, firstDateField, firstMissingRequiredField, firstUnknownDefault, flagFieldValue, generateUniqueId, isAccentColor, isCanonicalServerTime, isFieldDrivenEvery, isLocalCollectionKey, isReadOnlySchema, isSafeRecordId, isSafeSlug, isSharedCollectionKey, isSortableField, isValidCollectionName, itemIdOf, itemIsDone, itemLabelOf, itemMatchesQuery, labelFieldFor, localCollectionKeyOf, matchesWhere, mergeIntoExisting, monthAnchorDate, newItemId, nextSortDirection, nextUniqueItemId, numericSortValue, parseCollectionKeyId, parseIsoDate, parseIsoDateTime, parseTimeRange, projectBacklinkRow, projectRecordFields, recordSpan, resolveEnumColor, resolveIcon, resolveIconGlyph, resolveRowRefs, rollupValue, rowFromItem, rowIdOf, sameCollectionCard, sameCollectionKey, scalarSortValue, schemaDefaults, selectDynamicRecord, serverTimeMillis, serverTimeOf, sharedCollectionKey, shortHexId, skillCommandSeed, snapshotEmptyEnums, sortItems, sortValueOf, spanCoversDay, spanOptionsFor, storageKindFor, stringSortValue, toPresentCollectionData, toShortcutInfo, toggleChecked, uniqueBacklinkSources, uniqueEmbedTargets, uniqueRefTargets, viaMatches, whenMatches, withCardScope, withExclusiveEnd, ymdKey };
688
688
 
689
689
  //# sourceMappingURL=index.js.map
@@ -4,9 +4,9 @@ const require_dist = require("../../../dist-Gj7ygaW2.cjs");
4
4
  const require_root = require("../../../root-BvwBUcol.cjs");
5
5
  const require_relPath = require("../../../relPath-CTAjGdCL.cjs");
6
6
  const require_utils_fetch = require("../../../utils/fetch.cjs");
7
- const require_discovery = require("../../../discovery-B79IxEM6.cjs");
7
+ const require_discovery = require("../../../discovery-CwBXvtyn.cjs");
8
8
  const require_templatePath = require("../../../templatePath-27vUZowm.cjs");
9
- const require_server = require("../../../server-DZdM2cLD.cjs");
9
+ const require_server = require("../../../server-ObUrsDs2.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 { l as isUnknownArray, t as errorMessage } from "../../../dist-BzoA9pDR.j
2
2
  import { n as writeFileAtomic } from "../../../root-BcS4-Kge.js";
3
3
  import { n as toPosixRelPath } from "../../../relPath-DW8MC8VO.js";
4
4
  import { fetchWithTimeout } from "../../../utils/fetch.js";
5
- import { K as safeRecordId, et as collectionsRegistriesConfigPath, ht as skillsStagingDir, lt as projectSkillsDir, r as loadCollection, rt as getWorkspaceRoot, s as CollectionSchemaZ, st as log, t as acceptParsedSchema } from "../../../discovery-DIGau7M8.js";
5
+ import { K as safeRecordId, et as collectionsRegistriesConfigPath, ht as skillsStagingDir, lt as projectSkillsDir, r as loadCollection, rt as getWorkspaceRoot, s as CollectionSchemaZ, st as log, t as acceptParsedSchema } from "../../../discovery-XoYJI2Ot.js";
6
6
  import { t as isSafeActionTemplatePath } from "../../../templatePath-k_WNbL_Q.js";
7
- import { y as ONE_SECOND_MS } from "../../../server--34TYvGP.js";
7
+ import { y as ONE_SECOND_MS } from "../../../server-CM5XNicg.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,9 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_root = require("../../root-BvwBUcol.cjs");
3
- const require_itemId = require("../../itemId-CGT2J7YK.cjs");
4
- const require_discovery = require("../../discovery-B79IxEM6.cjs");
3
+ const require_itemId = require("../../itemId-CVrNibwT.cjs");
4
+ const require_discovery = require("../../discovery-CwBXvtyn.cjs");
5
5
  const require_templatePath = require("../../templatePath-27vUZowm.cjs");
6
- const require_server = require("../../server-DZdM2cLD.cjs");
6
+ const require_server = require("../../server-ObUrsDs2.cjs");
7
7
  exports.APP_MANIFEST_FILE = require_discovery.APP_MANIFEST_FILE;
8
8
  exports.BackendUnavailableError = require_discovery.BackendUnavailableError;
9
9
  exports.COLLECTION_ROOT_REQUIRED = require_discovery.COLLECTION_ROOT_REQUIRED;
@@ -1,6 +1,6 @@
1
1
  import { t as canonicalRoot } from "../../root-BcS4-Kge.js";
2
- import { U as COMPUTED_TYPES } from "../../itemId-4P9S_ehz.js";
3
- import { $ as collectionChangePayload, A as readItem, B as SCHEMA_FILE, C as CollectionQueryZ, D as generateItemId, E as deleteItem, F as loadAppManifest, G as resolveTemplatePath, H as isUnderRealRoot, I as parseAppManifest, J as BackendUnavailableError, K as safeRecordId, L as sharedItemsPath, M as writeItem, N as APP_MANIFEST_FILE, O as isRegularFile, P as appManifestReason, Q as collectionChangeKey, R as pageFromFullRead, S as compileJsonlQuery, T as MAX_QUERY_ROWS, U as itemFilePath, V as isContainedInRoot, W as resolveDataDir, X as COLLECTION_ROOT_REQUIRED, Y as isBackendUnavailable, _ as dedupeByRecordId, a as toDetail, ct as peekWorkspaceRoot, d as storeFor, dt as setCollectionChangePublisher, ft as setFirestoreAccessor, g as decodeCsvRecordId, h as csvRowToItem, i as resolvePrimaryField, it as hostSupportsSharedCollections, j as resolveCreateItemId, k as listItems, l as collectionWritable, mt as sharedCollectionChangePayload, n as discoverCollections, nt as firestoreHandle, o as toSummary, ot as localCollectionKey, p as MAX_CSV_ROWS, pt as setSharedCollectionsSupport, q as safeSlugName, r as loadCollection, rt as getWorkspaceRoot, s as CollectionSchemaZ, st as log, t as acceptParsedSchema, tt as configureCollectionHost, u as readOnlyRefusal, ut as publishCollectionChange, v as encodeCsvRecordId, w as DEFAULT_QUERY_ROWS, x as compileCsvQuery, y as normalizeCsvValue, z as projectItemFields } from "../../discovery-DIGau7M8.js";
2
+ import { K as COMPUTED_TYPES } from "../../itemId-C9s-Jd5s.js";
3
+ import { $ as collectionChangePayload, A as readItem, B as SCHEMA_FILE, C as CollectionQueryZ, D as generateItemId, E as deleteItem, F as loadAppManifest, G as resolveTemplatePath, H as isUnderRealRoot, I as parseAppManifest, J as BackendUnavailableError, K as safeRecordId, L as sharedItemsPath, M as writeItem, N as APP_MANIFEST_FILE, O as isRegularFile, P as appManifestReason, Q as collectionChangeKey, R as pageFromFullRead, S as compileJsonlQuery, T as MAX_QUERY_ROWS, U as itemFilePath, V as isContainedInRoot, W as resolveDataDir, X as COLLECTION_ROOT_REQUIRED, Y as isBackendUnavailable, _ as dedupeByRecordId, a as toDetail, ct as peekWorkspaceRoot, d as storeFor, dt as setCollectionChangePublisher, ft as setFirestoreAccessor, g as decodeCsvRecordId, h as csvRowToItem, i as resolvePrimaryField, it as hostSupportsSharedCollections, j as resolveCreateItemId, k as listItems, l as collectionWritable, mt as sharedCollectionChangePayload, n as discoverCollections, nt as firestoreHandle, o as toSummary, ot as localCollectionKey, p as MAX_CSV_ROWS, pt as setSharedCollectionsSupport, q as safeSlugName, r as loadCollection, rt as getWorkspaceRoot, s as CollectionSchemaZ, st as log, t as acceptParsedSchema, tt as configureCollectionHost, u as readOnlyRefusal, ut as publishCollectionChange, v as encodeCsvRecordId, w as DEFAULT_QUERY_ROWS, x as compileCsvQuery, y as normalizeCsvValue, z as projectItemFields } from "../../discovery-XoYJI2Ot.js";
4
4
  import { i as isSafeTemplatePath, n as isSafeCustomViewI18nPath, r as isSafeCustomViewPath, t as isSafeActionTemplatePath } from "../../templatePath-k_WNbL_Q.js";
5
- import { A as recordFieldProblem, B as stagedSkillDir, C as applyMutateAction, D as validateCollectionRecords, E as STORE_UNREADABLE, F as buildCollectionActionSeedPrompt, I as promptPathsFor, L as readCustomViewHtml, M as enrichItems, N as runQueryOverRows, O as validateRecordObject, P as buildActionSeedPrompt, R as readCustomViewI18n, S as schemaRelations, T as MAX_RECORD_ISSUES, _ as resolveEvery, a as MAX_UNSELECTIVE_ITEMS, b as computeCollectionIcon, c as deleteCollection, d as computeSuccessor, f as daysInMonth, g as parseCivil, h as maybeSpawnSuccessor, i as MAX_SCHEMA_ISSUES, j as runCollectionQuery, k as compileRecordZ, l as deleteCollectionRefusalMessage, m as isTriggerDue, n as MAX_PUT_ITEMS, o as makeManageCollectionTool, p as formatCivil, r as MAX_PUT_LINT, s as deleteCustomView, t as MAX_ITEMS_FILE_BYTES, u as advanceTriggerDate, v as successorId, w as firstMutateParamProblem, x as buildWorkspaceOntology, z as readSkillTemplate } from "../../server--34TYvGP.js";
5
+ import { A as recordFieldProblem, B as stagedSkillDir, C as applyMutateAction, D as validateCollectionRecords, E as STORE_UNREADABLE, F as buildCollectionActionSeedPrompt, I as promptPathsFor, L as readCustomViewHtml, M as enrichItems, N as runQueryOverRows, O as validateRecordObject, P as buildActionSeedPrompt, R as readCustomViewI18n, S as schemaRelations, T as MAX_RECORD_ISSUES, _ as resolveEvery, a as MAX_UNSELECTIVE_ITEMS, b as computeCollectionIcon, c as deleteCollection, d as computeSuccessor, f as daysInMonth, g as parseCivil, h as maybeSpawnSuccessor, i as MAX_SCHEMA_ISSUES, j as runCollectionQuery, k as compileRecordZ, l as deleteCollectionRefusalMessage, m as isTriggerDue, n as MAX_PUT_ITEMS, o as makeManageCollectionTool, p as formatCivil, r as MAX_PUT_LINT, s as deleteCustomView, t as MAX_ITEMS_FILE_BYTES, u as advanceTriggerDate, v as successorId, w as firstMutateParamProblem, x as buildWorkspaceOntology, z as readSkillTemplate } from "../../server-CM5XNicg.js";
6
6
  export { APP_MANIFEST_FILE, BackendUnavailableError, COLLECTION_ROOT_REQUIRED, COMPUTED_TYPES, CollectionQueryZ, CollectionSchemaZ, DEFAULT_QUERY_ROWS, MAX_CSV_ROWS, MAX_ITEMS_FILE_BYTES, MAX_PUT_ITEMS, MAX_PUT_LINT, MAX_QUERY_ROWS, MAX_RECORD_ISSUES, MAX_SCHEMA_ISSUES, MAX_UNSELECTIVE_ITEMS, SCHEMA_FILE, STORE_UNREADABLE, acceptParsedSchema, advanceTriggerDate, appManifestReason, applyMutateAction, buildActionSeedPrompt, buildCollectionActionSeedPrompt, buildWorkspaceOntology, canonicalRoot, collectionChangeKey, collectionChangePayload, collectionWritable, compileCsvQuery, compileJsonlQuery, compileRecordZ, computeCollectionIcon, computeSuccessor, configureCollectionHost, csvRowToItem, daysInMonth, decodeCsvRecordId, dedupeByRecordId, deleteCollection, deleteCollectionRefusalMessage, deleteCustomView, deleteItem, discoverCollections, encodeCsvRecordId, enrichItems, firestoreHandle, firstMutateParamProblem, formatCivil, generateItemId, getWorkspaceRoot, hostSupportsSharedCollections, isBackendUnavailable, isContainedInRoot, isRegularFile, isSafeActionTemplatePath, isSafeCustomViewI18nPath, isSafeCustomViewPath, isSafeTemplatePath, isTriggerDue, isUnderRealRoot, itemFilePath, listItems, loadAppManifest, loadCollection, localCollectionKey, log, makeManageCollectionTool, maybeSpawnSuccessor, normalizeCsvValue, pageFromFullRead, parseAppManifest, parseCivil, peekWorkspaceRoot, projectItemFields, promptPathsFor, publishCollectionChange, readCustomViewHtml, readCustomViewI18n, readItem, readOnlyRefusal, readSkillTemplate, recordFieldProblem, resolveCreateItemId, resolveDataDir, resolveEvery, resolvePrimaryField, resolveTemplatePath, runCollectionQuery, runQueryOverRows, safeRecordId, safeSlugName, schemaRelations, setCollectionChangePublisher, setFirestoreAccessor, setSharedCollectionsSupport, sharedCollectionChangePayload, sharedItemsPath, stagedSkillDir, storeFor, successorId, toDetail, toSummary, validateCollectionRecords, validateRecordObject, writeItem };
@@ -1,10 +1,10 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_root = require("../root-BvwBUcol.cjs");
3
- const require_itemId = require("../itemId-CGT2J7YK.cjs");
4
- const require_promptSafety = require("../promptSafety-caJWd1ZQ.cjs");
3
+ const require_itemId = require("../itemId-CVrNibwT.cjs");
4
+ const require_promptSafety = require("../promptSafety-BGV1wrE6.cjs");
5
5
  require("../collection/index.cjs");
6
- const require_discovery = require("../discovery-B79IxEM6.cjs");
7
- const require_server = require("../server-DZdM2cLD.cjs");
6
+ const require_discovery = require("../discovery-CwBXvtyn.cjs");
7
+ const require_server = require("../server-ObUrsDs2.cjs");
8
8
  const require_notifier = require("../notifier-B65Mvngb.cjs");
9
9
  let node_fs_promises = require("node:fs/promises");
10
10
  //#region src/collection-watchers/config.ts
@@ -1,9 +1,9 @@
1
1
  import { t as canonicalRoot } from "../root-BcS4-Kge.js";
2
- import { X as fieldText, j as isValidCollectionName } from "../itemId-4P9S_ehz.js";
3
- import { E as whenMatches, f as itemIsDone } from "../promptSafety-BpBTh5xO.js";
2
+ import { $ as fieldText, P as isValidCollectionName } from "../itemId-C9s-Jd5s.js";
3
+ import { E as whenMatches, f as itemIsDone } from "../promptSafety-B5uGroik.js";
4
4
  import "../collection/index.js";
5
- import { $ as collectionChangePayload, U as itemFilePath, ct as peekWorkspaceRoot, d as storeFor, mt as sharedCollectionChangePayload, n as discoverCollections, nt as firestoreHandle, r as loadCollection, ut as publishCollectionChange } from "../discovery-DIGau7M8.js";
6
- import { h as maybeSpawnSuccessor, m as isTriggerDue } from "../server--34TYvGP.js";
5
+ import { $ as collectionChangePayload, U as itemFilePath, ct as peekWorkspaceRoot, d as storeFor, mt as sharedCollectionChangePayload, n as discoverCollections, nt as firestoreHandle, r as loadCollection, ut as publishCollectionChange } from "../discovery-XoYJI2Ot.js";
6
+ import { h as maybeSpawnSuccessor, m as isTriggerDue } from "../server-CM5XNicg.js";
7
7
  import { d as publish, m as updateForPlugin, n as clear, s as listAll } from "../notifier-vAp5t6wL.js";
8
8
  import { access } from "node:fs/promises";
9
9
  //#region src/collection-watchers/config.ts
@@ -1,7 +1,7 @@
1
1
  const require_rolldown_runtime = require("./rolldown-runtime-VH7oDXx4.cjs");
2
2
  const require_dist = require("./dist-Gj7ygaW2.cjs");
3
3
  const require_root = require("./root-BvwBUcol.cjs");
4
- const require_itemId = require("./itemId-CGT2J7YK.cjs");
4
+ const require_itemId = require("./itemId-CVrNibwT.cjs");
5
5
  const require_project = require("./project-C1ep9pvo.cjs");
6
6
  const require_listen = require("./listen-BXthb-9C.cjs");
7
7
  const require_templatePath = require("./templatePath-27vUZowm.cjs");
@@ -3798,4 +3798,4 @@ Object.defineProperty(exports, "writeItem", {
3798
3798
  }
3799
3799
  });
3800
3800
 
3801
- //# sourceMappingURL=discovery-B79IxEM6.cjs.map
3801
+ //# sourceMappingURL=discovery-CwBXvtyn.cjs.map