Sign In

goodmemory

Package Overview
Dependencies
Maintainers
1
Versions
19
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

goodmemory - npm Package Compare versions

Comparing version
0.7.1
to
0.7.2
+2
dist/bin/chunk-0dnmpnqg.js
import{readFileSync as W}from"node:fs";var X=new URL("../../package.json",import.meta.url),Q;function Y(){if(Q)return Q;let z=JSON.parse(W(X,"utf8")),x=z.goodmemoryRelease;if(typeof z.version!=="string"||z.version.length===0||typeof x?.installCommandsApplyAfterPublish!=="boolean"||typeof x.npmDistTag!=="string"||x.npmDistTag.length===0||x.status!=="release-candidate"&&x.status!=="stable")throw Error("Unable to read GoodMemory package release metadata.");return Q={goodmemoryRelease:{installCommandsApplyAfterPublish:x.installCommandsApplyAfterPublish,npmDistTag:x.npmDistTag,status:x.status},version:z.version},Q}var q="https://github.com/hjqcan/GoodMemory",V="https://goodmemory.vibenest.net";function $(z={}){let x=z.packageMetadata??Y(),I=z.version??x.version;return{schemaVersion:"goodmemory.capability/v2",name:"goodmemory",version:I,kind:"memory-layer",summary:"Durable user/project memory layer for chat apps, copilots, and coding agents.",description:"GoodMemory is the product memory layer between an app or installed agent host and the model runtime: write selected facts, recall the right context, inject it into the next turn, audit what happened, and delete it when it is wrong.",notA:["llm","agent-framework","vector-database","rag-system"],license:"MIT",homepage:`${q}#readme`,repository:q,documentation:{inspector:`${q}/blob/main/docs/GoodMemory-Inspector-and-Admin-API.md`,llmsTxt:`${q}/blob/main/llms.txt`,readme:`${q}#readme`,quickstart:`${q}#quickstart-codex-or-claude-code-memory`},install:{npmGlobal:`npm install -g goodmemory@${I}`,npmPackage:`npm install goodmemory@${I}`,bun:`bun add goodmemory@${I}`},releaseStatus:{...x.goodmemoryRelease,tarball:`goodmemory-${I}.tgz`},memoryApi:["remember","recall","buildContext","feedback","forget","exportMemory","deleteAllMemory"],onboarding:[{audience:"installed-coding-agent-host",when:"You are, or run inside, Claude Code or Codex.",method:"cli",steps:[`npm install -g goodmemory@${I}`,"goodmemory setup","goodmemory status"],autoDetect:"goodmemory adopt",docs:`${q}#quickstart-codex-or-claude-code-memory`},{audience:"kimi-code-plugin",when:"You run Kimi Code and want local, scoped cross-session project memory.",method:"plugin",install:`/plugins install ${q}`,runtimeRequirements:["Node.js >=20","Bun >=1.3.14","npx"],writeBoundary:"goodmemory_remember is exposed at install; Kimi Code approval still governs each unapproved MCP call",docs:`${q}/blob/main/docs/GoodMemory-Kimi-Code-Setup-Guide.md`},{audience:"mcp-client",when:"You speak the Model Context Protocol (Cursor, Windsurf, Cline, Claude Desktop, Gemini CLI, OpenCode, or a custom MCP client).",method:"mcp",mcpServer:{command:"goodmemory-mcp",args:["--standalone","--user-id","YOUR_USER_ID"]},autoDetect:"goodmemory adopt",docs:`${q}#standalone-mcp-for-any-client`},{audience:"framework-agent-or-backend",when:"You are a framework agent (LangGraph, custom loop) or a backend that calls memory as an HTTP service.",method:"http",endpoint:V,selfHost:"goodmemory-http-bridge --recommended OR GOODMEMORY_PROFILE=agent-recommended goodmemory-http-bridge",pythonClient:"pip install goodmemory-client",docs:`${q}#pythonfastapi-http-bridge`}],mcp:{command:"goodmemory-mcp",standaloneArgs:["--standalone","--user-id","YOUR_USER_ID"],primaryTools:["goodmemory_get_context","goodmemory_remember"],readOnlyToolCount:8,writeTool:"goodmemory_remember (opt-in via --allow-write)",registryName:"io.github.hjqcan/goodmemory",docs:`${q}#standalone-mcp-for-any-client`},http:{hosted:V,liveness:`${V}/healthz`,wellKnown:`${V}/.well-known/goodmemory.json`,auth:"bearer-token",selfHost:"goodmemory-http-bridge --recommended OR GOODMEMORY_PROFILE=agent-recommended goodmemory-http-bridge",endpoints:{recall:"POST /memory/recall-context",remember:"POST /memory/remember",feedback:"POST /memory/feedback",export:"POST /memory/export",forget:"POST /memory/forget",revise:"POST /memory/revise"},pythonClient:"goodmemory-client (PyPI)",docs:`${q}#pythonfastapi-http-bridge`},benchmarks:{currentClaims:[],historicalEvidence:{url:`${q}/tree/main/benchmark-claims`,note:`The v0.6.0 LoCoMo, BEAM, and MemoryAgentBench results, plus older LongMemEval and ImplicitMemBench runs, remain reproducible versioned evidence. None is a current ${I} production claim until rerun against this package line. LongMemEval and ImplicitMemBench remain internal evidence.`}},capabilities:{localFirst:!0,embeddingFreeDefault:!0,builtInLanguagePacks:["en","zh-Hans","zh-Hant","ja","ko","fr","es"],durableStore:"sqlite (default), postgres (opt-in)",audit:!0,deletion:!0,localInspector:"goodmemory inspector serve (loopback-only React console and /admin/v1 API)",correctByDefaultRecall:"Recall never silently degrades: a downgraded strategy carries routing.warnings (semantic_recall_inactive) and routing.warningMessages (semantic recall inactive — set strategy:hybrid + RETRIEVAL_PRESET) instead of quietly returning the lexical floor."},canonicalSources:{prose:`${q}#readme`,benchmarks:`${q}/tree/main/benchmark-claims`,note:"Benchmark entries keep explicit measuredPackageVersion provenance; a package version bump never relabels historical results. Source declarations remain in benchmark-claims/*.json."}}}
export{$ as a};

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

