@mulmoclaude/collection-plugin 0.5.3 → 0.5.6

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.
package/dist/style.css CHANGED
@@ -2746,7 +2746,7 @@
2746
2746
  }
2747
2747
  }
2748
2748
 
2749
- .custom-view-container[data-v-3ab71997] {
2749
+ .custom-view-container[data-v-d5fb7ca6] {
2750
2750
  width: 100%;
2751
2751
  height: 100%;
2752
2752
  min-height: 0;
@@ -2755,12 +2755,12 @@
2755
2755
  background: white;
2756
2756
  overflow: hidden;
2757
2757
  }
2758
- .custom-view-message[data-v-3ab71997] {
2758
+ .custom-view-message[data-v-d5fb7ca6] {
2759
2759
  padding: 1rem;
2760
2760
  font-size: 0.875rem;
2761
2761
  color: #64748b;
2762
2762
  }
2763
- [role="alert"].custom-view-message[data-v-3ab71997] {
2763
+ [role="alert"].custom-view-message[data-v-d5fb7ca6] {
2764
2764
  color: #b71c1c;
2765
2765
  }
2766
2766
  /*$vite$:1*/
@@ -3,7 +3,25 @@ type __VLS_Props = {
3
3
  slug: string;
4
4
  view: CollectionCustomView;
5
5
  };
6
- declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
6
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
7
+ openItem: (payload: {
8
+ id: string;
9
+ mode: "view" | "edit";
10
+ }) => any;
11
+ startChat: (payload: {
12
+ prompt: string;
13
+ role?: string;
14
+ }) => any;
15
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
16
+ onOpenItem?: ((payload: {
17
+ id: string;
18
+ mode: "view" | "edit";
19
+ }) => any) | undefined;
20
+ onStartChat?: ((payload: {
21
+ prompt: string;
22
+ role?: string;
23
+ }) => any) | undefined;
24
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
7
25
  declare const _default: typeof __VLS_export;
8
26
  export default _default;
9
27
  //# sourceMappingURL=CollectionCustomView.vue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CollectionCustomView.vue.d.ts","sourceRoot":"","sources":["../../../src/vue/components/CollectionCustomView.vue"],"names":[],"mappings":"AAiJA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAK9D,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,oBAAoB,CAAC;CAC5B,CAAC;AA4IF,QAAA,MAAM,YAAY,kSAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"CollectionCustomView.vue.d.ts","sourceRoot":"","sources":["../../../src/vue/components/CollectionCustomView.vue"],"names":[],"mappings":"AAuNA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAK9D,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,oBAAoB,CAAC;CAC5B,CAAC;AAuNF,QAAA,MAAM,YAAY;;YAjNU,MAAM;cAAQ,MAAM,GAAG,MAAM;;;gBAGxB,MAAM;eAAS,MAAM;;;;YAH1B,MAAM;cAAQ,MAAM,GAAG,MAAM;;;gBAGxB,MAAM;eAAS,MAAM;;kFAiNpD,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -26,18 +26,18 @@ type __VLS_ModelProps = {
26
26
  type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
27
27
  declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
28
28
  edit: () => any;
29
+ delete: () => any;
29
30
  close: () => any;
30
31
  submit: () => any;
31
32
  cancel: () => any;
32
- delete: () => any;
33
33
  runAction: (action: CollectionAction) => any;
34
34
  "update:editing": (value: EditState | null) => any;
35
35
  }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
36
36
  onEdit?: (() => any) | undefined;
37
+ onDelete?: (() => any) | undefined;
37
38
  onClose?: (() => any) | undefined;
38
39
  onSubmit?: (() => any) | undefined;
39
40
  onCancel?: (() => any) | undefined;
40
- onDelete?: (() => any) | undefined;
41
41
  onRunAction?: ((action: CollectionAction) => any) | undefined;
42
42
  "onUpdate:editing"?: ((value: EditState | null) => any) | undefined;
43
43
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
@@ -1 +1 @@
1
- {"version":3,"file":"CollectionView.vue.d.ts","sourceRoot":"","sources":["../../../src/vue/components/CollectionView.vue"],"names":[],"mappings":"AAujEA,OAAO,EAML,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AA8B/B;;;;;;;;;6CAS6C;AAC7C,KAAK,WAAW,GAAG;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;;;uEAGmE;IACnE,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AA27GF,QAAA,MAAM,YAAY;;;cAh7GiB,eAAe;qBAAe,MAAM;oBAAc,MAAM;;;;;cAAxD,eAAe;qBAAe,MAAM;oBAAc,MAAM;;kFAm7GzF,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"CollectionView.vue.d.ts","sourceRoot":"","sources":["../../../src/vue/components/CollectionView.vue"],"names":[],"mappings":"AA6qEA,OAAO,EAML,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AA8B/B;;;;;;;;;6CAS6C;AAC7C,KAAK,WAAW,GAAG;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;;;uEAGmE;IACnE,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAkkHF,QAAA,MAAM,YAAY;;;cAvjHiB,eAAe;qBAAe,MAAM;oBAAc,MAAM;;;;;cAAxD,eAAe;qBAAe,MAAM;oBAAc,MAAM;;kFA0jHzF,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -159,6 +159,11 @@ export interface CollectionUi {
159
159
  reconcileShortcuts: (kind: "collection" | "feed", live: CollectionShortcutInfo[]) => Promise<void>;
160
160
  /** Start a new chat with a seed prompt + role (host: `useAppApi().startNewChat`). */
161
161
  startChat: (prompt: string, role: string) => void;
162
+ /** Open a new chat with `prompt` prefilled in the composer as an editable DRAFT
163
+ * (NOT auto-sent) — the user reviews / edits / sends it. Backs a custom view's
164
+ * `__MC_VIEW.startChat`. `role` is optional and validated host-side (falls back
165
+ * to the general role). */
166
+ startNewChatDraft: (prompt: string, role?: string) => void;
162
167
  /** The host's active i18n locale tag (e.g. "en", "ja"), read reactively — the
163
168
  * plugin syncs its own self-contained i18n instance to it. */
164
169
  localeTag: () => string;
@@ -172,6 +177,13 @@ export interface CollectionUi {
172
177
  /** Active-notification severity per record id, for accenting flagged rows/cards
173
178
  * (`collectionNotifiedSeverities` over the host's live notifier entries). */
174
179
  notifiedSeverities: (slug: string) => Map<string, CollectionNotifySeverity>;
180
+ /** Subscribe to server-side record changes for `slug` — fires `cb` whenever a
181
+ * record is created / updated / deleted by ANY writer (the agent, the UI, a
182
+ * feed refresh, or a host-driven `spawn` successor), so a live view can
183
+ * debounce-refetch. Returns an unsubscribe. Optional: a host without a
184
+ * pub/sub transport omits it and views fall back to manual refresh (so this
185
+ * is purely additive — a missing binding never breaks a view). */
186
+ subscribeChanges?: (slug: string, cb: () => void) => () => void;
175
187
  /** The host's pin/unpin toggle (couples to the host's shortcut store + is
176
188
  * shared with other host views), rendered in the View header via
177
189
  * `<component :is>`. Props: `kind`, `slug`, `title`, `icon`. */
@@ -1 +1 @@
1
- {"version":3,"file":"uiContext.d.ts","sourceRoot":"","sources":["../../src/vue/uiContext.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"uiContext.d.ts","sourceRoot":"","sources":["../../src/vue/uiContext.ts"],"names":[],"mappings":"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"}
package/dist/vue.cjs CHANGED
@@ -2379,12 +2379,15 @@ var CollectionCustomView_vue_vue_type_script_setup_true_lang_default = /* @__PUR
2379
2379
  slug: {},
2380
2380
  view: {}
2381
2381
  },
2382
- setup(__props) {
2382
+ emits: ["openItem", "startChat"],
2383
+ setup(__props, { emit: __emit }) {
2383
2384
  const { t } = useCollectionI18n();
2384
2385
  const props = __props;
2386
+ const emit = __emit;
2385
2387
  const loading = (0, vue.ref)(true);
2386
2388
  const error = (0, vue.ref)(null);
2387
2389
  const srcdoc = (0, vue.ref)(null);
2390
+ const iframeEl = (0, vue.ref)(null);
2388
2391
  let refreshTimer;
2389
2392
  function clearRefresh() {
2390
2393
  if (refreshTimer !== void 0) {
@@ -2433,9 +2436,53 @@ var CollectionCustomView_vue_vue_type_script_setup_true_lang_default = /* @__PUR
2433
2436
  }
2434
2437
  }
2435
2438
  (0, vue.watch)([() => props.slug, () => props.view.id], () => void load(), { immediate: true });
2436
- (0, vue.onBeforeUnmount)(clearRefresh);
2439
+ let changeUnsub = null;
2440
+ function relayChange() {
2441
+ iframeEl.value?.contentWindow?.postMessage({
2442
+ type: "mc-collection-changed",
2443
+ slug: props.slug
2444
+ }, "*");
2445
+ }
2446
+ (0, vue.watch)(() => props.slug, (slug) => {
2447
+ changeUnsub?.();
2448
+ changeUnsub = null;
2449
+ const subscribe = collectionUi().subscribeChanges;
2450
+ if (slug && subscribe) changeUnsub = subscribe(slug, relayChange);
2451
+ }, { immediate: true });
2452
+ function handleOpenItem(body) {
2453
+ const itemId = typeof body.id === "string" ? body.id : String(body.id ?? "");
2454
+ if (!itemId) return;
2455
+ emit("openItem", {
2456
+ id: itemId,
2457
+ mode: body.mode === "edit" ? "edit" : "view"
2458
+ });
2459
+ }
2460
+ function handleStartChat(body) {
2461
+ const prompt = typeof body.prompt === "string" ? body.prompt.trim() : "";
2462
+ if (!prompt) return;
2463
+ emit("startChat", {
2464
+ prompt,
2465
+ role: typeof body.role === "string" ? body.role : void 0
2466
+ });
2467
+ }
2468
+ function onWindowMessage(event) {
2469
+ if (event.source !== iframeEl.value?.contentWindow) return;
2470
+ const msg = event.data;
2471
+ if (!msg || msg.slug !== props.slug) return;
2472
+ if (msg.type === "mc-open-item") handleOpenItem(msg);
2473
+ else if (msg.type === "mc-start-chat") handleStartChat(msg);
2474
+ }
2475
+ (0, vue.onMounted)(() => window.addEventListener("message", onWindowMessage));
2476
+ (0, vue.onBeforeUnmount)(() => {
2477
+ clearRefresh();
2478
+ changeUnsub?.();
2479
+ changeUnsub = null;
2480
+ window.removeEventListener("message", onWindowMessage);
2481
+ });
2437
2482
  return (_ctx, _cache) => {
2438
2483
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$5, [error.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_2$4, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.customViewError", { error: error.value })), 1)) : loading.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_3$4, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.customViewLoading")), 1)) : srcdoc.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("iframe", {
2484
+ ref_key: "iframeEl",
2485
+ ref: iframeEl,
2439
2486
  key: __props.view.id,
2440
2487
  "data-testid": "collection-custom-view-iframe",
2441
2488
  title: __props.view.label,
@@ -2455,7 +2502,7 @@ var _plugin_vue_export_helper_default = (sfc, props) => {
2455
2502
  };
2456
2503
  //#endregion
2457
2504
  //#region src/vue/components/CollectionCustomView.vue
2458
- var CollectionCustomView_default = /* @__PURE__ */ _plugin_vue_export_helper_default(CollectionCustomView_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-3ab71997"]]);
2505
+ var CollectionCustomView_default = /* @__PURE__ */ _plugin_vue_export_helper_default(CollectionCustomView_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-d5fb7ca6"]]);
2459
2506
  //#endregion
2460
2507
  //#region src/vue/useCollectionRendering.ts
2461
2508
  function useCollectionRendering(collection, locale) {
@@ -2985,6 +3032,17 @@ var _hoisted_83 = { class: "px-6 py-5" };
2985
3032
  var _hoisted_84 = ["placeholder", "onKeydown"];
2986
3033
  var _hoisted_85 = { class: "px-6 py-3.5 border-t border-slate-100 flex items-center justify-end gap-2 bg-slate-50/50" };
2987
3034
  var _hoisted_86 = ["disabled"];
3035
+ /** `slug` / `selected` are supplied only in EMBEDDED mode (the
3036
+ * `presentCollection` chat card mounts this component and drives both
3037
+ * from the tool result). In standalone route mode (the
3038
+ * `/collections/:slug` page) both are undefined and the component reads
3039
+ * `route.params.slug` / `route.query.selected` as before.
3040
+ *
3041
+ * `sendTextMessage` is forwarded ONLY by the chat card — its presence
3042
+ * is our "rendered inside a chat" signal. When set, chat-triggering
3043
+ * actions send into the current session instead of spawning a new
3044
+ * chat (see `runAction` / `submitChat`). */
3045
+ var LIVE_REFRESH_DEBOUNCE_MS = 150;
2988
3046
  //#endregion
2989
3047
  //#region src/vue/components/CollectionView.vue
2990
3048
  var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -3358,6 +3416,26 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
3358
3416
  }
3359
3417
  maybeAutoRefreshFeed(slug);
3360
3418
  }
3419
+ /** Refresh records + schema IN PLACE for a live (pub/sub-driven) update,
3420
+ * preserving the user's browsing state — unlike `loadCollection`, which is the
3421
+ * route-change path and resets it. Specifically: does NOT null `collection`
3422
+ * (so the layout and an active custom-view iframe don't remount), keeps
3423
+ * `searchQuery` / `openDay` / `sortState`, and shows no loading spinner; the
3424
+ * open detail (`viewing`) is re-resolved against the fresh records by id, so it
3425
+ * follows an edited record and closes only if the record was deleted. A failed
3426
+ * fetch is a no-op (keep the current data) — a transient blip shouldn't blank a
3427
+ * view the user is reading. */
3428
+ async function refreshItemsInPlace(slug) {
3429
+ const result = await cui.fetchCollectionDetail(slug);
3430
+ if (!result.ok || activeSlug.value !== slug) return;
3431
+ collection.value = result.data.collection;
3432
+ items.value = result.data.items;
3433
+ dataIssues.value = result.data.issues ?? [];
3434
+ enumOriginallyEmpty.value = snapshotEmptyEnums(result.data.collection.schema, result.data.items);
3435
+ await render.loadLinkedCollections(result.data.collection.schema, slug);
3436
+ if (activeSlug.value !== slug) return;
3437
+ if (viewing.value) viewing.value = findItemById(String(viewing.value[result.data.collection.schema.primaryKey] ?? "")) ?? null;
3438
+ }
3361
3439
  function maybeAutoRefreshFeed(slug) {
3362
3440
  if (embedded.value) return;
3363
3441
  const current = collection.value;
@@ -3873,6 +3951,30 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
3873
3951
  showDetail(item);
3874
3952
  writeSelectedToUrl(itemId);
3875
3953
  }
3954
+ /** A custom (sandboxed) view asked to open a record in the shared modal.
3955
+ * `view` → read-only detail, `edit` → straight into the editor. Ungated: the
3956
+ * capability token governs the view's *code*, not user actions through the
3957
+ * host's own trusted modal (no write happens without an explicit Save). */
3958
+ function onCustomViewOpenItem(payload) {
3959
+ const item = findItemById(payload.id);
3960
+ if (!item) return;
3961
+ if (editing.value) closeEditor();
3962
+ if (payload.mode === "edit") {
3963
+ openEdit(item);
3964
+ return;
3965
+ }
3966
+ showDetail(item);
3967
+ writeSelectedToUrl(payload.id);
3968
+ }
3969
+ /** The custom view called `__MC_VIEW.startChat(prompt, role)` — open a new chat
3970
+ * with the prompt prefilled as an editable draft. The host validates `role`
3971
+ * (falls back to General). The view's code only proposes text; the user
3972
+ * approves / edits / sends, so no capability is required. */
3973
+ function onCustomViewStartChat(payload) {
3974
+ const prompt = payload.prompt.trim();
3975
+ if (!prompt) return;
3976
+ cui.startNewChatDraft(prompt, payload.role);
3977
+ }
3876
3978
  /** A calendar day cell was activated → open its popup on a clean slate
3877
3979
  * (clear any prior selection so the popup opens timeline-only). */
3878
3980
  function onOpenDay(day) {
@@ -3928,6 +4030,42 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
3928
4030
  loading.value = false;
3929
4031
  }
3930
4032
  }, { immediate: true });
4033
+ let changeUnsub = null;
4034
+ let liveRefreshTimer;
4035
+ let pendingRemoteRefresh = false;
4036
+ function clearLiveRefreshTimer() {
4037
+ if (liveRefreshTimer !== void 0) {
4038
+ clearTimeout(liveRefreshTimer);
4039
+ liveRefreshTimer = void 0;
4040
+ }
4041
+ }
4042
+ function onRemoteChange(slug) {
4043
+ clearLiveRefreshTimer();
4044
+ liveRefreshTimer = setTimeout(() => {
4045
+ liveRefreshTimer = void 0;
4046
+ if (editing.value) {
4047
+ pendingRemoteRefresh = true;
4048
+ return;
4049
+ }
4050
+ if (activeSlug.value === slug) refreshItemsInPlace(slug);
4051
+ }, LIVE_REFRESH_DEBOUNCE_MS);
4052
+ }
4053
+ (0, vue.watch)(editing, (current) => {
4054
+ if (current || !pendingRemoteRefresh) return;
4055
+ pendingRemoteRefresh = false;
4056
+ if (activeSlug.value) refreshItemsInPlace(activeSlug.value);
4057
+ });
4058
+ (0, vue.watch)(activeSlug, (slug) => {
4059
+ changeUnsub?.();
4060
+ changeUnsub = null;
4061
+ clearLiveRefreshTimer();
4062
+ if (slug && cui.subscribeChanges) changeUnsub = cui.subscribeChanges(slug, () => onRemoteChange(slug));
4063
+ }, { immediate: true });
4064
+ (0, vue.onUnmounted)(() => {
4065
+ changeUnsub?.();
4066
+ changeUnsub = null;
4067
+ clearLiveRefreshTimer();
4068
+ });
3931
4069
  (0, vue.watch)([
3932
4070
  activeView,
3933
4071
  calendarAnchorField,
@@ -4252,7 +4390,9 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4252
4390
  "notified"
4253
4391
  ])])])) : activeCustomView.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_45, [(0, vue.createVNode)(CollectionCustomView_default, {
4254
4392
  slug: collection.value.slug,
4255
- view: activeCustomView.value
4393
+ view: activeCustomView.value,
4394
+ onOpenItem: onCustomViewOpenItem,
4395
+ onStartChat: onCustomViewStartChat
4256
4396
  }, null, 8, ["slug", "view"])])) : items.value.length === 0 && editing.value?.mode !== "create" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_46, [_cache[41] || (_cache[41] = (0, vue.createElementVNode)("span", { class: "material-icons text-4xl text-slate-300" }, "folder_open", -1)), (0, vue.createElementVNode)("p", _hoisted_47, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.itemsEmpty")), 1)])) : filteredItems.value.length === 0 && editing.value?.mode !== "create" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_48, [
4257
4397
  _cache[42] || (_cache[42] = (0, vue.createElementVNode)("span", { class: "material-icons text-4xl text-slate-300" }, "search_off", -1)),
4258
4398
  (0, vue.createElementVNode)("p", _hoisted_49, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.noMatchingItems")), 1),