@remnic/core 9.6.24 → 9.6.25
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-cli.js +3 -3
- package/dist/access-http.js +2 -2
- package/dist/access-mcp.js +1 -1
- package/dist/{chunk-KEY3FEMP.js → chunk-43VNWTBB.js} +3 -3
- package/dist/{chunk-A2OFRQ5B.js → chunk-N6VIXDT7.js} +2 -2
- package/dist/{chunk-D3D677BV.js → chunk-QLYLTKUG.js} +4 -4
- package/dist/{chunk-D3D677BV.js.map → chunk-QLYLTKUG.js.map} +1 -1
- package/dist/cli.js +3 -3
- package/dist/index.js +3 -3
- package/dist/orchestrator.js +3 -3
- package/package.json +2 -2
- package/src/access-http.test.ts +2 -2
- package/src/access-mcp.test.ts +2 -2
- package/src/access-mcp.ts +3 -3
- package/src/access-service-coding-write.test.ts +18 -18
- package/src/access-service-lcm-forgery.test.ts +5 -5
- package/src/access-service-observe-lcm-parity.test.ts +25 -25
- package/src/access-service-observe-scope.test.ts +16 -16
- package/src/access-service-project-tag.test.ts +2 -2
- package/src/access-service-raw-excerpt-read-gate.test.ts +1 -1
- package/src/coding/coding-namespace.test.ts +3 -3
- package/src/coding/wire-coding-context.test.ts +22 -22
- package/src/issue-1492-coding-mode-consistency.test.ts +2 -2
- /package/dist/{chunk-KEY3FEMP.js.map → chunk-43VNWTBB.js.map} +0 -0
- /package/dist/{chunk-A2OFRQ5B.js.map → chunk-N6VIXDT7.js.map} +0 -0
package/dist/cli.js
CHANGED
|
@@ -90,7 +90,7 @@ import {
|
|
|
90
90
|
runWorkProductStatusCliCommand,
|
|
91
91
|
runWorkProjectCliCommand,
|
|
92
92
|
runWorkTaskCliCommand
|
|
93
|
-
} from "./chunk-
|
|
93
|
+
} from "./chunk-43VNWTBB.js";
|
|
94
94
|
import "./chunk-MMACM5G2.js";
|
|
95
95
|
import "./chunk-54BGIBCR.js";
|
|
96
96
|
import "./chunk-H4CKS5B2.js";
|
|
@@ -168,7 +168,7 @@ import "./chunk-G6NKALRN.js";
|
|
|
168
168
|
import "./chunk-OO42R444.js";
|
|
169
169
|
import "./chunk-K6MV3TRQ.js";
|
|
170
170
|
import "./chunk-OADWQ5CR.js";
|
|
171
|
-
import "./chunk-
|
|
171
|
+
import "./chunk-N6VIXDT7.js";
|
|
172
172
|
import "./chunk-V7IZKJI3.js";
|
|
173
173
|
import "./chunk-SEDEKFYQ.js";
|
|
174
174
|
import "./chunk-RKNJBZ55.js";
|
|
@@ -177,7 +177,7 @@ import "./chunk-RSUYKGGZ.js";
|
|
|
177
177
|
import "./chunk-42NQ7AVG.js";
|
|
178
178
|
import "./chunk-TMSXWOBZ.js";
|
|
179
179
|
import "./chunk-7RXCMVFQ.js";
|
|
180
|
-
import "./chunk-
|
|
180
|
+
import "./chunk-QLYLTKUG.js";
|
|
181
181
|
import "./chunk-IC2TCZJ2.js";
|
|
182
182
|
import "./chunk-D24OXEPB.js";
|
|
183
183
|
import "./chunk-5RUE3GHQ.js";
|
package/dist/index.js
CHANGED
|
@@ -348,7 +348,7 @@ import {
|
|
|
348
348
|
registerTrainingExportAdapter,
|
|
349
349
|
runBulkImportCliCommand,
|
|
350
350
|
runWearablesCliCommand
|
|
351
|
-
} from "./chunk-
|
|
351
|
+
} from "./chunk-43VNWTBB.js";
|
|
352
352
|
import "./chunk-MMACM5G2.js";
|
|
353
353
|
import "./chunk-54BGIBCR.js";
|
|
354
354
|
import "./chunk-H4CKS5B2.js";
|
|
@@ -550,7 +550,7 @@ import "./chunk-K6MV3TRQ.js";
|
|
|
550
550
|
import "./chunk-OADWQ5CR.js";
|
|
551
551
|
import {
|
|
552
552
|
EngramAccessHttpServer
|
|
553
|
-
} from "./chunk-
|
|
553
|
+
} from "./chunk-N6VIXDT7.js";
|
|
554
554
|
import {
|
|
555
555
|
WearablesInputError,
|
|
556
556
|
describeErrorForOperator
|
|
@@ -564,7 +564,7 @@ import "./chunk-TMSXWOBZ.js";
|
|
|
564
564
|
import "./chunk-7RXCMVFQ.js";
|
|
565
565
|
import {
|
|
566
566
|
EngramMcpServer
|
|
567
|
-
} from "./chunk-
|
|
567
|
+
} from "./chunk-QLYLTKUG.js";
|
|
568
568
|
import "./chunk-IC2TCZJ2.js";
|
|
569
569
|
import {
|
|
570
570
|
buildCitationGuidance,
|
package/dist/orchestrator.js
CHANGED
|
@@ -126,7 +126,7 @@ import "./chunk-Q6IP2ARR.js";
|
|
|
126
126
|
import "./chunk-6HEM6HTQ.js";
|
|
127
127
|
import "./chunk-O2EL7EGG.js";
|
|
128
128
|
import "./chunk-FVTLSFWU.js";
|
|
129
|
-
import "./chunk-
|
|
129
|
+
import "./chunk-43VNWTBB.js";
|
|
130
130
|
import "./chunk-MMACM5G2.js";
|
|
131
131
|
import "./chunk-54BGIBCR.js";
|
|
132
132
|
import "./chunk-H4CKS5B2.js";
|
|
@@ -217,7 +217,7 @@ import "./chunk-G6NKALRN.js";
|
|
|
217
217
|
import "./chunk-OO42R444.js";
|
|
218
218
|
import "./chunk-K6MV3TRQ.js";
|
|
219
219
|
import "./chunk-OADWQ5CR.js";
|
|
220
|
-
import "./chunk-
|
|
220
|
+
import "./chunk-N6VIXDT7.js";
|
|
221
221
|
import "./chunk-V7IZKJI3.js";
|
|
222
222
|
import "./chunk-SEDEKFYQ.js";
|
|
223
223
|
import "./chunk-RKNJBZ55.js";
|
|
@@ -226,7 +226,7 @@ import "./chunk-RSUYKGGZ.js";
|
|
|
226
226
|
import "./chunk-42NQ7AVG.js";
|
|
227
227
|
import "./chunk-TMSXWOBZ.js";
|
|
228
228
|
import "./chunk-7RXCMVFQ.js";
|
|
229
|
-
import "./chunk-
|
|
229
|
+
import "./chunk-QLYLTKUG.js";
|
|
230
230
|
import "./chunk-IC2TCZJ2.js";
|
|
231
231
|
import "./chunk-D24OXEPB.js";
|
|
232
232
|
import "./chunk-5RUE3GHQ.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remnic/core",
|
|
3
|
-
"version": "9.6.
|
|
3
|
+
"version": "9.6.25",
|
|
4
4
|
"description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -3000,7 +3000,7 @@
|
|
|
3000
3000
|
"core"
|
|
3001
3001
|
],
|
|
3002
3002
|
"peerDependencies": {
|
|
3003
|
-
"@remnic/coding-graph": "^9.6.
|
|
3003
|
+
"@remnic/coding-graph": "^9.6.25"
|
|
3004
3004
|
},
|
|
3005
3005
|
"peerDependenciesMeta": {
|
|
3006
3006
|
"@remnic/coding-graph": {
|
package/src/access-http.test.ts
CHANGED
|
@@ -268,11 +268,11 @@ test("HTTP coding-context endpoint accepts projectTag shorthand", async () => {
|
|
|
268
268
|
},
|
|
269
269
|
body: JSON.stringify({
|
|
270
270
|
sessionKey: "s1",
|
|
271
|
-
projectTag: "
|
|
271
|
+
projectTag: "Acme/Webshop",
|
|
272
272
|
}),
|
|
273
273
|
});
|
|
274
274
|
|
|
275
|
-
const projectId = projectTagProjectId("
|
|
275
|
+
const projectId = projectTagProjectId("Acme/Webshop");
|
|
276
276
|
assert.equal(response.status, 200);
|
|
277
277
|
assert.deepEqual(await response.json(), { ok: true });
|
|
278
278
|
assert.deepEqual(calls, [
|
package/src/access-mcp.test.ts
CHANGED
|
@@ -301,7 +301,7 @@ test("MCP write tools accept and forward client-injected cwd/projectTag (#1434)"
|
|
|
301
301
|
category: "fact",
|
|
302
302
|
dryRun: true,
|
|
303
303
|
cwd: "/home/dev/project-x",
|
|
304
|
-
projectTag: "
|
|
304
|
+
projectTag: "Acme/Webshop",
|
|
305
305
|
}),
|
|
306
306
|
);
|
|
307
307
|
const result = (response as Record<string, unknown> & {
|
|
@@ -310,7 +310,7 @@ test("MCP write tools accept and forward client-injected cwd/projectTag (#1434)"
|
|
|
310
310
|
|
|
311
311
|
assert.equal(result?.isError, false, `${toolName} should accept cwd/projectTag`);
|
|
312
312
|
assert.equal(received?.cwd, "/home/dev/project-x", `${toolName} must forward cwd`);
|
|
313
|
-
assert.equal(received?.projectTag, "
|
|
313
|
+
assert.equal(received?.projectTag, "Acme/Webshop", `${toolName} must forward projectTag`);
|
|
314
314
|
}
|
|
315
315
|
});
|
|
316
316
|
|
package/src/access-mcp.ts
CHANGED
|
@@ -542,7 +542,7 @@ export class EngramMcpServer {
|
|
|
542
542
|
cwd: { type: "string", description: "Working directory for auto git-context resolution." },
|
|
543
543
|
projectTag: {
|
|
544
544
|
type: "string",
|
|
545
|
-
description: "Project tag for non-git project scoping (e.g. '
|
|
545
|
+
description: "Project tag for non-git project scoping (e.g. 'acme-webshop').",
|
|
546
546
|
},
|
|
547
547
|
asOf: {
|
|
548
548
|
type: "string",
|
|
@@ -611,7 +611,7 @@ export class EngramMcpServer {
|
|
|
611
611
|
projectTag: {
|
|
612
612
|
type: "string",
|
|
613
613
|
description:
|
|
614
|
-
"Arbitrary project tag for non-git project scoping (e.g. '
|
|
614
|
+
"Arbitrary project tag for non-git project scoping (e.g. 'acme-webshop'). " +
|
|
615
615
|
"Creates a coding context with projectId 'tag:<projectTag>'. " +
|
|
616
616
|
"Use instead of codingContext when the session isn't tied to a specific git repo.",
|
|
617
617
|
},
|
|
@@ -1274,7 +1274,7 @@ export class EngramMcpServer {
|
|
|
1274
1274
|
cwd: { type: "string", description: "Working directory for auto git-context resolution." },
|
|
1275
1275
|
projectTag: {
|
|
1276
1276
|
type: "string",
|
|
1277
|
-
description: "Project tag for non-git project scoping (e.g. '
|
|
1277
|
+
description: "Project tag for non-git project scoping (e.g. 'acme-webshop').",
|
|
1278
1278
|
},
|
|
1279
1279
|
},
|
|
1280
1280
|
required: ["sessionKey", "messages"],
|
|
@@ -76,11 +76,11 @@ test("#1434 projectTag scopes the write to the project namespace, read-only", as
|
|
|
76
76
|
const resolved = await resolver(service)({
|
|
77
77
|
sessionKey: "sess-1",
|
|
78
78
|
authenticatedPrincipal: "alice",
|
|
79
|
-
projectTag: "
|
|
79
|
+
projectTag: "Acme/Webshop",
|
|
80
80
|
content: "x",
|
|
81
81
|
});
|
|
82
82
|
|
|
83
|
-
assert.equal(resolved, projectNamespaceFor("
|
|
83
|
+
assert.equal(resolved, projectNamespaceFor("Acme/Webshop"));
|
|
84
84
|
assert.notEqual(resolved, "default", "project context must change the namespace");
|
|
85
85
|
// Read-only: resolving must NOT persist coding context on the session.
|
|
86
86
|
assert.equal(
|
|
@@ -100,7 +100,7 @@ test("#1434 a sessionless write with projectTag stays on the base namespace (rec
|
|
|
100
100
|
const service = new EngramAccessService(orch);
|
|
101
101
|
const resolved = await resolver(service)({
|
|
102
102
|
authenticatedPrincipal: "alice",
|
|
103
|
-
projectTag: "
|
|
103
|
+
projectTag: "Acme/Webshop",
|
|
104
104
|
content: "x",
|
|
105
105
|
});
|
|
106
106
|
assert.equal(resolved, "default");
|
|
@@ -109,9 +109,9 @@ test("#1434 a sessionless write with projectTag stays on the base namespace (rec
|
|
|
109
109
|
test("#1434 an existing session coding context scopes the write (recall-then-store flow)", async () => {
|
|
110
110
|
const orch = makeOrchestratorStub();
|
|
111
111
|
orch.setCodingContextForSession("sess-ctx", {
|
|
112
|
-
projectId: projectTagProjectId("
|
|
112
|
+
projectId: projectTagProjectId("Acme/Webshop"),
|
|
113
113
|
branch: null,
|
|
114
|
-
rootPath: projectTagProjectId("
|
|
114
|
+
rootPath: projectTagProjectId("Acme/Webshop"),
|
|
115
115
|
defaultBranch: null,
|
|
116
116
|
});
|
|
117
117
|
const service = new EngramAccessService(orch);
|
|
@@ -121,7 +121,7 @@ test("#1434 an existing session coding context scopes the write (recall-then-sto
|
|
|
121
121
|
authenticatedPrincipal: "alice",
|
|
122
122
|
content: "x",
|
|
123
123
|
});
|
|
124
|
-
assert.equal(resolved, projectNamespaceFor("
|
|
124
|
+
assert.equal(resolved, projectNamespaceFor("Acme/Webshop"));
|
|
125
125
|
});
|
|
126
126
|
|
|
127
127
|
test("#1434 an existing session binding wins over per-call projectTag (recall symmetry)", async () => {
|
|
@@ -155,7 +155,7 @@ test("#1434 explicit namespace wins and bypasses coding overlay", async () => {
|
|
|
155
155
|
sessionKey: "sess-2",
|
|
156
156
|
authenticatedPrincipal: "alice",
|
|
157
157
|
namespace: "default",
|
|
158
|
-
projectTag: "
|
|
158
|
+
projectTag: "Acme/Webshop",
|
|
159
159
|
content: "x",
|
|
160
160
|
});
|
|
161
161
|
assert.equal(resolved, "default");
|
|
@@ -208,12 +208,12 @@ test("#1434 project write overlays onto the principal self base (recall symmetry
|
|
|
208
208
|
const resolved = await resolver(service)({
|
|
209
209
|
sessionKey: "sess-3c",
|
|
210
210
|
authenticatedPrincipal: "alice",
|
|
211
|
-
projectTag: "
|
|
211
|
+
projectTag: "Acme/Webshop",
|
|
212
212
|
content: "x",
|
|
213
213
|
});
|
|
214
214
|
assert.equal(
|
|
215
215
|
resolved,
|
|
216
|
-
combineNamespaces("alice", projectNamespaceName(projectTagProjectId("
|
|
216
|
+
combineNamespaces("alice", projectNamespaceName(projectTagProjectId("Acme/Webshop"))),
|
|
217
217
|
);
|
|
218
218
|
});
|
|
219
219
|
|
|
@@ -228,7 +228,7 @@ test("#1434 an explicit coding-overlay namespace string is NOT a writable target
|
|
|
228
228
|
resolver(service)({
|
|
229
229
|
sessionKey: "sess-explicit-overlay",
|
|
230
230
|
authenticatedPrincipal: "alice",
|
|
231
|
-
namespace: projectNamespaceFor("
|
|
231
|
+
namespace: projectNamespaceFor("Acme/Webshop"), // "default-project-…"
|
|
232
232
|
content: "x",
|
|
233
233
|
}),
|
|
234
234
|
/not writable/,
|
|
@@ -308,7 +308,7 @@ test("#1434 namespaces disabled: cwd/projectTag are a no-op (common single-tenan
|
|
|
308
308
|
const service = new EngramAccessService(orch);
|
|
309
309
|
const resolved = await resolver(service)({
|
|
310
310
|
sessionKey: "sess-4",
|
|
311
|
-
projectTag: "
|
|
311
|
+
projectTag: "Acme/Webshop",
|
|
312
312
|
content: "x",
|
|
313
313
|
});
|
|
314
314
|
assert.equal(resolved, "default");
|
|
@@ -368,18 +368,18 @@ test("#1434 a real memory_store attaches coding context so a later bare recall o
|
|
|
368
368
|
const service = new EngramAccessService(orch);
|
|
369
369
|
|
|
370
370
|
const res = await service.memoryStore(
|
|
371
|
-
storeRequest({ sessionKey: "sess-attach", projectTag: "
|
|
371
|
+
storeRequest({ sessionKey: "sess-attach", projectTag: "Acme/Webshop" }),
|
|
372
372
|
);
|
|
373
373
|
|
|
374
374
|
assert.equal(res.status, "stored");
|
|
375
|
-
assert.equal(res.namespace, projectNamespaceFor("
|
|
375
|
+
assert.equal(res.namespace, projectNamespaceFor("Acme/Webshop"));
|
|
376
376
|
// The store attached the coding context the recall path reads.
|
|
377
377
|
assert.equal(
|
|
378
378
|
contexts.get("sess-attach")?.projectId,
|
|
379
|
-
projectTagProjectId("
|
|
379
|
+
projectTagProjectId("Acme/Webshop"),
|
|
380
380
|
);
|
|
381
381
|
assert.ok(
|
|
382
|
-
getStorageCalls.every((ns) => ns === projectNamespaceFor("
|
|
382
|
+
getStorageCalls.every((ns) => ns === projectNamespaceFor("Acme/Webshop")),
|
|
383
383
|
`expected all getStorage calls on the project namespace, got ${JSON.stringify(getStorageCalls)}`,
|
|
384
384
|
);
|
|
385
385
|
// A later BARE resolve (no per-call context) on the same session — what a
|
|
@@ -389,7 +389,7 @@ test("#1434 a real memory_store attaches coding context so a later bare recall o
|
|
|
389
389
|
authenticatedPrincipal: "alice",
|
|
390
390
|
content: "y",
|
|
391
391
|
});
|
|
392
|
-
assert.equal(bare, projectNamespaceFor("
|
|
392
|
+
assert.equal(bare, projectNamespaceFor("Acme/Webshop"));
|
|
393
393
|
});
|
|
394
394
|
|
|
395
395
|
test("#1434 an explicit-namespace store does NOT bind the session to a project (Codex review)", async () => {
|
|
@@ -399,7 +399,7 @@ test("#1434 an explicit-namespace store does NOT bind the session to a project (
|
|
|
399
399
|
const { orch, contexts } = makeAttachOrchestrator();
|
|
400
400
|
const service = new EngramAccessService(orch);
|
|
401
401
|
const res = await service.memoryStore(
|
|
402
|
-
storeRequest({ sessionKey: "sess-explicit", namespace: "default", projectTag: "
|
|
402
|
+
storeRequest({ sessionKey: "sess-explicit", namespace: "default", projectTag: "Acme/Webshop" }),
|
|
403
403
|
);
|
|
404
404
|
assert.equal(res.status, "stored");
|
|
405
405
|
assert.equal(res.namespace, "default");
|
|
@@ -411,7 +411,7 @@ test("#1434 a dryRun store does NOT bind the session to a project (Codex review)
|
|
|
411
411
|
const { orch, contexts } = makeAttachOrchestrator();
|
|
412
412
|
const service = new EngramAccessService(orch);
|
|
413
413
|
const res = await service.memoryStore(
|
|
414
|
-
storeRequest({ sessionKey: "sess-dry", projectTag: "
|
|
414
|
+
storeRequest({ sessionKey: "sess-dry", projectTag: "Acme/Webshop", dryRun: true }),
|
|
415
415
|
);
|
|
416
416
|
assert.equal(res.status, "validated");
|
|
417
417
|
assert.equal(contexts.get("sess-dry"), undefined, "dryRun must not bind the session");
|
|
@@ -193,7 +193,7 @@ test("#1495 P1 FORGERY BLOCKED: a default-only caller cannot read another tenant
|
|
|
193
193
|
const victimRes = await service.observe(
|
|
194
194
|
observeRequest({
|
|
195
195
|
sessionKey: "alice:s1",
|
|
196
|
-
projectTag: "
|
|
196
|
+
projectTag: "Acme/Webshop",
|
|
197
197
|
}),
|
|
198
198
|
);
|
|
199
199
|
const victimWriteKey = probe.rows[0]!.session_id;
|
|
@@ -235,7 +235,7 @@ test("#1495 P1 FORGERY BLOCKED: a default-only caller cannot read another tenant
|
|
|
235
235
|
const service = new EngramAccessService(probe.orch);
|
|
236
236
|
|
|
237
237
|
const victimRes = await service.observe(
|
|
238
|
-
observeRequest({ sessionKey: "alice:s1", projectTag: "
|
|
238
|
+
observeRequest({ sessionKey: "alice:s1", projectTag: "Acme/Webshop" }),
|
|
239
239
|
);
|
|
240
240
|
const victimOverlayNs = victimRes.effectiveNamespace!;
|
|
241
241
|
assert.ok(victimOverlayNs.startsWith("alice-"));
|
|
@@ -268,7 +268,7 @@ test("#1495 P1 LEGITIMATE ACCESS PRESERVED: the victim still reads its OWN overl
|
|
|
268
268
|
|
|
269
269
|
// alice archives under her overlay AND binds the coding context to her session.
|
|
270
270
|
await service.observe(
|
|
271
|
-
observeRequest({ sessionKey: "alice:s1", projectTag: "
|
|
271
|
+
observeRequest({ sessionKey: "alice:s1", projectTag: "Acme/Webshop" }),
|
|
272
272
|
);
|
|
273
273
|
|
|
274
274
|
// A same-session lcmSearch by alice (no explicit namespace) must reach her rows:
|
|
@@ -330,7 +330,7 @@ test("#1505 codex P1 r2 FORGERY BLOCKED: explicit-namespace + sessionless lcmSea
|
|
|
330
330
|
|
|
331
331
|
// VICTIM archives overlay rows.
|
|
332
332
|
const victimRes = await service.observe(
|
|
333
|
-
observeRequest({ sessionKey: "alice:s1", projectTag: "
|
|
333
|
+
observeRequest({ sessionKey: "alice:s1", projectTag: "Acme/Webshop" }),
|
|
334
334
|
);
|
|
335
335
|
assert.ok(victimRes.effectiveNamespace!.startsWith("alice-"));
|
|
336
336
|
|
|
@@ -361,7 +361,7 @@ test("#1505 codex P1 r2 FORGERY BLOCKED: default-readable implicit + sessionless
|
|
|
361
361
|
const service = new EngramAccessService(probe.orch);
|
|
362
362
|
|
|
363
363
|
const victimRes = await service.observe(
|
|
364
|
-
observeRequest({ sessionKey: "alice:s1", projectTag: "
|
|
364
|
+
observeRequest({ sessionKey: "alice:s1", projectTag: "Acme/Webshop" }),
|
|
365
365
|
);
|
|
366
366
|
assert.ok(victimRes.effectiveNamespace!.startsWith("alice-"));
|
|
367
367
|
|
|
@@ -305,12 +305,12 @@ test("#1505 thread 2 (c) projectTag: observe LCM write key == recall reader key
|
|
|
305
305
|
const service = new EngramAccessService(probe.orch);
|
|
306
306
|
|
|
307
307
|
const res = await service.observe(
|
|
308
|
-
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "
|
|
308
|
+
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "Acme/Webshop" }),
|
|
309
309
|
);
|
|
310
310
|
|
|
311
311
|
const expectedNs = combineNamespaces(
|
|
312
312
|
"pi-geek",
|
|
313
|
-
projectNamespaceName(projectTagProjectId("
|
|
313
|
+
projectNamespaceName(projectTagProjectId("Acme/Webshop")),
|
|
314
314
|
);
|
|
315
315
|
const expectedKey = encodeNs(expectedNs, "pi-geek:abc123");
|
|
316
316
|
assert.equal(res.effectiveNamespace, expectedNs);
|
|
@@ -442,7 +442,7 @@ test("#1505 thread 2 (d) projectScope:false ⇒ raw sessionKey everywhere (singl
|
|
|
442
442
|
const service = new EngramAccessService(probe.orch);
|
|
443
443
|
|
|
444
444
|
const res = await service.observe(
|
|
445
|
-
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "
|
|
445
|
+
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "Acme/Webshop" }),
|
|
446
446
|
);
|
|
447
447
|
// No overlay ⇒ effective namespace is the default store ⇒ raw key.
|
|
448
448
|
assert.equal(res.effectiveNamespace, "default");
|
|
@@ -470,7 +470,7 @@ test("#1505 thread 2 (d) namespacesEnabled:false ⇒ raw sessionKey everywhere",
|
|
|
470
470
|
const service = new EngramAccessService(probe.orch);
|
|
471
471
|
|
|
472
472
|
const res = await service.observe(
|
|
473
|
-
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "
|
|
473
|
+
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "Acme/Webshop" }),
|
|
474
474
|
);
|
|
475
475
|
assert.equal(res.effectiveNamespace, "default");
|
|
476
476
|
assert.equal(probe.lcmWriteKeys[0], "pi-geek:abc123", "raw LCM write key");
|
|
@@ -501,14 +501,14 @@ test("#1505 thread 1: extraction provenance principal is the resolved principal
|
|
|
501
501
|
await service.observe(
|
|
502
502
|
observeRequest({
|
|
503
503
|
sessionKey: "pi-geek:abc123",
|
|
504
|
-
projectTag: "
|
|
504
|
+
projectTag: "Acme/Webshop",
|
|
505
505
|
skipExtraction: false, // exercise the extraction path
|
|
506
506
|
}),
|
|
507
507
|
);
|
|
508
508
|
|
|
509
509
|
const expectedNs = combineNamespaces(
|
|
510
510
|
"pi-geek",
|
|
511
|
-
projectNamespaceName(projectTagProjectId("
|
|
511
|
+
projectNamespaceName(projectTagProjectId("Acme/Webshop")),
|
|
512
512
|
);
|
|
513
513
|
assert.equal(probe.extractionCalls.length, 1);
|
|
514
514
|
// Provenance identity: the resolved principal, never a default parsed from the
|
|
@@ -590,7 +590,7 @@ test("#1505 thread 2: LCM read namespace honors authenticatedPrincipal (write-un
|
|
|
590
590
|
observeRequest({
|
|
591
591
|
sessionKey: "sess-1",
|
|
592
592
|
authenticatedPrincipal: "alice",
|
|
593
|
-
projectTag: "
|
|
593
|
+
projectTag: "Acme/Webshop",
|
|
594
594
|
}),
|
|
595
595
|
);
|
|
596
596
|
const writeKey = probe.lcmWriteKeys[0];
|
|
@@ -639,7 +639,7 @@ test("#1505 thread 2 compaction regression: flush/record overlay-derived key mat
|
|
|
639
639
|
const service = new EngramAccessService(probe.orch);
|
|
640
640
|
|
|
641
641
|
await service.observe(
|
|
642
|
-
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "
|
|
642
|
+
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "Acme/Webshop" }),
|
|
643
643
|
);
|
|
644
644
|
await service.lcmCompactionFlush({ sessionKey: "pi-geek:abc123" });
|
|
645
645
|
|
|
@@ -748,7 +748,7 @@ test("#1505 round 3: access lcmSearch routes the session_id through the SCOPED (
|
|
|
748
748
|
const service = new EngramAccessService(probe.orch);
|
|
749
749
|
|
|
750
750
|
await service.observe(
|
|
751
|
-
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "
|
|
751
|
+
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "Acme/Webshop" }),
|
|
752
752
|
);
|
|
753
753
|
const writeKey = probe.lcmWriteKeys[0];
|
|
754
754
|
// New #1495 P1 encoding: `\x1f<overlayNs>\x1f<sessionKey>`. Parse the overlay
|
|
@@ -872,8 +872,8 @@ test("#1505 round 3 thread 1: orchestrator LCM read key falls back to default wh
|
|
|
872
872
|
|
|
873
873
|
// Bind a coding context to sess-1 so the overlay would apply on alice's base.
|
|
874
874
|
probe.contexts.set("sess-1", {
|
|
875
|
-
projectId: "
|
|
876
|
-
projectName: "
|
|
875
|
+
projectId: "acme-webshop",
|
|
876
|
+
projectName: "Acme/Webshop",
|
|
877
877
|
} as unknown as CodingContext);
|
|
878
878
|
|
|
879
879
|
const lcmReadNamespaceForSession = Orchestrator.prototype[
|
|
@@ -914,8 +914,8 @@ test("#1505 round 3 thread 1: orchestrator LCM read key falls back to default wh
|
|
|
914
914
|
} as Partial<PluginConfig>);
|
|
915
915
|
|
|
916
916
|
probe.contexts.set("sess-1", {
|
|
917
|
-
projectId: "
|
|
918
|
-
projectName: "
|
|
917
|
+
projectId: "acme-webshop",
|
|
918
|
+
projectName: "Acme/Webshop",
|
|
919
919
|
} as unknown as CodingContext);
|
|
920
920
|
|
|
921
921
|
const lcmReadNamespaceForSession = Orchestrator.prototype[
|
|
@@ -944,8 +944,8 @@ test("#1505 round 3 thread 1: orchestrator LCM read key still uses the overlay w
|
|
|
944
944
|
} as Partial<PluginConfig>);
|
|
945
945
|
|
|
946
946
|
probe.contexts.set("pi-geek:abc123", {
|
|
947
|
-
projectId: "
|
|
948
|
-
projectName: "
|
|
947
|
+
projectId: "acme-webshop",
|
|
948
|
+
projectName: "Acme/Webshop",
|
|
949
949
|
} as unknown as CodingContext);
|
|
950
950
|
|
|
951
951
|
const lcmReadNamespaceForSession = Orchestrator.prototype[
|
|
@@ -977,8 +977,8 @@ test("#1505 round 3 thread 2: lcmSearch returns NO overlay rows when the princip
|
|
|
977
977
|
const service = new EngramAccessService(probe.orch);
|
|
978
978
|
|
|
979
979
|
probe.contexts.set("sess-1", {
|
|
980
|
-
projectId: "
|
|
981
|
-
projectName: "
|
|
980
|
+
projectId: "acme-webshop",
|
|
981
|
+
projectName: "Acme/Webshop",
|
|
982
982
|
} as unknown as CodingContext);
|
|
983
983
|
|
|
984
984
|
await service.lcmSearch({
|
|
@@ -1036,7 +1036,7 @@ test("#1505 round 4 thread (codex P2): compaction flush/record target the OVERLA
|
|
|
1036
1036
|
observeRequest({
|
|
1037
1037
|
sessionKey: "sess-1",
|
|
1038
1038
|
authenticatedPrincipal: "alice",
|
|
1039
|
-
projectTag: "
|
|
1039
|
+
projectTag: "Acme/Webshop",
|
|
1040
1040
|
}),
|
|
1041
1041
|
);
|
|
1042
1042
|
const writeKey = probe.lcmWriteKeys[0];
|
|
@@ -1080,8 +1080,8 @@ test("#1505 round 4 thread (codex P2): a read-only lcmSearch by the SAME write-o
|
|
|
1080
1080
|
const service = new EngramAccessService(probe.orch);
|
|
1081
1081
|
|
|
1082
1082
|
probe.contexts.set("sess-1", {
|
|
1083
|
-
projectId: "
|
|
1084
|
-
projectName: "
|
|
1083
|
+
projectId: "acme-webshop",
|
|
1084
|
+
projectName: "Acme/Webshop",
|
|
1085
1085
|
} as unknown as CodingContext);
|
|
1086
1086
|
|
|
1087
1087
|
await service.lcmSearch({
|
|
@@ -1115,7 +1115,7 @@ test("#1505 round 3 thread 2: lcmSearch still routes through the overlay key whe
|
|
|
1115
1115
|
observeRequest({
|
|
1116
1116
|
sessionKey: "sess-1",
|
|
1117
1117
|
authenticatedPrincipal: "alice",
|
|
1118
|
-
projectTag: "
|
|
1118
|
+
projectTag: "Acme/Webshop",
|
|
1119
1119
|
}),
|
|
1120
1120
|
);
|
|
1121
1121
|
const writeKey = probe.lcmWriteKeys[0];
|
|
@@ -1172,7 +1172,7 @@ test("#1505 thread NBHWs (codex P2): restrictive `default` WRITE policy + writab
|
|
|
1172
1172
|
observeRequest({
|
|
1173
1173
|
sessionKey: "sess-1",
|
|
1174
1174
|
authenticatedPrincipal: "alice",
|
|
1175
|
-
projectTag: "
|
|
1175
|
+
projectTag: "Acme/Webshop",
|
|
1176
1176
|
}),
|
|
1177
1177
|
);
|
|
1178
1178
|
const writeKey = probe.lcmWriteKeys[0];
|
|
@@ -1230,7 +1230,7 @@ test("#1505 thread NBHWz (sweep): restrictive `default` READ policy + readable s
|
|
|
1230
1230
|
|
|
1231
1231
|
// observe archives under pi-geek's readable+writable project overlay.
|
|
1232
1232
|
await service.observe(
|
|
1233
|
-
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "
|
|
1233
|
+
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "Acme/Webshop" }),
|
|
1234
1234
|
);
|
|
1235
1235
|
const writeKey = probe.lcmWriteKeys[0];
|
|
1236
1236
|
assertOverlayWriteKey(writeKey, "pi-geek-"); // observe must archive under pi-geek's overlay key, got ${writeKey}
|
|
@@ -1277,8 +1277,8 @@ test("#1505 codex P1 'Don't treat any readable namespace as default LCM access':
|
|
|
1277
1277
|
|
|
1278
1278
|
// Bind a coding context so the overlay WOULD apply on alice's base.
|
|
1279
1279
|
probe.contexts.set("sess-1", {
|
|
1280
|
-
projectId: "
|
|
1281
|
-
projectName: "
|
|
1280
|
+
projectId: "acme-webshop",
|
|
1281
|
+
projectName: "Acme/Webshop",
|
|
1282
1282
|
} as unknown as CodingContext);
|
|
1283
1283
|
|
|
1284
1284
|
const res = await service.lcmSearch({
|
|
@@ -162,14 +162,14 @@ test("#1495 projectTag: LCM, extraction, objective-state, and response all agree
|
|
|
162
162
|
const service = new EngramAccessService(probe.orch);
|
|
163
163
|
|
|
164
164
|
const res = await service.observe(
|
|
165
|
-
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "
|
|
165
|
+
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "Acme/Webshop" }),
|
|
166
166
|
);
|
|
167
167
|
|
|
168
168
|
// Effective write namespace == principal self base overlaid with the project,
|
|
169
169
|
// EXACTLY what a same-session project-scoped recall/store resolves.
|
|
170
170
|
const expected = combineNamespaces(
|
|
171
171
|
"pi-geek",
|
|
172
|
-
projectNamespaceName(projectTagProjectId("
|
|
172
|
+
projectNamespaceName(projectTagProjectId("Acme/Webshop")),
|
|
173
173
|
);
|
|
174
174
|
|
|
175
175
|
assert.equal(res.effectiveNamespace, expected, "response effectiveNamespace");
|
|
@@ -334,7 +334,7 @@ test("#1495 explicit namespace wins and project context does NOT silently overri
|
|
|
334
334
|
observeRequest({
|
|
335
335
|
sessionKey: "pi-geek:abc123",
|
|
336
336
|
namespace: "team",
|
|
337
|
-
projectTag: "
|
|
337
|
+
projectTag: "Acme/Webshop",
|
|
338
338
|
}),
|
|
339
339
|
);
|
|
340
340
|
|
|
@@ -364,7 +364,7 @@ test("#1495 projectScope:false ⇒ no overlay (unqualified write stays on config
|
|
|
364
364
|
const service = new EngramAccessService(probe.orch);
|
|
365
365
|
|
|
366
366
|
const res = await service.observe(
|
|
367
|
-
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "
|
|
367
|
+
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "Acme/Webshop" }),
|
|
368
368
|
);
|
|
369
369
|
|
|
370
370
|
assert.equal(res.effectiveNamespace, "default");
|
|
@@ -385,7 +385,7 @@ test("#1495 namespacesEnabled:false ⇒ single-store behavior preserved", async
|
|
|
385
385
|
const service = new EngramAccessService(probe.orch);
|
|
386
386
|
|
|
387
387
|
const res = await service.observe(
|
|
388
|
-
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "
|
|
388
|
+
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "Acme/Webshop" }),
|
|
389
389
|
);
|
|
390
390
|
|
|
391
391
|
assert.equal(res.effectiveNamespace, "default");
|
|
@@ -409,7 +409,7 @@ test("#1495 unauthorized explicit namespace throws BEFORE session context is att
|
|
|
409
409
|
observeRequest({
|
|
410
410
|
sessionKey: "pi-geek:abc123",
|
|
411
411
|
namespace: "victim-secret",
|
|
412
|
-
projectTag: "
|
|
412
|
+
projectTag: "Acme/Webshop",
|
|
413
413
|
}),
|
|
414
414
|
),
|
|
415
415
|
/not writable/,
|
|
@@ -445,7 +445,7 @@ test("#1505 thread 1/3: unauthorized OVERLAY self-base throws BEFORE coding cont
|
|
|
445
445
|
|
|
446
446
|
await assert.rejects(
|
|
447
447
|
service.observe(
|
|
448
|
-
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "
|
|
448
|
+
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "Acme/Webshop" }),
|
|
449
449
|
),
|
|
450
450
|
/not writable/,
|
|
451
451
|
);
|
|
@@ -491,13 +491,13 @@ test("#1505 thread jvO: restrictive default-namespace write policy does NOT reje
|
|
|
491
491
|
|
|
492
492
|
const expectedOverlay = combineNamespaces(
|
|
493
493
|
"pi-geek",
|
|
494
|
-
projectNamespaceName(projectTagProjectId("
|
|
494
|
+
projectNamespaceName(projectTagProjectId("Acme/Webshop")),
|
|
495
495
|
);
|
|
496
496
|
|
|
497
497
|
// FAIL-BEFORE: this threw `namespace is not writable: default`. PASS-AFTER:
|
|
498
498
|
// the observe is accepted exactly like memory_store/suggestion_submit would.
|
|
499
499
|
const res = await service.observe(
|
|
500
|
-
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "
|
|
500
|
+
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "Acme/Webshop" }),
|
|
501
501
|
);
|
|
502
502
|
|
|
503
503
|
// Every side effect uses the authorized overlay write target.
|
|
@@ -533,7 +533,7 @@ test("#1505 thread jvO: a genuine reject (unwritable self base) under a restrict
|
|
|
533
533
|
|
|
534
534
|
await assert.rejects(
|
|
535
535
|
service.observe(
|
|
536
|
-
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "
|
|
536
|
+
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "Acme/Webshop" }),
|
|
537
537
|
),
|
|
538
538
|
/not writable/,
|
|
539
539
|
);
|
|
@@ -553,12 +553,12 @@ test("#1495 scopeDebug exposes the resolved plan for callers/tests", async () =>
|
|
|
553
553
|
const service = new EngramAccessService(probe.orch);
|
|
554
554
|
|
|
555
555
|
const res = await service.observe(
|
|
556
|
-
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "
|
|
556
|
+
observeRequest({ sessionKey: "pi-geek:abc123", projectTag: "Acme/Webshop" }),
|
|
557
557
|
);
|
|
558
558
|
|
|
559
559
|
const expected = combineNamespaces(
|
|
560
560
|
"pi-geek",
|
|
561
|
-
projectNamespaceName(projectTagProjectId("
|
|
561
|
+
projectNamespaceName(projectTagProjectId("Acme/Webshop")),
|
|
562
562
|
);
|
|
563
563
|
assert.ok(res.scopeDebug, "scopeDebug must be present");
|
|
564
564
|
assert.equal(res.scopeDebug!.principal, "pi-geek");
|
|
@@ -611,9 +611,9 @@ test("#1495 the scope plan's writeNamespace matches resolveCodingScopedWriteName
|
|
|
611
611
|
const probe = makeObserveProbe(withSelfPolicyPrefix("pi-geek"));
|
|
612
612
|
// Bind a session coding context so both resolvers see the same project.
|
|
613
613
|
probe.contexts.set("pi-geek:abc123", {
|
|
614
|
-
projectId: projectTagProjectId("
|
|
614
|
+
projectId: projectTagProjectId("Acme/Webshop"),
|
|
615
615
|
branch: null,
|
|
616
|
-
rootPath: projectTagProjectId("
|
|
616
|
+
rootPath: projectTagProjectId("Acme/Webshop"),
|
|
617
617
|
defaultBranch: null,
|
|
618
618
|
});
|
|
619
619
|
const service = new EngramAccessService(probe.orch);
|
|
@@ -765,14 +765,14 @@ test("#1495 skipExtraction does not enqueue extraction but still archives LCM un
|
|
|
765
765
|
const res = await service.observe(
|
|
766
766
|
observeRequest({
|
|
767
767
|
sessionKey: "pi-geek:abc123",
|
|
768
|
-
projectTag: "
|
|
768
|
+
projectTag: "Acme/Webshop",
|
|
769
769
|
skipExtraction: true,
|
|
770
770
|
}),
|
|
771
771
|
);
|
|
772
772
|
|
|
773
773
|
const expected = combineNamespaces(
|
|
774
774
|
"pi-geek",
|
|
775
|
-
projectNamespaceName(projectTagProjectId("
|
|
775
|
+
projectNamespaceName(projectTagProjectId("Acme/Webshop")),
|
|
776
776
|
);
|
|
777
777
|
assert.equal(res.extractionQueued, false);
|
|
778
778
|
assert.equal(probe.extractionCalls.length, 0);
|
|
@@ -24,10 +24,10 @@ test("projectTag auto-resolution uses the shared project tag canonicalizer", asy
|
|
|
24
24
|
} as any);
|
|
25
25
|
|
|
26
26
|
await (service as any).maybeAttachCodingContext("session-a", {
|
|
27
|
-
projectTag: "
|
|
27
|
+
projectTag: "Acme/Webshop",
|
|
28
28
|
});
|
|
29
29
|
|
|
30
|
-
const projectId = projectTagProjectId("
|
|
30
|
+
const projectId = projectTagProjectId("Acme/Webshop");
|
|
31
31
|
assert.deepEqual(contexts.get("session-a"), {
|
|
32
32
|
projectId,
|
|
33
33
|
branch: null,
|