# GoodMemory Kimi Code Setup Guide
GoodMemory adds local-first, auditable cross-session project memory to Kimi
Code through a Kimi plugin and a local MCP server. Recall is on demand. The
plugin exposes the governed write tool at install time, but Kimi Code approval
still controls each unapproved MCP call.
## Requirements
- Kimi Code with plugin support.
- Node.js 20 or newer, with `npx` on `PATH`.
- Bun 1.3.14 or newer on `PATH`.
- macOS or Linux for the verified v0.7.2 support boundary. Windows remains
unverified until a clean-machine smoke is recorded.
Check the additional runtime before installing:
```bash
node --version
npx --version
bun --version
```
Kimi Code itself can be installed as a standalone binary without Node.js.
GoodMemory's current MCP launcher is Bun-backed, so the plugin still needs both
Node.js and Bun.
## Install
Start Kimi Code in a project and run:
```text
/plugins install https://github.com/hjqcan/GoodMemory
```
The GitHub source is classified as a third-party plugin. Review the source and
confirm the trust prompt; third-party installation defaults to cancel. Then
activate the managed copy with either:
```text
/reload
```
or start a clean session with `/new`.
Kimi Code installs plugins at user-level, so the plugin is available in all
projects for that OS user. GoodMemory still derives a separate workspace scope
from the current project absolute path supplied to every tool call.
## Verify
Run:
```text
/plugins info goodmemory
/mcp
/goodmemory:status
```
The `goodmemory` MCP server should be connected and expose eight read-only
tools plus `goodmemory_remember`. A missing Bun error should tell you to install
Bun or set `GOODMEMORY_BUN_BINARY`; it is not evidence that the memory store is
empty.
## Use
```text
/goodmemory:remember Use PostgreSQL for production storage.
/goodmemory:recall What storage decision did we make?
/goodmemory:trace What storage decision did we make?
```
`/goodmemory:remember` sends one user-originated statement to the write tool.
The tool is registered automatically by the plugin, but no permanent allow rule
is installed. Kimi Code requests approval when its permission rules do not
already cover the call. Do not use a broad `mcp__*` allow rule merely to remove
that approval boundary.
The session-start Skill does not execute code and does not silently read or
write memory. It teaches Kimi when an on-demand recall is useful and when a
durable write is appropriate.
## Correct or Delete Memory
The initial Kimi plugin intentionally does not invent a `/goodmemory:forget`
command because the standalone MCP surface has no forget tool. Use the
GoodMemory Inspector or CLI administration flows described in
`GoodMemory-Inspector-and-Admin-API.md` to inspect, revise, export, or delete
incorrect memory.
## Upgrade or Remove
Repeat the GitHub installation command to install the latest GoodMemory
release, then run `/reload` or `/new`. Inspect the selected version with
`/plugins info goodmemory`.
Remove the plugin with:
```text
/plugins remove goodmemory
```
Kimi Code asks for confirmation. Removing the plugin does not automatically
delete GoodMemory's local SQLite data; use the Inspector or CLI when data
deletion is intended.
+20
-7
{
"schemaVersion": "goodmemory.capability/v2",
"name": "goodmemory",
"version": "0.7.1",
"version": "0.7.2",
"kind": "memory-layer",

@@ -24,5 +24,5 @@ "summary": "Durable user/project memory layer for chat apps, copilots, and coding agents.",

"install": {
"npmGlobal": "npm install -g goodmemory@0.7.1",
"npmPackage": "npm install goodmemory@0.7.1",
"bun": "bun add goodmemory@0.7.1"
"npmGlobal": "npm install -g goodmemory@0.7.2",
"npmPackage": "npm install goodmemory@0.7.2",
"bun": "bun add goodmemory@0.7.2"
},

@@ -33,3 +33,3 @@ "releaseStatus": {

"status": "stable",
"tarball": "goodmemory-0.7.1.tgz"
"tarball": "goodmemory-0.7.2.tgz"
},

@@ -51,3 +51,3 @@ "memoryApi": [

"steps": [
"npm install -g goodmemory@0.7.1",
"npm install -g goodmemory@0.7.2",
"goodmemory setup",

@@ -60,2 +60,15 @@ "goodmemory status"

{
"audience": "kimi-code-plugin",
"when": "You run Kimi Code and want local, scoped cross-session project memory.",
"method": "plugin",
"install": "/plugins install https://github.com/hjqcan/GoodMemory",
"runtimeRequirements": [
"Node.js >=20",
"Bun >=1.3.14",
"npx"
],
"writeBoundary": "goodmemory_remember is exposed at install; Kimi Code approval still governs each unapproved MCP call",
"docs": "https://github.com/hjqcan/GoodMemory/blob/main/docs/GoodMemory-Kimi-Code-Setup-Guide.md"
},
{
"audience": "mcp-client",

@@ -122,3 +135,3 @@ "when": "You speak the Model Context Protocol (Cursor, Windsurf, Cline, Claude Desktop, Gemini CLI, OpenCode, or a custom MCP client).",

"url": "https://github.com/hjqcan/GoodMemory/tree/main/benchmark-claims",
"note": "The v0.6.0 LoCoMo, BEAM, and MemoryAgentBench results, plus older LongMemEval and ImplicitMemBench runs, remain reproducible versioned evidence. None is a current 0.7.1 production claim until rerun against this package line. LongMemEval and ImplicitMemBench remain internal evidence."
"note": "The v0.6.0 LoCoMo, BEAM, and MemoryAgentBench results, plus older LongMemEval and ImplicitMemBench runs, remain reproducible versioned evidence. None is a current 0.7.2 production claim until rerun against this package line. LongMemEval and ImplicitMemBench remain internal evidence."
}

@@ -125,0 +138,0 @@ },

@@ -13,3 +13,6 @@ export interface GoodMemoryPackageReleaseMetadata {

readonly when: string;
readonly method: "cli" | "mcp" | "http";
readonly method: "cli" | "mcp" | "http" | "plugin";
readonly install?: string;
readonly runtimeRequirements?: readonly string[];
readonly writeBoundary?: string;
readonly steps?: readonly string[];

@@ -16,0 +19,0 @@ readonly mcpServer?: {

@@ -9,2 +9,4 @@ import type { RetrievalStrategyRolloutConfig } from "../governance/retrievalInternalRollout";

behavioralOutcomeRecorder?: boolean;
/** Repo-only fixed-budget recall-pass coverage experiment. */
distinctRecallPassHeadProtection?: boolean;
environment?: Record<string, string | undefined>;

@@ -11,0 +13,0 @@ /** Repo-only instance selector override for historical evaluation profiles. */

#!/usr/bin/env bun
import{a as d}from"./chunk-c8pcftxd.js";import{Ja as w,La as T,ta as P,ua as y,va as c}from"./chunk-xa0pw257.js";import"./chunk-jmsnz9jn.js";import{resolve as y$}from"node:path";import{fileURLToPath as c$}from"node:url";var G="phase-39.http-memory.v1",_$=new Set(["export","forget","revise"]);function _($){return Boolean($)&&typeof $==="object"&&!Array.isArray($)}function W($){return typeof $==="string"&&$.trim().length>0}function K($,X){let Z=$[X];if(Z===void 0)return;return W(Z)?Z.trim():void 0}function D$($){if(!_($)||!W($.userId))return{code:"invalid_scope",message:"Expected scope.userId and optional string tenant/workspace/agent/session fields.",ok:!1};for(let j of["tenantId","workspaceId","agentId","sessionId"])if($[j]!==void 0&&!W($[j]))return{code:"invalid_scope",message:"Expected scope.userId and optional string tenant/workspace/agent/session fields.",ok:!1};let X={userId:$.userId.trim()},Z=K($,"tenantId"),U=K($,"workspaceId"),Q=K($,"agentId"),Y=K($,"sessionId");if(Z)X.tenantId=Z;if(U)X.workspaceId=U;if(Q)X.agentId=Q;if(Y)X.sessionId=Y;return{ok:!0,value:X}}function G$($){if(!Array.isArray($)||$.length===0)return{code:"invalid_messages",message:"Expected messages to be a non-empty array.",ok:!1};let X=[];for(let Z of $){if(!_(Z)||!W(Z.role)||!W(Z.content))return{code:"invalid_messages",message:"Expected every message to include role and content string fields.",ok:!1};X.push({content:Z.content,role:Z.role})}return{ok:!0,value:X}}function h($){return $===null||typeof $==="string"||typeof $==="number"||typeof $==="boolean"}function L$($){return $==="profile"||$==="preference"||$==="reference"||$==="fact"||$==="feedback"}function B$($){return $==="always"||$==="never"||$==="auto"}function x($){return $==="blocker"||$==="open_loop"||$==="role_update"||$==="focus_update"||$==="project_state"||$==="generic_project"}function f($){return $==="identity"||$==="project"||$==="runtime"||$==="reference"||$==="preference"}function b($){return $==="do"||$==="dont"||$==="prefer"||$==="validated_pattern"}function g($){return $==="name"||$==="role"||$==="organization"||$==="location"||$==="timezone"||$==="languagePreference"||$==="currentProject"}function m($){return $==="source_of_truth"||$==="runbook"||$==="doc"||$==="dashboard"||$==="tracker"}function M$($){if($===void 0)return{ok:!0,value:void 0};if(!_($))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch to be an object when provided.",ok:!1};for(let Z of["category","factKind","scopeKind","subject","feedbackKind","appliesTo","profileField","preferenceCategory","preferenceValue","referenceKind","referenceTitle","referencePointer","supersedesPointer"])if($[Z]!==void 0&&!W($[Z]))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch string fields to be non-empty strings.",ok:!1};if($.factKind!==void 0&&!x($.factKind))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.factKind to be a supported fact kind.",ok:!1};if($.scopeKind!==void 0&&!f($.scopeKind))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.scopeKind to be a supported scope kind.",ok:!1};if($.feedbackKind!==void 0&&!b($.feedbackKind))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.feedbackKind to be a supported feedback kind.",ok:!1};if($.profileField!==void 0&&!g($.profileField))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.profileField to be a supported profile field.",ok:!1};if($.referenceKind!==void 0&&!m($.referenceKind))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.referenceKind to be a supported reference kind.",ok:!1};if($.tags!==void 0&&(!Array.isArray($.tags)||!$.tags.every(W)))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.tags to be an array of non-empty strings.",ok:!1};if($.attributes!==void 0){if(!_($.attributes))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.attributes to be an object.",ok:!1};for(let Z of Object.values($.attributes))if(!h(Z))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.attributes values to be string, number, boolean, or null.",ok:!1}}let X=_($.attributes)?Object.fromEntries(Object.entries($.attributes).filter((Z)=>h(Z[1]))):void 0;return{ok:!0,value:{...W($.category)?{category:$.category}:{},...x($.factKind)?{factKind:$.factKind}:{},...f($.scopeKind)?{scopeKind:$.scopeKind}:{},...W($.subject)?{subject:$.subject}:{},...Array.isArray($.tags)?{tags:[...$.tags]}:{},...X!==void 0?{attributes:X}:{},...b($.feedbackKind)?{feedbackKind:$.feedbackKind}:{},...W($.appliesTo)?{appliesTo:$.appliesTo}:{},...g($.profileField)?{profileField:$.profileField}:{},...W($.preferenceCategory)?{preferenceCategory:$.preferenceCategory}:{},...W($.preferenceValue)?{preferenceValue:$.preferenceValue}:{},...m($.referenceKind)?{referenceKind:$.referenceKind}:{},...W($.referenceTitle)?{referenceTitle:$.referenceTitle}:{},...W($.referencePointer)?{referencePointer:$.referencePointer}:{},...W($.supersedesPointer)?{supersedesPointer:$.supersedesPointer}:{}}}}function z$($){if($===void 0)return{ok:!0,value:void 0};if(!Array.isArray($))return{code:"invalid_annotations",message:"Expected annotations to be an array when provided.",ok:!1};let X=[];for(let Z of $){if(!_(Z))return{code:"invalid_annotations",message:"Expected every annotation to be an object.",ok:!1};let U=Z.messageIndex;if(typeof U!=="number"||!Number.isInteger(U))return{code:"invalid_annotations",message:"Expected every annotation to include integer messageIndex.",ok:!1};if(U<0)return{code:"invalid_annotations",message:"Expected annotation.messageIndex to be non-negative.",ok:!1};if(Z.remember!==void 0&&!B$(Z.remember))return{code:"invalid_annotations",message:"Expected annotation.remember to be always, never, or auto.",ok:!1};if(Z.kindHint!==void 0&&!L$(Z.kindHint))return{code:"invalid_annotations",message:"Expected annotation.kindHint to be profile, preference, reference, fact, or feedback.",ok:!1};if(Z.confirmed!==void 0&&typeof Z.confirmed!=="boolean")return{code:"invalid_annotations",message:"Expected annotation.confirmed to be a boolean when provided.",ok:!1};if(Z.verified!==void 0&&typeof Z.verified!=="boolean")return{code:"invalid_annotations",message:"Expected annotation.verified to be a boolean when provided.",ok:!1};if(Z.reason!==void 0&&!W(Z.reason))return{code:"invalid_annotations",message:"Expected annotation.reason to be a non-empty string when provided.",ok:!1};let Q=M$(Z.metadataPatch);if(!Q.ok)return Q;X.push({messageIndex:U,...Z.remember!==void 0?{remember:Z.remember}:{},...Z.kindHint!==void 0?{kindHint:Z.kindHint}:{},...Q.value!==void 0?{metadataPatch:Q.value}:{},...Z.confirmed!==void 0?{confirmed:Z.confirmed}:{},...Z.verified!==void 0?{verified:Z.verified}:{},...W(Z.reason)?{reason:Z.reason}:{}})}return{ok:!0,value:X}}function F$($){if($===void 0)return{ok:!0,value:void 0};if($==="coding_agent"||$==="general_chat")return{ok:!0,value:$};return{code:"invalid_retrieval_profile",message:"Expected retrievalProfile to be general_chat or coding_agent.",ok:!1}}function w$($){if($===void 0)return{ok:!0,value:void 0};if($==="auto"||$==="rules-only"||$==="hybrid")return{ok:!0,value:$};return{code:"invalid_recall_strategy",message:"Expected strategy to be auto, rules-only, or hybrid.",ok:!1}}function O$($){if($===void 0)return{ok:!0,value:"system_prompt_fragment"};if($==="json"||$==="markdown"||$==="system_prompt_fragment"||$==="developer_prompt_fragment")return{ok:!0,value:$};return{code:"invalid_context_output",message:"Expected output to be json, markdown, system_prompt_fragment, or developer_prompt_fragment.",ok:!1}}function K$($){if($===void 0)return{ok:!0,value:void 0};if($==="auto"||$==="rules-only"||$==="llm-assisted")return{ok:!0,value:$};return{code:"invalid_extraction_strategy",message:"Expected extractionStrategy to be auto, rules-only, or llm-assisted.",ok:!1}}function R($,X){if($===void 0&&!X)return{ok:!0,value:void 0};if(W($))return{ok:!0,value:$.trim()};return{code:"invalid_idempotency_key",message:"Expected a non-empty idempotencyKey string.",ok:!1}}function V$($){if($===void 0)return{ok:!0,value:void 0};if(!_($))return{code:"invalid_evidence",message:"Expected evidence to be an object when provided.",ok:!1};if($.source!=="user_message"&&$.source!=="manual_review"&&$.source!=="system")return{code:"invalid_evidence",message:"Expected evidence.source to be user_message, manual_review, or system.",ok:!1};return{ok:!0,value:{source:$.source,...W($.message)?{message:$.message}:{},...W($.excerpt)?{excerpt:$.excerpt}:{},...W($.sourceUri)?{sourceUri:$.sourceUri}:{},...Array.isArray($.sourceMessageIds)?{sourceMessageIds:$.sourceMessageIds.filter(W)}:{}}}}function T$($,X){return{error:{code:$,message:X},ok:!1}}function L($,X){return{body:X,statusCode:$}}function H($,X,Z){return L($,T$(X,Z))}async function P$($){try{let X=await $.json();if(!_(X))return{code:"invalid_json_body",message:"Expected a JSON object request body.",ok:!1};return{ok:!0,value:X}}catch{return{code:"invalid_json_body",message:"Expected a valid JSON object request body.",ok:!1}}}function R$($){let X=$.headers.get("x-goodmemory-user-id")?.trim();if(!X)return null;let U=$.headers.get("x-goodmemory-operations")?.split(",").map((Q)=>Q.trim()).filter(Boolean);return{authorizedOperations:U?.includes("*")?"*":U??[],tenantId:$.headers.get("x-goodmemory-tenant-id")?.trim()||void 0,userId:X,workspaceId:$.headers.get("x-goodmemory-workspace-id")?.trim()||void 0}}function C$($){if(!$.caller)return{authorized:!1,code:"caller_required",message:"The bridge requires a backend-resolved caller identity.",statusCode:401};if($.caller.userId!==$.scope.userId)return{authorized:!1,code:"scope_not_authorized",message:"Caller userId must match scope.userId.",statusCode:403};if($.caller.tenantId&&$.scope.tenantId!==$.caller.tenantId)return{authorized:!1,code:"scope_not_authorized",message:"Request scope.tenantId must be present and match the caller tenantId.",statusCode:403};if($.scope.tenantId&&!$.caller.tenantId)return{authorized:!1,code:"scope_not_authorized",message:"Caller must provide tenantId to authorize tenant-scoped memory.",statusCode:403};if($.caller.workspaceId&&$.scope.workspaceId!==$.caller.workspaceId)return{authorized:!1,code:"scope_not_authorized",message:"Request scope.workspaceId must be present and match the caller workspaceId.",statusCode:403};if($.scope.workspaceId&&!$.caller.workspaceId)return{authorized:!1,code:"scope_not_authorized",message:"Caller must provide workspaceId to authorize workspace-scoped memory.",statusCode:403};if($.sensitive&&$.caller.authorizedOperations!=="*"){if(!$.caller.authorizedOperations.includes($.operation))return{authorized:!1,code:"operation_not_authorized",message:"Caller is not authorized for this scoped memory operation.",statusCode:403}}return{authorized:!0}}function A$($){if(typeof $==="string")return $;return JSON.stringify($)}function M($,X){if(!X||X.content.trim().length===0)return;$.push(X)}function N$($){return Boolean($.profile||$.preferences.length>0||$.references.length>0||$.facts.length>0||$.feedback.length>0||$.archives.length>0||$.episodes.length>0||$.workingMemory||$.journal)}function v($,X=[]){let Z=$.metadata.routingDecision.strategyExplanation,U=new Set([...Z.warnings??[],...X]);if($.metadata.policyApplied?.includes("semantic_candidates_unavailable"))U.add(P);let Q=y({existingMessages:Z.warningMessages,warnings:[...U]});return{...Z.fallbackReason?{fallbackReason:Z.fallbackReason}:{},llmRefinement:Z.llmRefinement,requestedStrategy:Z.requestedStrategy,resolvedStrategy:Z.resolvedStrategy,semanticTieBreaking:Z.semanticTieBreaking,...Q.length>0?{warningMessages:Q}:{},...U.size>0?{warnings:[...U]}:{}}}function q$($){if($.requestedStrategy!=="auto"||$.runtimeInfo?.embeddingEnabled!==!0||$.runtimeInfo.retrievalPreset)return[];return($.recall.metadata.routingDecision.strategyExplanation.resolvedStrategy??$.recall.metadata.routingDecision.strategy)==="rules-only"?[P]:[]}function I$($){return{...v($.recall),fallbackReason:"provider_error",providerFallback:{reason:"provider_error",recoveredStrategy:"rules-only"},requestedStrategy:$.requestedStrategy,resolvedStrategy:"rules-only",semanticTieBreaking:!1}}function E$($){let X=[];if($.profile){let Z=[$.profile.identity.name,$.profile.identity.role,$.profile.identity.organization,...$.profile.activeContext.goals,...$.profile.activeContext.currentProjects].filter(W);M(X,{content:Z.join("; "),memoryId:`profile:${$.profile.userId}`,source:"goodmemory",type:"profile"})}for(let Z of $.preferences)M(X,{category:Z.category,confidence:Z.confidence,content:`${Z.category}: ${A$(Z.value)}`,memoryId:Z.id,source:"goodmemory",tags:Z.tags,type:"preference"});for(let Z of $.references)M(X,{category:Z.referenceKind,confidence:Z.confidence,content:Z.description?`${Z.title}: ${Z.pointer} - ${Z.description}`:`${Z.title}: ${Z.pointer}`,memoryId:Z.id,source:"goodmemory",tags:Z.tags,type:"reference"});for(let Z of $.facts)M(X,{category:Z.category,confidence:Z.confidence,content:Z.content,memoryId:Z.id,source:"goodmemory",tags:Z.tags,type:"fact"});for(let Z of $.feedback)M(X,{category:Z.kind,confidence:Z.confidence,content:Z.rule,memoryId:Z.id,source:"goodmemory",tags:Z.tags,type:"feedback"});for(let Z of $.episodes)M(X,{confidence:Z.confidence,content:Z.summary,memoryId:Z.id,source:"goodmemory",tags:Z.topics,type:"episode"});if($.workingMemory)M(X,{content:[$.workingMemory.currentGoal,...$.workingMemory.openLoops,...$.workingMemory.temporaryDecisions??[]].filter(W).join("; "),memoryId:`working-memory:${$.workingMemory.userId}:${$.workingMemory.sessionId}`,source:"goodmemory",type:"working_memory"});if($.journal)M(X,{content:[$.journal.currentState,$.journal.taskSpecification,...$.journal.workflow??[],...$.journal.errorsAndCorrections??[],...$.journal.learnings??[],...$.journal.keyResults??[],...$.journal.worklog].filter(W).join("; "),memoryId:`session-journal:${$.journal.userId}:${$.journal.sessionId}`,source:"goodmemory",type:"session_journal"});return X}async function S$($,X,Z){if(!W(X.query))return H(400,"invalid_query","Expected query to be a non-empty string.");let U=F$(X.retrievalProfile);if(!U.ok)return H(400,U.code,U.message);let Q=w$(X.strategy);if(!Q.ok)return H(400,Q.code,Q.message);let Y=O$(X.output);if(!Y.ok)return H(400,Y.code,Y.message);let j=typeof X.maxTokens==="number"&&Number.isFinite(X.maxTokens)?Math.max(1,Math.floor(X.maxTokens)):void 0,J=Q.value??"auto",D=w($),z=D?.retrievalPreset!==void 0?J:J==="hybrid"?"hybrid":"rules-only",q={scope:Z,query:X.query,...U.value?{retrievalProfile:U.value}:{},strategy:z},B,I=void 0;try{B=await $.recall(q)}catch(k){if(J==="rules-only"||!c(k))throw k;B=await $.recall({...q,strategy:"rules-only"}),I=I$({recall:B,requestedStrategy:J})}let F=await $.buildContext({recall:B,output:Y.value,...j?{maxTokens:j}:{}}),E=E$(B),S=F.traceId??B.metadata.traceId;return L(200,{context:{content:F.content,estimatedTokens:F.estimatedTokens,omittedSections:F.omittedSections,output:F.output},contextText:F.content,contractVersion:G,hasContext:N$(B),itemCount:E.length,items:E,ok:!0,operation:"recall-context",routing:I??{...v(B,q$({recall:B,requestedStrategy:J,runtimeInfo:D})),requestedStrategy:J},...S?{traceId:S}:{}})}async function k$($,X,Z){let U=G$(X.messages);if(!U.ok)return H(400,U.code,U.message);let Q=z$(X.annotations);if(!Q.ok)return H(400,Q.code,Q.message);let Y=K$(X.extractionStrategy);if(!Y.ok)return H(400,Y.code,Y.message);let j=X.mode===void 0?"sync":X.mode;if(j!=="sync"&&j!=="async")return H(400,"invalid_mode","Expected mode to be sync or async.");let J=R(X.idempotencyKey,j==="async");if(!J.ok)return H(400,J.code,J.message);let D={scope:Z,messages:U.value,...Q.value?{annotations:Q.value}:{},...Y.value?{extractionStrategy:Y.value}:{},...W(X.locale)?{locale:X.locale}:{}};if(j==="async")try{let z=await $.jobs.enqueueRemember({...D,idempotencyKey:J.value,reason:"manual_enqueue"});return L(200,{contractVersion:G,idempotency:{handledBy:"goodmemory_jobs",key:J.value},job:z,mode:j,ok:!0,operation:"remember"})}catch(z){if(_(z)&&z.code==="idempotency_conflict")return H(409,"idempotency_conflict","GoodMemory job idempotency key already exists for a different payload.");throw z}let N=await $.remember(D);return L(200,{contractVersion:G,idempotency:J.value?{handledBy:"consumer_provenance_only",key:J.value}:{handledBy:"none"},mode:j,ok:!0,operation:"remember",result:N})}async function h$($,X,Z){if(!W(X.signal))return H(400,"invalid_signal","Expected signal to be a non-empty string.");let U=R(X.idempotencyKey,!0);if(!U.ok)return H(400,U.code,U.message);let Q=_(X.source)?X.source:{},Y=await $.feedback({scope:Z,signal:X.signal,...W(X.locale)?{locale:X.locale}:{}});return L(200,{contractVersion:G,idempotency:{handledBy:"consumer_provenance_only",key:U.value},ok:!0,operation:"feedback",provenance:{...W(Q.eventId)?{eventId:Q.eventId}:{},...W(Q.proposalId)?{proposalId:Q.proposalId}:{},...W(Q.reason)?{reason:Q.reason}:{},...W(Q.reviewDecision)?{reviewDecision:Q.reviewDecision}:{},...W(Q.system)?{system:Q.system}:{}},result:Y})}async function x$($,X,Z){if(!W(X.memoryId))return H(400,"invalid_memory_id","Expected memoryId to be a non-empty string.");let U=await $.forget({memoryId:X.memoryId,scope:Z});return L(200,{contractVersion:G,ok:!0,operation:"forget",result:U})}async function f$($,X,Z){let U=X.includeRuntime===!0,Q=await $.exportMemory({includeRuntime:U,scope:Z});return L(200,{contractVersion:G,exported:Q,includeRuntime:U,ok:!0,operation:"export"})}async function b$($,X,Z){let U=_(X.target)?X.target:null;if(!U||!W(U.memoryId))return H(400,"target_memory_id_required","Expected target.memoryId. Query-resolved revision targets are out of scope.");if(!_(X.revision)||!W(X.revision.content))return H(400,"invalid_revision","Expected revision.content to be a non-empty string.");if(!W(X.reason))return H(400,"invalid_reason","Expected reason to be a non-empty string.");let Q=R(X.idempotencyKey,!0);if(!Q.ok)return H(400,Q.code,Q.message);let Y=Q.value;if(!Y)return H(400,"invalid_idempotency_key","Expected a non-empty idempotencyKey string.");let j=V$(X.evidence);if(!j.ok)return H(400,j.code,j.message);let J=await $.reviseMemory({evidence:j.value,idempotencyKey:Y,reason:X.reason,revision:{content:X.revision.content},scope:Z,target:{memoryId:U.memoryId}});return L(200,{contractVersion:G,idempotency:{handledBy:"goodmemory_revision",key:Y},ok:!0,operation:"revise",result:J})}function g$($){if($==="/memory/recall-context")return"recall-context";if($==="/memory/remember")return"remember";if($==="/memory/feedback")return"feedback";if($==="/memory/forget")return"forget";if($==="/memory/export")return"export";if($==="/memory/revise")return"revise";return null}async function m$($){if($.operation==="recall-context")return S$($.memory,$.body,$.scope);if($.operation==="remember")return k$($.memory,$.body,$.scope);if($.operation==="feedback")return h$($.memory,$.body,$.scope);if($.operation==="forget")return x$($.memory,$.body,$.scope);if($.operation==="export")return f$($.memory,$.body,$.scope);return b$($.memory,$.body,$.scope)}function p($){let X=$.resolveCaller??R$,Z=$.authorize??C$;async function U(Q){if(Q.method==="GET"&&new URL(Q.url).pathname==="/healthz")return L(200,{...$.healthMetadata??{},contractVersion:G,ok:!0,status:"ok"});if(Q.method==="GET"&&new URL(Q.url).pathname==="/.well-known/goodmemory.json")return L(200,d());if(Q.method!=="POST")return H(405,"method_not_allowed","GoodMemory bridge endpoints require POST.");let Y=g$(new URL(Q.url).pathname);if(!Y)return H(404,"not_found","Unknown GoodMemory bridge endpoint.");let j=await P$(Q);if(!j.ok)return H(400,j.code,j.message);let J=D$(j.value.scope);if(!J.ok)return H(400,J.code,J.message);let D=await Z({body:j.value,caller:X(Q,j.value),operation:Y,request:Q,scope:J.value,sensitive:_$.has(Y)});if(!D.authorized)return H(D.statusCode??403,D.code??"operation_not_authorized",D.message??"Caller is not authorized for this memory operation.");try{return await m$({body:j.value,memory:$.memory,operation:Y,scope:J.value})}catch{return H(500,"bridge_operation_failed","GoodMemory bridge operation failed.")}}return{async fetch(Q){let Y=await U(Q);return new Response(JSON.stringify(Y.body),{headers:{"content-type":"application/json"},status:Y.statusCode})},handle:U}}function s(){return{preset:"default",profiles:[{assistantOutputs:{mode:"confirmed_or_verified_only"},extends:"default",id:"life-coach",when:{agentId:"life-coach"}}]}}var a="127.0.0.1",t=8739,e="GOODMEMORY_HTTP_BRIDGE_HOST",$$="GOODMEMORY_HTTP_BRIDGE_PORT",C="GOODMEMORY_HTTP_BRIDGE_TOKEN",A="GOODMEMORY_HTTP_BRIDGE_AUTH",X$="x-goodmemory-bridge-auth",Z$="GOODMEMORY_HTTP_BRIDGE_PROFILE",Q$="GOODMEMORY_HTTP_BRIDGE_RETRIEVAL_PRESET",U$="GOODMEMORY_HTTP_BRIDGE_RECOMMENDED",W$="GOODMEMORY_PROFILE",Y$="GOODMEMORY_HTTP_BRIDGE_ALLOW_INSECURE";function d$(){console.log(`GoodMemory HTTP memory bridge
import{a as d}from"./chunk-0dnmpnqg.js";import{Ja as w,La as T,ta as P,ua as y,va as c}from"./chunk-zzjzm513.js";import"./chunk-jmsnz9jn.js";import{resolve as y$}from"node:path";import{fileURLToPath as c$}from"node:url";var G="phase-39.http-memory.v1",_$=new Set(["export","forget","revise"]);function _($){return Boolean($)&&typeof $==="object"&&!Array.isArray($)}function W($){return typeof $==="string"&&$.trim().length>0}function K($,X){let Z=$[X];if(Z===void 0)return;return W(Z)?Z.trim():void 0}function D$($){if(!_($)||!W($.userId))return{code:"invalid_scope",message:"Expected scope.userId and optional string tenant/workspace/agent/session fields.",ok:!1};for(let j of["tenantId","workspaceId","agentId","sessionId"])if($[j]!==void 0&&!W($[j]))return{code:"invalid_scope",message:"Expected scope.userId and optional string tenant/workspace/agent/session fields.",ok:!1};let X={userId:$.userId.trim()},Z=K($,"tenantId"),U=K($,"workspaceId"),Q=K($,"agentId"),Y=K($,"sessionId");if(Z)X.tenantId=Z;if(U)X.workspaceId=U;if(Q)X.agentId=Q;if(Y)X.sessionId=Y;return{ok:!0,value:X}}function G$($){if(!Array.isArray($)||$.length===0)return{code:"invalid_messages",message:"Expected messages to be a non-empty array.",ok:!1};let X=[];for(let Z of $){if(!_(Z)||!W(Z.role)||!W(Z.content))return{code:"invalid_messages",message:"Expected every message to include role and content string fields.",ok:!1};X.push({content:Z.content,role:Z.role})}return{ok:!0,value:X}}function h($){return $===null||typeof $==="string"||typeof $==="number"||typeof $==="boolean"}function L$($){return $==="profile"||$==="preference"||$==="reference"||$==="fact"||$==="feedback"}function B$($){return $==="always"||$==="never"||$==="auto"}function x($){return $==="blocker"||$==="open_loop"||$==="role_update"||$==="focus_update"||$==="project_state"||$==="generic_project"}function f($){return $==="identity"||$==="project"||$==="runtime"||$==="reference"||$==="preference"}function b($){return $==="do"||$==="dont"||$==="prefer"||$==="validated_pattern"}function g($){return $==="name"||$==="role"||$==="organization"||$==="location"||$==="timezone"||$==="languagePreference"||$==="currentProject"}function m($){return $==="source_of_truth"||$==="runbook"||$==="doc"||$==="dashboard"||$==="tracker"}function M$($){if($===void 0)return{ok:!0,value:void 0};if(!_($))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch to be an object when provided.",ok:!1};for(let Z of["category","factKind","scopeKind","subject","feedbackKind","appliesTo","profileField","preferenceCategory","preferenceValue","referenceKind","referenceTitle","referencePointer","supersedesPointer"])if($[Z]!==void 0&&!W($[Z]))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch string fields to be non-empty strings.",ok:!1};if($.factKind!==void 0&&!x($.factKind))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.factKind to be a supported fact kind.",ok:!1};if($.scopeKind!==void 0&&!f($.scopeKind))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.scopeKind to be a supported scope kind.",ok:!1};if($.feedbackKind!==void 0&&!b($.feedbackKind))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.feedbackKind to be a supported feedback kind.",ok:!1};if($.profileField!==void 0&&!g($.profileField))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.profileField to be a supported profile field.",ok:!1};if($.referenceKind!==void 0&&!m($.referenceKind))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.referenceKind to be a supported reference kind.",ok:!1};if($.tags!==void 0&&(!Array.isArray($.tags)||!$.tags.every(W)))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.tags to be an array of non-empty strings.",ok:!1};if($.attributes!==void 0){if(!_($.attributes))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.attributes to be an object.",ok:!1};for(let Z of Object.values($.attributes))if(!h(Z))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.attributes values to be string, number, boolean, or null.",ok:!1}}let X=_($.attributes)?Object.fromEntries(Object.entries($.attributes).filter((Z)=>h(Z[1]))):void 0;return{ok:!0,value:{...W($.category)?{category:$.category}:{},...x($.factKind)?{factKind:$.factKind}:{},...f($.scopeKind)?{scopeKind:$.scopeKind}:{},...W($.subject)?{subject:$.subject}:{},...Array.isArray($.tags)?{tags:[...$.tags]}:{},...X!==void 0?{attributes:X}:{},...b($.feedbackKind)?{feedbackKind:$.feedbackKind}:{},...W($.appliesTo)?{appliesTo:$.appliesTo}:{},...g($.profileField)?{profileField:$.profileField}:{},...W($.preferenceCategory)?{preferenceCategory:$.preferenceCategory}:{},...W($.preferenceValue)?{preferenceValue:$.preferenceValue}:{},...m($.referenceKind)?{referenceKind:$.referenceKind}:{},...W($.referenceTitle)?{referenceTitle:$.referenceTitle}:{},...W($.referencePointer)?{referencePointer:$.referencePointer}:{},...W($.supersedesPointer)?{supersedesPointer:$.supersedesPointer}:{}}}}function z$($){if($===void 0)return{ok:!0,value:void 0};if(!Array.isArray($))return{code:"invalid_annotations",message:"Expected annotations to be an array when provided.",ok:!1};let X=[];for(let Z of $){if(!_(Z))return{code:"invalid_annotations",message:"Expected every annotation to be an object.",ok:!1};let U=Z.messageIndex;if(typeof U!=="number"||!Number.isInteger(U))return{code:"invalid_annotations",message:"Expected every annotation to include integer messageIndex.",ok:!1};if(U<0)return{code:"invalid_annotations",message:"Expected annotation.messageIndex to be non-negative.",ok:!1};if(Z.remember!==void 0&&!B$(Z.remember))return{code:"invalid_annotations",message:"Expected annotation.remember to be always, never, or auto.",ok:!1};if(Z.kindHint!==void 0&&!L$(Z.kindHint))return{code:"invalid_annotations",message:"Expected annotation.kindHint to be profile, preference, reference, fact, or feedback.",ok:!1};if(Z.confirmed!==void 0&&typeof Z.confirmed!=="boolean")return{code:"invalid_annotations",message:"Expected annotation.confirmed to be a boolean when provided.",ok:!1};if(Z.verified!==void 0&&typeof Z.verified!=="boolean")return{code:"invalid_annotations",message:"Expected annotation.verified to be a boolean when provided.",ok:!1};if(Z.reason!==void 0&&!W(Z.reason))return{code:"invalid_annotations",message:"Expected annotation.reason to be a non-empty string when provided.",ok:!1};let Q=M$(Z.metadataPatch);if(!Q.ok)return Q;X.push({messageIndex:U,...Z.remember!==void 0?{remember:Z.remember}:{},...Z.kindHint!==void 0?{kindHint:Z.kindHint}:{},...Q.value!==void 0?{metadataPatch:Q.value}:{},...Z.confirmed!==void 0?{confirmed:Z.confirmed}:{},...Z.verified!==void 0?{verified:Z.verified}:{},...W(Z.reason)?{reason:Z.reason}:{}})}return{ok:!0,value:X}}function F$($){if($===void 0)return{ok:!0,value:void 0};if($==="coding_agent"||$==="general_chat")return{ok:!0,value:$};return{code:"invalid_retrieval_profile",message:"Expected retrievalProfile to be general_chat or coding_agent.",ok:!1}}function w$($){if($===void 0)return{ok:!0,value:void 0};if($==="auto"||$==="rules-only"||$==="hybrid")return{ok:!0,value:$};return{code:"invalid_recall_strategy",message:"Expected strategy to be auto, rules-only, or hybrid.",ok:!1}}function O$($){if($===void 0)return{ok:!0,value:"system_prompt_fragment"};if($==="json"||$==="markdown"||$==="system_prompt_fragment"||$==="developer_prompt_fragment")return{ok:!0,value:$};return{code:"invalid_context_output",message:"Expected output to be json, markdown, system_prompt_fragment, or developer_prompt_fragment.",ok:!1}}function K$($){if($===void 0)return{ok:!0,value:void 0};if($==="auto"||$==="rules-only"||$==="llm-assisted")return{ok:!0,value:$};return{code:"invalid_extraction_strategy",message:"Expected extractionStrategy to be auto, rules-only, or llm-assisted.",ok:!1}}function R($,X){if($===void 0&&!X)return{ok:!0,value:void 0};if(W($))return{ok:!0,value:$.trim()};return{code:"invalid_idempotency_key",message:"Expected a non-empty idempotencyKey string.",ok:!1}}function V$($){if($===void 0)return{ok:!0,value:void 0};if(!_($))return{code:"invalid_evidence",message:"Expected evidence to be an object when provided.",ok:!1};if($.source!=="user_message"&&$.source!=="manual_review"&&$.source!=="system")return{code:"invalid_evidence",message:"Expected evidence.source to be user_message, manual_review, or system.",ok:!1};return{ok:!0,value:{source:$.source,...W($.message)?{message:$.message}:{},...W($.excerpt)?{excerpt:$.excerpt}:{},...W($.sourceUri)?{sourceUri:$.sourceUri}:{},...Array.isArray($.sourceMessageIds)?{sourceMessageIds:$.sourceMessageIds.filter(W)}:{}}}}function T$($,X){return{error:{code:$,message:X},ok:!1}}function L($,X){return{body:X,statusCode:$}}function H($,X,Z){return L($,T$(X,Z))}async function P$($){try{let X=await $.json();if(!_(X))return{code:"invalid_json_body",message:"Expected a JSON object request body.",ok:!1};return{ok:!0,value:X}}catch{return{code:"invalid_json_body",message:"Expected a valid JSON object request body.",ok:!1}}}function R$($){let X=$.headers.get("x-goodmemory-user-id")?.trim();if(!X)return null;let U=$.headers.get("x-goodmemory-operations")?.split(",").map((Q)=>Q.trim()).filter(Boolean);return{authorizedOperations:U?.includes("*")?"*":U??[],tenantId:$.headers.get("x-goodmemory-tenant-id")?.trim()||void 0,userId:X,workspaceId:$.headers.get("x-goodmemory-workspace-id")?.trim()||void 0}}function C$($){if(!$.caller)return{authorized:!1,code:"caller_required",message:"The bridge requires a backend-resolved caller identity.",statusCode:401};if($.caller.userId!==$.scope.userId)return{authorized:!1,code:"scope_not_authorized",message:"Caller userId must match scope.userId.",statusCode:403};if($.caller.tenantId&&$.scope.tenantId!==$.caller.tenantId)return{authorized:!1,code:"scope_not_authorized",message:"Request scope.tenantId must be present and match the caller tenantId.",statusCode:403};if($.scope.tenantId&&!$.caller.tenantId)return{authorized:!1,code:"scope_not_authorized",message:"Caller must provide tenantId to authorize tenant-scoped memory.",statusCode:403};if($.caller.workspaceId&&$.scope.workspaceId!==$.caller.workspaceId)return{authorized:!1,code:"scope_not_authorized",message:"Request scope.workspaceId must be present and match the caller workspaceId.",statusCode:403};if($.scope.workspaceId&&!$.caller.workspaceId)return{authorized:!1,code:"scope_not_authorized",message:"Caller must provide workspaceId to authorize workspace-scoped memory.",statusCode:403};if($.sensitive&&$.caller.authorizedOperations!=="*"){if(!$.caller.authorizedOperations.includes($.operation))return{authorized:!1,code:"operation_not_authorized",message:"Caller is not authorized for this scoped memory operation.",statusCode:403}}return{authorized:!0}}function A$($){if(typeof $==="string")return $;return JSON.stringify($)}function M($,X){if(!X||X.content.trim().length===0)return;$.push(X)}function N$($){return Boolean($.profile||$.preferences.length>0||$.references.length>0||$.facts.length>0||$.feedback.length>0||$.archives.length>0||$.episodes.length>0||$.workingMemory||$.journal)}function v($,X=[]){let Z=$.metadata.routingDecision.strategyExplanation,U=new Set([...Z.warnings??[],...X]);if($.metadata.policyApplied?.includes("semantic_candidates_unavailable"))U.add(P);let Q=y({existingMessages:Z.warningMessages,warnings:[...U]});return{...Z.fallbackReason?{fallbackReason:Z.fallbackReason}:{},llmRefinement:Z.llmRefinement,requestedStrategy:Z.requestedStrategy,resolvedStrategy:Z.resolvedStrategy,semanticTieBreaking:Z.semanticTieBreaking,...Q.length>0?{warningMessages:Q}:{},...U.size>0?{warnings:[...U]}:{}}}function q$($){if($.requestedStrategy!=="auto"||$.runtimeInfo?.embeddingEnabled!==!0||$.runtimeInfo.retrievalPreset)return[];return($.recall.metadata.routingDecision.strategyExplanation.resolvedStrategy??$.recall.metadata.routingDecision.strategy)==="rules-only"?[P]:[]}function I$($){return{...v($.recall),fallbackReason:"provider_error",providerFallback:{reason:"provider_error",recoveredStrategy:"rules-only"},requestedStrategy:$.requestedStrategy,resolvedStrategy:"rules-only",semanticTieBreaking:!1}}function E$($){let X=[];if($.profile){let Z=[$.profile.identity.name,$.profile.identity.role,$.profile.identity.organization,...$.profile.activeContext.goals,...$.profile.activeContext.currentProjects].filter(W);M(X,{content:Z.join("; "),memoryId:`profile:${$.profile.userId}`,source:"goodmemory",type:"profile"})}for(let Z of $.preferences)M(X,{category:Z.category,confidence:Z.confidence,content:`${Z.category}: ${A$(Z.value)}`,memoryId:Z.id,source:"goodmemory",tags:Z.tags,type:"preference"});for(let Z of $.references)M(X,{category:Z.referenceKind,confidence:Z.confidence,content:Z.description?`${Z.title}: ${Z.pointer} - ${Z.description}`:`${Z.title}: ${Z.pointer}`,memoryId:Z.id,source:"goodmemory",tags:Z.tags,type:"reference"});for(let Z of $.facts)M(X,{category:Z.category,confidence:Z.confidence,content:Z.content,memoryId:Z.id,source:"goodmemory",tags:Z.tags,type:"fact"});for(let Z of $.feedback)M(X,{category:Z.kind,confidence:Z.confidence,content:Z.rule,memoryId:Z.id,source:"goodmemory",tags:Z.tags,type:"feedback"});for(let Z of $.episodes)M(X,{confidence:Z.confidence,content:Z.summary,memoryId:Z.id,source:"goodmemory",tags:Z.topics,type:"episode"});if($.workingMemory)M(X,{content:[$.workingMemory.currentGoal,...$.workingMemory.openLoops,...$.workingMemory.temporaryDecisions??[]].filter(W).join("; "),memoryId:`working-memory:${$.workingMemory.userId}:${$.workingMemory.sessionId}`,source:"goodmemory",type:"working_memory"});if($.journal)M(X,{content:[$.journal.currentState,$.journal.taskSpecification,...$.journal.workflow??[],...$.journal.errorsAndCorrections??[],...$.journal.learnings??[],...$.journal.keyResults??[],...$.journal.worklog].filter(W).join("; "),memoryId:`session-journal:${$.journal.userId}:${$.journal.sessionId}`,source:"goodmemory",type:"session_journal"});return X}async function S$($,X,Z){if(!W(X.query))return H(400,"invalid_query","Expected query to be a non-empty string.");let U=F$(X.retrievalProfile);if(!U.ok)return H(400,U.code,U.message);let Q=w$(X.strategy);if(!Q.ok)return H(400,Q.code,Q.message);let Y=O$(X.output);if(!Y.ok)return H(400,Y.code,Y.message);let j=typeof X.maxTokens==="number"&&Number.isFinite(X.maxTokens)?Math.max(1,Math.floor(X.maxTokens)):void 0,J=Q.value??"auto",D=w($),z=D?.retrievalPreset!==void 0?J:J==="hybrid"?"hybrid":"rules-only",q={scope:Z,query:X.query,...U.value?{retrievalProfile:U.value}:{},strategy:z},B,I=void 0;try{B=await $.recall(q)}catch(k){if(J==="rules-only"||!c(k))throw k;B=await $.recall({...q,strategy:"rules-only"}),I=I$({recall:B,requestedStrategy:J})}let F=await $.buildContext({recall:B,output:Y.value,...j?{maxTokens:j}:{}}),E=E$(B),S=F.traceId??B.metadata.traceId;return L(200,{context:{content:F.content,estimatedTokens:F.estimatedTokens,omittedSections:F.omittedSections,output:F.output},contextText:F.content,contractVersion:G,hasContext:N$(B),itemCount:E.length,items:E,ok:!0,operation:"recall-context",routing:I??{...v(B,q$({recall:B,requestedStrategy:J,runtimeInfo:D})),requestedStrategy:J},...S?{traceId:S}:{}})}async function k$($,X,Z){let U=G$(X.messages);if(!U.ok)return H(400,U.code,U.message);let Q=z$(X.annotations);if(!Q.ok)return H(400,Q.code,Q.message);let Y=K$(X.extractionStrategy);if(!Y.ok)return H(400,Y.code,Y.message);let j=X.mode===void 0?"sync":X.mode;if(j!=="sync"&&j!=="async")return H(400,"invalid_mode","Expected mode to be sync or async.");let J=R(X.idempotencyKey,j==="async");if(!J.ok)return H(400,J.code,J.message);let D={scope:Z,messages:U.value,...Q.value?{annotations:Q.value}:{},...Y.value?{extractionStrategy:Y.value}:{},...W(X.locale)?{locale:X.locale}:{}};if(j==="async")try{let z=await $.jobs.enqueueRemember({...D,idempotencyKey:J.value,reason:"manual_enqueue"});return L(200,{contractVersion:G,idempotency:{handledBy:"goodmemory_jobs",key:J.value},job:z,mode:j,ok:!0,operation:"remember"})}catch(z){if(_(z)&&z.code==="idempotency_conflict")return H(409,"idempotency_conflict","GoodMemory job idempotency key already exists for a different payload.");throw z}let N=await $.remember(D);return L(200,{contractVersion:G,idempotency:J.value?{handledBy:"consumer_provenance_only",key:J.value}:{handledBy:"none"},mode:j,ok:!0,operation:"remember",result:N})}async function h$($,X,Z){if(!W(X.signal))return H(400,"invalid_signal","Expected signal to be a non-empty string.");let U=R(X.idempotencyKey,!0);if(!U.ok)return H(400,U.code,U.message);let Q=_(X.source)?X.source:{},Y=await $.feedback({scope:Z,signal:X.signal,...W(X.locale)?{locale:X.locale}:{}});return L(200,{contractVersion:G,idempotency:{handledBy:"consumer_provenance_only",key:U.value},ok:!0,operation:"feedback",provenance:{...W(Q.eventId)?{eventId:Q.eventId}:{},...W(Q.proposalId)?{proposalId:Q.proposalId}:{},...W(Q.reason)?{reason:Q.reason}:{},...W(Q.reviewDecision)?{reviewDecision:Q.reviewDecision}:{},...W(Q.system)?{system:Q.system}:{}},result:Y})}async function x$($,X,Z){if(!W(X.memoryId))return H(400,"invalid_memory_id","Expected memoryId to be a non-empty string.");let U=await $.forget({memoryId:X.memoryId,scope:Z});return L(200,{contractVersion:G,ok:!0,operation:"forget",result:U})}async function f$($,X,Z){let U=X.includeRuntime===!0,Q=await $.exportMemory({includeRuntime:U,scope:Z});return L(200,{contractVersion:G,exported:Q,includeRuntime:U,ok:!0,operation:"export"})}async function b$($,X,Z){let U=_(X.target)?X.target:null;if(!U||!W(U.memoryId))return H(400,"target_memory_id_required","Expected target.memoryId. Query-resolved revision targets are out of scope.");if(!_(X.revision)||!W(X.revision.content))return H(400,"invalid_revision","Expected revision.content to be a non-empty string.");if(!W(X.reason))return H(400,"invalid_reason","Expected reason to be a non-empty string.");let Q=R(X.idempotencyKey,!0);if(!Q.ok)return H(400,Q.code,Q.message);let Y=Q.value;if(!Y)return H(400,"invalid_idempotency_key","Expected a non-empty idempotencyKey string.");let j=V$(X.evidence);if(!j.ok)return H(400,j.code,j.message);let J=await $.reviseMemory({evidence:j.value,idempotencyKey:Y,reason:X.reason,revision:{content:X.revision.content},scope:Z,target:{memoryId:U.memoryId}});return L(200,{contractVersion:G,idempotency:{handledBy:"goodmemory_revision",key:Y},ok:!0,operation:"revise",result:J})}function g$($){if($==="/memory/recall-context")return"recall-context";if($==="/memory/remember")return"remember";if($==="/memory/feedback")return"feedback";if($==="/memory/forget")return"forget";if($==="/memory/export")return"export";if($==="/memory/revise")return"revise";return null}async function m$($){if($.operation==="recall-context")return S$($.memory,$.body,$.scope);if($.operation==="remember")return k$($.memory,$.body,$.scope);if($.operation==="feedback")return h$($.memory,$.body,$.scope);if($.operation==="forget")return x$($.memory,$.body,$.scope);if($.operation==="export")return f$($.memory,$.body,$.scope);return b$($.memory,$.body,$.scope)}function p($){let X=$.resolveCaller??R$,Z=$.authorize??C$;async function U(Q){if(Q.method==="GET"&&new URL(Q.url).pathname==="/healthz")return L(200,{...$.healthMetadata??{},contractVersion:G,ok:!0,status:"ok"});if(Q.method==="GET"&&new URL(Q.url).pathname==="/.well-known/goodmemory.json")return L(200,d());if(Q.method!=="POST")return H(405,"method_not_allowed","GoodMemory bridge endpoints require POST.");let Y=g$(new URL(Q.url).pathname);if(!Y)return H(404,"not_found","Unknown GoodMemory bridge endpoint.");let j=await P$(Q);if(!j.ok)return H(400,j.code,j.message);let J=D$(j.value.scope);if(!J.ok)return H(400,J.code,J.message);let D=await Z({body:j.value,caller:X(Q,j.value),operation:Y,request:Q,scope:J.value,sensitive:_$.has(Y)});if(!D.authorized)return H(D.statusCode??403,D.code??"operation_not_authorized",D.message??"Caller is not authorized for this memory operation.");try{return await m$({body:j.value,memory:$.memory,operation:Y,scope:J.value})}catch{return H(500,"bridge_operation_failed","GoodMemory bridge operation failed.")}}return{async fetch(Q){let Y=await U(Q);return new Response(JSON.stringify(Y.body),{headers:{"content-type":"application/json"},status:Y.statusCode})},handle:U}}function s(){return{preset:"default",profiles:[{assistantOutputs:{mode:"confirmed_or_verified_only"},extends:"default",id:"life-coach",when:{agentId:"life-coach"}}]}}var a="127.0.0.1",t=8739,e="GOODMEMORY_HTTP_BRIDGE_HOST",$$="GOODMEMORY_HTTP_BRIDGE_PORT",C="GOODMEMORY_HTTP_BRIDGE_TOKEN",A="GOODMEMORY_HTTP_BRIDGE_AUTH",X$="x-goodmemory-bridge-auth",Z$="GOODMEMORY_HTTP_BRIDGE_PROFILE",Q$="GOODMEMORY_HTTP_BRIDGE_RETRIEVAL_PRESET",U$="GOODMEMORY_HTTP_BRIDGE_RECOMMENDED",W$="GOODMEMORY_PROFILE",Y$="GOODMEMORY_HTTP_BRIDGE_ALLOW_INSECURE";function d$(){console.log(`GoodMemory HTTP memory bridge

@@ -4,0 +4,0 @@ Usage:

#!/usr/bin/env bun
import{$ as k,_ as j,aa as q,ba as g}from"./chunk-pd5xjr5y.js";import"./chunk-xa0pw257.js";import"./chunk-gqbzz1dr.js";import"./chunk-djzzs7r6.js";import"./chunk-jmsnz9jn.js";import{resolve as u}from"node:path";import{fileURLToPath as x}from"node:url";async function z(){let b=j({argv:process.argv.slice(2),env:process.env});if(b.mode==="error")process.stderr.write(`${b.message}
import{$ as k,_ as j,aa as q,ba as g}from"./chunk-t4djxrsg.js";import"./chunk-zzjzm513.js";import"./chunk-gqbzz1dr.js";import"./chunk-djzzs7r6.js";import"./chunk-jmsnz9jn.js";import{resolve as u}from"node:path";import{fileURLToPath as x}from"node:url";async function z(){let b=j({argv:process.argv.slice(2),env:process.env});if(b.mode==="error")process.stderr.write(`${b.message}
`),process.exit(1);if(b.mode==="standalone"){q(b.config),await g({allowWrite:b.allowWrite,standalone:b.config});return}await g({allowWrite:b.allowWrite||await k({host:b.host}),host:b.host})}if(process.argv[1]!==void 0&&x(import.meta.url)===u(process.argv[1]))await z();

@@ -1,1 +0,1 @@

import{ca as M,da as g,ia as m,na as y}from"../chunk-e5bhvzqx.js";import"../chunk-b7j2aytn.js";import"../chunk-14dkxqxk.js";import{readFileSync as c}from"node:fs";var p=new URL("../../package.json",import.meta.url),z;function s(){if(z)return z;let Q=JSON.parse(c(p,"utf8")),Y=Q.goodmemoryRelease;if(typeof Q.version!=="string"||Q.version.length===0||typeof Y?.installCommandsApplyAfterPublish!=="boolean"||typeof Y.npmDistTag!=="string"||Y.npmDistTag.length===0||Y.status!=="release-candidate"&&Y.status!=="stable")throw Error("Unable to read GoodMemory package release metadata.");return z={goodmemoryRelease:{installCommandsApplyAfterPublish:Y.installCommandsApplyAfterPublish,npmDistTag:Y.npmDistTag,status:Y.status},version:Q.version},z}var A="https://github.com/hjqcan/GoodMemory",w="https://goodmemory.vibenest.net";function I(Q={}){let Y=Q.packageMetadata??s(),X=Q.version??Y.version;return{schemaVersion:"goodmemory.capability/v2",name:"goodmemory",version:X,kind:"memory-layer",summary:"Durable user/project memory layer for chat apps, copilots, and coding agents.",description:"GoodMemory is the product memory layer between an app or installed agent host and the model runtime: write selected facts, recall the right context, inject it into the next turn, audit what happened, and delete it when it is wrong.",notA:["llm","agent-framework","vector-database","rag-system"],license:"MIT",homepage:`${A}#readme`,repository:A,documentation:{inspector:`${A}/blob/main/docs/GoodMemory-Inspector-and-Admin-API.md`,llmsTxt:`${A}/blob/main/llms.txt`,readme:`${A}#readme`,quickstart:`${A}#quickstart-codex-or-claude-code-memory`},install:{npmGlobal:`npm install -g goodmemory@${X}`,npmPackage:`npm install goodmemory@${X}`,bun:`bun add goodmemory@${X}`},releaseStatus:{...Y.goodmemoryRelease,tarball:`goodmemory-${X}.tgz`},memoryApi:["remember","recall","buildContext","feedback","forget","exportMemory","deleteAllMemory"],onboarding:[{audience:"installed-coding-agent-host",when:"You are, or run inside, Claude Code or Codex.",method:"cli",steps:[`npm install -g goodmemory@${X}`,"goodmemory setup","goodmemory status"],autoDetect:"goodmemory adopt",docs:`${A}#quickstart-codex-or-claude-code-memory`},{audience:"mcp-client",when:"You speak the Model Context Protocol (Cursor, Windsurf, Cline, Claude Desktop, Gemini CLI, OpenCode, or a custom MCP client).",method:"mcp",mcpServer:{command:"goodmemory-mcp",args:["--standalone","--user-id","YOUR_USER_ID"]},autoDetect:"goodmemory adopt",docs:`${A}#standalone-mcp-for-any-client`},{audience:"framework-agent-or-backend",when:"You are a framework agent (LangGraph, custom loop) or a backend that calls memory as an HTTP service.",method:"http",endpoint:w,selfHost:"goodmemory-http-bridge --recommended OR GOODMEMORY_PROFILE=agent-recommended goodmemory-http-bridge",pythonClient:"pip install goodmemory-client",docs:`${A}#pythonfastapi-http-bridge`}],mcp:{command:"goodmemory-mcp",standaloneArgs:["--standalone","--user-id","YOUR_USER_ID"],primaryTools:["goodmemory_get_context","goodmemory_remember"],readOnlyToolCount:8,writeTool:"goodmemory_remember (opt-in via --allow-write)",registryName:"io.github.hjqcan/goodmemory",docs:`${A}#standalone-mcp-for-any-client`},http:{hosted:w,liveness:`${w}/healthz`,wellKnown:`${w}/.well-known/goodmemory.json`,auth:"bearer-token",selfHost:"goodmemory-http-bridge --recommended OR GOODMEMORY_PROFILE=agent-recommended goodmemory-http-bridge",endpoints:{recall:"POST /memory/recall-context",remember:"POST /memory/remember",feedback:"POST /memory/feedback",export:"POST /memory/export",forget:"POST /memory/forget",revise:"POST /memory/revise"},pythonClient:"goodmemory-client (PyPI)",docs:`${A}#pythonfastapi-http-bridge`},benchmarks:{currentClaims:[],historicalEvidence:{url:`${A}/tree/main/benchmark-claims`,note:`The v0.6.0 LoCoMo, BEAM, and MemoryAgentBench results, plus older LongMemEval and ImplicitMemBench runs, remain reproducible versioned evidence. None is a current ${X} production claim until rerun against this package line. LongMemEval and ImplicitMemBench remain internal evidence.`}},capabilities:{localFirst:!0,embeddingFreeDefault:!0,builtInLanguagePacks:["en","zh-Hans","zh-Hant","ja","ko","fr","es"],durableStore:"sqlite (default), postgres (opt-in)",audit:!0,deletion:!0,localInspector:"goodmemory inspector serve (loopback-only React console and /admin/v1 API)",correctByDefaultRecall:"Recall never silently degrades: a downgraded strategy carries routing.warnings (semantic_recall_inactive) and routing.warningMessages (semantic recall inactive — set strategy:hybrid + RETRIEVAL_PRESET) instead of quietly returning the lexical floor."},canonicalSources:{prose:`${A}#readme`,benchmarks:`${A}/tree/main/benchmark-claims`,note:"Benchmark entries keep explicit measuredPackageVersion provenance; a package version bump never relabels historical results. Source declarations remain in benchmark-claims/*.json."}}}var D="phase-39.http-memory.v1",v=new Set(["export","forget","revise"]);function F(Q){return Boolean(Q)&&typeof Q==="object"&&!Array.isArray(Q)}function L(Q){return typeof Q==="string"&&Q.trim().length>0}function C(Q,Y){let X=Q[Y];if(X===void 0)return;return L(X)?X.trim():void 0}function i(Q){if(!F(Q)||!L(Q.userId))return{code:"invalid_scope",message:"Expected scope.userId and optional string tenant/workspace/agent/session fields.",ok:!1};for(let j of["tenantId","workspaceId","agentId","sessionId"])if(Q[j]!==void 0&&!L(Q[j]))return{code:"invalid_scope",message:"Expected scope.userId and optional string tenant/workspace/agent/session fields.",ok:!1};let Y={userId:Q.userId.trim()},X=C(Q,"tenantId"),$=C(Q,"workspaceId"),Z=C(Q,"agentId"),U=C(Q,"sessionId");if(X)Y.tenantId=X;if($)Y.workspaceId=$;if(Z)Y.agentId=Z;if(U)Y.sessionId=U;return{ok:!0,value:Y}}function o(Q){if(!Array.isArray(Q)||Q.length===0)return{code:"invalid_messages",message:"Expected messages to be a non-empty array.",ok:!1};let Y=[];for(let X of Q){if(!F(X)||!L(X.role)||!L(X.content))return{code:"invalid_messages",message:"Expected every message to include role and content string fields.",ok:!1};Y.push({content:X.content,role:X.role})}return{ok:!0,value:Y}}function q(Q){return Q===null||typeof Q==="string"||typeof Q==="number"||typeof Q==="boolean"}function r(Q){return Q==="profile"||Q==="preference"||Q==="reference"||Q==="fact"||Q==="feedback"}function n(Q){return Q==="always"||Q==="never"||Q==="auto"}function N(Q){return Q==="blocker"||Q==="open_loop"||Q==="role_update"||Q==="focus_update"||Q==="project_state"||Q==="generic_project"}function f(Q){return Q==="identity"||Q==="project"||Q==="runtime"||Q==="reference"||Q==="preference"}function E(Q){return Q==="do"||Q==="dont"||Q==="prefer"||Q==="validated_pattern"}function S(Q){return Q==="name"||Q==="role"||Q==="organization"||Q==="location"||Q==="timezone"||Q==="languagePreference"||Q==="currentProject"}function b(Q){return Q==="source_of_truth"||Q==="runbook"||Q==="doc"||Q==="dashboard"||Q==="tracker"}function u(Q){if(Q===void 0)return{ok:!0,value:void 0};if(!F(Q))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch to be an object when provided.",ok:!1};for(let X of["category","factKind","scopeKind","subject","feedbackKind","appliesTo","profileField","preferenceCategory","preferenceValue","referenceKind","referenceTitle","referencePointer","supersedesPointer"])if(Q[X]!==void 0&&!L(Q[X]))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch string fields to be non-empty strings.",ok:!1};if(Q.factKind!==void 0&&!N(Q.factKind))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.factKind to be a supported fact kind.",ok:!1};if(Q.scopeKind!==void 0&&!f(Q.scopeKind))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.scopeKind to be a supported scope kind.",ok:!1};if(Q.feedbackKind!==void 0&&!E(Q.feedbackKind))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.feedbackKind to be a supported feedback kind.",ok:!1};if(Q.profileField!==void 0&&!S(Q.profileField))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.profileField to be a supported profile field.",ok:!1};if(Q.referenceKind!==void 0&&!b(Q.referenceKind))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.referenceKind to be a supported reference kind.",ok:!1};if(Q.tags!==void 0&&(!Array.isArray(Q.tags)||!Q.tags.every(L)))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.tags to be an array of non-empty strings.",ok:!1};if(Q.attributes!==void 0){if(!F(Q.attributes))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.attributes to be an object.",ok:!1};for(let X of Object.values(Q.attributes))if(!q(X))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.attributes values to be string, number, boolean, or null.",ok:!1}}let Y=F(Q.attributes)?Object.fromEntries(Object.entries(Q.attributes).filter((X)=>q(X[1]))):void 0;return{ok:!0,value:{...L(Q.category)?{category:Q.category}:{},...N(Q.factKind)?{factKind:Q.factKind}:{},...f(Q.scopeKind)?{scopeKind:Q.scopeKind}:{},...L(Q.subject)?{subject:Q.subject}:{},...Array.isArray(Q.tags)?{tags:[...Q.tags]}:{},...Y!==void 0?{attributes:Y}:{},...E(Q.feedbackKind)?{feedbackKind:Q.feedbackKind}:{},...L(Q.appliesTo)?{appliesTo:Q.appliesTo}:{},...S(Q.profileField)?{profileField:Q.profileField}:{},...L(Q.preferenceCategory)?{preferenceCategory:Q.preferenceCategory}:{},...L(Q.preferenceValue)?{preferenceValue:Q.preferenceValue}:{},...b(Q.referenceKind)?{referenceKind:Q.referenceKind}:{},...L(Q.referenceTitle)?{referenceTitle:Q.referenceTitle}:{},...L(Q.referencePointer)?{referencePointer:Q.referencePointer}:{},...L(Q.supersedesPointer)?{supersedesPointer:Q.supersedesPointer}:{}}}}function l(Q){if(Q===void 0)return{ok:!0,value:void 0};if(!Array.isArray(Q))return{code:"invalid_annotations",message:"Expected annotations to be an array when provided.",ok:!1};let Y=[];for(let X of Q){if(!F(X))return{code:"invalid_annotations",message:"Expected every annotation to be an object.",ok:!1};let $=X.messageIndex;if(typeof $!=="number"||!Number.isInteger($))return{code:"invalid_annotations",message:"Expected every annotation to include integer messageIndex.",ok:!1};if($<0)return{code:"invalid_annotations",message:"Expected annotation.messageIndex to be non-negative.",ok:!1};if(X.remember!==void 0&&!n(X.remember))return{code:"invalid_annotations",message:"Expected annotation.remember to be always, never, or auto.",ok:!1};if(X.kindHint!==void 0&&!r(X.kindHint))return{code:"invalid_annotations",message:"Expected annotation.kindHint to be profile, preference, reference, fact, or feedback.",ok:!1};if(X.confirmed!==void 0&&typeof X.confirmed!=="boolean")return{code:"invalid_annotations",message:"Expected annotation.confirmed to be a boolean when provided.",ok:!1};if(X.verified!==void 0&&typeof X.verified!=="boolean")return{code:"invalid_annotations",message:"Expected annotation.verified to be a boolean when provided.",ok:!1};if(X.reason!==void 0&&!L(X.reason))return{code:"invalid_annotations",message:"Expected annotation.reason to be a non-empty string when provided.",ok:!1};let Z=u(X.metadataPatch);if(!Z.ok)return Z;Y.push({messageIndex:$,...X.remember!==void 0?{remember:X.remember}:{},...X.kindHint!==void 0?{kindHint:X.kindHint}:{},...Z.value!==void 0?{metadataPatch:Z.value}:{},...X.confirmed!==void 0?{confirmed:X.confirmed}:{},...X.verified!==void 0?{verified:X.verified}:{},...L(X.reason)?{reason:X.reason}:{}})}return{ok:!0,value:Y}}function t(Q){if(Q===void 0)return{ok:!0,value:void 0};if(Q==="coding_agent"||Q==="general_chat")return{ok:!0,value:Q};return{code:"invalid_retrieval_profile",message:"Expected retrievalProfile to be general_chat or coding_agent.",ok:!1}}function a(Q){if(Q===void 0)return{ok:!0,value:void 0};if(Q==="auto"||Q==="rules-only"||Q==="hybrid")return{ok:!0,value:Q};return{code:"invalid_recall_strategy",message:"Expected strategy to be auto, rules-only, or hybrid.",ok:!1}}function e(Q){if(Q===void 0)return{ok:!0,value:"system_prompt_fragment"};if(Q==="json"||Q==="markdown"||Q==="system_prompt_fragment"||Q==="developer_prompt_fragment")return{ok:!0,value:Q};return{code:"invalid_context_output",message:"Expected output to be json, markdown, system_prompt_fragment, or developer_prompt_fragment.",ok:!1}}function QQ(Q){if(Q===void 0)return{ok:!0,value:void 0};if(Q==="auto"||Q==="rules-only"||Q==="llm-assisted")return{ok:!0,value:Q};return{code:"invalid_extraction_strategy",message:"Expected extractionStrategy to be auto, rules-only, or llm-assisted.",ok:!1}}function O(Q,Y){if(Q===void 0&&!Y)return{ok:!0,value:void 0};if(L(Q))return{ok:!0,value:Q.trim()};return{code:"invalid_idempotency_key",message:"Expected a non-empty idempotencyKey string.",ok:!1}}function XQ(Q){if(Q===void 0)return{ok:!0,value:void 0};if(!F(Q))return{code:"invalid_evidence",message:"Expected evidence to be an object when provided.",ok:!1};if(Q.source!=="user_message"&&Q.source!=="manual_review"&&Q.source!=="system")return{code:"invalid_evidence",message:"Expected evidence.source to be user_message, manual_review, or system.",ok:!1};return{ok:!0,value:{source:Q.source,...L(Q.message)?{message:Q.message}:{},...L(Q.excerpt)?{excerpt:Q.excerpt}:{},...L(Q.sourceUri)?{sourceUri:Q.sourceUri}:{},...Array.isArray(Q.sourceMessageIds)?{sourceMessageIds:Q.sourceMessageIds.filter(L)}:{}}}}function YQ(Q,Y){return{error:{code:Q,message:Y},ok:!1}}function G(Q,Y){return{body:Y,statusCode:Q}}function W(Q,Y,X){return G(Q,YQ(Y,X))}async function ZQ(Q){try{let Y=await Q.json();if(!F(Y))return{code:"invalid_json_body",message:"Expected a JSON object request body.",ok:!1};return{ok:!0,value:Y}}catch{return{code:"invalid_json_body",message:"Expected a valid JSON object request body.",ok:!1}}}function $Q(Q){let Y=Q.headers.get("x-goodmemory-user-id")?.trim();if(!Y)return null;let $=Q.headers.get("x-goodmemory-operations")?.split(",").map((Z)=>Z.trim()).filter(Boolean);return{authorizedOperations:$?.includes("*")?"*":$??[],tenantId:Q.headers.get("x-goodmemory-tenant-id")?.trim()||void 0,userId:Y,workspaceId:Q.headers.get("x-goodmemory-workspace-id")?.trim()||void 0}}function LQ(Q){if(!Q.caller)return{authorized:!1,code:"caller_required",message:"The bridge requires a backend-resolved caller identity.",statusCode:401};if(Q.caller.userId!==Q.scope.userId)return{authorized:!1,code:"scope_not_authorized",message:"Caller userId must match scope.userId.",statusCode:403};if(Q.caller.tenantId&&Q.scope.tenantId!==Q.caller.tenantId)return{authorized:!1,code:"scope_not_authorized",message:"Request scope.tenantId must be present and match the caller tenantId.",statusCode:403};if(Q.scope.tenantId&&!Q.caller.tenantId)return{authorized:!1,code:"scope_not_authorized",message:"Caller must provide tenantId to authorize tenant-scoped memory.",statusCode:403};if(Q.caller.workspaceId&&Q.scope.workspaceId!==Q.caller.workspaceId)return{authorized:!1,code:"scope_not_authorized",message:"Request scope.workspaceId must be present and match the caller workspaceId.",statusCode:403};if(Q.scope.workspaceId&&!Q.caller.workspaceId)return{authorized:!1,code:"scope_not_authorized",message:"Caller must provide workspaceId to authorize workspace-scoped memory.",statusCode:403};if(Q.sensitive&&Q.caller.authorizedOperations!=="*"){if(!Q.caller.authorizedOperations.includes(Q.operation))return{authorized:!1,code:"operation_not_authorized",message:"Caller is not authorized for this scoped memory operation.",statusCode:403}}return{authorized:!0}}function UQ(Q){return{userId:Q.userId,...Q.tenantId?{tenantId:Q.tenantId}:{},...Q.workspaceId?{workspaceId:Q.workspaceId}:{},...Q.agentId?{agentId:Q.agentId}:{},...Q.sessionId?{sessionId:Q.sessionId}:{}}}function jQ(Q){if(typeof Q==="string")return Q;return JSON.stringify(Q)}function H(Q,Y){if(!Y||Y.content.trim().length===0)return;Q.push(Y)}function WQ(Q){return Boolean(Q.profile||Q.preferences.length>0||Q.references.length>0||Q.facts.length>0||Q.feedback.length>0||Q.archives.length>0||Q.episodes.length>0||Q.workingMemory||Q.journal)}function d(Q,Y=[]){let X=Q.metadata.routingDecision.strategyExplanation,$=new Set([...X.warnings??[],...Y]);if(Q.metadata.policyApplied?.includes("semantic_candidates_unavailable"))$.add(M);let Z=g({existingMessages:X.warningMessages,warnings:[...$]});return{...X.fallbackReason?{fallbackReason:X.fallbackReason}:{},llmRefinement:X.llmRefinement,requestedStrategy:X.requestedStrategy,resolvedStrategy:X.resolvedStrategy,semanticTieBreaking:X.semanticTieBreaking,...Z.length>0?{warningMessages:Z}:{},...$.size>0?{warnings:[...$]}:{}}}function _Q(Q){if(Q.requestedStrategy!=="auto"||Q.runtimeInfo?.embeddingEnabled!==!0||Q.runtimeInfo.retrievalPreset)return[];return(Q.recall.metadata.routingDecision.strategyExplanation.resolvedStrategy??Q.recall.metadata.routingDecision.strategy)==="rules-only"?[M]:[]}function AQ(Q){return{...d(Q.recall),fallbackReason:"provider_error",providerFallback:{reason:"provider_error",recoveredStrategy:"rules-only"},requestedStrategy:Q.requestedStrategy,resolvedStrategy:"rules-only",semanticTieBreaking:!1}}function FQ(Q){let Y=[];if(Q.profile){let X=[Q.profile.identity.name,Q.profile.identity.role,Q.profile.identity.organization,...Q.profile.activeContext.goals,...Q.profile.activeContext.currentProjects].filter(L);H(Y,{content:X.join("; "),memoryId:`profile:${Q.profile.userId}`,source:"goodmemory",type:"profile"})}for(let X of Q.preferences)H(Y,{category:X.category,confidence:X.confidence,content:`${X.category}: ${jQ(X.value)}`,memoryId:X.id,source:"goodmemory",tags:X.tags,type:"preference"});for(let X of Q.references)H(Y,{category:X.referenceKind,confidence:X.confidence,content:X.description?`${X.title}: ${X.pointer} - ${X.description}`:`${X.title}: ${X.pointer}`,memoryId:X.id,source:"goodmemory",tags:X.tags,type:"reference"});for(let X of Q.facts)H(Y,{category:X.category,confidence:X.confidence,content:X.content,memoryId:X.id,source:"goodmemory",tags:X.tags,type:"fact"});for(let X of Q.feedback)H(Y,{category:X.kind,confidence:X.confidence,content:X.rule,memoryId:X.id,source:"goodmemory",tags:X.tags,type:"feedback"});for(let X of Q.episodes)H(Y,{confidence:X.confidence,content:X.summary,memoryId:X.id,source:"goodmemory",tags:X.topics,type:"episode"});if(Q.workingMemory)H(Y,{content:[Q.workingMemory.currentGoal,...Q.workingMemory.openLoops,...Q.workingMemory.temporaryDecisions??[]].filter(L).join("; "),memoryId:`working-memory:${Q.workingMemory.userId}:${Q.workingMemory.sessionId}`,source:"goodmemory",type:"working_memory"});if(Q.journal)H(Y,{content:[Q.journal.currentState,Q.journal.taskSpecification,...Q.journal.workflow??[],...Q.journal.errorsAndCorrections??[],...Q.journal.learnings??[],...Q.journal.keyResults??[],...Q.journal.worklog].filter(L).join("; "),memoryId:`session-journal:${Q.journal.userId}:${Q.journal.sessionId}`,source:"goodmemory",type:"session_journal"});return Y}async function BQ(Q,Y,X){if(!L(Y.query))return W(400,"invalid_query","Expected query to be a non-empty string.");let $=t(Y.retrievalProfile);if(!$.ok)return W(400,$.code,$.message);let Z=a(Y.strategy);if(!Z.ok)return W(400,Z.code,Z.message);let U=e(Y.output);if(!U.ok)return W(400,U.code,U.message);let j=typeof Y.maxTokens==="number"&&Number.isFinite(Y.maxTokens)?Math.max(1,Math.floor(Y.maxTokens)):void 0,_=Z.value??"auto",B=y(Q),J=B?.retrievalPreset!==void 0?_:_==="hybrid"?"hybrid":"rules-only",R={scope:X,query:Y.query,...$.value?{retrievalProfile:$.value}:{},strategy:J},V,P=void 0;try{V=await Q.recall(R)}catch(h){if(_==="rules-only"||!m(h))throw h;V=await Q.recall({...R,strategy:"rules-only"}),P=AQ({recall:V,requestedStrategy:_})}let T=await Q.buildContext({recall:V,output:U.value,...j?{maxTokens:j}:{}}),k=FQ(V),x=T.traceId??V.metadata.traceId;return G(200,{context:{content:T.content,estimatedTokens:T.estimatedTokens,omittedSections:T.omittedSections,output:T.output},contextText:T.content,contractVersion:D,hasContext:WQ(V),itemCount:k.length,items:k,ok:!0,operation:"recall-context",routing:P??{...d(V,_Q({recall:V,requestedStrategy:_,runtimeInfo:B})),requestedStrategy:_},...x?{traceId:x}:{}})}async function GQ(Q,Y,X){let $=o(Y.messages);if(!$.ok)return W(400,$.code,$.message);let Z=l(Y.annotations);if(!Z.ok)return W(400,Z.code,Z.message);let U=QQ(Y.extractionStrategy);if(!U.ok)return W(400,U.code,U.message);let j=Y.mode===void 0?"sync":Y.mode;if(j!=="sync"&&j!=="async")return W(400,"invalid_mode","Expected mode to be sync or async.");let _=O(Y.idempotencyKey,j==="async");if(!_.ok)return W(400,_.code,_.message);let B={scope:X,messages:$.value,...Z.value?{annotations:Z.value}:{},...U.value?{extractionStrategy:U.value}:{},...L(Y.locale)?{locale:Y.locale}:{}};if(j==="async")try{let J=await Q.jobs.enqueueRemember({...B,idempotencyKey:_.value,reason:"manual_enqueue"});return G(200,{contractVersion:D,idempotency:{handledBy:"goodmemory_jobs",key:_.value},job:J,mode:j,ok:!0,operation:"remember"})}catch(J){if(F(J)&&J.code==="idempotency_conflict")return W(409,"idempotency_conflict","GoodMemory job idempotency key already exists for a different payload.");throw J}let K=await Q.remember(B);return G(200,{contractVersion:D,idempotency:_.value?{handledBy:"consumer_provenance_only",key:_.value}:{handledBy:"none"},mode:j,ok:!0,operation:"remember",result:K})}async function VQ(Q,Y,X){if(!L(Y.signal))return W(400,"invalid_signal","Expected signal to be a non-empty string.");let $=O(Y.idempotencyKey,!0);if(!$.ok)return W(400,$.code,$.message);let Z=F(Y.source)?Y.source:{},U=await Q.feedback({scope:X,signal:Y.signal,...L(Y.locale)?{locale:Y.locale}:{}});return G(200,{contractVersion:D,idempotency:{handledBy:"consumer_provenance_only",key:$.value},ok:!0,operation:"feedback",provenance:{...L(Z.eventId)?{eventId:Z.eventId}:{},...L(Z.proposalId)?{proposalId:Z.proposalId}:{},...L(Z.reason)?{reason:Z.reason}:{},...L(Z.reviewDecision)?{reviewDecision:Z.reviewDecision}:{},...L(Z.system)?{system:Z.system}:{}},result:U})}async function HQ(Q,Y,X){if(!L(Y.memoryId))return W(400,"invalid_memory_id","Expected memoryId to be a non-empty string.");let $=await Q.forget({memoryId:Y.memoryId,scope:X});return G(200,{contractVersion:D,ok:!0,operation:"forget",result:$})}async function DQ(Q,Y,X){let $=Y.includeRuntime===!0,Z=await Q.exportMemory({includeRuntime:$,scope:X});return G(200,{contractVersion:D,exported:Z,includeRuntime:$,ok:!0,operation:"export"})}async function JQ(Q,Y,X){let $=F(Y.target)?Y.target:null;if(!$||!L($.memoryId))return W(400,"target_memory_id_required","Expected target.memoryId. Query-resolved revision targets are out of scope.");if(!F(Y.revision)||!L(Y.revision.content))return W(400,"invalid_revision","Expected revision.content to be a non-empty string.");if(!L(Y.reason))return W(400,"invalid_reason","Expected reason to be a non-empty string.");let Z=O(Y.idempotencyKey,!0);if(!Z.ok)return W(400,Z.code,Z.message);let U=Z.value;if(!U)return W(400,"invalid_idempotency_key","Expected a non-empty idempotencyKey string.");let j=XQ(Y.evidence);if(!j.ok)return W(400,j.code,j.message);let _=await Q.reviseMemory({evidence:j.value,idempotencyKey:U,reason:Y.reason,revision:{content:Y.revision.content},scope:X,target:{memoryId:$.memoryId}});return G(200,{contractVersion:D,idempotency:{handledBy:"goodmemory_revision",key:U},ok:!0,operation:"revise",result:_})}function TQ(Q){if(Q==="/memory/recall-context")return"recall-context";if(Q==="/memory/remember")return"remember";if(Q==="/memory/feedback")return"feedback";if(Q==="/memory/forget")return"forget";if(Q==="/memory/export")return"export";if(Q==="/memory/revise")return"revise";return null}async function zQ(Q){if(Q.operation==="recall-context")return BQ(Q.memory,Q.body,Q.scope);if(Q.operation==="remember")return GQ(Q.memory,Q.body,Q.scope);if(Q.operation==="feedback")return VQ(Q.memory,Q.body,Q.scope);if(Q.operation==="forget")return HQ(Q.memory,Q.body,Q.scope);if(Q.operation==="export")return DQ(Q.memory,Q.body,Q.scope);return JQ(Q.memory,Q.body,Q.scope)}function PQ(Q){let Y=Q.resolveCaller??$Q,X=Q.authorize??LQ;async function $(Z){if(Z.method==="GET"&&new URL(Z.url).pathname==="/healthz")return G(200,{...Q.healthMetadata??{},contractVersion:D,ok:!0,status:"ok"});if(Z.method==="GET"&&new URL(Z.url).pathname==="/.well-known/goodmemory.json")return G(200,I());if(Z.method!=="POST")return W(405,"method_not_allowed","GoodMemory bridge endpoints require POST.");let U=TQ(new URL(Z.url).pathname);if(!U)return W(404,"not_found","Unknown GoodMemory bridge endpoint.");let j=await ZQ(Z);if(!j.ok)return W(400,j.code,j.message);let _=i(j.value.scope);if(!_.ok)return W(400,_.code,_.message);let B=await X({body:j.value,caller:Y(Z,j.value),operation:U,request:Z,scope:_.value,sensitive:v.has(U)});if(!B.authorized)return W(B.statusCode??403,B.code??"operation_not_authorized",B.message??"Caller is not authorized for this memory operation.");try{return await zQ({body:j.value,memory:Q.memory,operation:U,scope:_.value})}catch{return W(500,"bridge_operation_failed","GoodMemory bridge operation failed.")}}return{async fetch(Z){let U=await $(Z);return new Response(JSON.stringify(U.body),{headers:{"content-type":"application/json"},status:U.statusCode})},handle:$}}function kQ(){return{preset:"default",profiles:[{assistantOutputs:{mode:"confirmed_or_verified_only"},extends:"default",id:"life-coach",when:{agentId:"life-coach"}}]}}function xQ(Q){if(Q.ok!==!0||!Array.isArray(Q.items))throw Error("Expected a successful GoodMemory recall-context response.");let Y=Q.items.filter(F).map((X)=>({content:L(X.content)?X.content:"",memoryId:L(X.memoryId)?X.memoryId:"",type:typeof X.type==="string"?X.type:"fact"})).filter((X)=>X.memoryId.length>0&&X.content.length>0);return{context:typeof Q.contextText==="string"?Q.contextText:"",memories:Y.map((X)=>({id:X.memoryId,kind:X.type,source:"goodmemory-http-bridge",text:X.content})),metadata:{hasContext:Q.hasContext===!0,itemCount:typeof Q.itemCount==="number"?Q.itemCount:Y.length,policyBoundary:"product_owned",source:"goodmemory-http-bridge",...L(Q.traceId)?{traceId:Q.traceId}:{}}}}function hQ(Q){return UQ({agentId:Q.agentId??"life-coach",sessionId:Q.sessionId,tenantId:Q.tenantId,userId:Q.userId,workspaceId:Q.workspaceId})}export{xQ as toOneLifeMemoryContextResponse,hQ as toLifeCoachScope,kQ as createLifeCoachHttpRememberConfig,PQ as createGoodMemoryHttpMemoryBridge,FQ as buildGoodMemoryHttpMemoryItems,D as GOODMEMORY_HTTP_MEMORY_BRIDGE_CONTRACT_VERSION};
import{ca as M,da as g,ia as m,na as y}from"../chunk-e5bhvzqx.js";import"../chunk-b7j2aytn.js";import"../chunk-14dkxqxk.js";import{readFileSync as c}from"node:fs";var p=new URL("../../package.json",import.meta.url),z;function s(){if(z)return z;let Q=JSON.parse(c(p,"utf8")),Y=Q.goodmemoryRelease;if(typeof Q.version!=="string"||Q.version.length===0||typeof Y?.installCommandsApplyAfterPublish!=="boolean"||typeof Y.npmDistTag!=="string"||Y.npmDistTag.length===0||Y.status!=="release-candidate"&&Y.status!=="stable")throw Error("Unable to read GoodMemory package release metadata.");return z={goodmemoryRelease:{installCommandsApplyAfterPublish:Y.installCommandsApplyAfterPublish,npmDistTag:Y.npmDistTag,status:Y.status},version:Q.version},z}var A="https://github.com/hjqcan/GoodMemory",w="https://goodmemory.vibenest.net";function I(Q={}){let Y=Q.packageMetadata??s(),X=Q.version??Y.version;return{schemaVersion:"goodmemory.capability/v2",name:"goodmemory",version:X,kind:"memory-layer",summary:"Durable user/project memory layer for chat apps, copilots, and coding agents.",description:"GoodMemory is the product memory layer between an app or installed agent host and the model runtime: write selected facts, recall the right context, inject it into the next turn, audit what happened, and delete it when it is wrong.",notA:["llm","agent-framework","vector-database","rag-system"],license:"MIT",homepage:`${A}#readme`,repository:A,documentation:{inspector:`${A}/blob/main/docs/GoodMemory-Inspector-and-Admin-API.md`,llmsTxt:`${A}/blob/main/llms.txt`,readme:`${A}#readme`,quickstart:`${A}#quickstart-codex-or-claude-code-memory`},install:{npmGlobal:`npm install -g goodmemory@${X}`,npmPackage:`npm install goodmemory@${X}`,bun:`bun add goodmemory@${X}`},releaseStatus:{...Y.goodmemoryRelease,tarball:`goodmemory-${X}.tgz`},memoryApi:["remember","recall","buildContext","feedback","forget","exportMemory","deleteAllMemory"],onboarding:[{audience:"installed-coding-agent-host",when:"You are, or run inside, Claude Code or Codex.",method:"cli",steps:[`npm install -g goodmemory@${X}`,"goodmemory setup","goodmemory status"],autoDetect:"goodmemory adopt",docs:`${A}#quickstart-codex-or-claude-code-memory`},{audience:"kimi-code-plugin",when:"You run Kimi Code and want local, scoped cross-session project memory.",method:"plugin",install:`/plugins install ${A}`,runtimeRequirements:["Node.js >=20","Bun >=1.3.14","npx"],writeBoundary:"goodmemory_remember is exposed at install; Kimi Code approval still governs each unapproved MCP call",docs:`${A}/blob/main/docs/GoodMemory-Kimi-Code-Setup-Guide.md`},{audience:"mcp-client",when:"You speak the Model Context Protocol (Cursor, Windsurf, Cline, Claude Desktop, Gemini CLI, OpenCode, or a custom MCP client).",method:"mcp",mcpServer:{command:"goodmemory-mcp",args:["--standalone","--user-id","YOUR_USER_ID"]},autoDetect:"goodmemory adopt",docs:`${A}#standalone-mcp-for-any-client`},{audience:"framework-agent-or-backend",when:"You are a framework agent (LangGraph, custom loop) or a backend that calls memory as an HTTP service.",method:"http",endpoint:w,selfHost:"goodmemory-http-bridge --recommended OR GOODMEMORY_PROFILE=agent-recommended goodmemory-http-bridge",pythonClient:"pip install goodmemory-client",docs:`${A}#pythonfastapi-http-bridge`}],mcp:{command:"goodmemory-mcp",standaloneArgs:["--standalone","--user-id","YOUR_USER_ID"],primaryTools:["goodmemory_get_context","goodmemory_remember"],readOnlyToolCount:8,writeTool:"goodmemory_remember (opt-in via --allow-write)",registryName:"io.github.hjqcan/goodmemory",docs:`${A}#standalone-mcp-for-any-client`},http:{hosted:w,liveness:`${w}/healthz`,wellKnown:`${w}/.well-known/goodmemory.json`,auth:"bearer-token",selfHost:"goodmemory-http-bridge --recommended OR GOODMEMORY_PROFILE=agent-recommended goodmemory-http-bridge",endpoints:{recall:"POST /memory/recall-context",remember:"POST /memory/remember",feedback:"POST /memory/feedback",export:"POST /memory/export",forget:"POST /memory/forget",revise:"POST /memory/revise"},pythonClient:"goodmemory-client (PyPI)",docs:`${A}#pythonfastapi-http-bridge`},benchmarks:{currentClaims:[],historicalEvidence:{url:`${A}/tree/main/benchmark-claims`,note:`The v0.6.0 LoCoMo, BEAM, and MemoryAgentBench results, plus older LongMemEval and ImplicitMemBench runs, remain reproducible versioned evidence. None is a current ${X} production claim until rerun against this package line. LongMemEval and ImplicitMemBench remain internal evidence.`}},capabilities:{localFirst:!0,embeddingFreeDefault:!0,builtInLanguagePacks:["en","zh-Hans","zh-Hant","ja","ko","fr","es"],durableStore:"sqlite (default), postgres (opt-in)",audit:!0,deletion:!0,localInspector:"goodmemory inspector serve (loopback-only React console and /admin/v1 API)",correctByDefaultRecall:"Recall never silently degrades: a downgraded strategy carries routing.warnings (semantic_recall_inactive) and routing.warningMessages (semantic recall inactive — set strategy:hybrid + RETRIEVAL_PRESET) instead of quietly returning the lexical floor."},canonicalSources:{prose:`${A}#readme`,benchmarks:`${A}/tree/main/benchmark-claims`,note:"Benchmark entries keep explicit measuredPackageVersion provenance; a package version bump never relabels historical results. Source declarations remain in benchmark-claims/*.json."}}}var D="phase-39.http-memory.v1",v=new Set(["export","forget","revise"]);function F(Q){return Boolean(Q)&&typeof Q==="object"&&!Array.isArray(Q)}function L(Q){return typeof Q==="string"&&Q.trim().length>0}function C(Q,Y){let X=Q[Y];if(X===void 0)return;return L(X)?X.trim():void 0}function i(Q){if(!F(Q)||!L(Q.userId))return{code:"invalid_scope",message:"Expected scope.userId and optional string tenant/workspace/agent/session fields.",ok:!1};for(let j of["tenantId","workspaceId","agentId","sessionId"])if(Q[j]!==void 0&&!L(Q[j]))return{code:"invalid_scope",message:"Expected scope.userId and optional string tenant/workspace/agent/session fields.",ok:!1};let Y={userId:Q.userId.trim()},X=C(Q,"tenantId"),$=C(Q,"workspaceId"),Z=C(Q,"agentId"),U=C(Q,"sessionId");if(X)Y.tenantId=X;if($)Y.workspaceId=$;if(Z)Y.agentId=Z;if(U)Y.sessionId=U;return{ok:!0,value:Y}}function o(Q){if(!Array.isArray(Q)||Q.length===0)return{code:"invalid_messages",message:"Expected messages to be a non-empty array.",ok:!1};let Y=[];for(let X of Q){if(!F(X)||!L(X.role)||!L(X.content))return{code:"invalid_messages",message:"Expected every message to include role and content string fields.",ok:!1};Y.push({content:X.content,role:X.role})}return{ok:!0,value:Y}}function q(Q){return Q===null||typeof Q==="string"||typeof Q==="number"||typeof Q==="boolean"}function r(Q){return Q==="profile"||Q==="preference"||Q==="reference"||Q==="fact"||Q==="feedback"}function n(Q){return Q==="always"||Q==="never"||Q==="auto"}function N(Q){return Q==="blocker"||Q==="open_loop"||Q==="role_update"||Q==="focus_update"||Q==="project_state"||Q==="generic_project"}function f(Q){return Q==="identity"||Q==="project"||Q==="runtime"||Q==="reference"||Q==="preference"}function E(Q){return Q==="do"||Q==="dont"||Q==="prefer"||Q==="validated_pattern"}function S(Q){return Q==="name"||Q==="role"||Q==="organization"||Q==="location"||Q==="timezone"||Q==="languagePreference"||Q==="currentProject"}function b(Q){return Q==="source_of_truth"||Q==="runbook"||Q==="doc"||Q==="dashboard"||Q==="tracker"}function u(Q){if(Q===void 0)return{ok:!0,value:void 0};if(!F(Q))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch to be an object when provided.",ok:!1};for(let X of["category","factKind","scopeKind","subject","feedbackKind","appliesTo","profileField","preferenceCategory","preferenceValue","referenceKind","referenceTitle","referencePointer","supersedesPointer"])if(Q[X]!==void 0&&!L(Q[X]))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch string fields to be non-empty strings.",ok:!1};if(Q.factKind!==void 0&&!N(Q.factKind))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.factKind to be a supported fact kind.",ok:!1};if(Q.scopeKind!==void 0&&!f(Q.scopeKind))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.scopeKind to be a supported scope kind.",ok:!1};if(Q.feedbackKind!==void 0&&!E(Q.feedbackKind))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.feedbackKind to be a supported feedback kind.",ok:!1};if(Q.profileField!==void 0&&!S(Q.profileField))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.profileField to be a supported profile field.",ok:!1};if(Q.referenceKind!==void 0&&!b(Q.referenceKind))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.referenceKind to be a supported reference kind.",ok:!1};if(Q.tags!==void 0&&(!Array.isArray(Q.tags)||!Q.tags.every(L)))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.tags to be an array of non-empty strings.",ok:!1};if(Q.attributes!==void 0){if(!F(Q.attributes))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.attributes to be an object.",ok:!1};for(let X of Object.values(Q.attributes))if(!q(X))return{code:"invalid_annotations",message:"Expected annotation.metadataPatch.attributes values to be string, number, boolean, or null.",ok:!1}}let Y=F(Q.attributes)?Object.fromEntries(Object.entries(Q.attributes).filter((X)=>q(X[1]))):void 0;return{ok:!0,value:{...L(Q.category)?{category:Q.category}:{},...N(Q.factKind)?{factKind:Q.factKind}:{},...f(Q.scopeKind)?{scopeKind:Q.scopeKind}:{},...L(Q.subject)?{subject:Q.subject}:{},...Array.isArray(Q.tags)?{tags:[...Q.tags]}:{},...Y!==void 0?{attributes:Y}:{},...E(Q.feedbackKind)?{feedbackKind:Q.feedbackKind}:{},...L(Q.appliesTo)?{appliesTo:Q.appliesTo}:{},...S(Q.profileField)?{profileField:Q.profileField}:{},...L(Q.preferenceCategory)?{preferenceCategory:Q.preferenceCategory}:{},...L(Q.preferenceValue)?{preferenceValue:Q.preferenceValue}:{},...b(Q.referenceKind)?{referenceKind:Q.referenceKind}:{},...L(Q.referenceTitle)?{referenceTitle:Q.referenceTitle}:{},...L(Q.referencePointer)?{referencePointer:Q.referencePointer}:{},...L(Q.supersedesPointer)?{supersedesPointer:Q.supersedesPointer}:{}}}}function l(Q){if(Q===void 0)return{ok:!0,value:void 0};if(!Array.isArray(Q))return{code:"invalid_annotations",message:"Expected annotations to be an array when provided.",ok:!1};let Y=[];for(let X of Q){if(!F(X))return{code:"invalid_annotations",message:"Expected every annotation to be an object.",ok:!1};let $=X.messageIndex;if(typeof $!=="number"||!Number.isInteger($))return{code:"invalid_annotations",message:"Expected every annotation to include integer messageIndex.",ok:!1};if($<0)return{code:"invalid_annotations",message:"Expected annotation.messageIndex to be non-negative.",ok:!1};if(X.remember!==void 0&&!n(X.remember))return{code:"invalid_annotations",message:"Expected annotation.remember to be always, never, or auto.",ok:!1};if(X.kindHint!==void 0&&!r(X.kindHint))return{code:"invalid_annotations",message:"Expected annotation.kindHint to be profile, preference, reference, fact, or feedback.",ok:!1};if(X.confirmed!==void 0&&typeof X.confirmed!=="boolean")return{code:"invalid_annotations",message:"Expected annotation.confirmed to be a boolean when provided.",ok:!1};if(X.verified!==void 0&&typeof X.verified!=="boolean")return{code:"invalid_annotations",message:"Expected annotation.verified to be a boolean when provided.",ok:!1};if(X.reason!==void 0&&!L(X.reason))return{code:"invalid_annotations",message:"Expected annotation.reason to be a non-empty string when provided.",ok:!1};let Z=u(X.metadataPatch);if(!Z.ok)return Z;Y.push({messageIndex:$,...X.remember!==void 0?{remember:X.remember}:{},...X.kindHint!==void 0?{kindHint:X.kindHint}:{},...Z.value!==void 0?{metadataPatch:Z.value}:{},...X.confirmed!==void 0?{confirmed:X.confirmed}:{},...X.verified!==void 0?{verified:X.verified}:{},...L(X.reason)?{reason:X.reason}:{}})}return{ok:!0,value:Y}}function t(Q){if(Q===void 0)return{ok:!0,value:void 0};if(Q==="coding_agent"||Q==="general_chat")return{ok:!0,value:Q};return{code:"invalid_retrieval_profile",message:"Expected retrievalProfile to be general_chat or coding_agent.",ok:!1}}function a(Q){if(Q===void 0)return{ok:!0,value:void 0};if(Q==="auto"||Q==="rules-only"||Q==="hybrid")return{ok:!0,value:Q};return{code:"invalid_recall_strategy",message:"Expected strategy to be auto, rules-only, or hybrid.",ok:!1}}function e(Q){if(Q===void 0)return{ok:!0,value:"system_prompt_fragment"};if(Q==="json"||Q==="markdown"||Q==="system_prompt_fragment"||Q==="developer_prompt_fragment")return{ok:!0,value:Q};return{code:"invalid_context_output",message:"Expected output to be json, markdown, system_prompt_fragment, or developer_prompt_fragment.",ok:!1}}function QQ(Q){if(Q===void 0)return{ok:!0,value:void 0};if(Q==="auto"||Q==="rules-only"||Q==="llm-assisted")return{ok:!0,value:Q};return{code:"invalid_extraction_strategy",message:"Expected extractionStrategy to be auto, rules-only, or llm-assisted.",ok:!1}}function K(Q,Y){if(Q===void 0&&!Y)return{ok:!0,value:void 0};if(L(Q))return{ok:!0,value:Q.trim()};return{code:"invalid_idempotency_key",message:"Expected a non-empty idempotencyKey string.",ok:!1}}function XQ(Q){if(Q===void 0)return{ok:!0,value:void 0};if(!F(Q))return{code:"invalid_evidence",message:"Expected evidence to be an object when provided.",ok:!1};if(Q.source!=="user_message"&&Q.source!=="manual_review"&&Q.source!=="system")return{code:"invalid_evidence",message:"Expected evidence.source to be user_message, manual_review, or system.",ok:!1};return{ok:!0,value:{source:Q.source,...L(Q.message)?{message:Q.message}:{},...L(Q.excerpt)?{excerpt:Q.excerpt}:{},...L(Q.sourceUri)?{sourceUri:Q.sourceUri}:{},...Array.isArray(Q.sourceMessageIds)?{sourceMessageIds:Q.sourceMessageIds.filter(L)}:{}}}}function YQ(Q,Y){return{error:{code:Q,message:Y},ok:!1}}function G(Q,Y){return{body:Y,statusCode:Q}}function W(Q,Y,X){return G(Q,YQ(Y,X))}async function ZQ(Q){try{let Y=await Q.json();if(!F(Y))return{code:"invalid_json_body",message:"Expected a JSON object request body.",ok:!1};return{ok:!0,value:Y}}catch{return{code:"invalid_json_body",message:"Expected a valid JSON object request body.",ok:!1}}}function $Q(Q){let Y=Q.headers.get("x-goodmemory-user-id")?.trim();if(!Y)return null;let $=Q.headers.get("x-goodmemory-operations")?.split(",").map((Z)=>Z.trim()).filter(Boolean);return{authorizedOperations:$?.includes("*")?"*":$??[],tenantId:Q.headers.get("x-goodmemory-tenant-id")?.trim()||void 0,userId:Y,workspaceId:Q.headers.get("x-goodmemory-workspace-id")?.trim()||void 0}}function LQ(Q){if(!Q.caller)return{authorized:!1,code:"caller_required",message:"The bridge requires a backend-resolved caller identity.",statusCode:401};if(Q.caller.userId!==Q.scope.userId)return{authorized:!1,code:"scope_not_authorized",message:"Caller userId must match scope.userId.",statusCode:403};if(Q.caller.tenantId&&Q.scope.tenantId!==Q.caller.tenantId)return{authorized:!1,code:"scope_not_authorized",message:"Request scope.tenantId must be present and match the caller tenantId.",statusCode:403};if(Q.scope.tenantId&&!Q.caller.tenantId)return{authorized:!1,code:"scope_not_authorized",message:"Caller must provide tenantId to authorize tenant-scoped memory.",statusCode:403};if(Q.caller.workspaceId&&Q.scope.workspaceId!==Q.caller.workspaceId)return{authorized:!1,code:"scope_not_authorized",message:"Request scope.workspaceId must be present and match the caller workspaceId.",statusCode:403};if(Q.scope.workspaceId&&!Q.caller.workspaceId)return{authorized:!1,code:"scope_not_authorized",message:"Caller must provide workspaceId to authorize workspace-scoped memory.",statusCode:403};if(Q.sensitive&&Q.caller.authorizedOperations!=="*"){if(!Q.caller.authorizedOperations.includes(Q.operation))return{authorized:!1,code:"operation_not_authorized",message:"Caller is not authorized for this scoped memory operation.",statusCode:403}}return{authorized:!0}}function UQ(Q){return{userId:Q.userId,...Q.tenantId?{tenantId:Q.tenantId}:{},...Q.workspaceId?{workspaceId:Q.workspaceId}:{},...Q.agentId?{agentId:Q.agentId}:{},...Q.sessionId?{sessionId:Q.sessionId}:{}}}function jQ(Q){if(typeof Q==="string")return Q;return JSON.stringify(Q)}function H(Q,Y){if(!Y||Y.content.trim().length===0)return;Q.push(Y)}function WQ(Q){return Boolean(Q.profile||Q.preferences.length>0||Q.references.length>0||Q.facts.length>0||Q.feedback.length>0||Q.archives.length>0||Q.episodes.length>0||Q.workingMemory||Q.journal)}function d(Q,Y=[]){let X=Q.metadata.routingDecision.strategyExplanation,$=new Set([...X.warnings??[],...Y]);if(Q.metadata.policyApplied?.includes("semantic_candidates_unavailable"))$.add(M);let Z=g({existingMessages:X.warningMessages,warnings:[...$]});return{...X.fallbackReason?{fallbackReason:X.fallbackReason}:{},llmRefinement:X.llmRefinement,requestedStrategy:X.requestedStrategy,resolvedStrategy:X.resolvedStrategy,semanticTieBreaking:X.semanticTieBreaking,...Z.length>0?{warningMessages:Z}:{},...$.size>0?{warnings:[...$]}:{}}}function _Q(Q){if(Q.requestedStrategy!=="auto"||Q.runtimeInfo?.embeddingEnabled!==!0||Q.runtimeInfo.retrievalPreset)return[];return(Q.recall.metadata.routingDecision.strategyExplanation.resolvedStrategy??Q.recall.metadata.routingDecision.strategy)==="rules-only"?[M]:[]}function AQ(Q){return{...d(Q.recall),fallbackReason:"provider_error",providerFallback:{reason:"provider_error",recoveredStrategy:"rules-only"},requestedStrategy:Q.requestedStrategy,resolvedStrategy:"rules-only",semanticTieBreaking:!1}}function FQ(Q){let Y=[];if(Q.profile){let X=[Q.profile.identity.name,Q.profile.identity.role,Q.profile.identity.organization,...Q.profile.activeContext.goals,...Q.profile.activeContext.currentProjects].filter(L);H(Y,{content:X.join("; "),memoryId:`profile:${Q.profile.userId}`,source:"goodmemory",type:"profile"})}for(let X of Q.preferences)H(Y,{category:X.category,confidence:X.confidence,content:`${X.category}: ${jQ(X.value)}`,memoryId:X.id,source:"goodmemory",tags:X.tags,type:"preference"});for(let X of Q.references)H(Y,{category:X.referenceKind,confidence:X.confidence,content:X.description?`${X.title}: ${X.pointer} - ${X.description}`:`${X.title}: ${X.pointer}`,memoryId:X.id,source:"goodmemory",tags:X.tags,type:"reference"});for(let X of Q.facts)H(Y,{category:X.category,confidence:X.confidence,content:X.content,memoryId:X.id,source:"goodmemory",tags:X.tags,type:"fact"});for(let X of Q.feedback)H(Y,{category:X.kind,confidence:X.confidence,content:X.rule,memoryId:X.id,source:"goodmemory",tags:X.tags,type:"feedback"});for(let X of Q.episodes)H(Y,{confidence:X.confidence,content:X.summary,memoryId:X.id,source:"goodmemory",tags:X.topics,type:"episode"});if(Q.workingMemory)H(Y,{content:[Q.workingMemory.currentGoal,...Q.workingMemory.openLoops,...Q.workingMemory.temporaryDecisions??[]].filter(L).join("; "),memoryId:`working-memory:${Q.workingMemory.userId}:${Q.workingMemory.sessionId}`,source:"goodmemory",type:"working_memory"});if(Q.journal)H(Y,{content:[Q.journal.currentState,Q.journal.taskSpecification,...Q.journal.workflow??[],...Q.journal.errorsAndCorrections??[],...Q.journal.learnings??[],...Q.journal.keyResults??[],...Q.journal.worklog].filter(L).join("; "),memoryId:`session-journal:${Q.journal.userId}:${Q.journal.sessionId}`,source:"goodmemory",type:"session_journal"});return Y}async function BQ(Q,Y,X){if(!L(Y.query))return W(400,"invalid_query","Expected query to be a non-empty string.");let $=t(Y.retrievalProfile);if(!$.ok)return W(400,$.code,$.message);let Z=a(Y.strategy);if(!Z.ok)return W(400,Z.code,Z.message);let U=e(Y.output);if(!U.ok)return W(400,U.code,U.message);let j=typeof Y.maxTokens==="number"&&Number.isFinite(Y.maxTokens)?Math.max(1,Math.floor(Y.maxTokens)):void 0,_=Z.value??"auto",B=y(Q),J=B?.retrievalPreset!==void 0?_:_==="hybrid"?"hybrid":"rules-only",R={scope:X,query:Y.query,...$.value?{retrievalProfile:$.value}:{},strategy:J},V,k=void 0;try{V=await Q.recall(R)}catch(h){if(_==="rules-only"||!m(h))throw h;V=await Q.recall({...R,strategy:"rules-only"}),k=AQ({recall:V,requestedStrategy:_})}let T=await Q.buildContext({recall:V,output:U.value,...j?{maxTokens:j}:{}}),x=FQ(V),P=T.traceId??V.metadata.traceId;return G(200,{context:{content:T.content,estimatedTokens:T.estimatedTokens,omittedSections:T.omittedSections,output:T.output},contextText:T.content,contractVersion:D,hasContext:WQ(V),itemCount:x.length,items:x,ok:!0,operation:"recall-context",routing:k??{...d(V,_Q({recall:V,requestedStrategy:_,runtimeInfo:B})),requestedStrategy:_},...P?{traceId:P}:{}})}async function GQ(Q,Y,X){let $=o(Y.messages);if(!$.ok)return W(400,$.code,$.message);let Z=l(Y.annotations);if(!Z.ok)return W(400,Z.code,Z.message);let U=QQ(Y.extractionStrategy);if(!U.ok)return W(400,U.code,U.message);let j=Y.mode===void 0?"sync":Y.mode;if(j!=="sync"&&j!=="async")return W(400,"invalid_mode","Expected mode to be sync or async.");let _=K(Y.idempotencyKey,j==="async");if(!_.ok)return W(400,_.code,_.message);let B={scope:X,messages:$.value,...Z.value?{annotations:Z.value}:{},...U.value?{extractionStrategy:U.value}:{},...L(Y.locale)?{locale:Y.locale}:{}};if(j==="async")try{let J=await Q.jobs.enqueueRemember({...B,idempotencyKey:_.value,reason:"manual_enqueue"});return G(200,{contractVersion:D,idempotency:{handledBy:"goodmemory_jobs",key:_.value},job:J,mode:j,ok:!0,operation:"remember"})}catch(J){if(F(J)&&J.code==="idempotency_conflict")return W(409,"idempotency_conflict","GoodMemory job idempotency key already exists for a different payload.");throw J}let O=await Q.remember(B);return G(200,{contractVersion:D,idempotency:_.value?{handledBy:"consumer_provenance_only",key:_.value}:{handledBy:"none"},mode:j,ok:!0,operation:"remember",result:O})}async function VQ(Q,Y,X){if(!L(Y.signal))return W(400,"invalid_signal","Expected signal to be a non-empty string.");let $=K(Y.idempotencyKey,!0);if(!$.ok)return W(400,$.code,$.message);let Z=F(Y.source)?Y.source:{},U=await Q.feedback({scope:X,signal:Y.signal,...L(Y.locale)?{locale:Y.locale}:{}});return G(200,{contractVersion:D,idempotency:{handledBy:"consumer_provenance_only",key:$.value},ok:!0,operation:"feedback",provenance:{...L(Z.eventId)?{eventId:Z.eventId}:{},...L(Z.proposalId)?{proposalId:Z.proposalId}:{},...L(Z.reason)?{reason:Z.reason}:{},...L(Z.reviewDecision)?{reviewDecision:Z.reviewDecision}:{},...L(Z.system)?{system:Z.system}:{}},result:U})}async function HQ(Q,Y,X){if(!L(Y.memoryId))return W(400,"invalid_memory_id","Expected memoryId to be a non-empty string.");let $=await Q.forget({memoryId:Y.memoryId,scope:X});return G(200,{contractVersion:D,ok:!0,operation:"forget",result:$})}async function DQ(Q,Y,X){let $=Y.includeRuntime===!0,Z=await Q.exportMemory({includeRuntime:$,scope:X});return G(200,{contractVersion:D,exported:Z,includeRuntime:$,ok:!0,operation:"export"})}async function JQ(Q,Y,X){let $=F(Y.target)?Y.target:null;if(!$||!L($.memoryId))return W(400,"target_memory_id_required","Expected target.memoryId. Query-resolved revision targets are out of scope.");if(!F(Y.revision)||!L(Y.revision.content))return W(400,"invalid_revision","Expected revision.content to be a non-empty string.");if(!L(Y.reason))return W(400,"invalid_reason","Expected reason to be a non-empty string.");let Z=K(Y.idempotencyKey,!0);if(!Z.ok)return W(400,Z.code,Z.message);let U=Z.value;if(!U)return W(400,"invalid_idempotency_key","Expected a non-empty idempotencyKey string.");let j=XQ(Y.evidence);if(!j.ok)return W(400,j.code,j.message);let _=await Q.reviseMemory({evidence:j.value,idempotencyKey:U,reason:Y.reason,revision:{content:Y.revision.content},scope:X,target:{memoryId:$.memoryId}});return G(200,{contractVersion:D,idempotency:{handledBy:"goodmemory_revision",key:U},ok:!0,operation:"revise",result:_})}function TQ(Q){if(Q==="/memory/recall-context")return"recall-context";if(Q==="/memory/remember")return"remember";if(Q==="/memory/feedback")return"feedback";if(Q==="/memory/forget")return"forget";if(Q==="/memory/export")return"export";if(Q==="/memory/revise")return"revise";return null}async function zQ(Q){if(Q.operation==="recall-context")return BQ(Q.memory,Q.body,Q.scope);if(Q.operation==="remember")return GQ(Q.memory,Q.body,Q.scope);if(Q.operation==="feedback")return VQ(Q.memory,Q.body,Q.scope);if(Q.operation==="forget")return HQ(Q.memory,Q.body,Q.scope);if(Q.operation==="export")return DQ(Q.memory,Q.body,Q.scope);return JQ(Q.memory,Q.body,Q.scope)}function kQ(Q){let Y=Q.resolveCaller??$Q,X=Q.authorize??LQ;async function $(Z){if(Z.method==="GET"&&new URL(Z.url).pathname==="/healthz")return G(200,{...Q.healthMetadata??{},contractVersion:D,ok:!0,status:"ok"});if(Z.method==="GET"&&new URL(Z.url).pathname==="/.well-known/goodmemory.json")return G(200,I());if(Z.method!=="POST")return W(405,"method_not_allowed","GoodMemory bridge endpoints require POST.");let U=TQ(new URL(Z.url).pathname);if(!U)return W(404,"not_found","Unknown GoodMemory bridge endpoint.");let j=await ZQ(Z);if(!j.ok)return W(400,j.code,j.message);let _=i(j.value.scope);if(!_.ok)return W(400,_.code,_.message);let B=await X({body:j.value,caller:Y(Z,j.value),operation:U,request:Z,scope:_.value,sensitive:v.has(U)});if(!B.authorized)return W(B.statusCode??403,B.code??"operation_not_authorized",B.message??"Caller is not authorized for this memory operation.");try{return await zQ({body:j.value,memory:Q.memory,operation:U,scope:_.value})}catch{return W(500,"bridge_operation_failed","GoodMemory bridge operation failed.")}}return{async fetch(Z){let U=await $(Z);return new Response(JSON.stringify(U.body),{headers:{"content-type":"application/json"},status:U.statusCode})},handle:$}}function xQ(){return{preset:"default",profiles:[{assistantOutputs:{mode:"confirmed_or_verified_only"},extends:"default",id:"life-coach",when:{agentId:"life-coach"}}]}}function PQ(Q){if(Q.ok!==!0||!Array.isArray(Q.items))throw Error("Expected a successful GoodMemory recall-context response.");let Y=Q.items.filter(F).map((X)=>({content:L(X.content)?X.content:"",memoryId:L(X.memoryId)?X.memoryId:"",type:typeof X.type==="string"?X.type:"fact"})).filter((X)=>X.memoryId.length>0&&X.content.length>0);return{context:typeof Q.contextText==="string"?Q.contextText:"",memories:Y.map((X)=>({id:X.memoryId,kind:X.type,source:"goodmemory-http-bridge",text:X.content})),metadata:{hasContext:Q.hasContext===!0,itemCount:typeof Q.itemCount==="number"?Q.itemCount:Y.length,policyBoundary:"product_owned",source:"goodmemory-http-bridge",...L(Q.traceId)?{traceId:Q.traceId}:{}}}}function hQ(Q){return UQ({agentId:Q.agentId??"life-coach",sessionId:Q.sessionId,tenantId:Q.tenantId,userId:Q.userId,workspaceId:Q.workspaceId})}export{PQ as toOneLifeMemoryContextResponse,hQ as toLifeCoachScope,xQ as createLifeCoachHttpRememberConfig,kQ as createGoodMemoryHttpMemoryBridge,FQ as buildGoodMemoryHttpMemoryItems,D as GOODMEMORY_HTTP_MEMORY_BRIDGE_CONTRACT_VERSION};

@@ -24,2 +24,3 @@ import type { SessionArchive } from "../domain/evolutionRecords";

laneCaps: Record<RecallRerankCollection, number>;
protectedPassHeadKeys?: string[];
referenceTime: string;

@@ -35,2 +36,3 @@ }

export declare function mergeRecallRerankPools<T extends object>(input: {
distinctPassHeadProtection?: boolean;
preRankLimit: number;

@@ -37,0 +39,0 @@ primaryReserveLimit: number;

@@ -12,8 +12,8 @@ # GoodMemory 15-Minute App Integration

The registry commands below apply after `goodmemory@0.7.1` is published. Before
publication, install the verified local `goodmemory-0.7.1.tgz` produced by the
The registry commands below apply after `goodmemory@0.7.2` is published. Before
publication, install the verified local `goodmemory-0.7.2.tgz` produced by the
release workflow.
```bash
npm install goodmemory@0.7.1
npm install goodmemory@0.7.2
```

@@ -24,3 +24,3 @@

```bash
bun add goodmemory@0.7.1
bun add goodmemory@0.7.2
```

@@ -27,0 +27,0 @@

# GoodMemory Claude Code Setup Guide
This is the canonical global CLI `0.7.1` Claude Code installed-host setup path.
This is the canonical global CLI `0.7.2` Claude Code installed-host setup path.

@@ -10,3 +10,3 @@ ## Install

```bash
npm install -g goodmemory@0.7.1
npm install -g goodmemory@0.7.2
goodmemory -V

@@ -23,3 +23,3 @@ ```

```bash
npm install -g ./goodmemory-0.7.1.tgz
npm install -g ./goodmemory-0.7.2.tgz
goodmemory -V

@@ -59,7 +59,7 @@ ```

```bash
npm install goodmemory@0.7.1
npm install goodmemory@0.7.2
npx goodmemory claude bootstrap --user-id <user-id> --workspace-id <workspace-id>
```
Bun services can install the same package with `bun add goodmemory@0.7.1`.
Bun services can install the same package with `bun add goodmemory@0.7.2`.

@@ -66,0 +66,0 @@ This creates repo-local scaffolding only:

# GoodMemory Codex Handoff Setup Guide
This is the canonical global CLI `0.7.1` Codex installed-host setup path.
This is the canonical global CLI `0.7.2` Codex installed-host setup path.

@@ -10,3 +10,3 @@ ## Install

```bash
npm install -g goodmemory@0.7.1
npm install -g goodmemory@0.7.2
goodmemory -V

@@ -23,3 +23,3 @@ ```

```bash
npm install -g ./goodmemory-0.7.1.tgz
npm install -g ./goodmemory-0.7.2.tgz
goodmemory -V

@@ -59,7 +59,7 @@ ```

```bash
npm install goodmemory@0.7.1
npm install goodmemory@0.7.2
npx goodmemory codex bootstrap --user-id <user-id> --workspace-id <workspace-id>
```
Bun services can install the same package with `bun add goodmemory@0.7.1`.
Bun services can install the same package with `bun add goodmemory@0.7.2`.

@@ -66,0 +66,0 @@ This creates repo-local scaffolding only:

@@ -41,3 +41,3 @@ # GoodMemory Python HTTP Integration Bridge

```bash
bun add goodmemory@0.7.1
bun add goodmemory@0.7.2

@@ -44,0 +44,0 @@ GOODMEMORY_HTTP_BRIDGE_TOKEN="replace-with-service-token" \

# GoodMemory Reference Integration Guide
This is the canonical packaged `0.7.1` reference path for chatbox/copilot-style integration.
This is the canonical packaged `0.7.2` reference path for chatbox/copilot-style integration.

@@ -10,3 +10,3 @@ ## Install

```bash
npm install goodmemory@0.7.1
npm install goodmemory@0.7.2
```

@@ -17,3 +17,3 @@

```bash
bun add goodmemory@0.7.1
bun add goodmemory@0.7.2
```

@@ -24,3 +24,3 @@

```bash
npm install ./goodmemory-0.7.1.tgz
npm install ./goodmemory-0.7.2.tgz
```

@@ -27,0 +27,0 @@

@@ -20,8 +20,8 @@ # GoodMemory Standalone MCP Setup Guide

The registry command below applies after `goodmemory@0.7.1` is published.
Before publication, install the verified local `goodmemory-0.7.1.tgz` produced
The registry command below applies after `goodmemory@0.7.2` is published.
Before publication, install the verified local `goodmemory-0.7.2.tgz` produced
by the release workflow.
```bash
npm install -g goodmemory@0.7.1
npm install -g goodmemory@0.7.2
```

@@ -28,0 +28,0 @@

@@ -53,2 +53,4 @@ # GoodMemory Documentation Map

server.
- `GoodMemory-Kimi-Code-Setup-Guide.md` - Kimi Code plugin install, MCP
permission boundary, scoped recall/write commands, and lifecycle operations.
- `GoodMemory-Python-HTTP-Integration-Bridge.md` - Python/FastAPI bridge.

@@ -55,0 +57,0 @@ - `cookbooks/langgraph.md` - LangGraph store adapter (TypeScript).

@@ -13,4 +13,4 @@ # GoodMemory

Release source: this is the immutable GoodMemory 0.7.1 stable release source.
Registry commands require goodmemory@0.7.1 to be published. The release workflow
Release source: this is the immutable GoodMemory 0.7.2 stable release source.
Registry commands require goodmemory@0.7.2 to be published. The release workflow
verifies npm latest and artifact integrity before creating the GitHub Release.

@@ -29,3 +29,3 @@

```bash
npm install -g goodmemory@0.7.1
npm install -g goodmemory@0.7.2
goodmemory setup # detects Codex + Claude Code, installs managed wiring

@@ -89,3 +89,3 @@ goodmemory status

Versioned `v0.6.0` evidence is retained unchanged; these are not current
`v0.7.1` production claims until rerun against the current package:
`v0.7.2` production claims until rerun against the current package:

@@ -92,0 +92,0 @@ - [LoCoMo full 10](https://github.com/hjqcan/GoodMemory/blob/main/benchmark-claims/locomo.json): official 0.8708, strict 0.6299, open-domain 0.6146 (59/96); provider-backed recommended profile; dataset CC BY-NC 4.0.

{
"name": "goodmemory",
"version": "0.7.1",
"version": "0.7.2",
"goodmemoryRelease": {

@@ -56,2 +56,3 @@ "installCommandsApplyAfterPublish": true,

"docs/GoodMemory-Inspector-and-Admin-API.md",
"docs/GoodMemory-Kimi-Code-Setup-Guide.md",
"docs/GoodMemory-LanguagePack-Extension-Guide.md",

@@ -282,2 +283,3 @@ "docs/GoodMemory-MCP-Registry-Publishing.md",

"eval:phase-72-longmemeval-answer-revision": "bun run scripts/run-phase-72-longmemeval-answer-revision.ts",
"eval:phase-72-longmemeval-operand-head-preservation-development": "bun run scripts/run-phase-72-longmemeval-operand-head-preservation-development.ts",
"eval:phase-72-longmemeval-temporal-operands-development": "bun run scripts/run-phase-72-longmemeval-temporal-operands-development.ts",

@@ -284,0 +286,0 @@ "eval:phase-72-longmemeval-verifier-chain": "bun run scripts/run-phase-72-longmemeval-verifier-chain.ts",

+15
-15

@@ -7,4 +7,4 @@ # GoodMemory

> **Release source:** this is the immutable `0.7.1` stable release source.
> Registry commands require `goodmemory@0.7.1` to be published. The release
> **Release source:** this is the immutable `0.7.2` stable release source.
> Registry commands require `goodmemory@0.7.2` to be published. The release
> workflow verifies npm `latest` and artifact integrity before creating the

@@ -66,3 +66,3 @@ > GitHub Release.

```bash
npm install -g goodmemory@0.7.1
npm install -g goodmemory@0.7.2
goodmemory setup --host codex

@@ -87,3 +87,3 @@ goodmemory status codex --workspace-root .

```bash
npm install -g goodmemory@0.7.1
npm install -g goodmemory@0.7.2
goodmemory setup

@@ -116,3 +116,3 @@ ```

not current-package performance claims or claims about the zero-provider
default; no row is promoted as a current `v0.7.1` claim until a fresh run passes
default; no row is promoted as a current `v0.7.2` claim until a fresh run passes
the same gate.

@@ -136,3 +136,3 @@ LongMemEval is withdrawn pending a clean rerun: the historical rules-only path

referenced raw artifacts, which are not all stored in the Git tree. They are
not current-production claims for `v0.7.1`.
not current-production claims for `v0.7.2`.

@@ -240,3 +240,3 @@ <!-- historical-evidence-table:start -->

- **You are, or run inside, Claude Code or Codex** →
`npm install -g goodmemory@0.7.1 && goodmemory setup`. Unsure what is already
`npm install -g goodmemory@0.7.2 && goodmemory setup`. Unsure what is already
wired? Run `goodmemory adopt` (add `--json` for a machine-readable plan): it

@@ -349,3 +349,3 @@ inspects `.claude/`, `.codex/`, and existing MCP config, then prints the exact

After GoodMemory `0.7.1` is published, it has two normal registry install paths.
After GoodMemory `0.7.2` is published, it has two normal registry install paths.
Before publication, use the tarball verification path below.

@@ -357,3 +357,3 @@

```bash
npm install -g goodmemory@0.7.1
npm install -g goodmemory@0.7.2
goodmemory setup

@@ -366,7 +366,7 @@ goodmemory status

```bash
npm install goodmemory@0.7.1
npm install goodmemory@0.7.2
```
If you want to type `goodmemory` directly, install the global CLI.
A project-local `npm install goodmemory@0.7.1` does not put `goodmemory` on your shell `PATH`.
A project-local `npm install goodmemory@0.7.2` does not put `goodmemory` on your shell `PATH`.
Use `npx goodmemory`, `npm exec -- goodmemory`, or `./node_modules/.bin/goodmemory`

@@ -382,3 +382,3 @@ from that project instead.

```bash
bun add goodmemory@0.7.1
bun add goodmemory@0.7.2
```

@@ -389,3 +389,3 @@

```bash
npm install ./goodmemory-0.7.1.tgz
npm install ./goodmemory-0.7.2.tgz
```

@@ -402,3 +402,3 @@

```bash
npm install -g goodmemory@0.7.1
npm install -g goodmemory@0.7.2
goodmemory setup

@@ -1236,3 +1236,3 @@ goodmemory status

The `goodmemory` command on your shell `PATH` is the global CLI installed with
`npm install -g goodmemory@0.7.1`. In a local dependency install, invoke the
`npm install -g goodmemory@0.7.2`. In a local dependency install, invoke the
package bin as `npx goodmemory`, `npm exec -- goodmemory`, or

@@ -1239,0 +1239,0 @@ `./node_modules/.bin/goodmemory`. The repo-local `bun run goodmemory` script is

@@ -7,4 +7,4 @@ # GoodMemory

> **发布源码:**这是不可变的 `0.7.1` 稳定发布源码。Registry 命令要求
> `goodmemory@0.7.1` 已发布;release workflow 会先校验 npm `latest`
> **发布源码:**这是不可变的 `0.7.2` 稳定发布源码。Registry 命令要求
> `goodmemory@0.7.2` 已发布;release workflow 会先校验 npm `latest`
> 与制品完整性,再创建 GitHub Release。

@@ -29,3 +29,3 @@

```bash
npm install -g goodmemory@0.7.1
npm install -g goodmemory@0.7.2
goodmemory setup

@@ -50,3 +50,3 @@ ```

LanguagePack 与召回语义,它们对当前包而言只是历史证据,不是当前版本性能声明,也不代表
零 provider 默认路径;在 `v0.7.1` 完成同等 fresh run 之前,当前声明表保持为空。
零 provider 默认路径;在 `v0.7.2` 完成同等 fresh run 之前,当前声明表保持为空。
LongMemEval 已撤下并等待 clean rerun:历史 rules-only 路径使用了 answer annotation,

@@ -148,3 +148,3 @@ 后来的 label-free 路径又把原始 `answer_*` session ID 暴露给检索和 reader。

- **你是、或运行在 Claude Code / Codex 里** →
`npm install -g goodmemory@0.7.1 && goodmemory setup`。不确定环境里已经装了
`npm install -g goodmemory@0.7.2 && goodmemory setup`。不确定环境里已经装了
什么?运行 `goodmemory adopt`(加 `--json` 得到机器可读方案):它会检测

@@ -244,3 +244,3 @@ `.claude/`、`.codex/` 和已有的 MCP 配置,并打印出针对你环境的确切下一条命令。

GoodMemory `0.7.1` 发布后有两条常用 registry 安装路径。发布前请使用下方 tarball 验证路径。
GoodMemory `0.7.2` 发布后有两条常用 registry 安装路径。发布前请使用下方 tarball 验证路径。

@@ -250,3 +250,3 @@ 如果你想给已安装的 coding agent 增加记忆能力,使用全局 CLI:

```bash
npm install -g goodmemory@0.7.1
npm install -g goodmemory@0.7.2
goodmemory setup

@@ -259,7 +259,7 @@ goodmemory status

```bash
npm install goodmemory@0.7.1
npm install goodmemory@0.7.2
```
如果你想直接输入 `goodmemory`,必须安装全局 CLI。
项目内 `npm install goodmemory@0.7.1` 不会把 `goodmemory` 放进 shell 的 `PATH`。
项目内 `npm install goodmemory@0.7.2` 不会把 `goodmemory` 放进 shell 的 `PATH`。
这种本地依赖安装只能从该项目里用 `npx goodmemory`、

@@ -275,3 +275,3 @@ `npm exec -- goodmemory` 或 `./node_modules/.bin/goodmemory` 调用。

```bash
bun add goodmemory@0.7.1
bun add goodmemory@0.7.2
```

@@ -282,3 +282,3 @@

```bash
npm install ./goodmemory-0.7.1.tgz
npm install ./goodmemory-0.7.2.tgz
```

@@ -293,3 +293,3 @@

```bash
npm install -g goodmemory@0.7.1
npm install -g goodmemory@0.7.2
goodmemory setup

@@ -980,3 +980,3 @@ goodmemory status

shell `PATH` 上的裸 `goodmemory` 命令来自
`npm install -g goodmemory@0.7.1` 安装的全局 CLI。本地 dependency install
`npm install -g goodmemory@0.7.2` 安装的全局 CLI。本地 dependency install
里,用 `npx goodmemory`、`npm exec -- goodmemory` 或

@@ -983,0 +983,0 @@ `./node_modules/.bin/goodmemory` 调用 package bin。repo-local

@@ -11,3 +11,3 @@ {

},
"version": "0.7.1",
"version": "0.7.2",
"packages": [

@@ -18,3 +18,3 @@ {

"identifier": "goodmemory",
"version": "0.7.1",
"version": "0.7.2",
"runtimeHint": "npx",

@@ -21,0 +21,0 @@ "transport": {

import{readFileSync as W}from"node:fs";var X=new URL("../../package.json",import.meta.url),Q;function Y(){if(Q)return Q;let z=JSON.parse(W(X,"utf8")),x=z.goodmemoryRelease;if(typeof z.version!=="string"||z.version.length===0||typeof x?.installCommandsApplyAfterPublish!=="boolean"||typeof x.npmDistTag!=="string"||x.npmDistTag.length===0||x.status!=="release-candidate"&&x.status!=="stable")throw Error("Unable to read GoodMemory package release metadata.");return Q={goodmemoryRelease:{installCommandsApplyAfterPublish:x.installCommandsApplyAfterPublish,npmDistTag:x.npmDistTag,status:x.status},version:z.version},Q}var q="https://github.com/hjqcan/GoodMemory",V="https://goodmemory.vibenest.net";function $(z={}){let x=z.packageMetadata??Y(),I=z.version??x.version;return{schemaVersion:"goodmemory.capability/v2",name:"goodmemory",version:I,kind:"memory-layer",summary:"Durable user/project memory layer for chat apps, copilots, and coding agents.",description:"GoodMemory is the product memory layer between an app or installed agent host and the model runtime: write selected facts, recall the right context, inject it into the next turn, audit what happened, and delete it when it is wrong.",notA:["llm","agent-framework","vector-database","rag-system"],license:"MIT",homepage:`${q}#readme`,repository:q,documentation:{inspector:`${q}/blob/main/docs/GoodMemory-Inspector-and-Admin-API.md`,llmsTxt:`${q}/blob/main/llms.txt`,readme:`${q}#readme`,quickstart:`${q}#quickstart-codex-or-claude-code-memory`},install:{npmGlobal:`npm install -g goodmemory@${I}`,npmPackage:`npm install goodmemory@${I}`,bun:`bun add goodmemory@${I}`},releaseStatus:{...x.goodmemoryRelease,tarball:`goodmemory-${I}.tgz`},memoryApi:["remember","recall","buildContext","feedback","forget","exportMemory","deleteAllMemory"],onboarding:[{audience:"installed-coding-agent-host",when:"You are, or run inside, Claude Code or Codex.",method:"cli",steps:[`npm install -g goodmemory@${I}`,"goodmemory setup","goodmemory status"],autoDetect:"goodmemory adopt",docs:`${q}#quickstart-codex-or-claude-code-memory`},{audience:"mcp-client",when:"You speak the Model Context Protocol (Cursor, Windsurf, Cline, Claude Desktop, Gemini CLI, OpenCode, or a custom MCP client).",method:"mcp",mcpServer:{command:"goodmemory-mcp",args:["--standalone","--user-id","YOUR_USER_ID"]},autoDetect:"goodmemory adopt",docs:`${q}#standalone-mcp-for-any-client`},{audience:"framework-agent-or-backend",when:"You are a framework agent (LangGraph, custom loop) or a backend that calls memory as an HTTP service.",method:"http",endpoint:V,selfHost:"goodmemory-http-bridge --recommended OR GOODMEMORY_PROFILE=agent-recommended goodmemory-http-bridge",pythonClient:"pip install goodmemory-client",docs:`${q}#pythonfastapi-http-bridge`}],mcp:{command:"goodmemory-mcp",standaloneArgs:["--standalone","--user-id","YOUR_USER_ID"],primaryTools:["goodmemory_get_context","goodmemory_remember"],readOnlyToolCount:8,writeTool:"goodmemory_remember (opt-in via --allow-write)",registryName:"io.github.hjqcan/goodmemory",docs:`${q}#standalone-mcp-for-any-client`},http:{hosted:V,liveness:`${V}/healthz`,wellKnown:`${V}/.well-known/goodmemory.json`,auth:"bearer-token",selfHost:"goodmemory-http-bridge --recommended OR GOODMEMORY_PROFILE=agent-recommended goodmemory-http-bridge",endpoints:{recall:"POST /memory/recall-context",remember:"POST /memory/remember",feedback:"POST /memory/feedback",export:"POST /memory/export",forget:"POST /memory/forget",revise:"POST /memory/revise"},pythonClient:"goodmemory-client (PyPI)",docs:`${q}#pythonfastapi-http-bridge`},benchmarks:{currentClaims:[],historicalEvidence:{url:`${q}/tree/main/benchmark-claims`,note:`The v0.6.0 LoCoMo, BEAM, and MemoryAgentBench results, plus older LongMemEval and ImplicitMemBench runs, remain reproducible versioned evidence. None is a current ${I} production claim until rerun against this package line. LongMemEval and ImplicitMemBench remain internal evidence.`}},capabilities:{localFirst:!0,embeddingFreeDefault:!0,builtInLanguagePacks:["en","zh-Hans","zh-Hant","ja","ko","fr","es"],durableStore:"sqlite (default), postgres (opt-in)",audit:!0,deletion:!0,localInspector:"goodmemory inspector serve (loopback-only React console and /admin/v1 API)",correctByDefaultRecall:"Recall never silently degrades: a downgraded strategy carries routing.warnings (semantic_recall_inactive) and routing.warningMessages (semantic recall inactive — set strategy:hybrid + RETRIEVAL_PRESET) instead of quietly returning the lexical floor."},canonicalSources:{prose:`${q}#readme`,benchmarks:`${q}/tree/main/benchmark-claims`,note:"Benchmark entries keep explicit measuredPackageVersion provenance; a package version bump never relabels historical results. Source declarations remain in benchmark-claims/*.json."}}}
export{$ as a};

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display