mcp-scraper 0.5.0 → 0.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 (52) hide show
  1. package/dist/bin/api-server.cjs +675 -214
  2. package/dist/bin/api-server.cjs.map +1 -1
  3. package/dist/bin/api-server.js +2 -2
  4. package/dist/bin/mcp-scraper-cli.cjs +1 -1
  5. package/dist/bin/mcp-scraper-cli.cjs.map +1 -1
  6. package/dist/bin/mcp-scraper-cli.js +1 -1
  7. package/dist/bin/mcp-scraper-install.cjs +1 -1
  8. package/dist/bin/mcp-scraper-install.cjs.map +1 -1
  9. package/dist/bin/mcp-scraper-install.js +1 -1
  10. package/dist/bin/mcp-stdio-server.cjs +322 -11
  11. package/dist/bin/mcp-stdio-server.cjs.map +1 -1
  12. package/dist/bin/mcp-stdio-server.js +3 -3
  13. package/dist/bin/paa-harvest.cjs +166 -74
  14. package/dist/bin/paa-harvest.cjs.map +1 -1
  15. package/dist/bin/paa-harvest.js +1 -1
  16. package/dist/chunk-EGWJ74EX.js +7 -0
  17. package/dist/chunk-EGWJ74EX.js.map +1 -0
  18. package/dist/{chunk-APJO2XV5.js → chunk-HL33CGJF.js} +3 -3
  19. package/dist/{chunk-APJO2XV5.js.map → chunk-HL33CGJF.js.map} +1 -1
  20. package/dist/{chunk-AUCXKRRH.js → chunk-RMPPYKUV.js} +167 -75
  21. package/dist/chunk-RMPPYKUV.js.map +1 -0
  22. package/dist/{chunk-BL7BBSYF.js → chunk-RUGJE5EB.js} +2 -2
  23. package/dist/{chunk-J4T5OSCF.js → chunk-YGRZU7IR.js} +322 -11
  24. package/dist/chunk-YGRZU7IR.js.map +1 -0
  25. package/dist/index.cjs +166 -74
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.js +1 -1
  28. package/dist/{server-Z4MEISH5.js → server-JNY4XPZE.js} +138 -81
  29. package/dist/server-JNY4XPZE.js.map +1 -0
  30. package/dist/{site-extract-repository-U476J44K.js → site-extract-repository-NVSZH35Y.js} +3 -3
  31. package/dist/{worker-KJZ3ZN2N.js → worker-JQTS437L.js} +4 -4
  32. package/dist/worker-JQTS437L.js.map +1 -0
  33. package/package.json +2 -2
  34. package/dist/chunk-3RTPEQJC.js +0 -7
  35. package/dist/chunk-3RTPEQJC.js.map +0 -1
  36. package/dist/chunk-AUCXKRRH.js.map +0 -1
  37. package/dist/chunk-J4T5OSCF.js.map +0 -1
  38. package/dist/server-Z4MEISH5.js.map +0 -1
  39. package/dist/worker-KJZ3ZN2N.js.map +0 -1
  40. package/docs/spec-browser-routing.md +0 -108
  41. package/docs/spec-kernel-computer-controls.md +0 -166
  42. package/docs/spec-mcp-tools.md +0 -146
  43. package/docs/spec-server-instructions.md +0 -94
  44. package/docs/specs/agent-ready-seo-packet-spec.md +0 -237
  45. package/docs/specs/audit-visual-demo.md +0 -309
  46. package/docs/specs/cli-agent-wiring-spec.md +0 -206
  47. package/docs/specs/local-competitive-audit-spec.md +0 -311
  48. package/docs/specs/scheduled-workflows-api-spec.md +0 -304
  49. package/docs/specs/seo-cli-growth-roadmap-spec.md +0 -181
  50. package/docs/specs/seo-workflow-runner-and-reports-spec.md +0 -241
  51. /package/dist/{chunk-BL7BBSYF.js.map → chunk-RUGJE5EB.js.map} +0 -0
  52. /package/dist/{site-extract-repository-U476J44K.js.map → site-extract-repository-NVSZH35Y.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  LedgerOperation
3
- } from "./chunk-APJO2XV5.js";
3
+ } from "./chunk-HL33CGJF.js";
4
4
  import {
5
5
  sanitizeVendorName
6
6
  } from "./chunk-M2S27J6Z.js";
@@ -127,4 +127,4 @@ export {
127
127
  failExtractJob,
128
128
  settleExtractJob
129
129
  };
130
- //# sourceMappingURL=chunk-BL7BBSYF.js.map
130
+ //# sourceMappingURL=chunk-RUGJE5EB.js.map
@@ -17,10 +17,10 @@ import {
17
17
  } from "./chunk-XGIPATLV.js";
