@mulmoclaude/core 4.4.2 → 4.5.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 (75) hide show
  1. package/assets/helps/bug-report-faq.md +13 -0
  2. package/assets/helps/business.md +4 -0
  3. package/assets/helps/error-recovery.md +71 -0
  4. package/assets/helps/gemini.md +1 -1
  5. package/assets/helps/mulmoscript.md +71 -1
  6. package/assets/helps/presentation-deck.md +4 -1
  7. package/assets/helps/storyteller.md +7 -0
  8. package/dist/collection/core/accentColor.d.ts +23 -0
  9. package/dist/collection/core/iconGlyph.d.ts +26 -0
  10. package/dist/collection/core/schema.d.ts +9 -0
  11. package/dist/collection/core/schemaZ.d.ts +18 -0
  12. package/dist/collection/core/shortcutInfo.d.ts +14 -0
  13. package/dist/collection/core/uiTypes.d.ts +6 -0
  14. package/dist/collection/index.cjs +22 -2
  15. package/dist/collection/index.cjs.map +1 -1
  16. package/dist/collection/index.d.ts +3 -0
  17. package/dist/collection/index.js +17 -3
  18. package/dist/collection/index.js.map +1 -1
  19. package/dist/collection/registry/server/index.cjs +3 -3
  20. package/dist/collection/registry/server/index.js +3 -3
  21. package/dist/collection/server/index.cjs +5 -4
  22. package/dist/collection/server/index.js +5 -5
  23. package/dist/collection/server/paths.d.ts +10 -0
  24. package/dist/collection-watchers/index.cjs +5 -5
  25. package/dist/collection-watchers/index.js +5 -5
  26. package/dist/{discovery-Dl9nRa-m.cjs → discovery-2TvulIz8.cjs} +25 -5
  27. package/dist/discovery-2TvulIz8.cjs.map +1 -0
  28. package/dist/{discovery-P64fgtuD.js → discovery-BY-nMCuh.js} +20 -6
  29. package/dist/discovery-BY-nMCuh.js.map +1 -0
  30. package/dist/feeds/index.cjs +2 -2
  31. package/dist/feeds/index.js +2 -2
  32. package/dist/feeds/server/index.cjs +5 -5
  33. package/dist/feeds/server/index.js +5 -5
  34. package/dist/files/atomic.d.ts +4 -0
  35. package/dist/files/index.cjs +1 -1
  36. package/dist/files/index.js +1 -1
  37. package/dist/google/index.cjs +3 -3
  38. package/dist/google/index.js +3 -3
  39. package/dist/iconGlyph-D8JeNg7R.js +59 -0
  40. package/dist/iconGlyph-D8JeNg7R.js.map +1 -0
  41. package/dist/iconGlyph-fSBp6k4J.cjs +70 -0
  42. package/dist/iconGlyph-fSBp6k4J.cjs.map +1 -0
  43. package/dist/{ingestTypes-CaX7_s-K.cjs → ingestTypes-DsVH9BYy.cjs} +2 -2
  44. package/dist/{ingestTypes-CaX7_s-K.cjs.map → ingestTypes-DsVH9BYy.cjs.map} +1 -1
  45. package/dist/{ingestTypes-CIy1lHjf.js → ingestTypes-GkG7bJdB.js} +2 -2
  46. package/dist/{ingestTypes-CIy1lHjf.js.map → ingestTypes-GkG7bJdB.js.map} +1 -1
  47. package/dist/{itemId-BY2YPBkT.js → itemId-4P9S_ehz.js} +48 -2
  48. package/dist/itemId-4P9S_ehz.js.map +1 -0
  49. package/dist/{itemId-CEQdK01z.cjs → itemId-CGT2J7YK.cjs} +65 -1
  50. package/dist/itemId-CGT2J7YK.cjs.map +1 -0
  51. package/dist/plugin-vue/IconGlyph.d.ts +27 -0
  52. package/dist/plugin-vue/index.cjs +117 -201
  53. package/dist/plugin-vue/index.cjs.map +1 -1
  54. package/dist/plugin-vue/index.d.ts +1 -0
  55. package/dist/plugin-vue/index.js +118 -203
  56. package/dist/plugin-vue/index.js.map +1 -1
  57. package/dist/{promptSafety-Bp780ezk.js → promptSafety-Bte62OvU.js} +2 -2
  58. package/dist/{promptSafety-Bp780ezk.js.map → promptSafety-Bte62OvU.js.map} +1 -1
  59. package/dist/{promptSafety-C0BWDsfT.cjs → promptSafety-Cv-SoTd4.cjs} +2 -2
  60. package/dist/{promptSafety-C0BWDsfT.cjs.map → promptSafety-Cv-SoTd4.cjs.map} +1 -1
  61. package/dist/{root-BMroU_mB.js → root-BcS4-Kge.js} +12 -2
  62. package/dist/root-BcS4-Kge.js.map +1 -0
  63. package/dist/{root-rPH6FGDT.cjs → root-BvwBUcol.cjs} +12 -2
  64. package/dist/root-BvwBUcol.cjs.map +1 -0
  65. package/dist/{server-BvXO49Vj.js → server-BENtFplH.js} +47 -18
  66. package/dist/{server-BvXO49Vj.js.map → server-BENtFplH.js.map} +1 -1
  67. package/dist/{server-CF1qllGV.cjs → server-Wz4_ALLl.cjs} +47 -18
  68. package/dist/{server-CF1qllGV.cjs.map → server-Wz4_ALLl.cjs.map} +1 -1
  69. package/package.json +8 -8
  70. package/dist/discovery-Dl9nRa-m.cjs.map +0 -1
  71. package/dist/discovery-P64fgtuD.js.map +0 -1
  72. package/dist/itemId-BY2YPBkT.js.map +0 -1
  73. package/dist/itemId-CEQdK01z.cjs.map +0 -1
  74. package/dist/root-BMroU_mB.js.map +0 -1
  75. package/dist/root-rPH6FGDT.cjs.map +0 -1
