@mulmoclaude/core 3.5.0 → 3.6.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 (45) hide show
  1. package/assets/helps/collection-skills.md +49 -1
  2. package/assets/helps/error-recovery.md +53 -0
  3. package/dist/calendarGrid-CQ8MVSRb.js.map +1 -1
  4. package/dist/calendarGrid-DGILaVxI.cjs.map +1 -1
  5. package/dist/collection/core/schema.d.ts +8 -1
  6. package/dist/collection/core/schemaZ.d.ts +36 -26
  7. package/dist/collection/firestore.cjs +51 -0
  8. package/dist/collection/firestore.cjs.map +1 -0
  9. package/dist/collection/firestore.d.ts +1 -0
  10. package/dist/collection/firestore.js +50 -0
  11. package/dist/collection/firestore.js.map +1 -0
  12. package/dist/collection/registry/server/index.cjs +2 -2
  13. package/dist/collection/registry/server/index.js +2 -2
  14. package/dist/collection/server/appManifest.d.ts +53 -0
  15. package/dist/collection/server/delete.d.ts +10 -0
  16. package/dist/collection/server/discoveredCollection.d.ts +10 -0
  17. package/dist/collection/server/discovery.d.ts +1 -0
  18. package/dist/collection/server/firestoreDocs.d.ts +39 -0
  19. package/dist/collection/server/firestoreStore.d.ts +14 -0
  20. package/dist/collection/server/host.d.ts +41 -0
  21. package/dist/collection/server/index.cjs +9 -2
  22. package/dist/collection/server/index.d.ts +4 -1
  23. package/dist/collection/server/index.js +3 -3
  24. package/dist/collection-watchers/index.cjs +132 -41
  25. package/dist/collection-watchers/index.cjs.map +1 -1
  26. package/dist/collection-watchers/index.js +132 -41
  27. package/dist/collection-watchers/index.js.map +1 -1
  28. package/dist/collection-watchers/reconciler.d.ts +1 -1
  29. package/dist/{discovery-DH9wweuj.js → discovery-CdkaURVY.js} +368 -57
  30. package/dist/discovery-CdkaURVY.js.map +1 -0
  31. package/dist/{discovery-Ck4AqikY.cjs → discovery-Cw5xWzZD.cjs} +407 -54
  32. package/dist/discovery-Cw5xWzZD.cjs.map +1 -0
  33. package/dist/feeds/server/index.cjs +2 -2
  34. package/dist/feeds/server/index.js +2 -2
  35. package/dist/google/index.cjs +1 -1
  36. package/dist/google/index.js +1 -1
  37. package/dist/{server-5EMj3naj.cjs → server-9mFaGLdq.cjs} +23 -4
  38. package/dist/server-9mFaGLdq.cjs.map +1 -0
  39. package/dist/{server-BiRLLMpW.js → server-DdHaX_Uu.js} +23 -4
  40. package/dist/server-DdHaX_Uu.js.map +1 -0
  41. package/package.json +7 -1
  42. package/dist/discovery-Ck4AqikY.cjs.map +0 -1
  43. package/dist/discovery-DH9wweuj.js.map +0 -1
  44. package/dist/server-5EMj3naj.cjs.map +0 -1
  45. package/dist/server-BiRLLMpW.js.map +0 -1
@@ -4,8 +4,8 @@ const require_dist = require("../../dist-CsgSfWwR.cjs");
4
4
  const require_root = require("../../root-rPH6FGDT.cjs");
5
5
  const require_calendarGrid = require("../../calendarGrid-DGILaVxI.cjs");
6
6
  const require_project = require("../../project-C1ep9pvo.cjs");
7
- const require_discovery = require("../../discovery-Ck4AqikY.cjs");
8
- const require_server = require("../../server-5EMj3naj.cjs");
7
+ const require_discovery = require("../../discovery-Cw5xWzZD.cjs");
8
+ const require_server = require("../../server-9mFaGLdq.cjs");
9
9
  const require_feeds_paths = require("../paths.cjs");