18
18
  import {
19
19
  PACKAGE_VERSION
20
- } from "./chunk-3RTPEQJC.js";
20
+ } from "./chunk-EGWJ74EX.js";
21
21
  import {
22
22
  MC_PER_CREDIT
23
- } from "./chunk-APJO2XV5.js";
23
+ } from "./chunk-HL33CGJF.js";
24
24
  import {
25
25
  sanitizeVendorName
26
26
  } from "./chunk-M2S27J6Z.js";
@@ -199,7 +199,7 @@ Multi-step orchestrations \u2014 prefer these over hand-chaining primitives when
199
199
  read it back for full detail rather than expecting the whole payload inline.
200
200
 
201
201
  ## Memory
202
- mcp-scraper also exposes 74 persistent per-user memory tools (notes, facts, vaults,
202
+ mcp-scraper also exposes persistent per-user memory tools (notes, facts, vaults,
203
203
  scheduled actions, tables, channels) backed by memory.mcpscraper.dev. Every account starts with 13
204
204
  vaults \u2014 call **list-vaults** to see what exists before creating anything new. Pick the vault whose job
205
205
  matches the content: **Ideas** (unvalidated concepts), **Knowledge** (distilled lessons/how-tos),
@@ -209,11 +209,45 @@ matches the content: **Ideas** (unvalidated concepts), **Knowledge** (distilled
209
209
  **Improvement Log** (receipts of changes made and whether they worked), **Experiments** (hypothesis +
210
210
  measured result), **Sprint** (current cycle's scope), **Inspiration** (other people's work worth
211
211
  studying).
212
- Before writing, call **memory-suggest** to check whether something's already captured and to find the
213
- right vault's hub note to link. Use **memory-put** for narrative notes (prose, a title, a body); use
212
+ For a normal new narrative note, call **prepare-memory-write** first. It queries the live vault contract,
213
+ tag vocabulary, and natural neighbor vaults, and returns interlink candidates that must be read before
214
+ acceptance. Compose every returned template section, then call **memory-capture**, which validates the
215
+ note, registers canonical tags, writes it, and verifies readback. Reserve low-level **memory-put** for
216
+ deliberate edits and migrations. Use
214
217
  **table-create**/**table-insert-rows**/**table-query** instead when the caller wants row-shaped data
215
218
  they'll filter/sort by exact value. **memory-search** is meaning-based over full content (embeds, slower);
216
219
  **memory-list** filters one vault by kind/tags (fast, exact).
220
+
221
+ Treat every memory create or update as a graph operation. **prepare-memory-write** supplies the initial
222
+ shortlist; use **memory-search** when it is weak or the topic is broad, and **memory-get** to read the best
223
+ candidates in full. Add only links supported by the notes: same-
224
+ vault targets go in props.related and natural [[path]] body links; cross-vault targets go in
225
+ props.related_vault_notes as Vault Name::relative/path.md. Prefer existing People/Projects/system
226
+ hubs and fewer strong links. Do not trust a background linker to repair a weak write.
227
+
228
+ Use the target vault's template, not generic prose. Always set summary, specific reusable tags,
229
+ source_type, source_ref, related, related_vault_notes, embed, embed_priority, and a valid
230
+ status; include vault-specific props when relevant. Body patterns: Knowledge = Thesis / Explanation /
231
+ Examples / Implications; Library = Source Identity / Preserved Material / Extraction Notes; People =
232
+ Identity / Relationship / Known Context / Interaction History / Open Loops; Projects = Purpose / Current
233
+ State / Architecture / Open Work / Decisions; Issues = Observation / Impact / Confirmation / Evidence /
234
+ Resolution; Improvement Log = Improvement / Issue Link / Change Made / Verification / Result. Keep Tasks,
235
+ Calendar, Communications, Ideas, Inspiration, Experiments, and Sprint aligned to their named purpose.
236
+ Tags are live vocabulary, not improvised labels: **list-memory-tags** shows what exists and
237
+ **resolve-memory-tags** returns reuse/create/omit. A new tag is justified only when the concept is central,
238
+ reusable, and has no exact, alias, or near-equivalent. Use **memory-backlinks**,
239
+ **memory-graph-universe**, and **memory-graph-path** to trace the linked universe across vaults.
240
+
241
+ Scrape deposits are raw evidence and therefore go to **Library** through **library-ingest**, with the full
242
+ Library template and source metadata. If the source contains durable applicable guidance, create a separate
243
+ Knowledge companion through prepare-memory-write + memory-capture and link it to the Library source with
244
+ derived_from; do not replace the raw source with the guide.
245
+
246
+ For an update, call **memory-get** first and pass its revision as baseRevision. Preserve the existing
247
+ title, source, capture time, content context, and props unless the request deliberately changes them.
248
+ If a legacy backend does not return props, do not overwrite an existing linked note through that surface;
249
+ report that link preservation cannot be proved. After the write, read it back and search a distinctive
250
+ phrase to verify persistence and indexing.
217
251
  `.trim();
218
252
  }
219
253
  var SERVER_INSTRUCTIONS = serverInstructions(true);
@@ -6877,6 +6911,52 @@ var UnlinkShareSchema = {
6877
6911
  openWorldHint: false
6878
6912
  }
6879
6913
  };
6914
+ var memoryCaptureTool_notePropsSchema = z3.object({
6915
+ status: z3.string().describe("Status enum value from the target vault contract."),
6916
+ summary: z3.string().describe("Short retrieval-ready description."),
6917
+ tags: z3.array(z3.string()).describe("AI-generated keyword tags, not vault names."),
6918
+ pinned: z3.boolean().describe("Recall boost for important notes."),
6919
+ source_type: z3.string().describe("Attribution kind: user, person, url, file, channel, thread, or note."),
6920
+ source_ref: z3.string().describe("Attribution reference (URL, path, channel, thread, or source note)."),
6921
+ related: z3.array(z3.string()).describe("Same-vault links (wiki [[ ]] targets)."),
6922
+ related_vault_notes: z3.array(z3.string()).describe('Cross-vault references in "Vault Name::relative/path.md" form.'),
6923
+ embed: z3.boolean().describe("Whether Smart RAG should index the note."),
6924
+ embed_priority: z3.enum(["low", "normal", "high"]).describe("Embedding priority."),
6925
+ embedding_summary: z3.string().describe("Optional retrieval-specific summary."),
6926
+ type: z3.string().describe("Note type from the target vault contract (also used to route the note)."),
6927
+ domain: z3.string().describe("Domain folder for Library/Knowledge (AI, SEO, Copywriting & Ads, Business, Spirituality)."),
6928
+ folder: z3.string().describe("Explicit sub-folder within the vault; overrides routing-derived folder."),
6929
+ parentMessageId: z3.string().describe("Channel messages only: the path of the top-level message this is a reply to. Absent on top-level messages.")
6930
+ }).partial().passthrough();
6931
+ var MemoryCaptureSchema = {
6932
+ id: "memory-capture",
6933
+ upstreamName: "memoryCaptureTool",
6934
+ description: "Strict normal-create path for durable memory. Refuses incomplete notes, writes through memory-put, registers canonical tags, and reads the note back to verify persisted content and props. Call prepare-memory-write first. Reserve memory-put for low-level migrations or deliberate edits.",
6935
+ input: {
6936
+ vault: z3.string(),
6937
+ folder: z3.string().optional(),
6938
+ path: z3.string().min(1),
6939
+ title: z3.string().min(1),
6940
+ content: z3.string().min(1),
6941
+ props: memoryCaptureTool_notePropsSchema,
6942
+ baseRevision: z3.number().optional(),
6943
+ tagDecisions: z3.array(z3.object({ tag: z3.string().min(1), central: z3.boolean(), reusable: z3.boolean(), description: z3.string().optional() })).max(8).optional().describe("Required justification for any tag that does not already exist. Existing exact/alias/near tags are canonicalized automatically; a new tag is accepted only when its matching decision has central=true and reusable=true.")
6944
+ },
6945
+ output: {
6946
+ ok: z3.boolean(),
6947
+ valid: z3.boolean().optional(),
6948
+ errors: z3.array(z3.string()).optional(),
6949
+ warnings: z3.array(z3.string()).optional(),
6950
+ tagResolutions: z3.array(z3.object({ candidate: z3.string(), action: z3.enum(["reuse", "create", "omit"]), tag: z3.string().optional(), reason: z3.string() })).optional(),
6951
+ note: z3.object({ path: z3.string(), title: z3.string(), updatedAt: z3.string(), revision: z3.number() }).optional(),
6952
+ indexed: z3.number().optional(),
6953
+ verified: z3.object({ contentBytes: z3.number(), propsPersisted: z3.boolean(), revision: z3.number() }).optional(),
6954
+ conflict: z3.boolean().optional(),
6955
+ code: z3.string().optional(),
6956
+ error: z3.string().optional()
6957
+ },
6958
+ annotations: { title: "Capture Governed Memory", readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true }
6959
+ };
6880
6960
  var MemoryQuestionsSchema = {
6881
6961
  id: "memory-questions",
6882
6962
  upstreamName: "memoryQuestionsTool",
@@ -6906,6 +6986,67 @@ var MemoryQuestionsSchema = {
6906
6986
  openWorldHint: true
6907
6987
  }
6908
6988
  };
6989
+ var PrepareMemoryWriteSchema = {
6990
+ id: "prepare-memory-write",
6991
+ upstreamName: "prepareMemoryWriteTool",
6992
+ description: "Mandatory planning pass for a normal new memory. Routes the note, returns the live template and natural vault relationships, resolves proposed tags against the registry, and shortlists interlink opportunities that must be read/reviewed before capture.",
6993
+ input: {
6994
+ title: z3.string().min(1),
6995
+ content: z3.string().min(1),
6996
+ source: z3.string().optional(),
6997
+ type: z3.string().optional(),
6998
+ vault: z3.string().optional(),
6999
+ tagCandidates: z3.array(z3.object({ tag: z3.string().min(1), central: z3.boolean().optional(), reusable: z3.boolean().optional(), description: z3.string().optional() })).max(20).optional(),
7000
+ maxLinks: z3.number().int().min(1).max(20).optional()
7001
+ },
7002
+ output: {
7003
+ ok: z3.boolean(),
7004
+ route: z3.record(z3.unknown()).optional(),
7005
+ contract: z3.record(z3.unknown()).optional(),
7006
+ tagResolutions: z3.array(z3.record(z3.unknown())).optional(),
7007
+ linkOpportunities: z3.array(z3.record(z3.unknown())).optional(),
7008
+ instructions: z3.array(z3.string()).optional(),
7009
+ error: z3.string().optional()
7010
+ },
7011
+ annotations: { title: "Prepare Memory Write", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }
7012
+ };
7013
+ var validateMemoryWriteTool_notePropsSchema = z3.object({
7014
+ status: z3.string().describe("Status enum value from the target vault contract."),
7015
+ summary: z3.string().describe("Short retrieval-ready description."),
7016
+ tags: z3.array(z3.string()).describe("AI-generated keyword tags, not vault names."),
7017
+ pinned: z3.boolean().describe("Recall boost for important notes."),
7018
+ source_type: z3.string().describe("Attribution kind: user, person, url, file, channel, thread, or note."),
7019
+ source_ref: z3.string().describe("Attribution reference (URL, path, channel, thread, or source note)."),
7020
+ related: z3.array(z3.string()).describe("Same-vault links (wiki [[ ]] targets)."),
7021
+ related_vault_notes: z3.array(z3.string()).describe('Cross-vault references in "Vault Name::relative/path.md" form.'),
7022
+ embed: z3.boolean().describe("Whether Smart RAG should index the note."),
7023
+ embed_priority: z3.enum(["low", "normal", "high"]).describe("Embedding priority."),
7024
+ embedding_summary: z3.string().describe("Optional retrieval-specific summary."),
7025
+ type: z3.string().describe("Note type from the target vault contract (also used to route the note)."),
7026
+ domain: z3.string().describe("Domain folder for Library/Knowledge (AI, SEO, Copywriting & Ads, Business, Spirituality)."),
7027
+ folder: z3.string().describe("Explicit sub-folder within the vault; overrides routing-derived folder."),
7028
+ parentMessageId: z3.string().describe("Channel messages only: the path of the top-level message this is a reply to. Absent on top-level messages.")
7029
+ }).partial().passthrough();
7030
+ var ValidateMemoryWriteSchema = {
7031
+ id: "validate-memory-write",
7032
+ upstreamName: "validateMemoryWriteTool",
7033
+ description: "Validate a proposed governed note without writing it. Checks template completeness, vault status/type, canonical tag count, attribution, Obsidian link primitives, and retrieval metadata.",
7034
+ input: {
7035
+ vault: z3.string(),
7036
+ title: z3.string(),
7037
+ content: z3.string(),
7038
+ props: validateMemoryWriteTool_notePropsSchema
7039
+ },
7040
+ output: {
7041
+ ok: z3.boolean(),
7042
+ valid: z3.boolean().optional(),
7043
+ errors: z3.array(z3.string()).optional(),
7044
+ warnings: z3.array(z3.string()).optional(),
7045
+ normalizedTags: z3.array(z3.string()).optional(),
7046
+ error: z3.string().optional()
7047
+ },
7048
+ annotations: { title: "Validate Memory Write", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }
7049
+ };
6909
7050
  var CreateChannelSchema = {
6910
7051
  id: "create-channel",
6911
7052
  upstreamName: "createChannelTool",
@@ -7246,18 +7387,78 @@ var RecordFactSchema = {
7246
7387
  openWorldHint: false
7247
7388
  }
7248
7389
  };
7390
+ var NoteBacklinksSchema = {
7391
+ id: "memory-backlinks",
7392
+ upstreamName: "noteBacklinksTool",
7393
+ description: "Return every resolved incoming link to a note across all accessible vaults, including typed metadata links and Obsidian wiki links.",
7394
+ input: {
7395
+ note: z3.string().min(1),
7396
+ vault: z3.string().optional()
7397
+ },
7398
+ output: {
7399
+ ok: z3.boolean(),
7400
+ nodes: z3.array(z3.object({ id: z3.string(), vault: z3.string(), path: z3.string(), title: z3.string(), resolved: z3.boolean() })).optional(),
7401
+ edges: z3.array(z3.object({ source: z3.string(), target: z3.string(), type: z3.string(), evidence: z3.string(), sourceField: z3.string(), resolved: z3.boolean() })).optional(),
7402
+ error: z3.string().optional()
7403
+ },
7404
+ annotations: { title: "Memory Backlinks", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }
7405
+ };
7406
+ var GraphPathSchema = {
7407
+ id: "memory-graph-path",
7408
+ upstreamName: "graphPathTool",
7409
+ description: "Find the shortest navigable connection between two memory notes across vault boundaries. Returns an empty graph when no path exists within maxDepth.",
7410
+ input: {
7411
+ from: z3.string().min(1),
7412
+ to: z3.string().min(1),
7413
+ fromVault: z3.string().optional(),
7414
+ toVault: z3.string().optional(),
7415
+ maxDepth: z3.number().int().min(1).max(12).optional()
7416
+ },
7417
+ output: {
7418
+ ok: z3.boolean(),
7419
+ nodes: z3.array(z3.object({ id: z3.string(), vault: z3.string(), path: z3.string(), title: z3.string(), resolved: z3.boolean() })).optional(),
7420
+ edges: z3.array(z3.object({ source: z3.string(), target: z3.string(), type: z3.string(), evidence: z3.string(), sourceField: z3.string(), resolved: z3.boolean() })).optional(),
7421
+ error: z3.string().optional()
7422
+ },
7423
+ annotations: { title: "Memory Graph Path", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }
7424
+ };
7425
+ var GraphUniverseSchema = {
7426
+ id: "memory-graph-universe",
7427
+ upstreamName: "graphUniverseTool",
7428
+ description: "Traverse the interlinked memory universe around one note in every direction, like an Obsidian local graph. Returns nodes and typed edges to a bounded depth.",
7429
+ input: {
7430
+ note: z3.string().min(1),
7431
+ vault: z3.string().optional(),
7432
+ depth: z3.number().int().min(0).max(6).optional(),
7433
+ maxNodes: z3.number().int().min(1).max(500).optional()
7434
+ },
7435
+ output: {
7436
+ ok: z3.boolean(),
7437
+ root: z3.string().optional(),
7438
+ depth: z3.number().optional(),
7439
+ truncated: z3.boolean().optional(),
7440
+ nodes: z3.array(z3.object({ id: z3.string(), vault: z3.string(), path: z3.string(), title: z3.string(), resolved: z3.boolean() })).optional(),
7441
+ edges: z3.array(z3.object({ source: z3.string(), target: z3.string(), type: z3.string(), evidence: z3.string(), sourceField: z3.string(), resolved: z3.boolean() })).optional(),
7442
+ error: z3.string().optional()
7443
+ },
7444
+ annotations: { title: "Memory Graph Universe", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }
7445
+ };
7249
7446
  var LibraryIngestSchema = {
7250
7447
  id: "library-ingest",
7251
7448
  upstreamName: "libraryIngestTool",
7252
7449
  description: "Deposit a scrape, transcript, or generated output into the tenant Library vault for later semantic recall. Content is embedded for per-tenant search and best-effort mirrored to a local vault when configured. Requires write scope on the target vault.",
7253
7450
  input: {
7254
7451
  vault: z3.string().optional().describe(
7255
- 'Vault to deposit into. Optional; defaults to the session active vault, then the first entitled vault, then "Library".'
7452
+ "Vault to deposit into. Optional and normally omitted: raw scrapes always default to Library. Override only for a deliberate nonstandard migration."
7256
7453
  ),
7257
7454
  title: z3.string().min(1).describe("Short human-readable title for the item; used to build the stored path. Must be non-empty."),
7258
7455
  content: z3.string().min(1).describe("The full captured text (scrape/transcript/output) to store and index. Must be non-empty."),
7259
7456
  source: z3.string().min(1).describe("Provenance of the content, e.g. a URL or tool name. Must be non-empty."),
7260
7457
  capturedAt: z3.string().optional().describe("ISO-8601 capture timestamp. Optional; defaults to now. Also seeds the deterministic storage path."),
7458
+ summary: z3.string().optional().describe("Retrieval-ready source summary. Optional; a provenance summary is generated when omitted."),
7459
+ tags: z3.array(z3.string()).max(8).optional().describe("Reviewed canonical tags. Existing tags should be resolved first; when omitted, deterministic source/topic tags are generated."),
7460
+ related: z3.array(z3.string()).optional().describe("Reviewed same-vault Library note paths."),
7461
+ relatedVaultNotes: z3.array(z3.string()).optional().describe("Reviewed cross-vault references in Vault::path.md form."),
7261
7462
  localVaultPath: z3.string().optional().describe("Filesystem root to also mirror the item to. Optional; falls back to MEMORY_LOCAL_VAULT_ROOT env when set.")
7262
7463
  },
7263
7464
  output: {
@@ -7267,6 +7468,7 @@ var LibraryIngestSchema = {
7267
7468
  path: z3.string().optional().describe("Vault-relative path the item was stored at (under library/...)."),
7268
7469
  indexed: z3.number().optional().describe("Number of search chunks indexed (0 if embedding failed but the note still saved)."),
7269
7470
  dualWritten: z3.boolean().optional().describe("True if the item was also mirrored to the local filesystem vault."),
7471
+ nextStep: z3.string().optional().describe("Recommended extraction action after the raw Library source is safe."),
7270
7472
  code: z3.string().optional().describe("Machine-readable denial code when ok is false: quota_exceeded or free_cost_cap."),
7271
7473
  error: z3.string().optional().describe("Human-readable failure reason when ok is false.")
7272
7474
  },
@@ -7344,10 +7546,27 @@ var ExportSchema = {
7344
7546
  openWorldHint: false
7345
7547
  }
7346
7548
  };
7549
+ var getTool_notePropsSchema = z3.object({
7550
+ status: z3.string().describe("Status enum value from the target vault contract."),
7551
+ summary: z3.string().describe("Short retrieval-ready description."),
7552
+ tags: z3.array(z3.string()).describe("AI-generated keyword tags, not vault names."),
7553
+ pinned: z3.boolean().describe("Recall boost for important notes."),
7554
+ source_type: z3.string().describe("Attribution kind: user, person, url, file, channel, thread, or note."),
7555
+ source_ref: z3.string().describe("Attribution reference (URL, path, channel, thread, or source note)."),
7556
+ related: z3.array(z3.string()).describe("Same-vault links (wiki [[ ]] targets)."),
7557
+ related_vault_notes: z3.array(z3.string()).describe('Cross-vault references in "Vault Name::relative/path.md" form.'),
7558
+ embed: z3.boolean().describe("Whether Smart RAG should index the note."),
7559
+ embed_priority: z3.enum(["low", "normal", "high"]).describe("Embedding priority."),
7560
+ embedding_summary: z3.string().describe("Optional retrieval-specific summary."),
7561
+ type: z3.string().describe("Note type from the target vault contract (also used to route the note)."),
7562
+ domain: z3.string().describe("Domain folder for Library/Knowledge (AI, SEO, Copywriting & Ads, Business, Spirituality)."),
7563
+ folder: z3.string().describe("Explicit sub-folder within the vault; overrides routing-derived folder."),
7564
+ parentMessageId: z3.string().describe("Channel messages only: the path of the top-level message this is a reply to. Absent on top-level messages.")
7565
+ }).partial().passthrough();
7347
7566
  var GetSchema = {
7348
7567
  id: "memory-get",
7349
7568
  upstreamName: "getTool",
7350
- description: "Read a single note from a vault by its exact path, or by shareId for a note shared with you and accepted. Returns a revision number \u2014 pass it as baseRevision on a later memory-put/delete-note to detect a concurrent edit instead of silently overwriting it. Requires read scope.",
7569
+ description: "Read a single note from a vault by its exact path, or by shareId for a note shared with you and accepted. Owned notes include their stored Obsidian props so edits can preserve links and template metadata. Returns a revision number \u2014 pass it as baseRevision on a later memory-put/delete-note to detect a concurrent edit instead of silently overwriting it. Requires read scope.",
7351
7570
  input: {
7352
7571
  vault: z3.string().optional().describe(
7353
7572
  "Vault to read from. Optional; defaults to the session active vault, then the first vault the caller is entitled to. Ignored when shareId is given."
@@ -7367,6 +7586,7 @@ var GetSchema = {
7367
7586
  capturedAt: z3.string().describe("ISO-8601 timestamp of when the note was first captured."),
7368
7587
  revision: z3.number().describe("Current revision number. Pass this as baseRevision when editing, so a concurrent edit by someone else is detected instead of silently overwritten."),
7369
7588
  updatedBy: z3.string().nullable().describe("Identity that made the last write, if known."),
7589
+ props: getTool_notePropsSchema.optional().describe("Stored Obsidian metadata for an owned note, including links and vault-specific template fields. Omitted for secure or individually shared notes."),
7370
7590
  sharedBy: z3.string().optional().describe("Present only when read via shareId: the identity who owns and shared this note."),
7371
7591
  othersEditing: z3.array(z3.string()).optional().describe("Advisory only, not a lock: identities who read this same note within the last ~2 minutes and may be about to edit it. Worth a heads-up to the human before you write; the real safety net is still baseRevision on the write itself.")
7372
7592
  }).optional().describe("The full note. Present when ok is true."),
@@ -7414,7 +7634,7 @@ var ListSchema = {
7414
7634
  openWorldHint: false
7415
7635
  }
7416
7636
  };
7417
- var notePropsSchema = z3.object({
7637
+ var putTool_notePropsSchema = z3.object({
7418
7638
  status: z3.string().describe("Status enum value from the target vault contract."),
7419
7639
  summary: z3.string().describe("Short retrieval-ready description."),
7420
7640
  tags: z3.array(z3.string()).describe("AI-generated keyword tags, not vault names."),
@@ -7430,7 +7650,7 @@ var notePropsSchema = z3.object({
7430
7650
  domain: z3.string().describe("Domain folder for Library/Knowledge (AI, SEO, Copywriting & Ads, Business, Spirituality)."),
7431
7651
  folder: z3.string().describe("Explicit sub-folder within the vault; overrides routing-derived folder."),
7432
7652
  parentMessageId: z3.string().describe("Channel messages only: the path of the top-level message this is a reply to. Absent on top-level messages.")
7433
- }).partial();
7653
+ }).partial().passthrough();
7434
7654
  var PutSchema = {
7435
7655
  id: "memory-put",
7436
7656
  upstreamName: "putTool",
@@ -7443,7 +7663,7 @@ var PutSchema = {
7443
7663
  shareId: z3.string().optional().describe("Edit a note someone individually shared with you and you accepted (accept-share), by its shareId, instead of vault+path. Requires the share to grant edit permission, and baseRevision is mandatory (get the current revision first) since you are editing alongside the owner and possibly others."),
7444
7664
  title: z3.string().optional().describe("Optional human-readable title; defaults are derived from the path when omitted."),
7445
7665
  content: z3.string().min(1).describe("The full note body to store and index for semantic search. Must be non-empty."),
7446
- props: notePropsSchema.optional().describe("Obsidian note primitives (status, summary, tags, pinned, source_type, source_ref, related, related_vault_notes, embed, embed_priority, type, domain, folder). Stored on the note so it round-trips the vault shape; type/domain/folder also steer routing when no vault is given."),
7666
+ props: putTool_notePropsSchema.optional().describe("Obsidian note primitives plus vault-specific template fields. On edits, supplied fields patch the stored props instead of replacing the whole object; pass an empty array to deliberately clear a link list. Type/domain/folder also steer routing when no vault is given."),
7447
7667
  baseRevision: z3.number().optional().describe("Revision the edit is based on (from a prior get/put). When provided, the write only applies if the note is still at this revision; otherwise it is rejected as a conflict instead of silently overwriting a concurrent edit. Omit for last-write-wins (fine for solo notes).")
7448
7668
  },
7449
7669
  output: {
@@ -8057,6 +8277,51 @@ var QueryTableSchema = {
8057
8277
  openWorldHint: false
8058
8278
  }
8059
8279
  };
8280
+ var ListTagsSchema = {
8281
+ id: "list-memory-tags",
8282
+ upstreamName: "listTagsTool",
8283
+ description: "List the live canonical tag vocabulary, aliases, usage counts, and per-vault distribution. Use this before choosing tags so existing concepts are reused instead of fragmented.",
8284
+ input: {
8285
+ includeDeprecated: z3.boolean().optional()
8286
+ },
8287
+ output: {
8288
+ ok: z3.boolean(),
8289
+ tags: z3.array(z3.object({ tag: z3.string(), description: z3.string().nullable(), aliases: z3.array(z3.string()), status: z3.enum(["active", "deprecated"]), usageCount: z3.number(), vaultUsage: z3.record(z3.number()) })).optional(),
8290
+ error: z3.string().optional()
8291
+ },
8292
+ annotations: { title: "List Memory Tags", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }
8293
+ };
8294
+ var ResolveTagsSchema = {
8295
+ id: "resolve-memory-tags",
8296
+ upstreamName: "resolveTagsTool",
8297
+ description: "Resolve proposed concepts against the live tag vocabulary. Returns reuse, create, or omit. A new tag is allowed only when no equivalent exists and the caller marks the concept central and reusable.",
8298
+ input: {
8299
+ candidates: z3.array(z3.object({ tag: z3.string().min(1), central: z3.boolean().optional(), reusable: z3.boolean().optional(), description: z3.string().optional() })).min(1).max(20)
8300
+ },
8301
+ output: {
8302
+ ok: z3.boolean(),
8303
+ resolutions: z3.array(z3.object({ candidate: z3.string(), normalized: z3.string(), action: z3.enum(["reuse", "create", "omit"]), tag: z3.string().optional(), matchedBy: z3.enum(["exact", "alias", "near"]).optional(), score: z3.number().optional(), reason: z3.string() })).optional(),
8304
+ error: z3.string().optional()
8305
+ },
8306
+ annotations: { title: "Resolve Memory Tags", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }
8307
+ };
8308
+ var UpsertTagSchema = {
8309
+ id: "upsert-memory-tag",
8310
+ upstreamName: "upsertTagTool",
8311
+ description: "Define or curate one canonical tag, its meaning, aliases, and lifecycle. Use only after resolve-memory-tags returns create, or to merge/deprecate vocabulary intentionally. Requires write scope.",
8312
+ input: {
8313
+ tag: z3.string().min(1),
8314
+ description: z3.string().optional(),
8315
+ aliases: z3.array(z3.string()).optional(),
8316
+ status: z3.enum(["active", "deprecated"]).optional()
8317
+ },
8318
+ output: {
8319
+ ok: z3.boolean(),
8320
+ tag: z3.object({ tag: z3.string(), description: z3.string().nullable(), aliases: z3.array(z3.string()), status: z3.enum(["active", "deprecated"]) }).optional(),
8321
+ error: z3.string().optional()
8322
+ },
8323
+ annotations: { title: "Upsert Memory Tag", readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false }
8324
+ };
8060
8325
  var AddVaultSchema = {
8061
8326
  id: "add-vault",
8062
8327
  upstreamName: "addVaultTool",
@@ -8124,6 +8389,21 @@ var DeleteVaultSchema = {
8124
8389
  openWorldHint: false
8125
8390
  }
8126
8391
  };
8392
+ var GetVaultContractSchema = {
8393
+ id: "get-vault-contract",
8394
+ upstreamName: "getVaultContractTool",
8395
+ description: "Read the machine-enforced purpose, template, statuses, types, natural neighbor vaults, and typed relationship guidance for one of the 13 governed Obsidian-style vaults. Call before composing a note when the correct shape is uncertain.",
8396
+ input: {
8397
+ vault: z3.string().describe("One governed vault: Ideas, Inspiration, Knowledge, Library, People, Communications, Calendar, Tasks, Projects, Issues, Improvement Log, Experiments, or Sprint.")
8398
+ },
8399
+ output: {
8400
+ ok: z3.boolean(),
8401
+ vault: z3.string().optional(),
8402
+ contract: z3.record(z3.unknown()).optional(),
8403
+ error: z3.string().optional()
8404
+ },
8405
+ annotations: { title: "Get Vault Contract", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }
8406
+ };
8127
8407
  var ListSharedWithMeSchema = {
8128
8408
  id: "list-shared-with-me",
8129
8409
  upstreamName: "listSharedWithMeTool",
@@ -8208,6 +8488,26 @@ var ProvisionDefaultsSchema = {
8208
8488
  openWorldHint: false
8209
8489
  }
8210
8490
  };
8491
+ var RouteMemorySchema = {
8492
+ id: "route-memory",
8493
+ upstreamName: "routeMemoryTool",
8494
+ description: "Choose the correct governed vault and folder from content intent. Raw scraped/source material routes to Library; distilled applicable guidance routes to Knowledge. Returns the live vault contract so the result does not depend on prompt memory.",
8495
+ input: {
8496
+ title: z3.string().min(1),
8497
+ content: z3.string().min(1),
8498
+ type: z3.string().optional(),
8499
+ source: z3.string().optional()
8500
+ },
8501
+ output: {
8502
+ ok: z3.boolean(),
8503
+ vault: z3.string().optional(),
8504
+ folder: z3.string().optional(),
8505
+ reason: z3.string().optional(),
8506
+ contract: z3.record(z3.unknown()).optional(),
8507
+ error: z3.string().optional()
8508
+ },
8509
+ annotations: { title: "Route Memory", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }
8510
+ };
8211
8511
  var VideoAnalyzeStartSchema = {
8212
8512
  id: "video-analyze-start",
8213
8513
  upstreamName: "videoAnalyzeStartTool",
@@ -8330,7 +8630,10 @@ var MEMORY_TOOL_SCHEMAS = [
8330
8630
  SwapVaultSchema,
8331
8631
  SwitchAccountSchema,
8332
8632
  UnlinkShareSchema,
8633
+ MemoryCaptureSchema,
8333
8634
  MemoryQuestionsSchema,
8635
+ PrepareMemoryWriteSchema,
8636
+ ValidateMemoryWriteSchema,
8334
8637
  CreateChannelSchema,
8335
8638
  GetMessageNoteSchema,
8336
8639
  ListChannelMembersSchema,
@@ -8343,6 +8646,9 @@ var MEMORY_TOOL_SCHEMAS = [
8343
8646
  ReplyMessageSchema,
8344
8647
  FactHistorySchema,
8345
8648
  RecordFactSchema,
8649
+ NoteBacklinksSchema,
8650
+ GraphPathSchema,
8651
+ GraphUniverseSchema,
8346
8652
  LibraryIngestSchema,
8347
8653
  DeleteNoteSchema,
8348
8654
  ExportSchema,
@@ -8372,12 +8678,17 @@ var MEMORY_TOOL_SCHEMAS = [
8372
8678
  InsertTableRowsSchema,
8373
8679
  ListTablesSchema,
8374
8680
  QueryTableSchema,
8681
+ ListTagsSchema,
8682
+ ResolveTagsSchema,
8683
+ UpsertTagSchema,
8375
8684
  AddVaultSchema,
8376
8685
  CreateSecureVaultSchema,
8377
8686
  DeleteVaultSchema,
8687
+ GetVaultContractSchema,
8378
8688
  ListSharedWithMeSchema,
8379
8689
  ListVaultsSchema,
8380
8690
  ProvisionDefaultsSchema,
8691
+ RouteMemorySchema,
8381
8692
  VideoAnalyzeStartSchema,
8382
8693
  VideoAnalyzeStatusSchema,
8383
8694
  CreateWebhookSchema,
@@ -8456,4 +8767,4 @@ export {
8456
8767
  registerMemoryMcpTools,
8457
8768
  MemoryMcpToolExecutor
8458
8769
  };
8459
- //# sourceMappingURL=chunk-J4T5OSCF.js.map
8770
+ //# sourceMappingURL=chunk-YGRZU7IR.js.map