@@ -1,10 +1,10 @@
1
1
  const require_rolldown_runtime = require("./rolldown-runtime-VH7oDXx4.cjs");
2
2
  const require_dist = require("./dist-CsgSfWwR.cjs");
3
- const require_root = require("./root-rPH6FGDT.cjs");
3
+ const require_root = require("./root-BvwBUcol.cjs");
4
4
  const require_relPath = require("./relPath-CTAjGdCL.cjs");
5
- const require_itemId = require("./itemId-CEQdK01z.cjs");
6
- const require_promptSafety = require("./promptSafety-C0BWDsfT.cjs");
7
- const require_discovery = require("./discovery-Dl9nRa-m.cjs");
5
+ const require_itemId = require("./itemId-CGT2J7YK.cjs");
6
+ const require_promptSafety = require("./promptSafety-Cv-SoTd4.cjs");
7
+ const require_discovery = require("./discovery-2TvulIz8.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_fs = require("node:fs");
@@ -1878,24 +1878,53 @@ function openItemsFileRefusal(err, shown) {
1878
1878
  * descriptor's inode is the one reachable at a contained path. A hardlink
1879
1879
  * would satisfy it, but the agent cannot create one across the mount boundary
1880
1880
  * — only the workspace is mounted, and a hardlink cannot cross filesystems. */
1881
- async function verifyOpenedItemsFile(handle, hostPath, root, shown) {
1882
- const opened = await handle.stat();
1881
+ /** What the filesystem says about the path the descriptor was opened from:
1882
+ * the link itself (is it a symlink?), the resolved target, the root resolved
1883
+ * BY THE SAME API, and the target's stat.
1884
+ *
1885
+ * Resolving the two sides with different apis is not a style question: on
1886
+ * Windows `realpath` expands an 8.3 short name and `realpathSync` does not, so
1887
+ * a root from `os.tmpdir()` compared against an async-resolved file inside it
1888
+ * read as "outside the workspace" and refused every itemsFile (#2972). */
1889
+ async function resolveOpenedPaths(hostPath, root) {
1890
+ const link = await (0, node_fs_promises.lstat)(hostPath);
1891
+ const real = await (0, node_fs_promises.realpath)(hostPath);
1892
+ return {
1893
+ link,
1894
+ real,
1895
+ rootReal: await (0, node_fs_promises.realpath)(root),
1896
+ atPath: await (0, node_fs_promises.stat)(real)
1897
+ };
1898
+ }
1899
+ /** Judge the opened descriptor against the paths it claims to be. Returns the
1900
+ * refusal text, or null when the descriptor is the contained file it should
1901
+ * be. `opened` is the descriptor's own stat, so the identity check compares
1902
+ * what was OPENED with what is reachable at the path. */
1903
+ function openedFileProblem(paths, opened, shown) {
1904
+ if (paths.link.isSymbolicLink()) return symlinkRefusal(shown);
1905
+ if (!require_discovery.isUnderRealRoot(paths.real, paths.rootReal)) return outsideWorkspaceRefusal(shown);
1906
+ if (paths.atPath.ino !== opened.ino || paths.atPath.dev !== opened.dev) return `manageCollection: \`itemsFile\` '${shown}' changed while it was being opened. Nothing was read; write the file, then call putItems.`;
1907
+ return null;
1908
+ }
1909
+ /** The descriptor's own shape: a regular file, within the byte cap. Returns the
1910
+ * refusal text, or null. Checked before any path work — a fifo or an 8 MiB
1911
+ * blob is refused without paying for a realpath. */
1912
+ function openedShapeProblem(opened, shown) {
1883
1913
  if (!opened.isFile()) return `manageCollection: \`itemsFile\` '${shown}' is not a regular file. It must be a JSON file holding an array of record objects.`;
1884
1914
  if (opened.size > 8388608) return `manageCollection: \`itemsFile\` '${shown}' is ${opened.size} bytes, over the limit of ${MAX_ITEMS_FILE_BYTES}. Nothing was read; split the rows across several files and call once per file.`;
1885
- let real;
1886
- let atPath;
1887
- let link;
1915
+ return null;
1916
+ }
1917
+ async function verifyOpenedItemsFile(handle, hostPath, root, shown) {
1918
+ const opened = await handle.stat();
1919
+ const shapeProblem = openedShapeProblem(opened, shown);
1920
+ if (shapeProblem !== null) return shapeProblem;
1921
+ let paths;
1888
1922
  try {
1889
- link = await (0, node_fs_promises.lstat)(hostPath);
1890
- real = await (0, node_fs_promises.realpath)(hostPath);
1891
- atPath = await (0, node_fs_promises.stat)(real);
1923
+ paths = await resolveOpenedPaths(hostPath, root);
1892
1924
  } catch (err) {
1893
1925
  return openItemsFileRefusal(err, shown);
1894
1926
  }
1895
- if (link.isSymbolicLink()) return symlinkRefusal(shown);
1896
- if (!require_discovery.isContainedInRoot(real, root)) return outsideWorkspaceRefusal(shown);
1897
- if (atPath.ino !== opened.ino || atPath.dev !== opened.dev) return `manageCollection: \`itemsFile\` '${shown}' changed while it was being opened. Nothing was read; write the file, then call putItems.`;
1898
- return { size: opened.size };
1927
+ return openedFileProblem(paths, opened, shown) ?? { size: opened.size };
1899
1928
  }
1900
1929
  /** Open the file ONCE, then prove that descriptor is the contained file.
1901
1930
  * `O_NOFOLLOW` refuses a symlink outright rather than resolving it, and
@@ -2335,7 +2364,7 @@ var MANAGE_COLLECTION_DEFINITION = {
2335
2364
  },
2336
2365
  schema: {
2337
2366
  type: "object",
2338
- description: "putSchema: the full collection schema object (same shape as schema.json — title, icon, dataPath, primaryKey, fields, …). Call getSchema first for the current one, and schemaDocs for the field DSL."
2367
+ description: "putSchema: the full collection schema object (same shape as schema.json — title, icon, dataPath, primaryKey, fields, …). `icon` is either a Material Symbols name (lowercase letters, digits and underscores only — `podcasts`, `rss_feed`, `3d_rotation`; capitals/spaces/hyphens never match) or a SINGLE emoji. Prefer an emoji when the collection would otherwise share a look-alike glyph with another one — it is in colour and tells them apart in the launcher. `color` is an OPTIONAL accent (violet | indigo | sky | teal | emerald | lime | fuchsia) drawn as a pale chip behind the launcher glyph — another way to separate collections that share a generic icon. Omit it rather than guessing; an unknown name simply draws no accent. Call getSchema first for the current one, and schemaDocs for the field DSL."
2339
2368
  },
2340
2369
  topic: {
2341
2370
  type: "string",
@@ -2593,4 +2622,4 @@ Object.defineProperty(exports, "validateRecordObject", {
2593
2622
  }
2594
2623
  });
2595
2624
 
2596
- //# sourceMappingURL=server-CF1qllGV.cjs.map
2625
+ //# sourceMappingURL=server-Wz4_ALLl.cjs.map