10
10
  const require_ingestTypes = require("../../ingestTypes-iaiq33Ph.cjs");
11
11
  const require_notifier = require("../../notifier-DZJj0sOh.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-BMroU_mB.js";
3
3
  import { M as FEED_SCHEDULES, N as INGEST_KINDS } from "../../calendarGrid-CQ8MVSRb.js";
4
4
  import { t as mergeIntoExisting } from "../../project-B0j_Vf_Q.js";
5
- import { B as resolveDataDir, N as listItems, U as safeSlugName, ct as createHostSlot, d as storeFor, n as discoverCollections, st as createForwardingLogger } from "../../discovery-DH9wweuj.js";
6
- import { A as buildCollectionActionSeedPrompt, P as readSkillTemplate, j as promptPathsFor } from "../../server-BiRLLMpW.js";
5
+ import { K as safeSlugName, U as resolveDataDir, d as storeFor, ht as createHostSlot, k as listItems, mt as createForwardingLogger, n as discoverCollections } from "../../discovery-CdkaURVY.js";
6
+ import { A as buildCollectionActionSeedPrompt, P as readSkillTemplate, j as promptPathsFor } from "../../server-DdHaX_Uu.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-CEi-Ot7F.js";
9
9
  import { d as publish, n as clear } from "../../notifier-DhnwR82U.js";
@@ -6,7 +6,7 @@ const require_root = require("../root-rPH6FGDT.cjs");
6
6
  const require_utils_fetch = require("../utils/fetch.cjs");
7
7
  const require_calendarGrid = require("../calendarGrid-DGILaVxI.cjs");
8
8
  const require_project = require("../project-C1ep9pvo.cjs");
9
- const require_discovery = require("../discovery-Ck4AqikY.cjs");
9
+ const require_discovery = require("../discovery-Cw5xWzZD.cjs");
10
10
  const require_paths = require("../paths-ClV946_f.cjs");
11
11
  let node_fs = require("node:fs");
12
12
  let node_path = require("node:path");
@@ -4,7 +4,7 @@ import { n as writeFileAtomic } from "../root-BMroU_mB.js";
4
4
  import { fetchWithTimeout } from "../utils/fetch.js";
5
5
  import { l as parseIsoDate, u as parseIsoDateTime } from "../calendarGrid-CQ8MVSRb.js";
6
6
  import { t as mergeIntoExisting } from "../project-B0j_Vf_Q.js";
7
- import { X as getWorkspaceRoot, ct as createHostSlot, d as storeFor, n as discoverCollections, st as createForwardingLogger } from "../discovery-DH9wweuj.js";
7
+ import { d as storeFor, ht as createHostSlot, mt as createForwardingLogger, n as discoverCollections, nt as getWorkspaceRoot } from "../discovery-CdkaURVY.js";
8
8
  import { t as mulmoConfigDir } from "../paths-CkJxNZ7T.js";
9
9
  import { promises } from "node:fs";
10
10
  import path, { join } from "node:path";
@@ -4,7 +4,7 @@ const require_root = require("./root-rPH6FGDT.cjs");
4
4
  const require_relPath = require("./relPath-CTAjGdCL.cjs");
5
5
  const require_calendarGrid = require("./calendarGrid-DGILaVxI.cjs");
6
6
  const require_promptSafety = require("./promptSafety-NNGViiCr.cjs");
7
- const require_discovery = require("./discovery-Ck4AqikY.cjs");
7
+ const require_discovery = require("./discovery-Cw5xWzZD.cjs");
8
8
  const require_feeds_paths = require("./feeds/paths.cjs");
9
9
  const require_skill_bridge_index = require("./skill-bridge/index.cjs");
10
10
  let node_path = require("node:path");
@@ -1024,7 +1024,8 @@ function deleteCollectionRefusalMessage(result) {
1024
1024
  "user-scope": `collection '${slug}' is user-scope (~/.claude/skills/) and is read-only from MulmoClaude`,
1025
1025
  preset: `collection '${slug}' is a preset (mc-*) and re-seeds on restart; unstar it from the catalog instead`,
1026
1026
  "unsafe-data-path": `collection '${slug}' declares a dataPath outside its own data/${slug}/ subtree; refusing to delete`,
1027
- "path-escape": `a directory for collection '${slug}' escapes the workspace`
1027
+ "path-escape": `a directory for collection '${slug}' escapes the workspace`,
1028
+ "unsupported-backend": `collection '${slug}' is a shared collection — its records are documents of its app, which this delete can neither archive nor remove, and other members read the same documents. Removing its records first does NOT unlock it. To retire the whole app, a Firestore project administrator deletes it recursively (\`firebase firestore:delete "apps/<aid>" --recursive\`, children first); the app owner's client credentials cannot do it.`
1028
1029
  }[result.kind];
1029
1030
  }
