@remembrance-ai/opencode-plugin 0.2.1 → 0.2.3

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.
@@ -738,8 +738,8 @@ var ZodIssueCode = util.arrayToEnum([
738
738
  "not_finite"
739
739
  ]);
740
740
  var quotelessJson = (obj) => {
741
- const json = JSON.stringify(obj, null, 2);
742
- return json.replace(/"([^"]+)":/g, "$1:");
741
+ const json2 = JSON.stringify(obj, null, 2);
742
+ return json2.replace(/"([^"]+)":/g, "$1:");
743
743
  };
744
744
  var ZodError = class _ZodError extends Error {
745
745
  get errors() {
@@ -8622,7 +8622,7 @@ var MCP_CORE_INSTRUCTIONS = "Remembrance is shared operational memory for agents
8622
8622
  - Send summaries and hashes, never secrets, credentials, private URLs, raw logs, or proprietary content.
8623
8623
  - If the host blocks a Remembrance action, report it once as not submitted and do not retry it another way.
8624
8624
  ` + LEGACY_CORE_FINISH_RULE;
8625
- var REMEMBRANCE_MCP_SERVER_INSTRUCTIONS = MCP_CORE_INSTRUCTIONS + MCP_DETAILS_HEADING + "Before claiming that Remembrance is anonymous, unconfigured, partially active, or missing an organization key, call run_connection_doctor for the transport you will actually use. It performs a safe catalog read and returns exact bounded remediation without submitting content. Use get_connection_status only when you need the underlying transport and lifecycle fields. An unset REMEMBRANCE_API_KEY does not prove that a local plugin is anonymous because local hooks and bundled MCP may read ~/.config/remembrance/config.json. Conversely, hosted MCP cannot read that local file. Anonymous curl or browser probes describe only those requests, not plugin authentication. Never print or request the raw key. When the user explicitly names an authorized Remembrance skill or supplies a remembrance://skills/{slug} URI, resolve ambiguous names with list_skills using its normalized slug-prefix filter, then call invoke_skill with an exact returned slug. Never guess a slug. list_skills is catalog resolution, not relevance search; use query_skills when the user wants relevant candidates rather than a known selection. invoke_skill rechecks authorization and organization policy, resolves the current reviewed version, and returns the only full instruction body. Catalog listings and MCP resource reads are lightweight handles, not skill use. Do not run query_skills merely to rediscover that explicit selection, and do not submit query-fit feedback for it. After meaningful direct use, follow the returned task-outcome and post-use feedback instructions once. BEFORE non-trivial service/API/tool/library/workflow/UI/review/test/security/deployment work, call query_skills to reuse proven skills and resources instead of rediscovering them. A local repository change still qualifies when it involves a reusable workflow or lesson; skip only genuinely trivial throwaway edits and one-off facts. For short follow-ups such as 'fix these issues', 'continue', or 'try again', infer the concrete task, domain, and constraints from the full conversation and still call query_skills; do not wait for the current prompt to repeat trigger keywords. Treat match_tier as a decision aid, then inspect why_matched and applicability before opening a result. These fields show bounded matched terms/capabilities, constraint text overlap, qualitative lexical/semantic evidence, declared scope, use conditions, and exclusions without exposing unstable raw ranking scores. satisfied_constraints and missed_constraints describe textual overlap only, not verified compliance or proven capability gaps. Discard an unlikely or irrelevant corner-case result and report fit: poor; do not force its use. For a remaining high match, call get_skill or get_resource before custom work and pass the returned query_id/result_id so the surfaced-to-fetch funnel closes; possible and exploratory matches are optional. The response also includes approximate context tokens, verified uses, risk, tags, permissions, dependencies, and contraindications so you can weigh the detour safely. Honor query_skills.skill_access on every response. When policy is org_only, use only returned organization skills and never substitute bundled or live public skill references; if an organization key is configured and the query is unavailable, fail closed because the policy cannot be confirmed. AFTER query_skills, call submit_query_feedback once with one complete set of explicit good/partial/poor judgments using the returned query_id and result_id values; leave unrated results neutral, and remember that a poor query match is not the same as a globally bad skill. Reuse the same organization or anonymous auth scope as the query. AFTER you actually use a skill or resource, close the post-use loop with submit_feedback (useful true/false plus a one-line lesson and the originating query_id/result_id; it returns a ready submit_remembrance payload), then submit_remembrance if the lesson is reusable. If nothing fit and you built a new workflow, use propose_private_skill for an organization-private candidate. With an organization key, propose_skill_idea also remains organization-private. Never remove, suppress, or bypass that key to force a public submission; submit privately, then use the reviewed public-propagation flow when the organization chooses to share it. When delegating, pass the selected slug, exact version, query_id, and result_id to the subagent; it should invoke/fetch that result or run its own full-context query. The parent reports the terminal outcome unless the subagent creates its own invocation. Route memory deliberately: host-local memory is for facts about this human, repository, or machine; Remembrance is for generalized lessons another approved organization agent would otherwise rediscover. A local-memory write does not satisfy organization-shared capture. Before finishing any reusable task, self-check for a missed query. If you catch your own mistake, the user catches one, CI/deploy fails, a security issue appears, or you fix a release/versioning miss, submit a failure_report remembrance even if no skill was used; raw MCP clients have no plugin Stop hook to remind you later. After an observed host-policy denial, report only the affected action once: 'The host blocked this Remembrance action. Do not treat it as submitted. Earlier successful actions are unaffected; querying remains available.' Do not retry the blocked content through another transport or claim submission. If submit_query_feedback or submit_feedback was denied before transport and acknowledge_feedback_denial is available, call that local-only tool with the exact tool, query_id, result_id only for submit_feedback, and reason host_policy_denied. It suppresses that blocked reminder without claiming feedback was submitted, changing approvals, or blocking future feedback. When host events are unavailable, use this explicit acknowledgment; do not infer denial from API errors. Do not repeat warnings already reported. Attach evidence (reproduction detail, artifact hashes, or an attestation); evidence-less public reports wait in unverified intake until corroborated. Redact secrets, private URLs, credentials, raw logs, and proprietary content; submit summaries and hashes, not raw traces.";
8625
+ var REMEMBRANCE_MCP_SERVER_INSTRUCTIONS = MCP_CORE_INSTRUCTIONS + MCP_DETAILS_HEADING + "Before claiming that Remembrance is anonymous, unconfigured, partially active, or missing an organization key, call run_connection_doctor for the transport you will actually use. It performs a safe catalog read and returns exact bounded remediation without submitting content. Use get_connection_status only when you need the underlying transport and lifecycle fields. An unset REMEMBRANCE_API_KEY does not prove that a local plugin is anonymous because local hooks and bundled MCP may read ~/.config/remembrance/config.json. Conversely, hosted MCP cannot read that local file. Anonymous curl or browser probes describe only those requests, not plugin authentication. Never print or request the raw key. When the user explicitly names an authorized Remembrance skill or supplies a remembrance://skills/{slug} URI, resolve ambiguous names with list_skills using its normalized slug-prefix filter, then call invoke_skill with an exact returned slug. Never guess a slug. list_skills is catalog resolution, not relevance search; use query_skills when the user wants relevant candidates rather than a known selection. invoke_skill rechecks authorization and organization policy, resolves the current reviewed version, and returns the only full instruction body. Catalog listings and MCP resource reads are lightweight handles, not skill use. Do not run query_skills merely to rediscover that explicit selection, and do not submit query-fit feedback for it. After meaningful direct use, follow the returned task-outcome and post-use feedback instructions once. BEFORE non-trivial service/API/tool/library/workflow/UI/review/test/security/deployment work, call query_skills to reuse proven skills and resources instead of rediscovering them. A local repository change still qualifies when it involves a reusable workflow or lesson; skip only genuinely trivial throwaway edits and one-off facts. For short follow-ups such as 'fix these issues', 'continue', or 'try again', infer the concrete task, domain, and constraints from the full conversation and still call query_skills; do not wait for the current prompt to repeat trigger keywords. Treat match_tier as a decision aid, then inspect why_matched and applicability before opening a result. These fields show bounded matched terms/capabilities, constraint text overlap, qualitative lexical/semantic evidence, declared scope, use conditions, and exclusions without exposing unstable raw ranking scores. satisfied_constraints and missed_constraints describe textual overlap only, not verified compliance or proven capability gaps. Discard an unlikely or irrelevant corner-case result and report fit: poor; do not force its use. For a remaining high match, call get_skill or get_resource before custom work and pass the returned query_id/result_id so the surfaced-to-fetch funnel closes; possible and exploratory matches are optional. The response also includes approximate context tokens, verified uses, risk, tags, permissions, dependencies, and contraindications so you can weigh the detour safely. Honor query_skills.skill_access on every response. When policy is org_only, use only returned organization skills and never substitute bundled or live public skill references; if an organization key is configured and the query is unavailable, fail closed because the policy cannot be confirmed. AFTER query_skills, call submit_query_feedback once with one complete set of explicit good/partial/poor judgments using the returned query_id and result_id values; leave unrated results neutral, and remember that a poor query match is not the same as a globally bad skill. Reuse the same organization or anonymous auth scope as the query. AFTER you actually use a skill or resource, close the post-use loop with submit_feedback (useful true/false plus a one-line lesson and the originating query_id/result_id; it returns a ready submit_remembrance payload), then submit_remembrance if the lesson is reusable. If nothing fit and you built a new workflow, use propose_private_skill for an organization-private candidate. With an organization key, propose_skill_idea also remains organization-private. Never remove, suppress, or bypass that key to force a public submission; submit privately, then use the reviewed public-propagation flow when the organization chooses to share it. When delegating, pass the selected slug, exact version, query_id, and result_id to the subagent; it should invoke/fetch that result or run its own full-context query. The parent reports the terminal outcome unless the subagent creates its own invocation. Route memory deliberately: host-local memory is for facts about this human, repository, or machine; Remembrance is for generalized lessons another approved organization agent would otherwise rediscover. A local-memory write does not satisfy organization-shared capture. Before finishing any reusable task, self-check for a missed query. If you catch your own mistake, the user catches one, CI/deploy fails, a security issue appears, or you fix a release/versioning miss, submit a failure_report remembrance even if no skill was used; raw MCP clients have no plugin Stop hook to remind you later. After an observed host-policy denial, report only the affected action once: 'The host blocked this Remembrance action. Do not treat it as submitted. Earlier successful actions are unaffected; querying remains available.' Do not retry the blocked content through another transport or claim submission. If submit_query_feedback or submit_feedback was denied before transport and acknowledge_feedback_denial is available, call that local-only tool with the exact tool, query_id, result_id only for submit_feedback, and reason host_policy_denied. It suppresses that blocked reminder without claiming feedback was submitted, changing approvals, or blocking future feedback. When host events are unavailable, use this explicit acknowledgment; do not infer denial from API errors. Do not repeat warnings already reported. Attach evidence (reproduction detail, artifact hashes, or an attestation); evidence-less public reports wait in unverified intake until corroborated. Redact secrets, private URLs, credentials, raw logs, and proprietary content; submit summaries and hashes, not raw traces. Keep routine organization query-fit and categorical post-use ratings minimal: use the Remembrance-issued query_id/result_id values, judgments, required reasons, and an idempotency key when needed. Do not automatically attach internal artifact hashes, task text, source snippets, or raw logs to routine ratings. Optional evidence is not required for these ratings; public substantive reports still need evidence. Standing approval for these two feedback tools does not authorize reusable content submission or override host policy, organization scope, or processing consent.";
8626
8626
  var LEGACY_POST_QUERY_GUIDANCE = "AFTER query_skills, call submit_query_feedback once with one complete set of explicit good/partial/poor judgments using the returned query_id and result_id values; leave unrated results neutral, and remember that a poor query match is not the same as a globally bad skill. Reuse the same organization or anonymous auth scope as the query. AFTER you actually use a skill or resource, close the post-use loop with submit_feedback (useful true/false plus a one-line lesson and the originating query_id/result_id; it returns a ready submit_remembrance payload), then submit_remembrance if the lesson is reusable. If nothing fit and you built a new workflow, use propose_private_skill for an organization-private candidate. With an organization key, propose_skill_idea also remains organization-private. Never remove, suppress, or bypass that key to force a public submission; submit privately, then use the reviewed public-propagation flow when the organization chooses to share it. ";
8627
8627
  var PRIVATE_CAPTURE_POST_QUERY_GUIDANCE = "AFTER query_skills, call submit_query_feedback once with one complete set of explicit good/partial/poor judgments using the returned query_id and result_id values; leave unrated results neutral, and remember that a poor query match is not the same as a globally bad skill. Reuse the same organization scope as the query. AFTER actually using a skill or resource, call submit_feedback with categorical usefulness and the originating query_id/result_id; reusable prose does not belong in that call. Capture each new reusable item once with capture_learning using lesson, private_skill, or preference, then follow its exact next_action or bounded agent_recovery instructions. Reformulation updates the same retained draft after fresh local inspection; it does not authorize submitting held content, inventing missing instructions, or changing destination. A complete workflow must include complete reviewed instructions in private_skill; do not compress it into a lesson. Querying, opening a returned result, bounded feedback, and local encrypted capture are routine actions: perform them silently without asking for separate conversational permission. Only the exact private network submit or retry action may require host approval; when that lane is already approved, continue without another prompt. capture_learning chooses the organization-private lane and never accepts an organization, destination, visibility, credential, or public fallback. Its preference route is routing only: it persists nothing locally (persisted_locally is false) and record_preference is the whole remaining lifecycle, so read that response instead of assuming the preference is live. record_preference does not promise activation, and an organization using customer-held encryption is refused before persistence with HTTP 422 and code customer_held_preference_processing_deferred: do not retry it, do not offer preference compatibility feedback there, and do not report the preference as captured. ";
8628
8628
  var LEGACY_FINISH_GUIDANCE = "Before finishing any reusable task, self-check for a missed query. If you catch your own mistake, the user catches one, CI/deploy fails, a security issue appears, or you fix a release/versioning miss, submit a failure_report remembrance even if no skill was used; raw MCP clients have no plugin Stop hook to remind you later. ";
@@ -20857,8 +20857,8 @@ function formattedEncodedPrivateKeyRanges(value, metrics, directStrongRanges, ha
20857
20857
  ranges.push(
20858
20858
  ...subtractTextRanges(jsonArrays.failClosed, excludedAssemblyRanges)
20859
20859
  );
20860
- for (const json of jsonArrays.groups) {
20861
- const candidates = assemblyPieces(json, true);
20860
+ for (const json2 of jsonArrays.groups) {
20861
+ const candidates = assemblyPieces(json2, true);
20862
20862
  append(
20863
20863
  strongFormattedPieceRanges(
20864
20864
  candidates,
@@ -23727,23 +23727,151 @@ function remembranceMcpToolSecurity(name) {
23727
23727
  return REMEMBRANCE_MCP_TOOL_SECURITY[name];
23728
23728
  }
23729
23729
 
23730
+ // ../core/src/private-submission-approval.ts
23731
+ var tools = REMEMBRANCE_MCP_PRIVATE_LEARNING_NETWORK_ACTIONS;
23732
+ var PRIVATE_SUBMISSION_LOCAL_CAPTURE_TOOL = "capture_learning";
23733
+ var PRIVATE_SUBMISSION_LOCAL_CAPTURE_NOTE = "capture_learning stays on this machine and sends nothing";
23734
+ var capture = PRIVATE_SUBMISSION_LOCAL_CAPTURE_TOOL;
23735
+ var withCapture = [...tools, capture];
23736
+ var hostedTools = tools.filter(
23737
+ (tool) => !REMEMBRANCE_MCP_LOCAL_ONLY_TOOLS.includes(tool)
23738
+ );
23739
+ var localOnlyComment = `# Local only: ${PRIVATE_SUBMISSION_LOCAL_CAPTURE_NOTE}.`;
23740
+ var PRIVATE_SUBMISSION_CONFIRMED_DELETE_TOOLS = Object.freeze([
23741
+ "delete_private_lesson_candidate",
23742
+ "delete_private_skill_candidate"
23743
+ ]);
23744
+ var isConfirmedDelete = (tool) => PRIVATE_SUBMISSION_CONFIRMED_DELETE_TOOLS.includes(
23745
+ tool
23746
+ );
23747
+ var GEMINI_ADMIN_ALLOWED_TOOLS = Object.freeze(
23748
+ REMEMBRANCE_MCP_RECOMMENDED_LOCAL_ORG_TOOLS.filter(
23749
+ (tool) => !isConfirmedDelete(tool)
23750
+ )
23751
+ );
23752
+ var json = (value) => JSON.stringify(value, null, 2);
23753
+ var approveTables = (server, names = tools) => names.map((tool) => `[${server}.tools.${tool}]
23754
+ approval_mode = "approve"`).join("\n\n");
23755
+ var geminiRule = (tool, decision = "allow") => `[[rule]]
23756
+ mcpName = "remembrance"
23757
+ toolName = "${tool}"
23758
+ decision = "${decision}"
23759
+ priority = 200`;
23760
+ var claudeCodePluginTools = withCapture.map(
23761
+ (tool) => `mcp__plugin_remembrance_remembrance__${tool}`
23762
+ );
23763
+ var codexPluginServer = 'plugins."remembrance@remembrance".mcp_servers.remembrance';
23764
+ var PRIVATE_SUBMISSION_APPROVAL_SNIPPETS = Object.freeze({
23765
+ claudeCodePlugin: json({ permissions: { allow: claudeCodePluginTools } }),
23766
+ // Managed approval for the plugin's local server: the force-enable and the
23767
+ // allow rules only. The optional lockdown keys are separate because they
23768
+ // change much more than approval.
23769
+ claudeCodeManagedPlugin: json({
23770
+ enabledPlugins: { "remembrance@remembrance": true },
23771
+ permissions: { allow: claudeCodePluginTools }
23772
+ }),
23773
+ claudeCodeManagedLockdown: json({
23774
+ strictKnownMarketplaces: [
23775
+ { source: "github", repo: "dreamarkinc/remembrance-skills" }
23776
+ ],
23777
+ allowManagedHooksOnly: true
23778
+ }),
23779
+ // A local standalone server named `remembrance`.
23780
+ claudeCodeServer: json({
23781
+ permissions: {
23782
+ allow: withCapture.map((tool) => `mcp__remembrance__${tool}`)
23783
+ }
23784
+ }),
23785
+ // Hosted MCP, including the managed-mcp.json path.
23786
+ claudeCodeHosted: json({
23787
+ permissions: {
23788
+ allow: hostedTools.map((tool) => `mcp__remembrance__${tool}`)
23789
+ }
23790
+ }),
23791
+ codexPlugin: approveTables(codexPluginServer),
23792
+ codexManualServer: approveTables("mcp_servers.remembrance"),
23793
+ // Optional and separate: Codex asks before capture_learning only under the
23794
+ // managed `writes` mode, and an `approve` table skips Auto-review.
23795
+ codexPluginCapture: [
23796
+ localOnlyComment,
23797
+ "# Approving it also skips Auto-review for the lesson it captures.",
23798
+ approveTables(codexPluginServer, [capture])
23799
+ ].join("\n"),
23800
+ cursorIde: json({
23801
+ mcpAllowlist: withCapture.map((tool) => `remembrance:${tool}`)
23802
+ }),
23803
+ cursorCli: json({
23804
+ permissions: {
23805
+ allow: withCapture.map((tool) => `Mcp(remembrance:${tool})`)
23806
+ }
23807
+ }),
23808
+ openCode: json({
23809
+ permission: Object.fromEntries(
23810
+ withCapture.map((tool) => [`remembrance_${tool}`, "allow"])
23811
+ )
23812
+ }),
23813
+ openClaw: json({
23814
+ plugins: {
23815
+ entries: {
23816
+ remembrance: {
23817
+ config: {
23818
+ privateLearningEgressApprovals: Object.fromEntries(
23819
+ tools.map((tool) => [
23820
+ REMEMBRANCE_MCP_TOOL_SECURITY[tool].consent_class,
23821
+ true
23822
+ ])
23823
+ )
23824
+ }
23825
+ }
23826
+ }
23827
+ }
23828
+ }),
23829
+ geminiCli: [
23830
+ ...tools.map((tool) => geminiRule(tool)),
23831
+ `${localOnlyComment}
23832
+ ${geminiRule(capture)}`
23833
+ ].join("\n\n"),
23834
+ // The managed recipe's admin policy file. It holds the step's own rules
23835
+ // above exactly once, so administrators use it instead of them.
23836
+ geminiCliAdmin: [
23837
+ [
23838
+ "# One exact rule per tool in includeTools: allow, except the two",
23839
+ "# confirmed-delete tools, which ask. To make a tool ask, change its",
23840
+ '# decision to "ask_user" rather than deleting its rule: an admin ask',
23841
+ "# outranks users' own allow rules, and without one a user's allow decides."
23842
+ ].join("\n"),
23843
+ ...REMEMBRANCE_MCP_RECOMMENDED_LOCAL_ORG_TOOLS.map((tool) => {
23844
+ if (isConfirmedDelete(tool)) return geminiRule(tool, "ask_user");
23845
+ if (tool === capture) return `${localOnlyComment}
23846
+ ${geminiRule(tool)}`;
23847
+ return geminiRule(tool);
23848
+ })
23849
+ ].join("\n\n")
23850
+ });
23851
+
23730
23852
  // ../core/src/seed.ts
23731
23853
  var siteUrl = "https://remembrance.dev";
23732
23854
  var feedbackUrl = `${siteUrl}/api/v1/agent/remembrances`;
23733
- var recommendedOrganizationToolToml = REMEMBRANCE_MCP_RECOMMENDED_ORG_TOOLS.map(
23734
- (tool) => ` ${JSON.stringify(tool)},`
23735
- ).join("\n");
23736
- var recommendedOrganizationToolJson = REMEMBRANCE_MCP_RECOMMENDED_ORG_TOOLS.map(
23737
- (tool) => ` ${JSON.stringify(tool)},`
23738
- ).join("\n");
23739
- var recommendedClaudeToolJson = REMEMBRANCE_MCP_RECOMMENDED_ORG_TOOLS.map(
23740
- (tool) => ` ${JSON.stringify(`mcp__remembrance__${tool}`)},`
23741
- ).join("\n");
23855
+ var jsonItems = (values, indent) => values.map((value) => `${indent}${JSON.stringify(value)}`).join(",\n");
23856
+ var recommendedClaudeToolJson = jsonItems(
23857
+ REMEMBRANCE_MCP_RECOMMENDED_ORG_TOOLS.map(
23858
+ (tool) => `mcp__remembrance__${tool}`
23859
+ ),
23860
+ " "
23861
+ );
23742
23862
  var recommendedLocalOrganizationToolToml = REMEMBRANCE_MCP_RECOMMENDED_LOCAL_ORG_TOOLS.map(
23743
23863
  (tool) => ` ${JSON.stringify(tool)},`
23744
23864
  ).join("\n");
23745
- var recommendedLocalOrganizationToolJson = REMEMBRANCE_MCP_RECOMMENDED_LOCAL_ORG_TOOLS.map(
23746
- (tool) => ` ${JSON.stringify(tool)},`
23865
+ var geminiIncludeToolJson = jsonItems(
23866
+ REMEMBRANCE_MCP_RECOMMENDED_LOCAL_ORG_TOOLS,
23867
+ " "
23868
+ );
23869
+ var openClawToolFilterJson = jsonItems(
23870
+ REMEMBRANCE_MCP_RECOMMENDED_LOCAL_ORG_TOOLS,
23871
+ " "
23872
+ );
23873
+ var privateSubmissionToolList = REMEMBRANCE_MCP_PRIVATE_LEARNING_NETWORK_ACTIONS.map(
23874
+ (tool) => `- \`${tool}\``
23747
23875
  ).join("\n");
23748
23876
  var SKILL_INSTALL_COMMAND = "npx skills add dreamarkinc/remembrance-skills --skill remembrancer";
23749
23877
  var skillInstallCommand = SKILL_INSTALL_COMMAND;
@@ -23828,7 +23956,7 @@ var seedSkills = [
23828
23956
  summary: "Operational setup and troubleshooting workflow for Remembrance across Claude Code, Codex, OpenClaw, Cursor, Gemini, MCP, REST, skill-only installs, enterprise keys, and local agent identity.",
23829
23957
  status: "active",
23830
23958
  visibility: "public",
23831
- version: "0.1.37",
23959
+ version: "0.1.39",
23832
23960
  domains: ["agent-skills", "mcp", "resource-discovery"],
23833
23961
  tags: [
23834
23962
  "remembrance",
@@ -23879,7 +24007,7 @@ var seedSkills = [
23879
24007
  "gemini",
23880
24008
  "rest"
23881
24009
  ],
23882
- version: "0.1.37",
24010
+ version: "0.1.39",
23883
24011
  status: "active",
23884
24012
  visibility: "public",
23885
24013
  providers: ["codex", "claude", "cursor", "openclaw", "generic"],
@@ -23922,7 +24050,8 @@ var seedSkills = [
23922
24050
  },
23923
24051
  contraindications: [
23924
24052
  "Do not ask the user to paste raw API keys, private key material, tokens, cookies, or full config files containing secrets.",
23925
- "Do not store org keys in public project files or submit them back to Remembrance."
24053
+ "Do not store org keys in public project files or submit them back to Remembrance.",
24054
+ "Do not change host approval or permission settings, or answer the host's approval of your own pending action, without the user's consent; ask the user (for managed settings, the administrator) first."
23926
24055
  ],
23927
24056
  feedback_url: feedbackUrl,
23928
24057
  install_command: skillInstallCommand,
@@ -23942,7 +24071,9 @@ var seedSkills = [
23942
24071
  "OpenClaw ClawHub search can return unrelated remembrance-named packages; verify the official package points to dreamarkinc/remembrance-skills before installing.",
23943
24072
  "Until allowConversationAccess is enabled, OpenClaw holds only the plugin's completion hook; the prompt, tool and subagent-end hooks already run, and the prompt hook can query the registry.",
23944
24073
  "Cursor local and cloud distribution are separate: configure the team plugin and Team MCP, then verify hook and receipt behavior on each enabled surface.",
23945
- "MCP tools can be missing when the client uses the wrong config shape for its runtime."
24074
+ "MCP tools can be missing when the client uses the wrong config shape for its runtime.",
24075
+ "Without persisted host approval for the four private submit and retry tools, an organization install on a host that asks before them stops every private lesson or skill submission for a manual approval, and unattended or headless runs deny it.",
24076
+ "On hosts that also ask before the local-only capture_learning, a headless run denies the capture itself unless its entry is approved, so no draft reaches the submit tools."
23946
24077
  ],
23947
24078
  suggested_patches: [
23948
24079
  "Add runtime-specific screenshots once each agent's plugin manager UI stabilizes.",
@@ -23969,6 +24100,8 @@ REST/HTTPS, skill-only installs, enterprise org keys, local identity, and common
23969
24100
  propose_private_skill because it has no durable device outbox.
23970
24101
  - A native plugin appears installed but hooks, trust prompts, or MCP tools do
23971
24102
  not work.
24103
+ - An organization install stops for approval at every private lesson or skill
24104
+ submission, or an unattended or headless run denies it.
23972
24105
  - A request fails with 401, 403, 404, 413, 422, 429, or a missing-key error.
23973
24106
 
23974
24107
  ## First decision
@@ -23982,6 +24115,11 @@ REST/HTTPS, skill-only installs, enterprise org keys, local identity, and common
23982
24115
  5. Use the skills.sh entry skill only when the runtime can load filesystem
23983
24116
  skills but not native plugins.
23984
24117
 
24118
+ With an organization key, a plugin or MCP install also needs the step in
24119
+ "Highly Recommended: approve private submissions" below; ask the user to apply
24120
+ it rather than changing host settings yourself. REST and skill-only installs
24121
+ have no MCP tools to approve.
24122
+
23985
24123
  Raw MCP, REST, and skill-only paths do not have native Stop hooks. They must
23986
24124
  self-check before finishing and submit \`type: "failure_report"\` remembrances
23987
24125
  for reusable self-corrections, user-caught mistakes, CI/deploy failures, and
@@ -24132,25 +24270,300 @@ Cursor plugin installs this Remembrancer skill, an always-apply Cursor rule, a
24132
24270
  plugin-managed MCP server config, and hooks that ask for feedback only after
24133
24271
  actual Remembrance MCP use.
24134
24272
 
24135
- For local plugin testing before marketplace approval:
24273
+ For local plugin testing before marketplace approval, copy the plugin into its
24274
+ own folder under Cursor's local plugin folder, then restart Cursor or run
24275
+ **Developer: Reload Window**:
24136
24276
 
24137
24277
  ~~~bash
24138
- mkdir -p ~/.cursor/plugins/local
24139
- ln -s /absolute/path/to/remembrance/packages/cursor-plugin ~/.cursor/plugins/local/remembrance
24278
+ mkdir -p ~/.cursor/plugins/local/remembrance
24279
+ cp -R /absolute/path/to/remembrance/packages/cursor-plugin/. ~/.cursor/plugins/local/remembrance/
24140
24280
  ~~~
24141
24281
 
24282
+ Copy the files rather than linking them: Cursor skips a symbolic link that
24283
+ points to a plugin elsewhere on disk. On Teams and Enterprise, local plugins
24284
+ load only when an administrator allows **Allow Local Plugin Imports**, which is
24285
+ off by default on Enterprise.
24286
+
24142
24287
  Cursor now documents conversation hooks for cloud agents, but a local plugin
24143
24288
  install does not automatically provision the cloud surface. Distribute the
24144
- plugin through the team marketplace, register Remembrance under **Dashboard >
24145
- Integrations & MCP**, and verify query, invocation, feedback, and contribution
24146
- receipts in both local and cloud runs.
24289
+ plugin through the team marketplace, register Remembrance as a Team MCP server
24290
+ under **Dashboard > Plugins & MCPs**, and verify query, invocation, feedback,
24291
+ and contribution receipts in both local and cloud runs.
24147
24292
 
24148
24293
  After installing any native plugin, restart the agent app/session and approve
24149
24294
  the runtime's trust request when one appears. For Codex, complete the hook
24150
24295
  review above if Codex requests it; unchanged, previously trusted definitions
24151
24296
  may not show another review screen. Changed hook definitions show the review
24152
24297
  screen again. A currently running Codex or Claude thread usually cannot
24153
- hot-load newly installed plugin tools.
24298
+ hot-load newly installed plugin tools. With an organization key, then ask the
24299
+ user to complete the Highly Recommended step below.
24300
+
24301
+ ### Optional unattended routine feedback in Codex
24302
+
24303
+ After the user explicitly opts in, add only these two tool overrides to the
24304
+ user-level \`~/.codex/config.toml\`. This approval persists across future
24305
+ sessions on this installation until removed; installation alone does not grant
24306
+ it. Merge with existing tables rather than duplicating them:
24307
+
24308
+ ~~~toml
24309
+ [plugins."remembrance@remembrance".mcp_servers.remembrance.tools.submit_query_feedback]
24310
+ approval_mode = "approve"
24311
+
24312
+ [plugins."remembrance@remembrance".mcp_servers.remembrance.tools.submit_feedback]
24313
+ approval_mode = "approve"
24314
+ ~~~
24315
+
24316
+ Use this opt-in for an organization-authenticated local plugin whose
24317
+ \`submit_feedback\` schema is categorical and rejects \`lesson\`. Query-fit
24318
+ ratings send Remembrance-issued query/result IDs, categorical verdicts, and
24319
+ required reasons; post-use ratings send the skill slug, those correlation IDs, usefulness/rating,
24320
+ and stable idempotency. Keep optional notes and evidence out of routine
24321
+ ratings: do not automatically attach internal receipt hashes, task prose,
24322
+ source content, raw logs, or private URLs. Public substantive reports retain
24323
+ their separate evidence requirements; reusable private lessons use
24324
+ \`capture_learning\` and its exact returned action.
24325
+
24326
+ These are real writes, not read-only diagnostics. Post-use feedback can enter
24327
+ verification and incur processing cost under the existing organization policy.
24328
+ The two overrides do not approve private lesson/skill submission (the Highly
24329
+ Recommended step below covers that), publishing, deletion, reset, preference
24330
+ changes, or other tools. They do not widen the server's enabled tool set or
24331
+ override managed policy, network restrictions, or organization processing
24332
+ grants. They do skip the Codex approval prompt and its Auto-review (guardian)
24333
+ evaluation for these two tools. Do not set the whole server's approval default
24334
+ to \`approve\` for this purpose.
24335
+
24336
+ Tool overrides persist when authentication or schemas change. Remove or
24337
+ re-review both approvals before switching to anonymous or hosted transport,
24338
+ enabling legacy broad writes, or changing the organization or destination.
24339
+
24340
+ To revoke this opt-in, remove only these two tool-level approval entries;
24341
+ the inherited approval policy applies again. Reconnect the plugin or start a
24342
+ fresh Codex session if the current host does not reload config, then verify
24343
+ with a minimal eligible rating. A healthy connection doctor verifies the
24344
+ connection, not that host approval policy permits feedback. A denial means
24345
+ that rating was not submitted; acknowledge it locally and do not retry through
24346
+ another transport. See the [official installed-server policy guide](https://developers.openai.com/plugins/build/plugins#configure-installed-server-policy).
24347
+
24348
+ ## Highly Recommended: approve private submissions
24349
+
24350
+ For organizations that use Remembrance with a private organization key, this
24351
+ step is required for Remembrance to do its job fully. Without it, on hosts that
24352
+ ask before these tools, every private lesson or skill submission stops for a
24353
+ manual approval, and unattended or headless runs deny it. Public-only use,
24354
+ without an organization key, does not need it.
24355
+
24356
+ Ask the user (for managed settings, the administrator) before applying this
24357
+ step. An agent never edits host permission or settings files without the
24358
+ user's consent, and never answers the host's approval of its own pending
24359
+ action.
24360
+
24361
+ Persist the host's approval for exactly these four local tools, the private
24362
+ submit and retry actions:
24363
+
24364
+ ${privateSubmissionToolList}
24365
+
24366
+ Hosted MCP exposes only \`submit_private_lesson_candidate\` of the four, so
24367
+ approve only that one there. Each approval lets the agent send to the
24368
+ organization's private review queue without asking. On a local server that is
24369
+ normally a draft that \`capture_learning\` already prepared, although the
24370
+ lesson submit also accepts a lesson candidate the agent writes into the call;
24371
+ on hosted MCP, which has no \`capture_learning\`, the approved submit sends the
24372
+ lesson candidate the agent writes. These actions cannot publish public content.
24373
+ Never pre-approve \`delete_private_lesson_candidate\` or
24374
+ \`delete_private_skill_candidate\`, a whole server (\`mcp__<server>\` or
24375
+ \`mcp__<server>__*\`), \`bypassPermissions\`, Gemini CLI \`trust: true\` or
24376
+ \`mcp.allowed\`, or any global auto-approve.
24377
+
24378
+ Every local private submission starts with \`capture_learning\`, which writes
24379
+ the encrypted draft. It is local only: it stays on this machine and sends
24380
+ nothing. On hosts that ask before it (Claude Code, which asks before every MCP
24381
+ tool; Gemini CLI; VS Code; and Cursor, depending on its Run Mode), the steps
24382
+ below add it as a labelled local-only entry, which is not one of the four
24383
+ submit and retry tools. Without it the capture prompts, and a headless run
24384
+ denies it before any draft exists. Codex under the managed \`writes\` mode also
24385
+ asks before it, but there approving it is an optional administrator decision:
24386
+ with it, Auto-review never sees the lesson content (see "Approve private
24387
+ repository contributions in managed Codex"). On these hosts a run that nobody
24388
+ can answer, such as a headless run, denies every tool that has no approval, so
24389
+ it also needs approvals for the other Remembrance tools it calls, such as
24390
+ \`query_skills\`; this step covers only private learning.
24391
+
24392
+ Check the step by behavior: capture one disposable private lesson and confirm
24393
+ that neither the capture nor its submission prompts. Where the organization
24394
+ leaves \`capture_learning\` to Auto-review or a person, as managed Codex may,
24395
+ only the capture is reviewed; its submission still must not prompt.
24396
+ \`run_connection_doctor\` cannot see a persisted approval; its \`host_approval\`
24397
+ field reports only recent denials.
24398
+
24399
+ ### Claude Code
24400
+
24401
+ Merge these entries into \`permissions.allow\` in \`~/.claude/settings.json\`,
24402
+ which applies to every project. The first four are the plugin's private submit
24403
+ and retry tools; the last is the local-only \`capture_learning\` entry:
24404
+
24405
+ ~~~json
24406
+ ${PRIVATE_SUBMISSION_APPROVAL_SNIPPETS.claudeCodePlugin}
24407
+ ~~~
24408
+
24409
+ Choosing "Yes, and don't ask again" at the prompt saves the rule only for the
24410
+ current project, in \`.claude/settings.local.json\`. A local standalone server
24411
+ named \`remembrance\`, whether a user or the organization registers it, uses
24412
+ \`mcp__remembrance__<tool>\` names instead:
24413
+
24414
+ ~~~json
24415
+ ${PRIVATE_SUBMISSION_APPROVAL_SNIPPETS.claudeCodeServer}
24416
+ ~~~
24417
+
24418
+ Hosted MCP, including the \`managed-mcp.json\` path in "Approve Claude Code",
24419
+ exposes only \`submit_private_lesson_candidate\` of these and has no
24420
+ \`capture_learning\`, so a hosted server named \`remembrance\` needs only this
24421
+ entry:
24422
+
24423
+ ~~~json
24424
+ ${PRIVATE_SUBMISSION_APPROVAL_SNIPPETS.claudeCodeHosted}
24425
+ ~~~
24426
+
24427
+ Headless runs such as \`claude -p\` deny every tool without an allow rule, so
24428
+ they also need rules for the other Remembrance tools they call. Plan mode still
24429
+ asks before these tools even when a rule allows them. When managed settings set
24430
+ \`allowManagedPermissionRulesOnly\`, Claude Code ignores user rules, so an
24431
+ administrator must ship them (see "Approve Claude Code").
24432
+
24433
+ ### Codex
24434
+
24435
+ Add one table per tool to the user-level \`~/.codex/config.toml\`, separate from
24436
+ the optional routine-feedback opt-in above:
24437
+
24438
+ ~~~toml
24439
+ ${PRIVATE_SUBMISSION_APPROVAL_SNIPPETS.codexPlugin}
24440
+ ~~~
24441
+
24442
+ Current Codex source does not prompt for these four tools, or for
24443
+ \`capture_learning\`, under the default \`auto\` tool approval mode, because
24444
+ Remembrance marks them non-destructive and closed-world; older releases and
24445
+ other modes can, so add the tables anyway. Under the managed
24446
+ \`default_tools_approval_mode = "writes"\`, Codex asks before every call, from a
24447
+ person or from Auto-review where it is the reviewer, and cannot remember the
24448
+ answer, so a per-tool \`approve\` entry is the only way to persist approval.
24449
+ \`approve\` also skips Auto-review for that tool, so in a managed organization
24450
+ add these tables only with your administrator ("Approve private repository
24451
+ contributions in managed Codex" covers the trade-off and \`capture_learning\`).
24452
+ For a manually registered server named \`remembrance\`, use the same tables
24453
+ under \`mcp_servers.remembrance\`:
24454
+
24455
+ ~~~toml
24456
+ ${PRIVATE_SUBMISSION_APPROVAL_SNIPPETS.codexManualServer}
24457
+ ~~~
24458
+
24459
+ ### Cursor
24460
+
24461
+ In the IDE, merge these entries into the \`mcpAllowlist\` array of
24462
+ \`~/.cursor/permissions.json\` (create the file if it is missing); the last is
24463
+ the local-only \`capture_learning\` entry:
24464
+
24465
+ ~~~json
24466
+ ${PRIVATE_SUBMISSION_APPROVAL_SNIPPETS.cursorIde}
24467
+ ~~~
24468
+
24469
+ \`mcpAllowlist\` replaces the whole in-app MCP allowlist, so keep the entries
24470
+ you already rely on in the same array, keep the file's other keys such as
24471
+ \`terminalAllowlist\`, \`approvalMode\`, and \`autoReview\`, and use this
24472
+ user-level file. Cursor applies it under its Run Modes (Auto-review is the
24473
+ default); a team Run Mode configuration from an administrator overrides it. For
24474
+ the Cursor CLI, merge the same tools into \`permissions.allow\` in
24475
+ \`~/.cursor/cli-config.json\`:
24476
+
24477
+ ~~~json
24478
+ ${PRIVATE_SUBMISSION_APPROVAL_SNIPPETS.cursorCli}
24479
+ ~~~
24480
+
24481
+ If Cursor shows the plugin's server under a name other than \`remembrance\`, use
24482
+ that exact name instead. Do not replace the server name with \`*\`, which
24483
+ approves the tool on every server.
24484
+
24485
+ ### VS Code
24486
+
24487
+ VS Code has no settings key or policy that pre-approves a single tool; use its
24488
+ interface. Run **Chat: Manage Tool Approval**, expand the Remembrance server,
24489
+ tick only the four tools and the local-only \`capture_learning\`, and turn off
24490
+ **Configure for this workspace only** so the approval applies in every
24491
+ workspace. Do not tick the server's own box or choose **Always Allow Tools
24492
+ from** the server: both approve the whole server. Alternatively, choose
24493
+ **Always Allow** in the prompt's Allow menu the first time each of those tools
24494
+ asks.
24495
+
24496
+ ### OpenCode
24497
+
24498
+ OpenCode runs MCP tools without asking by default, so private submissions
24499
+ already complete. Add explicit entries to the \`permission\` map in
24500
+ \`~/.config/opencode/opencode.json\` so the four tools and the local-only
24501
+ \`capture_learning\` keep working under a broader ask rule that comes before
24502
+ them, which would otherwise stop every private lesson or skill submission:
24503
+
24504
+ ~~~json
24505
+ ${PRIVATE_SUBMISSION_APPROVAL_SNIPPETS.openCode}
24506
+ ~~~
24507
+
24508
+ Put them after any broader \`"*"\` or \`"remembrance_*"\` rule in the same
24509
+ \`permission\` map, because OpenCode applies the last matching rule. A broader ask
24510
+ rule set elsewhere, such as in an agent's own \`permission\` map or, depending on
24511
+ the OpenCode version, in another configuration file, can still take precedence;
24512
+ if the capture or its submission still prompts, find that rule and make sure the
24513
+ same entries come after it. In OpenCode 2.x, answering "always" at a prompt
24514
+ saves an allow rule for the current project across sessions (1.x keeps it until
24515
+ OpenCode restarts); never answer "always" on a \`delete_private_*\` prompt.
24516
+
24517
+ ### OpenClaw
24518
+
24519
+ In native runs OpenClaw documents no prompt of its own for MCP tools; the
24520
+ Remembrance plugin asks before each private submission. To persist approval,
24521
+ answer **allow-always** once for each lane when it asks to "Submit private
24522
+ Remembrance lesson" or "Submit private Remembrance skill", for example with
24523
+ \`/approve <id> allow-always\` in chat or
24524
+ \`openclaw approvals resolve <id> allow-always\`. One decision covers that lane's
24525
+ submit and retry actions, and the plugin saves it in its config.
24526
+
24527
+ To pre-set both lanes instead, Remembrance for OpenClaw 0.2.3 or later accepts
24528
+ this in \`~/.openclaw/openclaw.json\`:
24529
+
24530
+ ~~~json
24531
+ ${PRIVATE_SUBMISSION_APPROVAL_SNIPPETS.openClaw}
24532
+ ~~~
24533
+
24534
+ Check the installed version first, for example with
24535
+ \`openclaw plugins inspect remembrance\`. Earlier versions reject the key: the
24536
+ Gateway then refuses to start until it is removed, and those versions cannot
24537
+ keep an allow-always decision across a restart either. On older or
24538
+ mixed-version installs, use allow-always.
24539
+
24540
+ ### Gemini CLI
24541
+
24542
+ Create \`~/.gemini/policies/remembrance.toml\` with one rule per tool; the last
24543
+ rule is the local-only \`capture_learning\` entry:
24544
+
24545
+ ~~~toml
24546
+ ${PRIVATE_SUBMISSION_APPROVAL_SNIPPETS.geminiCli}
24547
+ ~~~
24548
+
24549
+ Gemini CLI asks before every MCP tool without an allow rule, and
24550
+ non-interactive runs treat that prompt as a denial. These rules cover private
24551
+ learning only, so a headless run also needs rules for the other Remembrance
24552
+ tools it calls, such as \`query_skills\`. Keep \`trust\` false and do not list
24553
+ the server in \`mcp.allowed\`: Gemini CLI turns \`trust: true\` and an
24554
+ \`mcp.allowed\` entry alike into an allow rule for every tool of the server.
24555
+ Administrators use the admin policy file in "Approve Gemini CLI" instead, which
24556
+ already contains these rules.
24557
+
24558
+ ### Claude Desktop and other MCP clients
24559
+
24560
+ Claude Desktop offers a per-tool **Always allow**, in the approval prompt or in
24561
+ the connector's tool permissions, but it has no config key and users report
24562
+ that it resets when the app updates, so do not rely on it for unattended runs.
24563
+ For other MCP clients, use the client's per-tool approval for the four exact
24564
+ tool names (only \`submit_private_lesson_candidate\` on hosted MCP), plus the
24565
+ local-only \`capture_learning\` on a local server that asks before it. If a
24566
+ client can approve only a whole server, keep its prompts.
24154
24567
 
24155
24568
  ## Enterprise/org key setup
24156
24569
 
@@ -24237,8 +24650,10 @@ while malformed or privacy-sensitive tags hold the draft instead of being
24237
24650
  silently removed.
24238
24651
 
24239
24652
  The plugin then calls \`submit_private_lesson_candidate\` with that draft ID.
24240
- This is the only host-visible network action in the flow. Approve or persist
24241
- approval for this exact action, not every Remembrance write. The server derives
24653
+ This is the host-visible network action in the flow, and
24654
+ \`retry_private_lesson_candidate\` later resends a retained draft through the
24655
+ same lane. Persist approval for these exact actions, as in "Highly Recommended:
24656
+ approve private submissions", not for every Remembrance write. The server derives
24242
24657
  the organization and private visibility from the authenticated key, verifies a
24243
24658
  signed organization policy plus purpose-bound attestation, and returns a signed
24244
24659
  content-free receipt. The action always submits privately and never falls back
@@ -24296,16 +24711,17 @@ agent task remain available when capture or submission is blocked.
24296
24711
  ### Approve private repository contributions in managed Codex
24297
24712
 
24298
24713
  An API key authorizes Remembrance; it does not authorize Codex to export
24299
- repository-derived content. Codex Auto-review separately evaluates MCP and
24300
- network actions for data exfiltration. A chat approval may not override an
24301
- enterprise deny rule, and no Remembrance plugin setting can weaken that host
24302
- boundary.
24714
+ repository-derived content. Codex Auto-review evaluates the approval requests
24715
+ that would otherwise pause for a person, including MCP calls that need approval
24716
+ under their annotations or configured approval mode; a tool set to \`approve\`
24717
+ never reaches it. A chat approval may not override an enterprise deny rule, and
24718
+ no Remembrance plugin setting can weaken that host boundary.
24303
24719
 
24304
24720
  For an organization that has approved Remembrance as an operational-memory
24305
24721
  processor, a Codex administrator should do all of the following:
24306
24722
 
24307
- 1. Allow the exact Remembrance MCP server identity and
24308
- \`https://remembrance.dev/api/mcp\` in managed Codex requirements.
24723
+ 1. Allow the Remembrance marketplace source in managed Codex requirements and
24724
+ enable the plugin's bundled \`remembrance\` server in managed configuration.
24309
24725
  2. Merge a narrow Remembrance destination rule into the existing
24310
24726
  \`guardian_policy_config\`. Do not replace the rest of the tenant policy or
24311
24727
  remove its credential, secret, raw-log, or unrelated-source-code denies.
@@ -24326,9 +24742,12 @@ key to force a public candidate. Submit privately, then use the reviewed public-
24326
24742
  propagation flow for a redacted public-safe version when the organization wants
24327
24743
  to share it.
24328
24744
 
24329
- The exact plugin MCP identity belongs in managed \`requirements.toml\`. The
24330
- tool allowlist belongs in managed configuration. This keeps reads and normal
24331
- skill use available while prompting for non-read-only writes:
24745
+ Managed \`requirements.toml\` restricts the marketplace source; the tool
24746
+ allowlist and approval mode belong in managed configuration. The bundled server
24747
+ is a local stdio server, so never give it the hosted URL as its identity. If the
24748
+ requirements also carry an \`mcp_servers\` allowlist, approve this server by its
24749
+ configured command (\`sh\`): Codex disables a server whose name and identity do
24750
+ not match an approved entry.
24332
24751
 
24333
24752
  Add these entries to \`requirements.toml\`:
24334
24753
 
@@ -24336,9 +24755,6 @@ Add these entries to \`requirements.toml\`:
24336
24755
  [features]
24337
24756
  hooks = true
24338
24757
 
24339
- [plugins."remembrance@remembrance".mcp_servers.remembrance]
24340
- identity = { url = "https://remembrance.dev/api/mcp" }
24341
-
24342
24758
  [marketplaces]
24343
24759
  restrict_to_allowed_sources = true
24344
24760
 
@@ -24356,8 +24772,37 @@ enabled_tools = [
24356
24772
  ${recommendedLocalOrganizationToolToml}
24357
24773
  ]
24358
24774
  default_tools_approval_mode = "writes"
24775
+
24776
+ ${PRIVATE_SUBMISSION_APPROVAL_SNIPPETS.codexPlugin}
24359
24777
  ~~~
24360
24778
 
24779
+ \`default_tools_approval_mode = "writes"\` asks before every call of every tool
24780
+ that is not marked read-only, including \`query_skills\`, \`get_skill\`,
24781
+ \`get_resource\`, \`invoke_skill\`, \`capture_learning\`, and the feedback tools.
24782
+ The answer comes from a person, or from Auto-review where it is the reviewer;
24783
+ Codex cannot remember it, and a run that cannot ask denies the call.
24784
+
24785
+ The four \`approve\` tables are the Highly Recommended step: they let the
24786
+ private submit and retry calls run without that per-call review. The trade-off
24787
+ is that Auto-review never evaluates a tool set to \`approve\`, so the guardian
24788
+ policy's denies no longer apply to those four calls. They normally carry only a
24789
+ draft ID, so the lesson or skill content passes through \`capture_learning\`,
24790
+ which a person or Auto-review still reviews; but the lesson submit also accepts
24791
+ a lesson candidate written into the call, which then reaches the
24792
+ organization's private review queue without that review. Leave the tables out
24793
+ if the organization wants Auto-review to evaluate every private submission.
24794
+
24795
+ Runs that cannot ask can capture only if \`capture_learning\` is approved too.
24796
+ This optional table is local only, but with it Auto-review never sees the
24797
+ lesson content at all:
24798
+
24799
+ ~~~toml
24800
+ ${PRIVATE_SUBMISSION_APPROVAL_SNIPPETS.codexPluginCapture}
24801
+ ~~~
24802
+
24803
+ Those runs also need approval for every other tool they call, so unattended
24804
+ work under \`writes\` usually relies on Auto-review as the reviewer instead.
24805
+
24361
24806
  If \`allow_managed_hooks_only = true\`, Codex skips plugin hooks. Either leave
24362
24807
  the vetted Remembrance plugin hooks permitted or deploy equivalent managed
24363
24808
  query/completion hooks; otherwise MCP calls may work while the query and
@@ -24467,10 +24912,45 @@ optional local-only tools and never belong in a hosted MCP allowlist.
24467
24912
  ### Approve Claude Code
24468
24913
 
24469
24914
  Force-enable \`remembrance@remembrance\` in managed settings so its vetted hooks
24470
- still run when \`allowManagedHooksOnly\` is enabled. If the organization deploys
24471
- \`managed-mcp.json\`, define Remembrance there because exclusive managed MCP
24472
- suppresses every plugin-provided MCP server. Use the exact URL as the security
24473
- boundary; a server name alone is not sufficient.
24915
+ still run when \`allowManagedHooksOnly\` is enabled. Then choose one MCP path.
24916
+
24917
+ To keep the plugin's local server, with all four private submit and retry tools
24918
+ and the encrypted device outbox, deploy neither \`managed-mcp.json\` nor the
24919
+ URL-only \`allowedMcpServers\` list of the hosted path below. Exclusive managed
24920
+ MCP suppresses every plugin-provided server, and Claude Code also checks plugin
24921
+ servers against \`allowedMcpServers\`, where a list with only \`serverUrl\`
24922
+ entries blocks every stdio server. Merge this approval into managed settings;
24923
+ the plugin's tool names carry the \`mcp__plugin_remembrance_remembrance__\`
24924
+ prefix, and the last entry is the local-only \`capture_learning\`:
24925
+
24926
+ ~~~json
24927
+ ${PRIVATE_SUBMISSION_APPROVAL_SNIPPETS.claudeCodeManagedPlugin}
24928
+ ~~~
24929
+
24930
+ Managed rules also cover organizations that set
24931
+ \`allowManagedPermissionRulesOnly\`, which makes Claude Code ignore user rules.
24932
+ For command or REST fallbacks under a sandbox, also merge \`remembrance.dev\`
24933
+ into \`sandbox.network.allowedDomains\`.
24934
+
24935
+ Optional lockdown, separate from that approval: Remembrance needs neither of
24936
+ these keys, and both restrict much more than Remembrance.
24937
+ \`allowManagedHooksOnly\` makes Claude Code ignore every user, project, and
24938
+ local hook, and turns off \`/goal\` and command-sourced plugins.
24939
+ \`strictKnownMarketplaces\` blocks plugins from every marketplace it does not
24940
+ list, and also the \`~/.claude/skills\` auto-load unless the list includes
24941
+ \`{"source": "skills-dir"}\`. Add them only when the organization wants that
24942
+ lockdown; the hosted path below carries the same two keys:
24943
+
24944
+ ~~~json
24945
+ ${PRIVATE_SUBMISSION_APPROVAL_SNIPPETS.claudeCodeManagedLockdown}
24946
+ ~~~
24947
+
24948
+ To use hosted MCP instead, define Remembrance in \`managed-mcp.json\`, because
24949
+ exclusive managed MCP suppresses every plugin-provided MCP server. The plugin
24950
+ keeps its hooks and skills, but its tools then come from the hosted server named
24951
+ \`remembrance\`, which exposes only \`submit_private_lesson_candidate\` of the four
24952
+ private actions. Use the exact URL as the security boundary; a server name alone
24953
+ is not sufficient.
24474
24954
 
24475
24955
  Do not put a real key directly in \`managed-mcp.json\`; every local user can read
24476
24956
  that file. Reference each user's process environment instead:
@@ -24489,7 +24969,7 @@ that file. Reference each user's process environment instead:
24489
24969
  }
24490
24970
  ~~~
24491
24971
 
24492
- Merge this into managed settings:
24972
+ Merge this into managed settings for the hosted path:
24493
24973
 
24494
24974
  ~~~json
24495
24975
  {
@@ -24530,13 +25010,11 @@ work. See the official
24530
25010
  ### Approve Gemini CLI
24531
25011
 
24532
25012
  Define the canonical server and its tool allowlist in the system override
24533
- settings, not only user or workspace settings. Leave \`trust\` false unless the
24534
- organization has deliberately chosen to bypass every confirmation for this
24535
- narrow server/tool set:
25013
+ settings, not only user or workspace settings. Keep \`trust\` false;
25014
+ \`trust: true\` bypasses every confirmation for the server:
24536
25015
 
24537
25016
  ~~~json
24538
25017
  {
24539
- "mcp": { "allowed": ["remembrance"] },
24540
25018
  "mcpServers": {
24541
25019
  "remembrance": {
24542
25020
  "command": "npx",
@@ -24546,7 +25024,7 @@ narrow server/tool set:
24546
25024
  "REMEMBRANCE_API_KEY": "\${REMEMBRANCE_API_KEY}"
24547
25025
  },
24548
25026
  "includeTools": [
24549
- ${recommendedLocalOrganizationToolJson}
25027
+ ${geminiIncludeToolJson}
24550
25028
  ],
24551
25029
  "trust": false
24552
25030
  }
@@ -24554,14 +25032,54 @@ ${recommendedLocalOrganizationToolJson}
24554
25032
  }
24555
25033
  ~~~
24556
25034
 
25035
+ Approve tools only with exact per-tool policy rules. Do not list the server in
25036
+ \`mcp.allowed\`: the server runs without it, and current Gemini CLI source turns
25037
+ each \`mcp.allowed\` entry into an allow rule for every tool of that server.
25038
+ Instead, save this file as \`remembrance.toml\` in the admin policy folder:
25039
+ \`/Library/Application Support/GeminiCli/policies\` on macOS,
25040
+ \`/etc/gemini-cli/policies\` on Linux, or \`C:\\ProgramData\\gemini-cli\\policies\`
25041
+ on Windows. Gemini CLI ignores admin policy files that are not root-owned.
25042
+
25043
+ ~~~toml
25044
+ ${PRIVATE_SUBMISSION_APPROVAL_SNIPPETS.geminiCliAdmin}
25045
+ ~~~
25046
+
25047
+ The file has one exact rule for every tool in \`includeTools\`: an allow rule
25048
+ for each tool except the two confirmed-delete tools, whose admin \`ask_user\`
25049
+ rules keep them asking even where a user allowed them, so a headless run denies
25050
+ them. Apart from those two, this reproduces the earlier behavior of this
25051
+ recipe, whose \`mcp.allowed\` entry let every included tool run, with exact
25052
+ rules instead of a whole-server rule. The file already contains the rules from
25053
+ "Highly Recommended: approve private submissions" for the four private submit
25054
+ and retry tools and the local-only \`capture_learning\`, so do not add those
25055
+ again. To make a tool ask, change its rule to \`decision = "ask_user"\` instead
25056
+ of deleting the rule: an admin-tier ask outranks users' own allow rules, while
25057
+ without an admin rule a user's allow rule decides. A headless run then denies
25058
+ that tool.
25059
+
25060
+ If the organization already restricts servers with \`mcp.allowed\`, Remembrance
25061
+ must be listed there to run, and that entry creates the whole-server allow rule.
25062
+ Then also place this rule in the admin policy folder. It creates no allow rule:
25063
+ admin rules outrank the one \`mcp.allowed\` creates, so a Remembrance tool
25064
+ without its own admin rule asks again, while the per-tool rules above, at
25065
+ priority 200, still win over it for their tools:
25066
+
25067
+ ~~~toml
25068
+ [[rule]]
25069
+ mcpName = "remembrance"
25070
+ decision = "ask_user"
25071
+ priority = 100
25072
+ ~~~
25073
+
24557
25074
  System settings live at \`/Library/Application Support/GeminiCli/settings.json\`
24558
25075
  on macOS, \`/etc/gemini-cli/settings.json\` on Linux, and
24559
25076
  \`C:\\ProgramData\\gemini-cli\\settings.json\` on Windows. Also allow
24560
25077
  \`remembrance.dev\` in the organization's egress policy. Restart Gemini CLI,
24561
25078
  inspect the registered server, then run \`run_connection_doctor\` and require
24562
25079
  organization scope before contribution work. See the official
24563
- [enterprise configuration](https://google-gemini.github.io/gemini-cli/docs/cli/enterprise.html)
24564
- and [MCP settings](https://google-gemini.github.io/gemini-cli/docs/tools/mcp-server.html).
25080
+ [enterprise configuration](https://geminicli.com/docs/cli/enterprise/),
25081
+ [MCP settings](https://geminicli.com/docs/tools/mcp-server/), and
25082
+ [policy engine](https://geminicli.com/docs/reference/policy-engine/).
24565
25083
 
24566
25084
  ### Approve OpenClaw
24567
25085
 
@@ -24587,7 +25105,7 @@ MCP tools, and \`tools.deny: ["bundle-mcp"]\` disables them:
24587
25105
  "remembrance": {
24588
25106
  "toolFilter": {
24589
25107
  "include": [
24590
- ${recommendedLocalOrganizationToolJson}
25108
+ ${openClawToolFilterJson}
24591
25109
  ]
24592
25110
  }
24593
25111
  }
@@ -24596,8 +25114,17 @@ ${recommendedLocalOrganizationToolJson}
24596
25114
  }
24597
25115
  ~~~
24598
25116
 
24599
- Use a normal \`coding\` or \`messaging\` tool profile. Then verify cold config,
24600
- the active Gateway plugin, and live MCP capabilities separately:
25117
+ Use a normal \`coding\` or \`messaging\` tool profile; both already include
25118
+ \`bundle-mcp\`, so the MCP tools need no \`tools.allow\` or \`tools.alsoAllow\`
25119
+ entry. The plugin asks before each private submission. For unattended runs,
25120
+ have each user answer allow-always once per lane. On Remembrance for OpenClaw
25121
+ 0.2.3 or later only, you can instead pre-set both private lanes by merging the
25122
+ \`privateLearningEgressApprovals\` object from "Highly Recommended: approve
25123
+ private submissions" into \`plugins.entries.remembrance.config\`. Earlier
25124
+ versions reject that key and the Gateway then refuses to start, so check the
25125
+ installed version first and keep allow-always on older or mixed-version
25126
+ fleets. Then verify cold config, the active Gateway plugin, and live MCP
25127
+ capabilities separately:
24601
25128
 
24602
25129
  ~~~bash
24603
25130
  openclaw plugins inspect remembrance --runtime --json
@@ -24632,18 +25159,27 @@ approved secret source, not in \`policy.jsonc\`. After the probes, run
24632
25159
 
24633
25160
  For local agents, publish Remembrance in the team marketplace and choose
24634
25161
  \`Required\` or \`Default On\`. For cloud agents, also register the exact
24635
- Remembrance endpoint under **Dashboard > Integrations & MCP** so the same Team
24636
- MCP is distributed across cloud agents, the Agents window, IDE, and CLI. Add
24637
- \`remembrance.dev\` to the enterprise sandbox network allowlist for command-
24638
- based fallback paths.
25162
+ Remembrance endpoint as a Team MCP server under **Dashboard > Plugins & MCPs**
25163
+ so the same Team MCP is distributed across cloud agents, the Agents window,
25164
+ IDE, and CLI. Add \`remembrance.dev\` to the enterprise sandbox network
25165
+ allowlist for command-based fallback paths.
24639
25166
 
24640
- Cursor's current public enterprise documentation does not define a managed
24641
- per-MCP-tool allowlist equivalent to Codex, Claude Code, Gemini CLI, or
24642
- OpenClaw. Keep Cursor's normal tool approvals enabled and do not claim an
24643
- undocumented control exists. Run \`run_connection_doctor\` and require
24644
- organization scope on every enabled surface, then verify query, invocation,
24645
- feedback, and private-contribution receipts; local plugin hooks and cloud-agent
24646
- hooks can differ. See the official
25167
+ Cursor's managed per-tool allowlist is \`~/.cursor/permissions.json\`,
25168
+ distributed through MDM: ship the five \`mcpAllowlist\` entries from "Highly
25169
+ Recommended: approve private submissions", the four private submit and retry
25170
+ tools and the local-only \`capture_learning\`. A distributed file replaces each
25171
+ user's file and its in-app MCP allowlist, so merge these entries with every
25172
+ other entry and key the organization relies on, such as \`terminalAllowlist\`,
25173
+ \`approvalMode\`, and \`autoReview\`. A team Run Mode configuration overrides
25174
+ local \`permissions.json\` files, and the per-server tools field under
25175
+ **Team Settings > MCP Configuration** limits which tools may run but does not
25176
+ run them without asking. Keep the Auto-review or Allowlist Run Mode rather
25177
+ than Run Everything. Run \`run_connection_doctor\` and
25178
+ require organization scope on every enabled surface, then verify query,
25179
+ invocation, feedback, and private-contribution receipts; local plugin hooks and
25180
+ cloud-agent hooks can differ. See the official
25181
+ [permissions file](https://cursor.com/docs/reference/permissions),
25182
+ [Run Modes](https://cursor.com/docs/agent/security/run-modes),
24647
25183
  [team plugin modes](https://cursor.com/changelog/05-01-26),
24648
25184
  [Team MCP distribution](https://cursor.com/changelog/team-marketplace-updates),
24649
25185
  [sandbox network controls](https://cursor.com/changelog/2-5), and
@@ -24653,12 +25189,15 @@ hooks can differ. See the official
24653
25189
 
24654
25190
  Register exactly \`https://remembrance.dev/api/mcp\` or the exact local
24655
25191
  \`npx @remembrance-ai/mcp-server\` command. Use the recommended organization
24656
- tool list above when the client supports tool filtering. Keep normal approval
24657
- behavior for non-read-only calls unless unattended organization-private
24658
- contribution is explicitly approved. A client with no server/tool policy must
24659
- use its existing destination control or the zero-network handoff. Supply the
25192
+ tool list above when the client supports tool filtering. Supply the
24660
25193
  organization key through the client's secret/header mechanism, then run
24661
25194
  \`run_connection_doctor\` and require organization scope before private writes.
25195
+ Keep normal approval behavior for other non-read-only calls, and persist
25196
+ approval only for the four private submit and retry tools (on hosted MCP, the
25197
+ lesson submit), plus the local-only \`capture_learning\` on a local server that
25198
+ asks before it, as in the Highly Recommended step. A client with no
25199
+ server/tool policy must use its existing destination control or the
25200
+ zero-network handoff.
24662
25201
 
24663
25202
  If any host still denies the export, that denial remains authoritative. The
24664
25203
  portable local handoff and dashboard import work identically for Codex, Claude
@@ -24768,6 +25307,13 @@ not inherit shell exports:
24768
25307
  }
24769
25308
  ~~~
24770
25309
 
25310
+ A server you register yourself under the name \`remembrance\`, local or hosted,
25311
+ takes the standalone approval forms from "Highly Recommended: approve private
25312
+ submissions": \`[mcp_servers.remembrance.tools.<tool>]\` tables in Codex,
25313
+ \`mcp__remembrance__<tool>\` rules in Claude Code (for example after
25314
+ \`claude mcp add\`), and \`remembrance:<tool>\` entries in Cursor. A hosted server
25315
+ needs only \`submit_private_lesson_candidate\`.
25316
+
24771
25317
  ## Skill-only install
24772
25318
 
24773
25319
  For skills.sh-compatible runtimes (or any Agent Skills provider) that can load
@@ -24850,14 +25396,20 @@ session skills.
24850
25396
  \`capture_learning.lesson\` followed by the exact returned action and a
24851
25397
  private draft receipt. On hosted/legacy MCP, require a \`failure_report\`
24852
25398
  through submit_remembrance. This validates both capability states without
24853
- mixing their schemas.
25399
+ mixing their schemas. With an organization key and the Highly Recommended
25400
+ approval in place, neither the capture nor the private submission may
25401
+ prompt. A prompt for a submit or retry tool means its approval is missing or
25402
+ uses the wrong tool names; one for \`capture_learning\` means only that its
25403
+ local-only entry is missing, and is expected where the organization leaves
25404
+ the capture to Auto-review or a person, as managed Codex may.
24854
25405
  12. If using an org key, list and invoke an org-only skill or private overlay
24855
25406
  that should not appear anonymously.
24856
25407
  13. With an organization submission key, submit one disposable redacted skill.
24857
25408
  Current local MCP must use \`capture_learning.private_skill\` followed by
24858
25409
  submit_private_skill_candidate; hosted/legacy MCP must use
24859
25410
  propose_private_skill. Verify it appears only in that organization's review
24860
- queue. In a separate negative scenario, simulate a
25411
+ queue and, on local MCP with the approval in place, that it needed no host
25412
+ prompt. In a separate negative scenario, simulate a
24861
25413
  host-policy denial and verify the plugin reports the fixed content-free alert
24862
25414
  once, persists no blocked content, performs no retry, and creates no handoff.
24863
25415
  Test queue_private_skill_import only as a separate administrator-requested
@@ -24917,6 +25469,27 @@ session skills.
24917
25469
  --probe", and restart OpenClaw after plugin install/config changes.
24918
25470
  - "Claude desktop ignores env vars": put env in the user-scoped Claude settings
24919
25471
  that the desktop app reads, then fully quit and relaunch.
25472
+ - "Every private submission asks for approval" or "a headless run denies
25473
+ private submissions": report the blocked submission once as not submitted.
25474
+ Then ask the user (for managed settings, the administrator) to apply or fix
25475
+ the Highly Recommended approval; never change host settings or answer the
25476
+ host's approval yourself, and only after they confirm, send the retained
25477
+ draft through its exact submit or retry action.
25478
+ \`inspect_private_learning_outbox\` lists each draft with its \`state\`,
25479
+ \`attempts\`, and \`next_retry_at\`: a draft the host stopped before sending,
25480
+ a lesson still \`awaiting_authorization\` with 0 attempts or a skill still
25481
+ \`ready\`, needs its submit action, and a \`retry_scheduled\` draft its retry
25482
+ action once \`next_retry_at\` has passed. A prompt or denial naming a
25483
+ submit or retry tool means its approval is missing or names the wrong tools:
25484
+ a Claude Code plugin install needs
25485
+ \`mcp__plugin_remembrance_remembrance__<tool>\` rules, not
25486
+ \`mcp__remembrance__<tool>\`. One naming \`capture_learning\` means only that
25487
+ its local-only entry is missing, and is expected where the organization
25488
+ leaves the capture to Auto-review or a person, as managed Codex may: under
25489
+ managed Codex \`writes\`, approving \`capture_learning\` is an optional
25490
+ administrator decision (with it, Auto-review never sees the lesson content),
25491
+ not a fix to ask for. \`run_connection_doctor\` cannot see a persisted
25492
+ approval.
24920
25493
  - "Host policy denied private repository export": this is not a Remembrance
24921
25494
  API failure. An administrator must narrowly approve the Remembrance MCP
24922
25495
  server, destination, and private contribution action. Otherwise use the
@@ -27613,7 +28186,8 @@ var pendingActionDeclineSchema = external_exports.object({
27613
28186
  "not_observed_by_this_agent",
27614
28187
  "agent_exited",
27615
28188
  "not_reusable",
27616
- "duplicate"
28189
+ "duplicate",
28190
+ "host_policy_denied"
27617
28191
  ]).describe("Why this agent cannot complete the action.")
27618
28192
  }).strict();
27619
28193
  var pendingActionPayloadSchema = external_exports.object({
@@ -27748,7 +28322,7 @@ var declaredToolDefinitions = [
27748
28322
  ),
27749
28323
  localTool(
27750
28324
  "decline_pending_action",
27751
- "Decline one pending Remembrance action that a hook reminder listed and you cannot complete. Pass the action_id shown under it and one reason: not_observed_by_this_agent (you never received the result or payload it refers to), agent_exited (the subagent that earned it has exited), not_reusable (it holds nothing reusable), or duplicate (it was already completed another way). It is local-only: it sends nothing, stores nothing, grants no approval, and never counts as feedback. The local completion hook closes that action in your own pending list when it observes this call.",
28325
+ "Decline one pending Remembrance action that a hook reminder listed and you cannot complete. Pass the action_id shown under it and one reason: not_observed_by_this_agent (you never received the result or payload it refers to), agent_exited (the subagent that earned it has exited), not_reusable (it holds nothing reusable), or duplicate (it was already completed another way); host_policy_denied only for a private-learning line or notice whose exact action the host denied. It is local-only: it sends nothing, stores nothing, grants no approval, and never counts as feedback. The local completion hook closes that action in your own pending list when it observes this call; a declined private draft stays retained and returns later only as a user decision.",
27752
28326
  "decline_pending_action",
27753
28327
  pendingActionDeclineSchema
27754
28328
  ),
@@ -28044,6 +28618,13 @@ var categoricalSubmitFeedbackMaxSerializedBytes = boundedWritePayloadCeilingWith
28044
28618
  categoricalSubmitFeedbackInputSchema[BOUNDED_JSON_BYTES_EXTENSION] = categoricalSubmitFeedbackMaxSerializedBytes;
28045
28619
  var categoricalSubmitFeedbackRuntime = freezeToolRuntime({
28046
28620
  ...canonicalSubmitFeedbackRuntime.definition,
28621
+ description: `${canonicalSubmitFeedbackRuntime.definition.description} Routine organization feedback needs only the skill identity, categorical rating, and Remembrance-issued correlation IDs. Do not automatically attach internal artifact hashes or task prose; include optional richer evidence only when the current task authorizes it.`,
28622
+ // This profile exists only for a configured organization's private feedback.
28623
+ // It remains a networked write; only the public/legacy profile is open-world.
28624
+ annotations: {
28625
+ ...canonicalSubmitFeedbackRuntime.definition.annotations,
28626
+ openWorldHint: false
28627
+ },
28047
28628
  schemaProfile: toolSchemaProfileId(
28048
28629
  "submit_feedback",
28049
28630
  "input",
@@ -28436,18 +29017,32 @@ function inputSchemaFor(schema, name, maxSerializedBytes) {
28436
29017
  const resolved = definitions?.[name] ?? converted;
28437
29018
  normalizeBoundedWriteJsonSchema(resolved, name);
28438
29019
  if (name === "acknowledge_feedback_denial") {
29020
+ const properties = resolved.properties;
28439
29021
  return {
28440
29022
  type: "object",
28441
- properties: resolved.properties,
29023
+ properties,
28442
29024
  additionalProperties: false,
28443
29025
  oneOf: [
28444
29026
  {
28445
- properties: { tool: { const: "submit_query_feedback" } },
29027
+ type: "object",
29028
+ properties: {
29029
+ tool: { const: "submit_query_feedback" },
29030
+ query_id: properties.query_id,
29031
+ reason: properties.reason
29032
+ },
29033
+ additionalProperties: false,
28446
29034
  required: ["tool", "query_id", "reason"],
28447
29035
  not: { required: ["result_id"] }
28448
29036
  },
28449
29037
  {
28450
- properties: { tool: { const: "submit_feedback" } },
29038
+ type: "object",
29039
+ properties: {
29040
+ tool: { const: "submit_feedback" },
29041
+ query_id: properties.query_id,
29042
+ result_id: properties.result_id,
29043
+ reason: properties.reason
29044
+ },
29045
+ additionalProperties: false,
28451
29046
  required: ["tool", "query_id", "result_id", "reason"]
28452
29047
  }
28453
29048
  ]
@@ -42778,27 +43373,27 @@ var require_stringifyString = __commonJS({
42778
43373
  return true;
42779
43374
  }
42780
43375
  function doubleQuotedString(value, ctx) {
42781
- const json = JSON.stringify(value);
43376
+ const json2 = JSON.stringify(value);
42782
43377
  if (ctx.options.doubleQuotedAsJSON)
42783
- return json;
43378
+ return json2;
42784
43379
  const { implicitKey } = ctx;
42785
43380
  const minMultiLineLength = ctx.options.doubleQuotedMinMultiLineLength;
42786
43381
  const indent = ctx.indent || (containsDocumentMarker(value) ? " " : "");
42787
43382
  let str = "";
42788
43383
  let start = 0;
42789
- for (let i = 0, ch = json[i]; ch; ch = json[++i]) {
42790
- if (ch === " " && json[i + 1] === "\\" && json[i + 2] === "n") {
42791
- str += json.slice(start, i) + "\\ ";
43384
+ for (let i = 0, ch = json2[i]; ch; ch = json2[++i]) {
43385
+ if (ch === " " && json2[i + 1] === "\\" && json2[i + 2] === "n") {
43386
+ str += json2.slice(start, i) + "\\ ";
42792
43387
  i += 1;
42793
43388
  start = i;
42794
43389
  ch = "\\";
42795
43390
  }
42796
43391
  if (ch === "\\")
42797
- switch (json[i + 1]) {
43392
+ switch (json2[i + 1]) {
42798
43393
  case "u":
42799
43394
  {
42800
- str += json.slice(start, i);
42801
- const code = json.substr(i + 2, 4);
43395
+ str += json2.slice(start, i);
43396
+ const code = json2.substr(i + 2, 4);
42802
43397
  switch (code) {
42803
43398
  case "0000":
42804
43399
  str += "\\0";
@@ -42828,23 +43423,23 @@ var require_stringifyString = __commonJS({
42828
43423
  if (code.substr(0, 2) === "00")
42829
43424
  str += "\\x" + code.substr(2);
42830
43425
  else
42831
- str += json.substr(i, 6);
43426
+ str += json2.substr(i, 6);
42832
43427
  }
42833
43428
  i += 5;
42834
43429
  start = i + 1;
42835
43430
  }
42836
43431
  break;
42837
43432
  case "n":
42838
- if (implicitKey || json[i + 2] === '"' || json.length < minMultiLineLength) {
43433
+ if (implicitKey || json2[i + 2] === '"' || json2.length < minMultiLineLength) {
42839
43434
  i += 1;
42840
43435
  } else {
42841
- str += json.slice(start, i) + "\n\n";
42842
- while (json[i + 2] === "\\" && json[i + 3] === "n" && json[i + 4] !== '"') {
43436
+ str += json2.slice(start, i) + "\n\n";
43437
+ while (json2[i + 2] === "\\" && json2[i + 3] === "n" && json2[i + 4] !== '"') {
42843
43438
  str += "\n";
42844
43439
  i += 2;
42845
43440
  }
42846
43441
  str += indent;
42847
- if (json[i + 2] === " ")
43442
+ if (json2[i + 2] === " ")
42848
43443
  str += "\\";
42849
43444
  i += 1;
42850
43445
  start = i + 1;
@@ -42854,7 +43449,7 @@ var require_stringifyString = __commonJS({
42854
43449
  i += 1;
42855
43450
  }
42856
43451
  }
42857
- str = start ? str + json.slice(start) : json;
43452
+ str = start ? str + json2.slice(start) : json2;
42858
43453
  return implicitKey ? str : foldFlowLines.foldFlowLines(str, indent, foldFlowLines.FOLD_QUOTED, getFoldOptions(ctx, false));
42859
43454
  }
42860
43455
  function singleQuotedString(value, ctx) {
@@ -45212,11 +45807,11 @@ var require_Document = __commonJS({
45212
45807
  throw new Error(`With a null YAML version, the { schema: Schema } option is required`);
45213
45808
  }
45214
45809
  // json & jsonArg are only used from toJSON()
45215
- toJS({ json, jsonArg, mapAsMap, maxAliasCount, onAnchor, reviver } = {}) {
45810
+ toJS({ json: json2, jsonArg, mapAsMap, maxAliasCount, onAnchor, reviver } = {}) {
45216
45811
  const ctx = {
45217
45812
  anchors: /* @__PURE__ */ new Map(),
45218
45813
  doc: this,
45219
- keep: !json,
45814
+ keep: !json2,
45220
45815
  mapAsMap: mapAsMap === true,
45221
45816
  mapKeyWarned: false,
45222
45817
  maxAliasCount: typeof maxAliasCount === "number" ? maxAliasCount : 100
@@ -67273,8 +67868,8 @@ function inspectPrivateLearningOutbox2(input, dependencies = {}) {
67273
67868
  }
67274
67869
  var MAX_REMOTE_RESPONSE_BYTES = 4 * 1024 * 1024;
67275
67870
  var DOCTOR_PROBE_TIMEOUT_MS = 7500;
67276
- var SERVER_VERSION = true ? "0.2.1" : "0.0.0-dev";
67277
- var tools = toolDefinitions;
67871
+ var SERVER_VERSION = true ? "0.2.3" : "0.0.0-dev";
67872
+ var tools2 = toolDefinitions;
67278
67873
  var doctorCliRequested = process.argv[2] === "doctor";
67279
67874
  var nativeContextCliRequested = process.argv[2] === "--native-context";
67280
67875
  function legacyBroadWritesEnabled(env = process.env) {
@@ -71117,7 +71712,7 @@ function boundedLocalProfileField(value) {
71117
71712
  return normalized2 ? normalized2.slice(0, 512) : null;
71118
71713
  }
71119
71714
  function mustFindTool(name) {
71120
- const tool = tools.find((item) => item.name === name);
71715
+ const tool = tools2.find((item) => item.name === name);
71121
71716
  if (!tool) {
71122
71717
  throw new Error(`Missing internal tool definition: ${name}`);
71123
71718
  }