@echomem/mcp 1.4.37 → 1.4.39
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/index.js +11 -73
- package/dist/package-metadata.js +1 -1
- package/dist/save-checkpoint-hook.js +1 -1
- package/dist/setup.js +1 -1
- package/dist/v1-contract.js +5 -5
- package/package.json +1 -1
- package/templates/codex-skills/echomem-save/SKILL.md +2 -3
- package/templates/echomem-recall.md +2 -3
package/dist/index.js
CHANGED
|
@@ -1719,7 +1719,7 @@ Details: ${m.details || "N/A"}`)
|
|
|
1719
1719
|
syncedGroupNames.length
|
|
1720
1720
|
? `Saved privately first and synced to approved groups: ${syncedGroupNames.join(", ")}.`
|
|
1721
1721
|
: "Saved to your private memory.",
|
|
1722
|
-
`This user has multiple groups: ${availableGroups.map((group) => `${readString(group, "name") ?? "Unnamed group"} (${readString(group, "id") ?? "unknown id"})`).join(", ")}. Call request_group_session_sharing with this conversation scope and one groupId at a time
|
|
1722
|
+
`This user has multiple groups: ${availableGroups.map((group) => `${readString(group, "name") ?? "Unnamed group"} (${readString(group, "id") ?? "unknown id"})`).join(", ")}. Call request_group_session_sharing with this conversation scope and one groupId at a time to obtain a separate text confirmation question for each group.`,
|
|
1723
1723
|
failedSyncs.length
|
|
1724
1724
|
? `${failedSyncs.length} approved group sync(s) failed; private memories were preserved.`
|
|
1725
1725
|
: "",
|
|
@@ -1728,7 +1728,7 @@ Details: ${m.details || "N/A"}`)
|
|
|
1728
1728
|
: "",
|
|
1729
1729
|
].filter(Boolean).join(" ")
|
|
1730
1730
|
: sharing?.decision === null || sharing?.decision === undefined
|
|
1731
|
-
? `Saved to your private memory. Call request_group_session_sharing with this conversation scope${readString(sharingGroup, "id") ? ` and groupId ${readString(sharingGroup, "id")}` : ""}
|
|
1731
|
+
? `Saved to your private memory. Call request_group_session_sharing with this conversation scope${readString(sharingGroup, "id") ? ` and groupId ${readString(sharingGroup, "id")}` : ""}, relay its exact text question for ${readString(sharingGroup, "name") ?? "your current group"}, and call set_group_session_sharing only after an explicit Yes or No. Silence leaves the state unset.`
|
|
1732
1732
|
: sharing.decision === "private"
|
|
1733
1733
|
? "Saved to your private memory."
|
|
1734
1734
|
: syncedGroupNames.length
|
|
@@ -2202,7 +2202,7 @@ Details: ${m.details || "N/A"}`;
|
|
|
2202
2202
|
return {
|
|
2203
2203
|
content: [{
|
|
2204
2204
|
type: "text",
|
|
2205
|
-
text: `${scopeText}\n\nThis user belongs to multiple groups: ${choices}. Reuse this same conversation scope and call request_group_session_sharing once per groupId
|
|
2205
|
+
text: `${scopeText}\n\nThis user belongs to multiple groups: ${choices}. Reuse this same conversation scope and call request_group_session_sharing once per groupId to obtain a separate text confirmation question for each group.`,
|
|
2206
2206
|
}],
|
|
2207
2207
|
};
|
|
2208
2208
|
}
|
|
@@ -2212,7 +2212,7 @@ Details: ${m.details || "N/A"}`;
|
|
|
2212
2212
|
return {
|
|
2213
2213
|
content: [{
|
|
2214
2214
|
type: "text",
|
|
2215
|
-
text: `${scopeText}\n\nNo sharing decision exists for this conversation. Call request_group_session_sharing with the scope above${readString(group, "id") ? ` and groupId ${readString(group, "id")}` : ""}
|
|
2215
|
+
text: `${scopeText}\n\nNo sharing decision exists for this conversation. Call request_group_session_sharing with the scope above${readString(group, "id") ? ` and groupId ${readString(group, "id")}` : ""}, relay its exact text question, and call set_group_session_sharing only after an explicit Yes or No. Silence leaves the state unset.`,
|
|
2216
2216
|
}],
|
|
2217
2217
|
};
|
|
2218
2218
|
}
|
|
@@ -2233,10 +2233,10 @@ Details: ${m.details || "N/A"}`;
|
|
|
2233
2233
|
? `Conversation sharing scope: ${groupSharingScopeId}\nReuse this exact groupSharingScopeId only in this conversation for later get/request/set/save calls. Never persist it as memory.`
|
|
2234
2234
|
: "";
|
|
2235
2235
|
}
|
|
2236
|
-
|
|
2236
|
+
sharingPromptText(scopeText, groupName) {
|
|
2237
2237
|
return [
|
|
2238
2238
|
scopeText,
|
|
2239
|
-
`
|
|
2239
|
+
`Ask exactly: “Share eligible memories saved from this conversation with ${groupName}?” Only an explicit Yes or No may be passed to set_group_session_sharing. Silence leaves the state unset.`,
|
|
2240
2240
|
].filter(Boolean).join("\n\n");
|
|
2241
2241
|
}
|
|
2242
2242
|
formatGroupSessionSharingUpdate(share, payload, scopeText = "") {
|
|
@@ -2310,71 +2310,9 @@ Details: ${m.details || "N/A"}`;
|
|
|
2310
2310
|
}],
|
|
2311
2311
|
};
|
|
2312
2312
|
}
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
|
|
2316
|
-
content: [{ type: "text", text: this.sharingFallbackText(scopeText, groupName) }],
|
|
2317
|
-
};
|
|
2318
|
-
}
|
|
2319
|
-
let elicitation;
|
|
2320
|
-
try {
|
|
2321
|
-
elicitation = await this.server.elicitInput({
|
|
2322
|
-
mode: "form",
|
|
2323
|
-
message: `EchoMem saved this checkpoint privately. Choose whether eligible memories from this conversation should also be shared with ${groupName}. Flagged memories always remain private.`,
|
|
2324
|
-
requestedSchema: {
|
|
2325
|
-
type: "object",
|
|
2326
|
-
properties: {
|
|
2327
|
-
sharingDecision: {
|
|
2328
|
-
type: "string",
|
|
2329
|
-
title: "Team sharing",
|
|
2330
|
-
description: `Choose whether eligible conversation memories may be shared with ${groupName}.`,
|
|
2331
|
-
oneOf: [
|
|
2332
|
-
{ const: "share", title: "Share with team" },
|
|
2333
|
-
{ const: "private", title: "Keep private" },
|
|
2334
|
-
],
|
|
2335
|
-
},
|
|
2336
|
-
},
|
|
2337
|
-
required: ["sharingDecision"],
|
|
2338
|
-
},
|
|
2339
|
-
});
|
|
2340
|
-
}
|
|
2341
|
-
catch {
|
|
2342
|
-
return {
|
|
2343
|
-
content: [{ type: "text", text: this.sharingFallbackText(scopeText, groupName) }],
|
|
2344
|
-
};
|
|
2345
|
-
}
|
|
2346
|
-
if (elicitation.action === "cancel") {
|
|
2347
|
-
return {
|
|
2348
|
-
content: [{
|
|
2349
|
-
type: "text",
|
|
2350
|
-
text: this.sharingFallbackText(scopeText, groupName),
|
|
2351
|
-
}],
|
|
2352
|
-
};
|
|
2353
|
-
}
|
|
2354
|
-
if (elicitation.action !== "accept") {
|
|
2355
|
-
return {
|
|
2356
|
-
content: [{
|
|
2357
|
-
type: "text",
|
|
2358
|
-
text: [
|
|
2359
|
-
scopeText,
|
|
2360
|
-
`No sharing decision was recorded for ${groupName}. The checkpoint remains private. Ask again at a later qualifying checkpoint; never interpret decline or cancel as No.`,
|
|
2361
|
-
].filter(Boolean).join("\n\n"),
|
|
2362
|
-
}],
|
|
2363
|
-
};
|
|
2364
|
-
}
|
|
2365
|
-
const sharingDecision = readString(elicitation.content ?? {}, "sharingDecision");
|
|
2366
|
-
if (sharingDecision !== "share" && sharingDecision !== "private") {
|
|
2367
|
-
return {
|
|
2368
|
-
content: [{ type: "text", text: this.sharingFallbackText(scopeText, groupName) }],
|
|
2369
|
-
};
|
|
2370
|
-
}
|
|
2371
|
-
const updatePayload = await this.client.setGroupSessionSharing({
|
|
2372
|
-
...parsed,
|
|
2373
|
-
groupSharingScopeId,
|
|
2374
|
-
share: sharingDecision === "share",
|
|
2375
|
-
confirmed: true,
|
|
2376
|
-
});
|
|
2377
|
-
return this.formatGroupSessionSharingUpdate(sharingDecision === "share", updatePayload, scopeText);
|
|
2313
|
+
return {
|
|
2314
|
+
content: [{ type: "text", text: this.sharingPromptText(scopeText, groupName) }],
|
|
2315
|
+
};
|
|
2378
2316
|
}
|
|
2379
2317
|
async handleSetGroupSessionSharing(args) {
|
|
2380
2318
|
const parsed = setGroupSessionSharingSchema.parse(args ?? {});
|
|
@@ -2429,8 +2367,8 @@ Details: ${m.details || "N/A"}`;
|
|
|
2429
2367
|
content: [{
|
|
2430
2368
|
type: "text",
|
|
2431
2369
|
text: payload?.alreadyMember
|
|
2432
|
-
? `You are already a member of ${payload?.group?.name ?? "this group"}. No memories were published. Use prepare_group_publication to review memories and propose any missing title or responsibility fields, then call request_group_session_sharing
|
|
2433
|
-
: `Joined ${payload?.group?.name ?? "the company group"}. No memories were published. Next use prepare_group_publication to review candidates, infer a proposed title and responsibility summary, and ask the user to confirm that profile together with the publication preview. Also call request_group_session_sharing without a scope
|
|
2370
|
+
? `You are already a member of ${payload?.group?.name ?? "this group"}. No memories were published. Use prepare_group_publication to review memories and propose any missing title or responsibility fields, then call request_group_session_sharing and relay its exact text question. Silence stays unset for a later checkpoint.`
|
|
2371
|
+
: `Joined ${payload?.group?.name ?? "the company group"}. No memories were published. Next use prepare_group_publication to review candidates, infer a proposed title and responsibility summary, and ask the user to confirm that profile together with the publication preview. Also call request_group_session_sharing without a scope and relay its exact text question. Silence leaves consent unset for a later checkpoint.`,
|
|
2434
2372
|
}],
|
|
2435
2373
|
};
|
|
2436
2374
|
}
|
package/dist/package-metadata.js
CHANGED
|
@@ -38,7 +38,7 @@ export const MCP_SERVER_INSTRUCTIONS = [
|
|
|
38
38
|
"Before re-deriving prior decisions or preferences, use search_memories.",
|
|
39
39
|
`Before the final response for a durable decision, implementation, fix, commit, passing verification, release, or milestone, call save_conversation. Skip secrets and trivial work. If the encrypted vault is locked, tell the user to ${MCP_VAULT_UNLOCK_INSTRUCTION}.`,
|
|
40
40
|
"After a successful save, show every memory created by that call in a compact EchoMem saved: list with canonical links; this is separate from \"EchoMem sources:\".",
|
|
41
|
-
"For company groups, call request_group_session_sharing near conversation start or after a qualifying save
|
|
41
|
+
"For company groups, call request_group_session_sharing near conversation start or after a qualifying save, relay its exact text question, and call set_group_session_sharing only after an explicit Yes or No. Omit groupSharingScopeId only on the first call, then reuse the returned scope only in this conversation. Each group needs an explicit choice; silence stays unset. Never infer consent. Flagged memories stay private.",
|
|
42
42
|
"EchoMem credential identity is authoritative over Claude profiles, host accounts, git identity, or inference. Use get_group_context before group-orientation answers and never re-filter owners returned by search_others_memories.",
|
|
43
43
|
"When a final answer materially uses teammate or friend memories, call record_memory_citations with only the exact used Memory IDs and a unique per-answer receiptId.",
|
|
44
44
|
"End memory-informed answers with a compact EchoMem sources: list. Use each memory key as the label and https://echoknows.com/memory/<memory-id> as its canonical link.",
|
|
@@ -8,7 +8,7 @@ const CHECKPOINT_REASON = [
|
|
|
8
8
|
"Review the work that just completed. If it produced a durable decision, confirmed preference, implementation, resolved bug, commit, passing verification, release, or project milestone, call `save_conversation` now with a concise structured summary of the outcome, reasoning, relevant files, and constraints.",
|
|
9
9
|
"Do not save secrets or incidental chatter. If the work was not durable, do not call the tool and finish normally.",
|
|
10
10
|
"Private persistence happens first. For a user with a company group, call `request_group_session_sharing` near conversation start or after a qualifying private save.",
|
|
11
|
-
"On the first request_group_session_sharing call in a conversation, omit groupSharingScopeId so EchoMem mints a fresh opaque scope. Reuse that exact scope only in this conversation for later get/request/set/save calls, and never persist it as memory. If multiple groups are returned, reuse the same scope and call once per groupId.
|
|
11
|
+
"On the first request_group_session_sharing call in a conversation, omit groupSharingScopeId so EchoMem mints a fresh opaque scope. Reuse that exact scope only in this conversation for later get/request/set/save calls, and never persist it as memory. If multiple groups are returned, reuse the same scope and call once per groupId. Relay the tool's exact text question and call set_group_session_sharing only after an explicit Yes/No. Silence leaves that group's state unset. A Share decision syncs eligible memories from later saves carrying the same scope to that group; saves automatically sync to every approved group. Keep private keeps them private for that group.",
|
|
12
12
|
"Flagged memories are withheld from automatic conversation sync and remain private.",
|
|
13
13
|
"If EchoMem reports that the encrypted vault is locked, tell the user to open Echo Desktop and unlock the vault there; on a headless system, use `echomem-mcp unlock`. Never silently skip a qualifying checkpoint.",
|
|
14
14
|
].join(" ");
|
package/dist/setup.js
CHANGED
|
@@ -360,7 +360,7 @@ function echomemGuidanceBlock() {
|
|
|
360
360
|
'- If the final user-facing answer materially relies on one or more EchoMem memories, end it with a compact `EchoMem sources:` list containing only the memories actually used. Link each memory key to its canonical `https://echoknows.com/memory/<memory-id>` URL. Do not cite memories that were merely retrieved, and omit the section when no memory informed the answer.',
|
|
361
361
|
"- Before the final response for a task that produced a durable decision, confirmed preference, implementation, resolved bug, commit, passing verification, release, or project milestone: call `save_conversation`. This private checkpoint does not require a separate user request. Do not save secrets, credentials, incidental chatter, or trivial read-only work. If a qualifying save fails because the encrypted vault is locked, tell the user to open Echo Desktop and unlock the vault there; on a headless system, use `echomem-mcp unlock`. Never silently skip it.",
|
|
362
362
|
'- After `save_conversation` succeeds and returns one or more saved memory IDs, make the save visible in the final user-facing answer with a compact `EchoMem saved:` list containing every memory created by that call. Link each memory key to its canonical `https://echoknows.com/memory/<memory-id>` URL. This save receipt is separate from `EchoMem sources:` and does not imply the newly saved memories informed the answer.',
|
|
363
|
-
"- For a user with a company group, call `request_group_session_sharing` near conversation start or after a qualifying private save. On the first call in a conversation, omit `groupSharingScopeId` so EchoMem mints a fresh opaque scope. Reuse that exact scope only in this conversation for later get/request/set/save calls, and never persist it as memory. If multiple groups are returned, reuse the same scope and call once per `groupId`.
|
|
363
|
+
"- For a user with a company group, call `request_group_session_sharing` near conversation start or after a qualifying private save. On the first call in a conversation, omit `groupSharingScopeId` so EchoMem mints a fresh opaque scope. Reuse that exact scope only in this conversation for later get/request/set/save calls, and never persist it as memory. If multiple groups are returned, reuse the same scope and call once per `groupId`. Relay the tool's exact text question and call `set_group_session_sharing` only after an explicit Yes/No. Silence leaves that group's state unset; never infer an answer. Saves sync eligible memories to every approved group; a No keeps them private for that group.",
|
|
364
364
|
"- If the user pastes a session carryover/checkpoint: it may reference `get_checkpoint_by_context` — use it to pull the checkpoint/decision trail when you need more than the snapshot.",
|
|
365
365
|
"",
|
|
366
366
|
"### Company group memory",
|
package/dist/v1-contract.js
CHANGED
|
@@ -50,6 +50,7 @@ const READ_ONLY_TOOL_NAMES = new Set([
|
|
|
50
50
|
canonicalToolNames.publicMemory,
|
|
51
51
|
canonicalToolNames.groupContext,
|
|
52
52
|
canonicalToolNames.getGroupSessionSharing,
|
|
53
|
+
canonicalToolNames.requestGroupSessionSharing,
|
|
53
54
|
canonicalToolNames.getByContext,
|
|
54
55
|
canonicalToolNames.checkpointByContext,
|
|
55
56
|
canonicalToolNames.report,
|
|
@@ -59,7 +60,6 @@ const READ_ONLY_TOOL_NAMES = new Set([
|
|
|
59
60
|
]);
|
|
60
61
|
const IDEMPOTENT_WRITE_TOOL_NAMES = new Set([
|
|
61
62
|
canonicalToolNames.recordCitations,
|
|
62
|
-
canonicalToolNames.requestGroupSessionSharing,
|
|
63
63
|
canonicalToolNames.setGroupSessionSharing,
|
|
64
64
|
canonicalToolNames.updateGroupProfile,
|
|
65
65
|
canonicalToolNames.completeGroupPublication,
|
|
@@ -417,7 +417,7 @@ export function listToolSpecs(opts = {}) {
|
|
|
417
417
|
},
|
|
418
418
|
{
|
|
419
419
|
name: canonicalToolNames.save,
|
|
420
|
-
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 ${MCP_VAULT_UNLOCK_INSTRUCTION} and never silently skip a qualifying checkpoint. Private persistence happens first. For group sharing, reuse the exact groupSharingScopeId returned by get_group_session_sharing, request_group_session_sharing, or an earlier save in this conversation. Never reuse it in another conversation or save it as memory. Each group has an independent decision under the same conversation scope; eligible memories sync automatically to every approved group, while flagged memories stay private. If a selected group has no decision yet, call request_group_session_sharing
|
|
420
|
+
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 ${MCP_VAULT_UNLOCK_INSTRUCTION} and never silently skip a qualifying checkpoint. Private persistence happens first. For group sharing, reuse the exact groupSharingScopeId returned by get_group_session_sharing, request_group_session_sharing, or an earlier save in this conversation. Never reuse it in another conversation or save it as memory. Each group has an independent decision under the same conversation scope; eligible memories sync automatically to every approved group, while flagged memories stay private. If a selected group has no decision yet, call request_group_session_sharing, relay its exact text question, and call set_group_session_sharing only after an explicit Yes or No. Silence leaves consent unset; never infer the answer. 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. ${SAVED_MEMORY_RECEIPT_INSTRUCTION}`,
|
|
421
421
|
inputSchema: {
|
|
422
422
|
type: "object",
|
|
423
423
|
properties: {
|
|
@@ -661,7 +661,7 @@ export function listToolSpecs(opts = {}) {
|
|
|
661
661
|
},
|
|
662
662
|
{
|
|
663
663
|
name: canonicalToolNames.getGroupSessionSharing,
|
|
664
|
-
description: "Read the confirmed sharing decision for one group in this exact conversation. On the first call, omit groupSharingScopeId; EchoMem returns a new opaque scope. Reuse that scope only in this conversation. If the user belongs to multiple groups and groupId is omitted, EchoMem returns the available groups. If a decision is unset, call request_group_session_sharing with this scope and the selected groupId
|
|
664
|
+
description: "Read the confirmed sharing decision for one group in this exact conversation. On the first call, omit groupSharingScopeId; EchoMem returns a new opaque scope. Reuse that scope only in this conversation. If the user belongs to multiple groups and groupId is omitted, EchoMem returns the available groups. If a decision is unset, call request_group_session_sharing with this scope and the selected groupId, relay its exact text question, and call set_group_session_sharing only after an explicit Yes or No. Silence leaves that group's state unset; never infer the answer.",
|
|
665
665
|
inputSchema: {
|
|
666
666
|
type: "object",
|
|
667
667
|
properties: {
|
|
@@ -682,7 +682,7 @@ export function listToolSpecs(opts = {}) {
|
|
|
682
682
|
},
|
|
683
683
|
{
|
|
684
684
|
name: canonicalToolNames.requestGroupSessionSharing,
|
|
685
|
-
description: "Check one group's sharing decision for this exact conversation and, only when it is unset,
|
|
685
|
+
description: "Check one group's sharing decision for this exact conversation and, only when it is unset, return the exact text confirmation question the agent must relay to the user. Omit groupSharingScopeId only on the first call so EchoMem can mint a fresh scope; reuse the returned scope only in this conversation. When multiple groups are returned, call again with the same scope and one groupId at a time. Call set_group_session_sharing only after the user explicitly answers Yes or No. A confirmed Yes backfills eligible private memories and syncs later saves; a confirmed No keeps them private. Silence records nothing.",
|
|
686
686
|
inputSchema: {
|
|
687
687
|
type: "object",
|
|
688
688
|
properties: {
|
|
@@ -743,7 +743,7 @@ export function listToolSpecs(opts = {}) {
|
|
|
743
743
|
},
|
|
744
744
|
{
|
|
745
745
|
name: canonicalToolNames.joinGroup,
|
|
746
|
-
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 request_group_session_sharing without a scope
|
|
746
|
+
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 request_group_session_sharing without a scope and relay its exact text question. Silence stays unset and should be prompted again at a later qualifying checkpoint.",
|
|
747
747
|
inputSchema: {
|
|
748
748
|
type: "object",
|
|
749
749
|
properties: {
|
package/package.json
CHANGED
|
@@ -27,8 +27,7 @@ Use the `save_conversation` tool from the `echomem` MCP server.
|
|
|
27
27
|
after a qualifying private save. On the first call in a conversation, omit `groupSharingScopeId` so
|
|
28
28
|
EchoMem mints a fresh opaque scope. Reuse that exact scope only in this conversation for later
|
|
29
29
|
get/request/set/save calls, and never persist it as memory. If multiple groups are returned, reuse
|
|
30
|
-
the same scope and call once per `groupId`.
|
|
31
|
-
|
|
32
|
-
`set_group_session_sharing` only after an explicit Yes/No. Decline, cancel, or silence leaves that
|
|
30
|
+
the same scope and call once per `groupId`. Relay the tool's exact text question and call
|
|
31
|
+
`set_group_session_sharing` only after an explicit Yes/No. Silence leaves that
|
|
33
32
|
group's state unset; never infer an answer. Saves sync eligible memories to every approved group;
|
|
34
33
|
Keep private keeps them private for that group; flagged memories remain private.
|
|
@@ -27,8 +27,7 @@ This project has EchoMem connected — the user's long-term memory across all th
|
|
|
27
27
|
after a qualifying private save. On the first call in a conversation, omit `groupSharingScopeId` so
|
|
28
28
|
EchoMem mints a fresh opaque scope. Reuse that exact scope only in this conversation for later
|
|
29
29
|
get/request/set/save calls, and never persist it as memory. If multiple groups are returned, reuse
|
|
30
|
-
the same scope and call once per `groupId`.
|
|
31
|
-
|
|
32
|
-
`set_group_session_sharing` only after an explicit Yes/No. Decline, cancel, or silence leaves that
|
|
30
|
+
the same scope and call once per `groupId`. Relay the tool's exact text question and call
|
|
31
|
+
`set_group_session_sharing` only after an explicit Yes/No. Silence leaves that
|
|
33
32
|
group's state unset; never infer an answer. Saves sync eligible memories to every approved group;
|
|
34
33
|
Keep private keeps them private for that group; flagged memories stay private.
|