@remnic/core 9.66.4 → 9.66.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-admin-ops-surface.js +27 -27
- package/dist/access-authorization-probe.js +28 -28
- package/dist/access-boundary.js +27 -27
- package/dist/access-cli.js +94 -93
- package/dist/access-cli.js.map +1 -1
- package/dist/access-extraction-force-flush.js +27 -27
- package/dist/access-http-query.js +29 -29
- package/dist/access-http.js +45 -44
- package/dist/access-identity-continuity-surface.js +27 -27
- package/dist/access-lcm-surface.js +27 -27
- package/dist/access-mcp-output-schemas.d.ts +1 -1
- package/dist/access-mcp-output-schemas.js +1 -1
- package/dist/access-mcp-tool-names.d.ts +19 -0
- package/dist/access-mcp-tool-names.js +22 -0
- package/dist/access-mcp.js +37 -36
- package/dist/access-namespace-preflight.js +27 -27
- package/dist/access-observe-write-surface.js +27 -27
- package/dist/access-offline-manifest.js +3 -3
- package/dist/access-operations-batch.js +30 -30
- package/dist/access-operations.js +34 -34
- package/dist/access-recall-concurrency.js +27 -27
- package/dist/access-recall-response.js +27 -27
- package/dist/access-recall-surface.js +27 -27
- package/dist/access-schema.js +5 -5
- package/dist/access-service.js +27 -27
- package/dist/access-surface-catalog.js +29 -29
- package/dist/active-recall.js +5 -5
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/registry.js +2 -2
- package/dist/briefing.js +9 -9
- package/dist/{capsule-crypto-GWVG7LGC.js → capsule-crypto-7FJQINUR.js} +2 -2
- package/dist/capsule-crypto-7FJQINUR.js.map +1 -0
- package/dist/causal-behavior.js +2 -2
- package/dist/causal-chain.js +2 -2
- package/dist/causal-consolidation.js +12 -12
- package/dist/causal-retrieval.js +2 -2
- package/dist/causal-trajectory.js +1 -1
- package/dist/{chunk-LEPOP46W.js → chunk-227UFSEQ.js} +4 -4
- package/dist/{chunk-OWHERGF2.js → chunk-2NLLXCJG.js} +2 -2
- package/dist/{chunk-AU7Q3LSC.js → chunk-2QSZNTDO.js} +4 -4
- package/dist/{chunk-6DTQSLER.js → chunk-34UT52QN.js} +2 -2
- package/dist/{chunk-562Q236T.js → chunk-3AJZMX4G.js} +2 -2
- package/dist/{chunk-G5TYMG7R.js → chunk-475F5NXP.js} +2 -2
- package/dist/{chunk-SNFWXG5G.js → chunk-4WCGTONM.js} +2 -2
- package/dist/{chunk-RNRDH4ZO.js → chunk-4XZPXNSO.js} +51 -51
- package/dist/{chunk-6L6V2OIX.js → chunk-5ACBDUD7.js} +3 -3
- package/dist/{chunk-SY7ASLC6.js → chunk-5MOGH5KI.js} +5 -5
- package/dist/{chunk-7IEFFOIC.js → chunk-5ZS6RSZI.js} +2 -2
- package/dist/{chunk-BUKK5SWA.js → chunk-7LCGFUMB.js} +4 -4
- package/dist/{chunk-ZYKNDRUJ.js → chunk-7XOG75AU.js} +3 -3
- package/dist/{chunk-FH4BB7F4.js → chunk-7Y5PVMNW.js} +5 -5
- package/dist/{chunk-RNVXKTIA.js → chunk-A2GLFKH5.js} +2 -2
- package/dist/{chunk-2PSX5BJU.js → chunk-AWGXR2PV.js} +2 -2
- package/dist/{chunk-JVDAIASW.js → chunk-BBDC7THW.js} +2 -2
- package/dist/{chunk-W7O7PH5E.js → chunk-CDCQHE6C.js} +2 -2
- package/dist/{chunk-27JH2KKM.js → chunk-CGFQE4JY.js} +3 -3
- package/dist/{chunk-HQJM3BKH.js → chunk-CTCGHNWN.js} +5 -5
- package/dist/{chunk-636UUVOZ.js → chunk-CXMY6YY7.js} +13 -13
- package/dist/{chunk-BE4Y6GK6.js → chunk-DJZWNKFO.js} +2 -2
- package/dist/{chunk-T4WDJPEZ.js → chunk-E4RMZGRS.js} +2 -2
- package/dist/{chunk-T4WDJPEZ.js.map → chunk-E4RMZGRS.js.map} +1 -1
- package/dist/{chunk-OT3GGOFW.js → chunk-EDPJFQIP.js} +2 -2
- package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
- package/dist/{chunk-WTRFM4SF.js → chunk-F7CAL3GZ.js} +2 -2
- package/dist/{chunk-IHK5KTOC.js → chunk-GBGLNWBW.js} +2 -2
- package/dist/{chunk-6IL5FFHH.js → chunk-GICQOFYG.js} +2 -2
- package/dist/{chunk-YUYARGKM.js → chunk-GO657WPH.js} +2 -2
- package/dist/{chunk-HAF3PUMO.js → chunk-GUG4LW4I.js} +3 -3
- package/dist/{chunk-645WOU5I.js → chunk-H7BZBSP6.js} +4 -4
- package/dist/{chunk-YJDKSDIU.js → chunk-HBXIGKYD.js} +2 -2
- package/dist/{chunk-5BIOXQGN.js → chunk-HUL6X5SZ.js} +2 -2
- package/dist/{chunk-MARZW7DB.js → chunk-I4WQPUCY.js} +2 -2
- package/dist/{chunk-UYA36DQ7.js → chunk-IGOINKTD.js} +1 -1
- package/dist/{chunk-UYA36DQ7.js.map → chunk-IGOINKTD.js.map} +1 -1
- package/dist/{chunk-PMMNP5GZ.js → chunk-IW5DRPZ6.js} +2 -2
- package/dist/{chunk-NHACZAM3.js → chunk-JA5EZ63P.js} +2 -2
- package/dist/{chunk-3E4REX7E.js → chunk-JDKSSYSP.js} +2 -2
- package/dist/{chunk-3A2Z4OOS.js → chunk-KDYU3KZT.js} +10 -10
- package/dist/{chunk-NTZ3452G.js → chunk-KQNL5VE6.js} +2 -2
- package/dist/{chunk-VVWPY5U7.js → chunk-LICB4CEI.js} +2 -2
- package/dist/{chunk-Y7LFWOX6.js → chunk-LRGYB2YF.js} +3 -3
- package/dist/{chunk-Y5U72X3D.js → chunk-LSRJDI6E.js} +2 -2
- package/dist/{chunk-C3LUYZLX.js → chunk-MCWEVIJD.js} +3 -3
- package/dist/{chunk-4EX26ZS3.js → chunk-MTYS6XMP.js} +36 -36
- package/dist/{chunk-6NA527W2.js → chunk-NCYS4EJV.js} +64 -64
- package/dist/{chunk-I7NBTRLR.js → chunk-O7ERGZDA.js} +2 -2
- package/dist/{chunk-K3CQQNMX.js → chunk-OHLDQ64J.js} +2 -2
- package/dist/{chunk-4BRBSON5.js → chunk-OTB4IRDI.js} +2 -2
- package/dist/{chunk-KWIGDKM2.js → chunk-PUTLM67J.js} +2 -2
- package/dist/{chunk-BQVWC67C.js → chunk-QIRBQH5P.js} +16 -26
- package/dist/chunk-QIRBQH5P.js.map +1 -0
- package/dist/{chunk-322MSJYS.js → chunk-SDCEOIV7.js} +5 -5
- package/dist/{chunk-5C3OQ253.js → chunk-SFUCQ7ZQ.js} +9 -9
- package/dist/{chunk-AQHDMA4A.js → chunk-TLSHEAHI.js} +2 -2
- package/dist/{chunk-GPFZFCRN.js → chunk-TR76RJNY.js} +1 -1
- package/dist/{chunk-IP7KIW7W.js → chunk-WFG3SZ6I.js} +6 -6
- package/dist/{chunk-SACAOBDB.js → chunk-WUEDPNTM.js} +1 -1
- package/dist/{chunk-UVYI6VIX.js → chunk-X7Y7WX73.js} +1 -1
- package/dist/{chunk-JCUG7AXZ.js → chunk-XJJYSX6F.js} +4 -4
- package/dist/{chunk-JGXMA6HL.js → chunk-YHCBJULX.js} +2 -2
- package/dist/{chunk-5VLXQFOS.js → chunk-YRS2SZM7.js} +2 -2
- package/dist/{chunk-F5FHDDOV.js → chunk-YY7IG7EF.js} +2 -2
- package/dist/{chunk-MS2I7JVN.js → chunk-Z3LZFKO5.js} +3 -3
- package/dist/{chunk-DFWO37KT.js → chunk-ZDPDYRSL.js} +21 -18
- package/dist/chunk-ZDPDYRSL.js.map +1 -0
- package/dist/chunk-ZQUVBZI4.js +45 -0
- package/dist/chunk-ZQUVBZI4.js.map +1 -0
- package/dist/cli.js +71 -70
- package/dist/coding/export-okf-codegraph.js +9 -9
- package/dist/coding/pre-action-gate.js +2 -2
- package/dist/compounding/engine.js +9 -9
- package/dist/config.js +5 -5
- package/dist/connectors/codex-materialize-runner.js +9 -9
- package/dist/connectors/index.js +9 -9
- package/dist/convergence-refresh.js +11 -11
- package/dist/conversation-index/backend.js +2 -2
- package/dist/corpus-watermark.js +11 -11
- package/dist/dashboard-runtime.js +2 -2
- package/dist/entity-retrieval.js +10 -10
- package/dist/event-order-recall.js +2 -2
- package/dist/external-wiki-access.js +28 -28
- package/dist/extraction.js +12 -12
- package/dist/harmonic-retrieval.js +1 -1
- package/dist/index.js +123 -122
- package/dist/location/index.js +11 -11
- package/dist/maintenance/memory-governance.js +9 -9
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +9 -9
- package/dist/maintenance/rebuild-memory-projection.js +10 -10
- package/dist/mcp-memory-inspector-app.d.ts +1 -1
- package/dist/mcp-memory-inspector-app.js +1 -1
- package/dist/namespaces/migrate.js +10 -10
- package/dist/namespaces/search.js +4 -4
- package/dist/namespaces/storage.js +9 -9
- package/dist/offline-sync.js +2 -2
- package/dist/operator-doctor-corpus.js +12 -12
- package/dist/operator-toolkit.js +23 -23
- package/dist/orchestration/maintenance.js +17 -17
- package/dist/orchestrator.js +94 -93
- package/dist/resume-bundles.js +6 -6
- package/dist/search/factory.js +3 -3
- package/dist/search/index.js +3 -3
- package/dist/semantic-consolidation.js +10 -10
- package/dist/semantic-rule-promotion.js +9 -9
- package/dist/semantic-rule-verifier.js +9 -9
- package/dist/source-agent-qualifier.js +9 -9
- package/dist/storage.js +8 -8
- package/dist/support-passport/index.js +30 -30
- package/dist/transfer/backup.js +2 -2
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/capsule-import.js +2 -2
- package/dist/transfer/export-okf.js +10 -10
- package/dist/verified-recall.js +9 -9
- package/dist/who-knows-cli.js +10 -10
- package/dist/who-knows.js +9 -9
- package/package.json +2 -2
- package/src/access-http.ts +2 -1
- package/src/access-mcp-output-schemas.ts +1 -1
- package/src/access-mcp-tool-names.test.ts +56 -0
- package/src/access-mcp-tool-names.ts +45 -0
- package/src/access-mcp.test.ts +23 -18
- package/src/access-mcp.ts +16 -35
- package/src/access-surface-catalog.test.ts +2 -2
- package/src/coding/architecture-surfaces.test.ts +2 -2
- package/src/coding/codegraph-surfaces.test.ts +4 -4
- package/src/coding/decision-surfaces.test.ts +1 -1
- package/src/correction/correction-surfaces.test.ts +4 -4
- package/src/mcp-memory-inspector-app.ts +1 -1
- package/src/support-passport/mcp-tools.test.ts +3 -3
- package/dist/chunk-BQVWC67C.js.map +0 -1
- package/dist/chunk-DFWO37KT.js.map +0 -1
- /package/dist/{capsule-crypto-GWVG7LGC.js.map → access-mcp-tool-names.js.map} +0 -0
- /package/dist/{chunk-LEPOP46W.js.map → chunk-227UFSEQ.js.map} +0 -0
- /package/dist/{chunk-OWHERGF2.js.map → chunk-2NLLXCJG.js.map} +0 -0
- /package/dist/{chunk-AU7Q3LSC.js.map → chunk-2QSZNTDO.js.map} +0 -0
- /package/dist/{chunk-6DTQSLER.js.map → chunk-34UT52QN.js.map} +0 -0
- /package/dist/{chunk-562Q236T.js.map → chunk-3AJZMX4G.js.map} +0 -0
- /package/dist/{chunk-G5TYMG7R.js.map → chunk-475F5NXP.js.map} +0 -0
- /package/dist/{chunk-SNFWXG5G.js.map → chunk-4WCGTONM.js.map} +0 -0
- /package/dist/{chunk-RNRDH4ZO.js.map → chunk-4XZPXNSO.js.map} +0 -0
- /package/dist/{chunk-6L6V2OIX.js.map → chunk-5ACBDUD7.js.map} +0 -0
- /package/dist/{chunk-SY7ASLC6.js.map → chunk-5MOGH5KI.js.map} +0 -0
- /package/dist/{chunk-7IEFFOIC.js.map → chunk-5ZS6RSZI.js.map} +0 -0
- /package/dist/{chunk-BUKK5SWA.js.map → chunk-7LCGFUMB.js.map} +0 -0
- /package/dist/{chunk-ZYKNDRUJ.js.map → chunk-7XOG75AU.js.map} +0 -0
- /package/dist/{chunk-FH4BB7F4.js.map → chunk-7Y5PVMNW.js.map} +0 -0
- /package/dist/{chunk-RNVXKTIA.js.map → chunk-A2GLFKH5.js.map} +0 -0
- /package/dist/{chunk-2PSX5BJU.js.map → chunk-AWGXR2PV.js.map} +0 -0
- /package/dist/{chunk-JVDAIASW.js.map → chunk-BBDC7THW.js.map} +0 -0
- /package/dist/{chunk-W7O7PH5E.js.map → chunk-CDCQHE6C.js.map} +0 -0
- /package/dist/{chunk-27JH2KKM.js.map → chunk-CGFQE4JY.js.map} +0 -0
- /package/dist/{chunk-HQJM3BKH.js.map → chunk-CTCGHNWN.js.map} +0 -0
- /package/dist/{chunk-636UUVOZ.js.map → chunk-CXMY6YY7.js.map} +0 -0
- /package/dist/{chunk-BE4Y6GK6.js.map → chunk-DJZWNKFO.js.map} +0 -0
- /package/dist/{chunk-OT3GGOFW.js.map → chunk-EDPJFQIP.js.map} +0 -0
- /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
- /package/dist/{chunk-WTRFM4SF.js.map → chunk-F7CAL3GZ.js.map} +0 -0
- /package/dist/{chunk-IHK5KTOC.js.map → chunk-GBGLNWBW.js.map} +0 -0
- /package/dist/{chunk-6IL5FFHH.js.map → chunk-GICQOFYG.js.map} +0 -0
- /package/dist/{chunk-YUYARGKM.js.map → chunk-GO657WPH.js.map} +0 -0
- /package/dist/{chunk-HAF3PUMO.js.map → chunk-GUG4LW4I.js.map} +0 -0
- /package/dist/{chunk-645WOU5I.js.map → chunk-H7BZBSP6.js.map} +0 -0
- /package/dist/{chunk-YJDKSDIU.js.map → chunk-HBXIGKYD.js.map} +0 -0
- /package/dist/{chunk-5BIOXQGN.js.map → chunk-HUL6X5SZ.js.map} +0 -0
- /package/dist/{chunk-MARZW7DB.js.map → chunk-I4WQPUCY.js.map} +0 -0
- /package/dist/{chunk-PMMNP5GZ.js.map → chunk-IW5DRPZ6.js.map} +0 -0
- /package/dist/{chunk-NHACZAM3.js.map → chunk-JA5EZ63P.js.map} +0 -0
- /package/dist/{chunk-3E4REX7E.js.map → chunk-JDKSSYSP.js.map} +0 -0
- /package/dist/{chunk-3A2Z4OOS.js.map → chunk-KDYU3KZT.js.map} +0 -0
- /package/dist/{chunk-NTZ3452G.js.map → chunk-KQNL5VE6.js.map} +0 -0
- /package/dist/{chunk-VVWPY5U7.js.map → chunk-LICB4CEI.js.map} +0 -0
- /package/dist/{chunk-Y7LFWOX6.js.map → chunk-LRGYB2YF.js.map} +0 -0
- /package/dist/{chunk-Y5U72X3D.js.map → chunk-LSRJDI6E.js.map} +0 -0
- /package/dist/{chunk-C3LUYZLX.js.map → chunk-MCWEVIJD.js.map} +0 -0
- /package/dist/{chunk-4EX26ZS3.js.map → chunk-MTYS6XMP.js.map} +0 -0
- /package/dist/{chunk-6NA527W2.js.map → chunk-NCYS4EJV.js.map} +0 -0
- /package/dist/{chunk-I7NBTRLR.js.map → chunk-O7ERGZDA.js.map} +0 -0
- /package/dist/{chunk-K3CQQNMX.js.map → chunk-OHLDQ64J.js.map} +0 -0
- /package/dist/{chunk-4BRBSON5.js.map → chunk-OTB4IRDI.js.map} +0 -0
- /package/dist/{chunk-KWIGDKM2.js.map → chunk-PUTLM67J.js.map} +0 -0
- /package/dist/{chunk-322MSJYS.js.map → chunk-SDCEOIV7.js.map} +0 -0
- /package/dist/{chunk-5C3OQ253.js.map → chunk-SFUCQ7ZQ.js.map} +0 -0
- /package/dist/{chunk-AQHDMA4A.js.map → chunk-TLSHEAHI.js.map} +0 -0
- /package/dist/{chunk-GPFZFCRN.js.map → chunk-TR76RJNY.js.map} +0 -0
- /package/dist/{chunk-IP7KIW7W.js.map → chunk-WFG3SZ6I.js.map} +0 -0
- /package/dist/{chunk-SACAOBDB.js.map → chunk-WUEDPNTM.js.map} +0 -0
- /package/dist/{chunk-UVYI6VIX.js.map → chunk-X7Y7WX73.js.map} +0 -0
- /package/dist/{chunk-JCUG7AXZ.js.map → chunk-XJJYSX6F.js.map} +0 -0
- /package/dist/{chunk-JGXMA6HL.js.map → chunk-YHCBJULX.js.map} +0 -0
- /package/dist/{chunk-5VLXQFOS.js.map → chunk-YRS2SZM7.js.map} +0 -0
- /package/dist/{chunk-F5FHDDOV.js.map → chunk-YY7IG7EF.js.map} +0 -0
- /package/dist/{chunk-MS2I7JVN.js.map → chunk-Z3LZFKO5.js.map} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remnic/core",
|
|
3
|
-
"version": "9.66.
|
|
3
|
+
"version": "9.66.5",
|
|
4
4
|
"description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -3217,7 +3217,7 @@
|
|
|
3217
3217
|
"core"
|
|
3218
3218
|
],
|
|
3219
3219
|
"peerDependencies": {
|
|
3220
|
-
"@remnic/coding-graph": "^9.66.
|
|
3220
|
+
"@remnic/coding-graph": "^9.66.5"
|
|
3221
3221
|
},
|
|
3222
3222
|
"peerDependenciesMeta": {
|
|
3223
3223
|
"@remnic/coding-graph": {
|
package/src/access-http.ts
CHANGED
|
@@ -70,6 +70,7 @@ import { isValidResolutionVerb, executeResolution } from "./contradiction/resolu
|
|
|
70
70
|
import { RelayMissionStoreError } from "./relay/mission.js";
|
|
71
71
|
import { ReviewDeckAccessHttpBase } from "./review/review-deck-http-base.js";
|
|
72
72
|
import { serializeInlineScriptValue } from "./inline-script.js";
|
|
73
|
+
import { toDottedRemnicName } from "./access-mcp-tool-names.js";
|
|
73
74
|
import type { SupportPassportExternalRequestHandler } from "./support-passport/public-http.js";
|
|
74
75
|
export interface AccessHttpReadinessState {
|
|
75
76
|
ready: boolean;
|
|
@@ -3273,7 +3274,7 @@ export class EngramAccessHttpServer extends ReviewDeckAccessHttpBase {
|
|
|
3273
3274
|
params?: Record<string, unknown>;
|
|
3274
3275
|
};
|
|
3275
3276
|
|
|
3276
|
-
const toolName = typeof request.params?.name === "string" ? request.params.name : "";
|
|
3277
|
+
const toolName = toDottedRemnicName(typeof request.params?.name === "string" ? request.params.name : "");
|
|
3277
3278
|
const toolArgs = request.params?.arguments;
|
|
3278
3279
|
const dreamsRunDryRun =
|
|
3279
3280
|
(toolName === "engram.dreams_run" || toolName === "remnic.dreams_run") &&
|
|
@@ -546,7 +546,7 @@ const TOOL_OUTPUT_SCHEMAS: Readonly<Record<string, Record<string, unknown>>> = {
|
|
|
546
546
|
/**
|
|
547
547
|
* Apply outputSchema from the registry to every tool that lacks one.
|
|
548
548
|
* Suffix resolution strips the canonical or legacy prefix so both
|
|
549
|
-
* `
|
|
549
|
+
* `remnic_*` and `engram.*` aliases inherit the same schema.
|
|
550
550
|
* Tools that already have an explicit outputSchema are skipped.
|
|
551
551
|
*/
|
|
552
552
|
export function applyToolOutputSchemas<T extends { name: string; outputSchema?: unknown }>(
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
CANONICAL_MCP_PREFIX,
|
|
6
|
+
toCanonicalToolName,
|
|
7
|
+
toLegacyToolName,
|
|
8
|
+
withToolAliases,
|
|
9
|
+
} from "./access-mcp-tool-names.js";
|
|
10
|
+
|
|
11
|
+
const ANTHROPIC_TOOL_NAME = /^[a-zA-Z0-9_-]{1,64}$/;
|
|
12
|
+
|
|
13
|
+
test("toCanonicalToolName maps remnic_ / remnic. / engram. to remnic_suffix", () => {
|
|
14
|
+
assert.equal(toCanonicalToolName("remnic_recall"), "remnic_recall");
|
|
15
|
+
assert.equal(toCanonicalToolName("remnic.recall"), "remnic_recall");
|
|
16
|
+
assert.equal(toCanonicalToolName("engram.recall"), "remnic_recall");
|
|
17
|
+
assert.equal(toCanonicalToolName("unknown"), "unknown");
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test("toLegacyToolName maps remnic_ / remnic. / engram. to engram.suffix", () => {
|
|
21
|
+
assert.equal(toLegacyToolName("remnic_recall"), "engram.recall");
|
|
22
|
+
assert.equal(toLegacyToolName("remnic.recall"), "engram.recall");
|
|
23
|
+
assert.equal(toLegacyToolName("engram.recall"), "engram.recall");
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test("withToolAliases advertises remnic_<suffix> and optional engram.*", () => {
|
|
27
|
+
const tool = { name: "engram.recall" };
|
|
28
|
+
const both = withToolAliases(tool, true);
|
|
29
|
+
assert.deepEqual(
|
|
30
|
+
both.map((entry) => entry.name),
|
|
31
|
+
["remnic_recall", "engram.recall"],
|
|
32
|
+
);
|
|
33
|
+
const canonicalOnly = withToolAliases(tool, false);
|
|
34
|
+
assert.deepEqual(
|
|
35
|
+
canonicalOnly.map((entry) => entry.name),
|
|
36
|
+
["remnic_recall"],
|
|
37
|
+
);
|
|
38
|
+
assert.ok(canonicalOnly.every((entry) => ANTHROPIC_TOOL_NAME.test(entry.name)));
|
|
39
|
+
assert.equal(CANONICAL_MCP_PREFIX, "remnic_");
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test("withToolAliases emits the engram.* alias for canonical-named tools too", () => {
|
|
43
|
+
const tool = { name: "remnic_recall" };
|
|
44
|
+
assert.deepEqual(
|
|
45
|
+
withToolAliases(tool, true).map((entry) => entry.name),
|
|
46
|
+
["remnic_recall", "engram.recall"],
|
|
47
|
+
);
|
|
48
|
+
assert.deepEqual(
|
|
49
|
+
withToolAliases(tool, false).map((entry) => entry.name),
|
|
50
|
+
["remnic_recall"],
|
|
51
|
+
);
|
|
52
|
+
assert.deepEqual(
|
|
53
|
+
withToolAliases({ name: "remnic.recall" }, true).map((entry) => entry.name),
|
|
54
|
+
["remnic_recall", "engram.recall"],
|
|
55
|
+
);
|
|
56
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool-name prefixes (issue #2705).
|
|
3
|
+
*
|
|
4
|
+
* Anthropic tool names must match `^[a-zA-Z0-9_-]{1,64}$`.
|
|
5
|
+
* Advertised canonical form is `remnic_<suffix>`.
|
|
6
|
+
* `remnic.` and `engram.` stay callable.
|
|
7
|
+
*/
|
|
8
|
+
export const CANONICAL_MCP_PREFIX = "remnic_";
|
|
9
|
+
export const LEGACY_MCP_PREFIX = "engram.";
|
|
10
|
+
export const DOTTED_REMNIC_PREFIX = "remnic.";
|
|
11
|
+
|
|
12
|
+
const KNOWN_PREFIXES = [CANONICAL_MCP_PREFIX, DOTTED_REMNIC_PREFIX, LEGACY_MCP_PREFIX] as const;
|
|
13
|
+
|
|
14
|
+
export function toolNameSuffix(name: string): string | null {
|
|
15
|
+
for (const prefix of KNOWN_PREFIXES) {
|
|
16
|
+
if (name.startsWith(prefix)) return name.slice(prefix.length);
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function toCanonicalToolName(name: string): string {
|
|
22
|
+
const suffix = toolNameSuffix(name);
|
|
23
|
+
return suffix === null ? name : `${CANONICAL_MCP_PREFIX}${suffix}`;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function toLegacyToolName(name: string): string {
|
|
27
|
+
const suffix = toolNameSuffix(name);
|
|
28
|
+
return suffix === null ? name : `${LEGACY_MCP_PREFIX}${suffix}`;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function toDottedRemnicName(name: string): string {
|
|
32
|
+
const suffix = toolNameSuffix(name);
|
|
33
|
+
return suffix === null ? name : `${DOTTED_REMNIC_PREFIX}${suffix}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function withToolAliases<T extends { name: string }>(tool: T, emitLegacyTools = true): T[] {
|
|
37
|
+
const suffix = toolNameSuffix(tool.name);
|
|
38
|
+
if (suffix === null) return [tool];
|
|
39
|
+
const canonicalName = `${CANONICAL_MCP_PREFIX}${suffix}`;
|
|
40
|
+
const canonicalTool = canonicalName === tool.name ? tool : { ...tool, name: canonicalName };
|
|
41
|
+
if (!emitLegacyTools) return [canonicalTool];
|
|
42
|
+
const legacyName = `${LEGACY_MCP_PREFIX}${suffix}`;
|
|
43
|
+
const legacyTool = legacyName === tool.name ? tool : { ...tool, name: legacyName };
|
|
44
|
+
return [canonicalTool, legacyTool];
|
|
45
|
+
}
|
package/src/access-mcp.test.ts
CHANGED
|
@@ -910,9 +910,9 @@ test("MCP tools/list exposes LCM compaction tools under remnic aliases", async (
|
|
|
910
910
|
(tool) => tool.name,
|
|
911
911
|
);
|
|
912
912
|
|
|
913
|
-
assert.ok(listed.includes("
|
|
913
|
+
assert.ok(listed.includes("remnic_lcm_compaction_flush"));
|
|
914
914
|
assert.ok(listed.includes("engram.lcm_compaction_flush"));
|
|
915
|
-
assert.ok(listed.includes("
|
|
915
|
+
assert.ok(listed.includes("remnic_lcm_compaction_record"));
|
|
916
916
|
assert.ok(listed.includes("engram.lcm_compaction_record"));
|
|
917
917
|
});
|
|
918
918
|
|
|
@@ -977,10 +977,10 @@ function listToolNames(response: unknown): string[] {
|
|
|
977
977
|
|
|
978
978
|
const TOOLS_LIST_REQUEST = { jsonrpc: "2.0", id: 1, method: "tools/list", params: {} };
|
|
979
979
|
|
|
980
|
-
test("tools/list advertises
|
|
980
|
+
test("tools/list advertises remnic_* and engram.* by default (back-compat)", async () => {
|
|
981
981
|
const server = new EngramMcpServer(makeMockService());
|
|
982
982
|
const names = listToolNames(await server.handleRequest(TOOLS_LIST_REQUEST));
|
|
983
|
-
assert.ok(names.includes("
|
|
983
|
+
assert.ok(names.includes("remnic_recall"), "canonical name present");
|
|
984
984
|
assert.ok(names.includes("engram.recall"), "legacy alias present by default");
|
|
985
985
|
const legacyCount = names.filter((n) => n.startsWith("engram.")).length;
|
|
986
986
|
assert.ok(legacyCount > 0, "legacy aliases advertised by default");
|
|
@@ -989,26 +989,31 @@ test("tools/list advertises both remnic.* and engram.* by default (back-compat)"
|
|
|
989
989
|
test("tools/list omits engram.* aliases when emitLegacyTools is false", async () => {
|
|
990
990
|
const server = new EngramMcpServer(makeMockService(), { emitLegacyTools: false });
|
|
991
991
|
const names = listToolNames(await server.handleRequest(TOOLS_LIST_REQUEST));
|
|
992
|
-
assert.ok(names.includes("
|
|
992
|
+
assert.ok(names.includes("remnic_recall"), "canonical name still present");
|
|
993
993
|
assert.equal(
|
|
994
994
|
names.filter((n) => n.startsWith("engram.")).length,
|
|
995
995
|
0,
|
|
996
996
|
"no engram.* aliases advertised when opted out",
|
|
997
997
|
);
|
|
998
|
-
// Every advertised tool uses the
|
|
999
|
-
assert.ok(names.every((n) => n.startsWith("
|
|
998
|
+
// Every advertised tool uses the Anthropic-safe remnic_* prefix.
|
|
999
|
+
assert.ok(names.every((n) => n.startsWith("remnic_")), "all advertised tools are canonical");
|
|
1000
|
+
assert.ok(names.every((n) => /^[a-zA-Z0-9_-]{1,64}$/.test(n)), "Anthropic tool-name pattern");
|
|
1000
1001
|
});
|
|
1001
1002
|
|
|
1002
1003
|
test("emitLegacyTools=false still allows calling tools under BOTH names (advertising-only opt-out)", async () => {
|
|
1003
1004
|
const server = new EngramMcpServer(makeMockService(), { emitLegacyTools: false });
|
|
1004
|
-
|
|
1005
|
-
const canonical = await server.handleRequest(makeToolRequest("remnic.recall", { query: "hello" }));
|
|
1005
|
+
const advertised = await server.handleRequest(makeToolRequest("remnic_recall", { query: "hello" }));
|
|
1006
1006
|
assert.notEqual(
|
|
1007
|
-
(
|
|
1007
|
+
(advertised as { result?: { isError?: boolean } }).result?.isError,
|
|
1008
1008
|
true,
|
|
1009
|
-
"
|
|
1009
|
+
"advertised remnic_recall call succeeds",
|
|
1010
|
+
);
|
|
1011
|
+
const dotted = await server.handleRequest(makeToolRequest("remnic.recall", { query: "hello" }));
|
|
1012
|
+
assert.notEqual(
|
|
1013
|
+
(dotted as { result?: { isError?: boolean } }).result?.isError,
|
|
1014
|
+
true,
|
|
1015
|
+
"dotted remnic.recall call still dispatches",
|
|
1010
1016
|
);
|
|
1011
|
-
// Legacy call still dispatches even though it is no longer advertised.
|
|
1012
1017
|
const legacy = await server.handleRequest(makeToolRequest("engram.recall", { query: "hello" }));
|
|
1013
1018
|
assert.notEqual(
|
|
1014
1019
|
(legacy as { result?: { isError?: boolean } }).result?.isError,
|
|
@@ -1034,10 +1039,10 @@ test("tools/list: ops-scoped token sees ONLY its permitted tools (issue #1850 fi
|
|
|
1034
1039
|
const names = await tokenCapabilityStore.run({ version: 1, ops: ["recall", "memory_get"] }, async () =>
|
|
1035
1040
|
listToolNames(await server.handleRequest(TOOLS_LIST_REQUEST)),
|
|
1036
1041
|
);
|
|
1037
|
-
assert.ok(names.includes("
|
|
1038
|
-
assert.ok(names.includes("
|
|
1039
|
-
assert.ok(!names.includes("
|
|
1040
|
-
assert.ok(!names.includes("
|
|
1042
|
+
assert.ok(names.includes("remnic_recall"), "permitted recall tool advertised");
|
|
1043
|
+
assert.ok(names.includes("remnic_memory_get"), "permitted memory_get tool advertised");
|
|
1044
|
+
assert.ok(!names.includes("remnic_memory_store"), "non-permitted tool must NOT be advertised");
|
|
1045
|
+
assert.ok(!names.includes("remnic_observe"), "non-permitted tool must NOT be advertised");
|
|
1041
1046
|
assert.equal(names.length, 2, "exactly the two permitted tools advertised");
|
|
1042
1047
|
});
|
|
1043
1048
|
|
|
@@ -1330,11 +1335,11 @@ test("MCP external_wiki_search exposes aliases and dispatches the stable result"
|
|
|
1330
1335
|
? [tool.name]
|
|
1331
1336
|
: []
|
|
1332
1337
|
);
|
|
1333
|
-
assert.ok(toolNames.includes("
|
|
1338
|
+
assert.ok(toolNames.includes("remnic_external_wiki_search"));
|
|
1334
1339
|
assert.ok(toolNames.includes("engram.external_wiki_search"));
|
|
1335
1340
|
|
|
1336
1341
|
let canonicalResult: unknown;
|
|
1337
|
-
for (const name of ["
|
|
1342
|
+
for (const name of ["remnic_external_wiki_search", "engram.external_wiki_search", "remnic.external_wiki_search"]) {
|
|
1338
1343
|
const response = await server.handleRequest(makeToolRequest(name, {
|
|
1339
1344
|
query: "hybrid retrieval",
|
|
1340
1345
|
limit: 3,
|
package/src/access-mcp.ts
CHANGED
|
@@ -42,6 +42,14 @@ import { readEnvVar } from "./runtime/env.js";
|
|
|
42
42
|
import type { RecallDisclosure, RecallPlanMode } from "./types.js";
|
|
43
43
|
import { expandTildePath } from "./utils/path.js";
|
|
44
44
|
import { applyToolOutputSchemas } from "./access-mcp-output-schemas.js";
|
|
45
|
+
import {
|
|
46
|
+
CANONICAL_MCP_PREFIX,
|
|
47
|
+
LEGACY_MCP_PREFIX,
|
|
48
|
+
toCanonicalToolName,
|
|
49
|
+
toLegacyToolName,
|
|
50
|
+
toolNameSuffix,
|
|
51
|
+
withToolAliases,
|
|
52
|
+
} from "./access-mcp-tool-names.js";
|
|
45
53
|
import { MCP_READ_ONLY_TOOL_SUFFIXES } from "./mcp-read-only-tools.js";
|
|
46
54
|
import { MEETINGS_MCP_TOOLS } from "./meetings/mcp-tools.js";
|
|
47
55
|
import { WEARABLES_MCP_TOOLS } from "./wearables/mcp-tools.js";
|
|
@@ -119,42 +127,15 @@ type McpResource = {
|
|
|
119
127
|
*/
|
|
120
128
|
export const MCP_SUPPORTED_PROTOCOL_VERSIONS: readonly string[] = ["2025-06-18", "2025-03-26", "2024-11-05"];
|
|
121
129
|
const MCP_DEFAULT_PROTOCOL_VERSION: string = MCP_SUPPORTED_PROTOCOL_VERSIONS[0] ?? "2025-06-18";
|
|
122
|
-
const LEGACY_MCP_PREFIX = "engram.";
|
|
123
|
-
const CANONICAL_MCP_PREFIX = "remnic.";
|
|
124
|
-
|
|
125
|
-
function toCanonicalToolName(name: string): string {
|
|
126
|
-
return name.startsWith(LEGACY_MCP_PREFIX) ? `${CANONICAL_MCP_PREFIX}${name.slice(LEGACY_MCP_PREFIX.length)}` : name;
|
|
127
|
-
}
|
|
128
|
-
function toLegacyToolName(name: string): string {
|
|
129
|
-
return name.startsWith(CANONICAL_MCP_PREFIX)
|
|
130
|
-
? `${LEGACY_MCP_PREFIX}${name.slice(CANONICAL_MCP_PREFIX.length)}`
|
|
131
|
-
: name;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
130
|
/**
|
|
135
131
|
* Suffix-based allowlist matcher. Returns true for tools whose canonical
|
|
136
|
-
* suffix (after stripping `remnic
|
|
132
|
+
* suffix (after stripping `remnic_`, `remnic.`, or `engram.`) is in
|
|
137
133
|
* {@link MCP_READ_ONLY_TOOL_SUFFIXES}. Unprefixed names are treated as
|
|
138
134
|
* unannotated.
|
|
139
135
|
*/
|
|
140
136
|
function isReadOnlyToolName(name: string): boolean {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
return MCP_READ_ONLY_TOOL_SUFFIXES[name.slice(prefix.length)] === true;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
return false;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
function withToolAliases(tool: McpTool, emitLegacyTools = true): McpTool[] {
|
|
150
|
-
const canonicalName = toCanonicalToolName(tool.name);
|
|
151
|
-
const canonicalTool = canonicalName === tool.name ? tool : { ...tool, name: canonicalName };
|
|
152
|
-
if (canonicalName === tool.name) return [canonicalTool];
|
|
153
|
-
// Issue #1427: when legacy aliases are opted out, advertise only the
|
|
154
|
-
// canonical `remnic.*` name and drop the `engram.*` duplicate. Tool *calls*
|
|
155
|
-
// still accept both names (the dispatch canonicalizes), so suppressing the
|
|
156
|
-
// alias only trims `tools/list`, not callability.
|
|
157
|
-
return emitLegacyTools ? [canonicalTool, tool] : [canonicalTool];
|
|
137
|
+
const suffix = toolNameSuffix(name);
|
|
138
|
+
return suffix !== null && MCP_READ_ONLY_TOOL_SUFFIXES[suffix] === true;
|
|
158
139
|
}
|
|
159
140
|
|
|
160
141
|
export const MCP_MIGRATED_OPERATIONS: Readonly<Record<string, OperationName>> = {
|
|
@@ -2247,7 +2228,7 @@ export class EngramMcpServer {
|
|
|
2247
2228
|
// allowlist. Done as a final pass so every spread (chat, codegraph,
|
|
2248
2229
|
// coding_*, correction, etc.) inherits the annotation without
|
|
2249
2230
|
// scattering the same logic across every `withToolAliases` call site.
|
|
2250
|
-
// Suffix-based matching covers both the `
|
|
2231
|
+
// Suffix-based matching covers both the `remnic_*` and `engram.*`
|
|
2251
2232
|
// naming forms emitted by `withToolAliases`.
|
|
2252
2233
|
this.tools = this.tools.map((tool) =>
|
|
2253
2234
|
isReadOnlyToolName(tool.name) && tool.annotations?.readOnlyHint !== true
|
|
@@ -2256,7 +2237,7 @@ export class EngramMcpServer {
|
|
|
2256
2237
|
);
|
|
2257
2238
|
// Apply `outputSchema` declarations from the registry. Like the
|
|
2258
2239
|
// readOnlyHint pass above, this is a final suffix-based pass so every
|
|
2259
|
-
// tool (including both `
|
|
2240
|
+
// tool (including both `remnic_*` and `engram.*` aliases) gets a
|
|
2260
2241
|
// schema. Tools that already declare an outputSchema (e.g.
|
|
2261
2242
|
// chatgpt_memory_inspector) are left untouched.
|
|
2262
2243
|
this.tools = applyToolOutputSchemas(this.tools, CANONICAL_MCP_PREFIX, LEGACY_MCP_PREFIX);
|
|
@@ -2589,9 +2570,9 @@ export class EngramMcpServer {
|
|
|
2589
2570
|
|
|
2590
2571
|
private toolAcceptsArgument(name: string, key: string): boolean {
|
|
2591
2572
|
// Match by canonical name so argument validation resolves whether the
|
|
2592
|
-
// caller used
|
|
2593
|
-
// legacy aliases are advertised (issue #1427) — a tool stays
|
|
2594
|
-
//
|
|
2573
|
+
// caller used `engram.*`, `remnic.*`, or `remnic_*` and regardless of
|
|
2574
|
+
// whether legacy aliases are advertised (issue #1427) — a tool stays
|
|
2575
|
+
// callable under those names even when only remnic_* appears in tools/list.
|
|
2595
2576
|
const target = toCanonicalToolName(name);
|
|
2596
2577
|
const tool = this.tools.find((entry) => toCanonicalToolName(entry.name) === target);
|
|
2597
2578
|
const inputSchema = getObjectProperties(tool?.inputSchema);
|
|
@@ -53,9 +53,9 @@ void getOperation;
|
|
|
53
53
|
// ---------------------------------------------------------------------------
|
|
54
54
|
|
|
55
55
|
const LEGACY_PREFIX = "engram.";
|
|
56
|
-
const CANONICAL_PREFIX = "
|
|
56
|
+
const CANONICAL_PREFIX = "remnic_";
|
|
57
57
|
|
|
58
|
-
/** Strip the `engram.`/`
|
|
58
|
+
/** Strip the `engram.`/`remnic_` prefix to get the canonical short name. */
|
|
59
59
|
function shortToolName(advertised: string): string {
|
|
60
60
|
if (advertised.startsWith(LEGACY_PREFIX)) return advertised.slice(LEGACY_PREFIX.length);
|
|
61
61
|
if (advertised.startsWith(CANONICAL_PREFIX)) return advertised.slice(CANONICAL_PREFIX.length);
|
|
@@ -543,7 +543,7 @@ test("tools/list: engram.coding_architecture absent when gate off (byte-identica
|
|
|
543
543
|
const response = await server.handleRequest({ jsonrpc: "2.0", id: 1, method: "tools/list" });
|
|
544
544
|
const names = extractToolNames(response);
|
|
545
545
|
assert.equal(names.has("engram.coding_architecture"), false, "tool must be absent when gate is off");
|
|
546
|
-
assert.equal(names.has("
|
|
546
|
+
assert.equal(names.has("remnic_coding_architecture"), false, "alias must be absent when gate is off");
|
|
547
547
|
});
|
|
548
548
|
|
|
549
549
|
test("tools/list: engram.coding_architecture present when gate on", async () => {
|
|
@@ -552,7 +552,7 @@ test("tools/list: engram.coding_architecture present when gate on", async () =>
|
|
|
552
552
|
const response = await server.handleRequest({ jsonrpc: "2.0", id: 1, method: "tools/list" });
|
|
553
553
|
const names = extractToolNames(response);
|
|
554
554
|
assert.equal(names.has("engram.coding_architecture"), true, "tool must be advertised when gate is on");
|
|
555
|
-
assert.equal(names.has("
|
|
555
|
+
assert.equal(names.has("remnic_coding_architecture"), true, "alias must be advertised when gate is on");
|
|
556
556
|
});
|
|
557
557
|
|
|
558
558
|
// ──────────────────────────────────────────────────────────────────────────
|
|
@@ -277,9 +277,9 @@ test("tools/list gate: all 14 codegraph tools absent when codegraphVisible off (
|
|
|
277
277
|
`engram.codegraph_${suffix} must be absent when gate is off`,
|
|
278
278
|
);
|
|
279
279
|
assert.equal(
|
|
280
|
-
names.has(`
|
|
280
|
+
names.has(`remnic_codegraph_${suffix}`),
|
|
281
281
|
false,
|
|
282
|
-
`
|
|
282
|
+
`remnic_codegraph_${suffix} must be absent when gate is off`,
|
|
283
283
|
);
|
|
284
284
|
}
|
|
285
285
|
});
|
|
@@ -296,9 +296,9 @@ test("tools/list gate: all 14 codegraph tools present when codegraphVisible on",
|
|
|
296
296
|
`engram.codegraph_${suffix} must be present when gate is on`,
|
|
297
297
|
);
|
|
298
298
|
assert.equal(
|
|
299
|
-
names.has(`
|
|
299
|
+
names.has(`remnic_codegraph_${suffix}`),
|
|
300
300
|
true,
|
|
301
|
-
`
|
|
301
|
+
`remnic_codegraph_${suffix} alias must be present when gate is on`,
|
|
302
302
|
);
|
|
303
303
|
}
|
|
304
304
|
});
|
|
@@ -168,7 +168,7 @@ test("tools/list: engram.coding_decision absent when gate off (byte-identical to
|
|
|
168
168
|
const tools = (response as { result?: { tools?: Array<{ name: string }> } }).result?.tools ?? [];
|
|
169
169
|
const names = new Set(tools.map((t) => t.name));
|
|
170
170
|
assert.equal(names.has("engram.coding_decision"), false, "tool must be absent when gate is off");
|
|
171
|
-
assert.equal(names.has("
|
|
171
|
+
assert.equal(names.has("remnic_coding_decision"), false, "alias must be absent when gate is off");
|
|
172
172
|
});
|
|
173
173
|
|
|
174
174
|
// ──────────────────────────────────────────────────────────────────────────
|
|
@@ -114,8 +114,8 @@ test("tools/list gate: correction tools absent when correctionVisible off (byte-
|
|
|
114
114
|
const names = extractToolNames(response);
|
|
115
115
|
assert.equal(names.has("engram.memory_correct_plan"), false, "plan tool must be absent when gate off");
|
|
116
116
|
assert.equal(names.has("engram.memory_correct_apply"), false, "apply tool must be absent when gate off");
|
|
117
|
-
assert.equal(names.has("
|
|
118
|
-
assert.equal(names.has("
|
|
117
|
+
assert.equal(names.has("remnic_memory_correct_plan"), false, "plan alias must be absent when gate off");
|
|
118
|
+
assert.equal(names.has("remnic_memory_correct_apply"), false, "apply alias must be absent when gate off");
|
|
119
119
|
});
|
|
120
120
|
|
|
121
121
|
test("tools/list gate: correction tools present when correctionVisible on (default)", async () => {
|
|
@@ -126,8 +126,8 @@ test("tools/list gate: correction tools present when correctionVisible on (defau
|
|
|
126
126
|
const names = extractToolNames(response);
|
|
127
127
|
assert.equal(names.has("engram.memory_correct_plan"), true, "plan tool must be present by default");
|
|
128
128
|
assert.equal(names.has("engram.memory_correct_apply"), true, "apply tool must be present by default");
|
|
129
|
-
assert.equal(names.has("
|
|
130
|
-
assert.equal(names.has("
|
|
129
|
+
assert.equal(names.has("remnic_memory_correct_plan"), true, "plan alias must be present");
|
|
130
|
+
assert.equal(names.has("remnic_memory_correct_apply"), true, "apply alias must be present");
|
|
131
131
|
});
|
|
132
132
|
|
|
133
133
|
// ---------------------------------------------------------------------------
|
|
@@ -7,7 +7,7 @@ import type { RetrievedMemoryProvenance } from "./memory-provenance.js";
|
|
|
7
7
|
export const REMNIC_CHATGPT_MEMORY_INSPECTOR_TOOL =
|
|
8
8
|
"engram.chatgpt_memory_inspector" as const;
|
|
9
9
|
export const REMNIC_CHATGPT_MEMORY_INSPECTOR_CANONICAL_TOOL =
|
|
10
|
-
"
|
|
10
|
+
"remnic_chatgpt_memory_inspector" as const;
|
|
11
11
|
export const REMNIC_CHATGPT_MEMORY_INSPECTOR_WIDGET_URI =
|
|
12
12
|
"ui://remnic/memory-inspector.v1.html" as const;
|
|
13
13
|
export const REMNIC_CHATGPT_MEMORY_INSPECTOR_MIME_TYPE =
|
|
@@ -42,10 +42,10 @@ test("support passport MCP tools are hidden until the feature is enabled", async
|
|
|
42
42
|
false
|
|
43
43
|
);
|
|
44
44
|
assert.equal(enabledNames.filter((name) => name.includes("support_passport")).length, 22);
|
|
45
|
-
assert.ok(enabledNames.includes("
|
|
46
|
-
assert.ok(enabledNames.includes("
|
|
45
|
+
assert.ok(enabledNames.includes("remnic_support_passport_memory_preview"));
|
|
46
|
+
assert.ok(enabledNames.includes("remnic_support_passport_cards_list"));
|
|
47
47
|
assert.ok(enabledNames.includes("engram.support_passport_grant_revoke"));
|
|
48
|
-
for (const name of ["
|
|
48
|
+
for (const name of ["remnic_support_passport_memory_preview", "engram.support_passport_memory_preview"]) {
|
|
49
49
|
assert.equal(enabledTools.find((tool) => tool.name === name)?.annotations?.readOnlyHint, true);
|
|
50
50
|
}
|
|
51
51
|
});
|