1030
1031
  async function pathExists(target) {
@@ -1080,6 +1081,10 @@ function isDataDirSafe(dataDir, slug, workspaceRoot) {
1080
1081
  * `dataSource` collection has no record files to copy (its rows live in
1081
1082
  * the external data file, which the delete never touches). */
1082
1083
  function restoreRecordsStep(schema) {
1084
+ if (schema.storage?.type === "firestore") return `2. Records: NOT archived. This is a shared collection: its records are
1085
+ documents at \`apps/<aid>/collections/<cid>/items\`, which this delete did
1086
+ not touch or export. They are still there, and other members still read
1087
+ them.`;
1083
1088
  if (schema.storage !== void 0) return `2. Records: copy the archived database file
1084
1089
  \`${node_path.default.basename(schema.storage.path)}\` (next to this document) back to
1085
1090
  \`${schema.storage.path}\` (workspace-relative, \`cp\`). It holds every
@@ -1138,9 +1143,16 @@ ${restoreRecordsStep(schema)}
1138
1143
 
1139
1144
  - slug: \`${slug}\`
1140
1145
  - title: ${schema.title}
1141
- - dataPath: \`${schema.dataPath ?? (schema.storage !== void 0 ? `(storage) ${schema.storage.path}` : `(dataSource) ${schema.dataSource?.path}`)}\`
1146
+ - dataPath: \`${schema.dataPath ?? recordLocationLabel(schema)}\`
1142
1147
  `;
1143
1148
  }
1149
+ /** Where a non-`dataPath` collection's records live, for the restore doc's
1150
+ * header line. */
1151
+ function recordLocationLabel(schema) {
1152
+ if (schema.storage?.type === "firestore") return "(storage) shared app";
1153
+ if (schema.storage !== void 0) return `(storage) ${schema.storage.path}`;
1154
+ return `(dataSource) ${schema.dataSource?.path}`;
1155
+ }
1144
1156
  /** Copy one skill copy + the records + RESTORE.md into `archiveDir`. */
1145
1157
  async function writeArchive(collection, archiveDir, workspaceRoot) {
1146
1158
  const staging = require_discovery.stagingSkillDir(workspaceRoot, collection.slug);
@@ -1198,6 +1210,13 @@ async function deleteCollection(collection, opts = {}) {
1198
1210
  kind: "preset",
1199
1211
  slug
1200
1212
  };
1213
+ if (collection.schema.storage?.type === "firestore") {
1214
+ require_discovery.log.warn("collections", "deleteCollection refused: a shared collection's records can be neither archived nor removed here", { slug });
1215
+ return {
1216
+ kind: "unsupported-backend",
1217
+ slug
1218
+ };
1219
+ }
1201
1220
  if (!isDataDirSafe(collection.dataDir, slug, workspaceRoot)) {
1202
1221
  require_discovery.log.warn("collections", "deleteCollection refused: dataDir is not under the per-collection root", {
1203
1222
  slug,
@@ -2255,4 +2274,4 @@ Object.defineProperty(exports, "validateRecordObject", {
2255
2274
  }
2256
2275
  });
2257
2276
 
2258
- //# sourceMappingURL=server-5EMj3naj.cjs.map
2277
+ //# sourceMappingURL=server-9mFaGLdq.cjs.map