@echomem/mcp 1.4.26 → 1.4.28

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.
@@ -11,6 +11,8 @@ export const canonicalToolNames = {
11
11
  others: "search_others_memories",
12
12
  publicMemory: "get_public_memory",
13
13
  groupContext: "get_group_context",
14
+ getGroupSessionSharing: "get_group_session_sharing",
15
+ setGroupSessionSharing: "set_group_session_sharing",
14
16
  createGroup: "create_memory_group",
15
17
  createGroupInvite: "create_group_invite",
16
18
  joinGroup: "join_memory_group",
@@ -115,6 +117,14 @@ export const publicMemorySchema = z.object({
115
117
  export const groupContextSchema = z.object({
116
118
  ...triggerMetadataSchema,
117
119
  });
120
+ export const getGroupSessionSharingSchema = z.object({
121
+ ...triggerMetadataSchema,
122
+ });
123
+ export const setGroupSessionSharingSchema = z.object({
124
+ ...triggerMetadataSchema,
125
+ share: z.boolean(),
126
+ confirmed: z.literal(true),
127
+ });
118
128
  export const createGroupSchema = z.object({
119
129
  ...triggerMetadataSchema,
120
130
  name: z.string().min(1).max(120),
@@ -237,7 +247,7 @@ export function listToolSpecs(opts = {}) {
237
247
  },
238
248
  {
239
249
  name: canonicalToolNames.save,
240
- description: "Save this conversation into EchoMem as long-term memory (durable memories are extracted automatically). New extraction input uses the plan's weekly processing allowance; if the limit is reached, nothing is saved. passthrough=true stores the text verbatim as a session capsule.",
250
+ description: "Save durable knowledge from this conversation into the user's private EchoMem (durable memories are extracted automatically). Call before the final response when work produced a durable decision, confirmed preference, implementation, resolved bug, commit, passing verification, release, or project milestone; this private checkpoint does not require a separate user request. Omit secrets, incidental chatter, and trivial read-only work. If the encrypted vault is locked, tell the user to run `echomem-mcp unlock` and never silently skip a qualifying checkpoint. Private persistence happens first. If this MCP session has confirmed group sharing, eligible memories are then synced to the current group automatically; flagged memories stay private. If the session has no decision yet, ask once whether to share memories saved from this session. New extraction input uses the plan's weekly processing allowance; if the limit is reached, nothing is saved. passthrough=true stores the text verbatim as a session capsule.",
241
251
  inputSchema: {
242
252
  type: "object",
243
253
  properties: {
@@ -438,7 +448,7 @@ export function listToolSpecs(opts = {}) {
438
448
  },
439
449
  {
440
450
  name: canonicalToolNames.groupContext,
441
- description: "Get your current company group, its participant directory, declared titles and responsibilities, and published-memory coverage. Use this before answering who works on what or suggesting where a new group member could contribute. Treat declared profile fields as facts and memory-derived work as evidence or inference.",
451
+ description: "Get your current company group, its participant directory, declared titles and responsibilities, and published-memory coverage. Use this before answering who works on what or suggesting where a new group member could contribute. Treat declared profile fields as facts and memory-derived work as evidence or inference. Session sharing is separate; call get_group_session_sharing instead of inferring it.",
442
452
  inputSchema: {
443
453
  type: "object",
444
454
  properties: {
@@ -450,6 +460,29 @@ export function listToolSpecs(opts = {}) {
450
460
  },
451
461
  },
452
462
  },
463
+ {
464
+ name: canonicalToolNames.getGroupSessionSharing,
465
+ description: "Read the confirmed sharing decision for this exact MCP session. Call near session start or after the first private save. If the user has a group and no decision exists, ask once: “Share memories saved from this session with <group>?” Never infer the answer.",
466
+ inputSchema: {
467
+ type: "object",
468
+ properties: {
469
+ triggerMessage: { type: "string" },
470
+ triggerMessageRole: { type: "string", default: "user" },
471
+ },
472
+ },
473
+ },
474
+ {
475
+ name: canonicalToolNames.setGroupSessionSharing,
476
+ description: "Store the user's explicit Yes/No sharing decision for this exact MCP session. share=true immediately syncs eligible memories already saved in the session and automatically syncs later private saves. share=false keeps later saves private. Flagged memories remain private and are reported as protected.",
477
+ inputSchema: {
478
+ type: "object",
479
+ properties: {
480
+ share: { type: "boolean" },
481
+ confirmed: { type: "boolean", const: true },
482
+ },
483
+ required: ["share", "confirmed"],
484
+ },
485
+ },
453
486
  {
454
487
  name: canonicalToolNames.createGroup,
455
488
  description: "Create one company memory group for the current user. The MVP allows at most one group per user. Call only after the user explicitly asks to create a group.",
@@ -478,7 +511,7 @@ export function listToolSpecs(opts = {}) {
478
511
  },
479
512
  {
480
513
  name: canonicalToolNames.joinGroup,
481
- description: "Join a company memory group using an invite code after the user explicitly asks to join. Joining never publishes memories. Next call prepare_group_publication, infer a proposed title and responsibility summary from the user's own candidate memories, and ask the user to confirm the profile together with the publication preview.",
514
+ description: "Join a company memory group using an invite code after the user explicitly asks to join. Joining never publishes memories. Next call prepare_group_publication, infer a proposed title and responsibility summary from the user's own candidate memories, and ask the user to confirm the profile together with the publication preview. Also call get_group_session_sharing and, if unset, ask once whether memories saved from this session should be shared.",
482
515
  inputSchema: {
483
516
  type: "object",
484
517
  properties: {
@@ -492,7 +525,7 @@ export function listToolSpecs(opts = {}) {
492
525
  },
493
526
  {
494
527
  name: canonicalToolNames.prepareGroupPublication,
495
- description: "Prepare a no-publication preview of up to 50 owned memories for group publication. For encrypted accounts the local bridge must be unlocked. The host agent selects exact work-related memory ids, gives each candidate an owner-only https://echoknows.com/memories/timeline?memoryId=... review link, drafts a concise title and responsibility summary from memory evidence, and asks the user to confirm both the profile and publication selection together. If an unflagged candidate appears sensitive, proactively ask whether the user wants to mark its exact ID for publication attention first. Explain that marking does not publish or change encryption; it means the agent will call it out and ask for detailed confirmation whenever a later publication includes it. Never auto-flag inferred sensitivity. Already-flagged memories are identified separately and require extra attention before publication. This tool never publishes.",
528
+ description: "Prepare a no-publication preview of up to 50 owned memories for group publication. For encrypted accounts the local bridge must be unlocked. The host agent selects exact work-related memory ids, gives each candidate a canonical https://echoknows.com/memory/<memory-id> review link labeled with its key, drafts a concise title and responsibility summary from memory evidence, and asks the user to confirm both the profile and publication selection together. The site resolves owners to their private timeline. If an unflagged candidate appears sensitive, proactively ask whether the user wants to mark its exact ID for publication attention first. Explain that marking does not publish or change encryption; it means the agent will call it out and ask for detailed confirmation whenever a later publication includes it. Never auto-flag inferred sensitivity. Already-flagged memories are identified separately and require extra attention before publication. This tool never publishes.",
496
529
  inputSchema: {
497
530
  type: "object",
498
531
  properties: {
@@ -508,7 +541,7 @@ export function listToolSpecs(opts = {}) {
508
541
  },
509
542
  {
510
543
  name: canonicalToolNames.flagPublicationAttention,
511
- description: "Mark exact owned memories for extra attention during future group publication. First search the user's own memories, show the matching memory IDs, summaries, and owner-only https://echoknows.com/memories/timeline?memoryId=... review links, and obtain explicit confirmation. This only records a safety flag; it does not publish, decrypt, change visibility, or retract an existing group snapshot.",
544
+ description: "Mark exact owned memories for extra attention during future group publication. First search the user's own memories, show the matching memory IDs, summaries, and canonical https://echoknows.com/memory/<memory-id> review links labeled with their keys, and obtain explicit confirmation. The site resolves owners to their private timeline. This only records a safety flag; it does not publish, decrypt, change visibility, or retract an existing group snapshot.",
512
545
  inputSchema: {
513
546
  type: "object",
514
547
  properties: {
@@ -548,7 +581,7 @@ export function listToolSpecs(opts = {}) {
548
581
  },
549
582
  {
550
583
  name: canonicalToolNames.completeGroupPublication,
551
- description: "Publish only the exact memory ids from a prepared scan after the user explicitly confirms the preview. confirmed must be true. Any flagged memories must be called out separately; state that nothing has been published yet and offer to exclude them, review them separately, or first search for and mark similar sensitive owned memories. Never auto-flag inferred sensitivity. Publish flagged memories only after extra user acknowledgement with their exact IDs in acknowledgedFlaggedMemoryIds. Completing an empty selection safely advances the scan cursor without publishing.",
584
+ description: "Publish only exact memory ids from a prepared scan after the user approves the preview with confirmed=true. This manual workflow is separate from session sharing. Explicitly confirmed flagged memories require their exact IDs in acknowledgedFlaggedMemoryIds. If an unflagged candidate appears sensitive, offer to first search for and mark similar sensitive owned memories for publication attention. Never auto-flag inferred sensitivity. Completing an empty selection safely advances the scan cursor.",
552
585
  inputSchema: {
553
586
  type: "object",
554
587
  properties: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@echomem/mcp",
3
- "version": "1.4.26",
3
+ "version": "1.4.28",
4
4
  "description": "EchoMem MCP bridge: cloud-first memory tools, local context HUD, and the Agent Doctor workspace forensics report (cost ledger + 3D repo city)",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -26,7 +26,8 @@
26
26
  "test:registry": "node test/registry-artifact.test.mjs",
27
27
  "test:registry-ui": "npm run build && node test/registry-ui.test.mjs",
28
28
  "test:ui": "npm run build && node test/setup-ui.test.mjs",
29
- "test": "npm run build && node test/local-data-paths.test.mjs && node test/crypto.test.mjs && node test/integration.test.mjs && node test/local-auth.test.mjs && node test/retrieval-only.test.mjs && node test/no-restart.test.mjs && node test/report.test.mjs && node test/forensics.test.mjs && node test/canonical-golden.test.mjs && node test/tools.test.mjs && node test/update-check.test.mjs && node test/delete.test.mjs && node test/low-touch-tools.test.mjs && node test/migrate.test.mjs && node test/restart-recovery.test.mjs && node test/hud.test.mjs",
29
+ "test:billing-ui": "npm run build && node test/setup-ui.test.mjs billing",
30
+ "test": "npm run build && node test/local-data-paths.test.mjs && node test/crypto.test.mjs && node test/integration.test.mjs && node test/local-auth.test.mjs && node test/retrieval-only.test.mjs && node test/no-restart.test.mjs && node test/report.test.mjs && node test/forensics.test.mjs && node test/canonical-golden.test.mjs && node test/tools.test.mjs && node test/update-check.test.mjs && node test/delete.test.mjs && node test/low-touch-tools.test.mjs && node test/migrate.test.mjs && node test/restart-recovery.test.mjs && node test/hud.test.mjs && node test/save-checkpoint-hook.test.mjs",
30
31
  "prepack": "npm run build && node scripts/bundle-city.mjs"
31
32
  },
32
33
  "dependencies": {
@@ -12,3 +12,13 @@ Use the `save_conversation` tool from the `echomem` MCP server.
12
12
  3. Use `passthrough: true` only when the user explicitly needs a verbatim session capsule.
13
13
  4. Never include secrets, credentials, or unnecessary sensitive content.
14
14
  5. Confirm what EchoMem saved. If saving fails, report the failure without switching providers silently.
15
+ 6. Before a final response, use this workflow proactively when the task produced a durable decision,
16
+ confirmed preference, implementation, resolved bug, commit, passing verification, release, or
17
+ project milestone. A private checkpoint does not require a separate user request. Skip trivial
18
+ read-only work and incidental chatter.
19
+ 7. If the encrypted vault is locked, tell the user to run `echomem-mcp unlock`; never silently skip a
20
+ qualifying checkpoint.
21
+ 8. For a user with a company group, call `get_group_session_sharing` near session start or after the
22
+ first qualifying private save. If unset, ask once whether memories saved from this session should be
23
+ shared, then call `set_group_session_sharing` with the explicit Yes/No answer. A Yes decision syncs
24
+ eligible memories after private persistence; flagged memories remain private.
@@ -13,5 +13,13 @@ This project has EchoMem connected — the user's long-term memory across all th
13
13
  "the usual", "our convention").
14
14
  - Treat recalled memories as authoritative context, but **cite them** (they carry provenance —
15
15
  date + source) so the user can verify.
16
- - To persist a new decision/constraint/resolved-bug, use `save_conversation` **only when the user
17
- explicitly asks** ("remember this"). Never auto-save the transcript.
16
+ - Before the final response for work that produced a durable decision, confirmed preference,
17
+ implementation, resolved bug, commit, passing verification, release, or project milestone, call
18
+ `save_conversation`. This private checkpoint does not require a separate user request. Save a
19
+ concise structured outcome rather than the full transcript. Never save secrets, credentials,
20
+ incidental chatter, or trivial read-only work. This does not authorize company-group publication.
21
+ - For a user with a company group, call `get_group_session_sharing` near session start or after the
22
+ first qualifying private save. If this exact session has no decision, ask once whether memories
23
+ saved from it should be shared, then store only the explicit Yes/No answer with
24
+ `set_group_session_sharing`. A Yes decision syncs eligible memories after private persistence;
25
+ flagged memories stay private.