@remnic/core 9.3.696 → 9.3.698
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-boundary.d.ts +1 -1
- package/dist/access-boundary.js +20 -20
- package/dist/access-cli.js +44 -44
- package/dist/access-http.d.ts +1 -1
- package/dist/access-http.js +23 -23
- package/dist/access-mcp.d.ts +1 -1
- package/dist/access-mcp.js +22 -22
- package/dist/access-operations.d.ts +1 -1
- package/dist/access-operations.js +21 -21
- package/dist/{access-service-BqBQeUJd.d.ts → access-service-DftqtNUy.d.ts} +10 -0
- package/dist/access-service.d.ts +1 -1
- package/dist/access-service.js +19 -19
- package/dist/access-surface-catalog.d.ts +1 -1
- package/dist/active-recall.js +1 -1
- package/dist/{auto-sync-PFW2NJZY.js → auto-sync-3AAP25FV.js} +5 -5
- package/dist/briefing.js +7 -7
- package/dist/calibration.js +2 -2
- package/dist/causal-behavior.js +2 -2
- package/dist/causal-chain.js +2 -2
- package/dist/causal-consolidation.js +10 -10
- package/dist/causal-retrieval.js +2 -2
- package/dist/causal-trajectory-graph.js +2 -2
- package/dist/causal-trajectory.js +1 -1
- package/dist/{chunk-YOZNTNNA.js → chunk-2K64VH66.js} +2 -2
- package/dist/{chunk-NLZO5NO6.js → chunk-2KJG6ZZK.js} +2 -2
- package/dist/{chunk-3P2XEQSV.js → chunk-2ULWWAQH.js} +2 -2
- package/dist/{chunk-EK6FYL2E.js → chunk-3LSSFCB4.js} +13 -13
- package/dist/chunk-3LSSFCB4.js.map +1 -0
- package/dist/{chunk-3PG3H5TD.js → chunk-4EX5WZ4M.js} +2 -2
- package/dist/chunk-4EX5WZ4M.js.map +1 -0
- package/dist/{chunk-LM6JB2EG.js → chunk-4NFVPDIL.js} +2 -2
- package/dist/{chunk-5TYA4OCF.js → chunk-5J4OL7TJ.js} +2 -2
- package/dist/chunk-5J4OL7TJ.js.map +1 -0
- package/dist/{chunk-J45OCIVH.js → chunk-A62RAIBN.js} +2 -2
- package/dist/{chunk-XXA6T3O4.js → chunk-ANZLT74L.js} +2 -2
- package/dist/{chunk-MNFAGE5D.js → chunk-COEZR6F5.js} +2 -2
- package/dist/{chunk-HKET3ZOI.js → chunk-CQ4PGFMC.js} +3 -3
- package/dist/{chunk-SPVIG2R3.js → chunk-E6GOVHHJ.js} +10 -10
- package/dist/{chunk-XWT4JXXA.js → chunk-EZWQZYLK.js} +2 -2
- package/dist/{chunk-5AT62NQH.js → chunk-FEB7W5JG.js} +104 -16
- package/dist/chunk-FEB7W5JG.js.map +1 -0
- package/dist/{chunk-QJM2XAJD.js → chunk-FN2SM5SN.js} +5 -5
- package/dist/{chunk-Q6ZHGGNJ.js → chunk-FSEQXHEZ.js} +2 -2
- package/dist/{chunk-32XTY2DQ.js → chunk-HZ5DRA4Q.js} +44 -44
- package/dist/{chunk-XUNQLJT2.js → chunk-IZ5E6ZTK.js} +4 -4
- package/dist/{chunk-RWST6NOL.js → chunk-JYVD2XZ4.js} +52 -52
- package/dist/chunk-JYVD2XZ4.js.map +1 -0
- package/dist/{chunk-YGKUAX2B.js → chunk-KF74X62T.js} +4 -4
- package/dist/{chunk-JMAKCWJ3.js → chunk-LIWU4QI6.js} +5 -5
- package/dist/{chunk-Q7SFJURX.js → chunk-M4DQWUKX.js} +2 -2
- package/dist/{chunk-AF6DSAWD.js → chunk-MRX6S22R.js} +2 -2
- package/dist/{chunk-FZMH66NT.js → chunk-N55RJT4N.js} +2 -2
- package/dist/{chunk-RK6F44Y6.js → chunk-N7RWREIQ.js} +2 -2
- package/dist/chunk-N7RWREIQ.js.map +1 -0
- package/dist/{chunk-W54EAJT4.js → chunk-PJIHCOGV.js} +2 -2
- package/dist/{chunk-WR6KFJKA.js → chunk-RC3CNIPK.js} +2 -2
- package/dist/{chunk-MOBRVKWE.js → chunk-RIC5U67B.js} +10 -10
- package/dist/{chunk-EC3A6M43.js → chunk-RTN2BLZM.js} +2 -2
- package/dist/{chunk-G663XUEG.js → chunk-SIDSEXUG.js} +2 -2
- package/dist/{chunk-52QIAN76.js → chunk-SJQ4HY3E.js} +2 -2
- package/dist/{chunk-JJT3AGL4.js → chunk-TH7WMHVK.js} +2 -2
- package/dist/{chunk-4NNDJOAO.js → chunk-UDDSC6PO.js} +8 -8
- package/dist/{chunk-TT7BJWGI.js → chunk-VKJHM6PL.js} +2 -2
- package/dist/{chunk-N4PD5IY3.js → chunk-XFG3PVZE.js} +53 -33
- package/dist/chunk-XFG3PVZE.js.map +1 -0
- package/dist/{chunk-NFMDHE45.js → chunk-XL5RSHZP.js} +2 -2
- package/dist/{chunk-3LYJIA76.js → chunk-YN4ZT4CW.js} +1 -1
- package/dist/{chunk-IF362TF6.js → chunk-YOI3ELXF.js} +2 -2
- package/dist/{chunk-6GAUF4OU.js → chunk-YY2HGKWR.js} +2 -2
- package/dist/{cli-DBDgdvh9.d.ts → cli-DUMkkdLl.d.ts} +1 -1
- package/dist/{codex-cli-fallback.js → cli-fallback.js} +2 -2
- package/dist/cli.d.ts +2 -2
- package/dist/cli.js +38 -38
- package/dist/compounding/engine.js +7 -7
- package/dist/config.js +1 -1
- package/dist/connectors/codex-materialize-runner.js +7 -7
- package/dist/connectors/index.js +7 -7
- package/dist/entity-retrieval.js +7 -7
- package/dist/extraction-faithfulness.d.ts +23 -3
- package/dist/extraction-faithfulness.js +3 -3
- package/dist/extraction-judge.js +3 -3
- package/dist/extraction.js +4 -4
- package/dist/fallback-llm.js +2 -2
- package/dist/{graph-edge-decay-JLOF3YW4.js → graph-edge-decay-D7OESCBR.js} +3 -3
- package/dist/graph-snapshot.js +3 -3
- package/dist/graph.js +2 -2
- package/dist/index.d.ts +4 -4
- package/dist/index.js +80 -80
- package/dist/maintenance/memory-governance.js +7 -7
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +7 -7
- package/dist/maintenance/rebuild-memory-projection.js +8 -8
- package/dist/mcp-memory-inspector-app.d.ts +1 -1
- package/dist/namespaces/migrate.js +8 -8
- package/dist/namespaces/storage.js +7 -7
- package/dist/operator-toolkit.js +15 -15
- package/dist/orchestration/maintenance.js +9 -9
- package/dist/orchestrator.js +35 -35
- package/dist/recall-planner-llm.js +2 -2
- package/dist/resume-bundles.js +2 -2
- package/dist/schemas.d.ts +22 -22
- package/dist/semantic-consolidation.js +8 -8
- package/dist/semantic-rule-promotion.js +7 -7
- package/dist/semantic-rule-verifier.js +7 -7
- package/dist/storage.js +6 -6
- package/dist/summarizer.js +3 -3
- package/dist/{codex-thread-key.js → thread-key.js} +2 -2
- package/dist/transfer/types.d.ts +12 -12
- package/dist/verified-recall.js +7 -7
- package/package.json +18 -18
- package/src/access-service.ts +17 -0
- package/src/coding/session-delta-surfaces.test.ts +185 -1
- package/src/coding/session-delta-surfaces.ts +30 -1
- package/src/coding/session-delta.test.ts +46 -0
- package/src/coding/session-delta.ts +18 -1
- package/src/config.test.ts +32 -0
- package/src/config.ts +12 -12
- package/src/extraction-faithfulness.test.ts +149 -5
- package/src/extraction-faithfulness.ts +195 -21
- package/src/fallback-llm.test.ts +1 -1
- package/src/fallback-llm.ts +1 -1
- package/src/index.ts +2 -2
- package/src/orchestrator.ts +1 -1
- package/dist/chunk-3PG3H5TD.js.map +0 -1
- package/dist/chunk-5AT62NQH.js.map +0 -1
- package/dist/chunk-5TYA4OCF.js.map +0 -1
- package/dist/chunk-EK6FYL2E.js.map +0 -1
- package/dist/chunk-N4PD5IY3.js.map +0 -1
- package/dist/chunk-RK6F44Y6.js.map +0 -1
- package/dist/chunk-RWST6NOL.js.map +0 -1
- /package/dist/{auto-sync-PFW2NJZY.js.map → auto-sync-3AAP25FV.js.map} +0 -0
- /package/dist/{chunk-YOZNTNNA.js.map → chunk-2K64VH66.js.map} +0 -0
- /package/dist/{chunk-NLZO5NO6.js.map → chunk-2KJG6ZZK.js.map} +0 -0
- /package/dist/{chunk-3P2XEQSV.js.map → chunk-2ULWWAQH.js.map} +0 -0
- /package/dist/{chunk-LM6JB2EG.js.map → chunk-4NFVPDIL.js.map} +0 -0
- /package/dist/{chunk-J45OCIVH.js.map → chunk-A62RAIBN.js.map} +0 -0
- /package/dist/{chunk-XXA6T3O4.js.map → chunk-ANZLT74L.js.map} +0 -0
- /package/dist/{chunk-MNFAGE5D.js.map → chunk-COEZR6F5.js.map} +0 -0
- /package/dist/{chunk-HKET3ZOI.js.map → chunk-CQ4PGFMC.js.map} +0 -0
- /package/dist/{chunk-SPVIG2R3.js.map → chunk-E6GOVHHJ.js.map} +0 -0
- /package/dist/{chunk-XWT4JXXA.js.map → chunk-EZWQZYLK.js.map} +0 -0
- /package/dist/{chunk-QJM2XAJD.js.map → chunk-FN2SM5SN.js.map} +0 -0
- /package/dist/{chunk-Q6ZHGGNJ.js.map → chunk-FSEQXHEZ.js.map} +0 -0
- /package/dist/{chunk-32XTY2DQ.js.map → chunk-HZ5DRA4Q.js.map} +0 -0
- /package/dist/{chunk-XUNQLJT2.js.map → chunk-IZ5E6ZTK.js.map} +0 -0
- /package/dist/{chunk-YGKUAX2B.js.map → chunk-KF74X62T.js.map} +0 -0
- /package/dist/{chunk-JMAKCWJ3.js.map → chunk-LIWU4QI6.js.map} +0 -0
- /package/dist/{chunk-Q7SFJURX.js.map → chunk-M4DQWUKX.js.map} +0 -0
- /package/dist/{chunk-AF6DSAWD.js.map → chunk-MRX6S22R.js.map} +0 -0
- /package/dist/{chunk-FZMH66NT.js.map → chunk-N55RJT4N.js.map} +0 -0
- /package/dist/{chunk-W54EAJT4.js.map → chunk-PJIHCOGV.js.map} +0 -0
- /package/dist/{chunk-WR6KFJKA.js.map → chunk-RC3CNIPK.js.map} +0 -0
- /package/dist/{chunk-MOBRVKWE.js.map → chunk-RIC5U67B.js.map} +0 -0
- /package/dist/{chunk-EC3A6M43.js.map → chunk-RTN2BLZM.js.map} +0 -0
- /package/dist/{chunk-G663XUEG.js.map → chunk-SIDSEXUG.js.map} +0 -0
- /package/dist/{chunk-52QIAN76.js.map → chunk-SJQ4HY3E.js.map} +0 -0
- /package/dist/{chunk-JJT3AGL4.js.map → chunk-TH7WMHVK.js.map} +0 -0
- /package/dist/{chunk-4NNDJOAO.js.map → chunk-UDDSC6PO.js.map} +0 -0
- /package/dist/{chunk-TT7BJWGI.js.map → chunk-VKJHM6PL.js.map} +0 -0
- /package/dist/{chunk-NFMDHE45.js.map → chunk-XL5RSHZP.js.map} +0 -0
- /package/dist/{chunk-3LYJIA76.js.map → chunk-YN4ZT4CW.js.map} +0 -0
- /package/dist/{chunk-IF362TF6.js.map → chunk-YOI3ELXF.js.map} +0 -0
- /package/dist/{chunk-6GAUF4OU.js.map → chunk-YY2HGKWR.js.map} +0 -0
- /package/dist/{codex-cli-fallback.d.ts → cli-fallback.d.ts} +0 -0
- /package/dist/{codex-cli-fallback.js.map → cli-fallback.js.map} +0 -0
- /package/dist/{graph-edge-decay-JLOF3YW4.js.map → graph-edge-decay-D7OESCBR.js.map} +0 -0
- /package/dist/{codex-thread-key.d.ts → thread-key.d.ts} +0 -0
- /package/dist/{codex-thread-key.js.map → thread-key.js.map} +0 -0
- /package/src/{codex-cli-fallback.ts → cli-fallback.ts} +0 -0
- /package/src/{codex-thread-key.ts → thread-key.ts} +0 -0
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
import {
|
|
2
2
|
compareVerifiedSemanticRuleResults,
|
|
3
3
|
searchVerifiedSemanticRules
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-N55RJT4N.js";
|
|
5
|
+
import "./chunk-RIC5U67B.js";
|
|
6
6
|
import "./chunk-M7XQSUBB.js";
|
|
7
7
|
import "./chunk-5UZXUTVO.js";
|
|
8
8
|
import "./chunk-5GPPACXK.js";
|
|
9
9
|
import "./chunk-SVOZFLIQ.js";
|
|
10
10
|
import "./chunk-J6A3CX5N.js";
|
|
11
11
|
import "./chunk-ZXUOAFUG.js";
|
|
12
|
-
import "./chunk-RULE4VG5.js";
|
|
13
12
|
import "./chunk-SCU65EZI.js";
|
|
14
13
|
import "./chunk-MB5RSUW6.js";
|
|
15
14
|
import "./chunk-6KYMPV2O.js";
|
|
16
15
|
import "./chunk-AWJ2FHCF.js";
|
|
17
16
|
import "./chunk-42JKGUFJ.js";
|
|
18
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-RULE4VG5.js";
|
|
19
18
|
import "./chunk-LDXUBPMO.js";
|
|
19
|
+
import "./chunk-DM2T26WE.js";
|
|
20
20
|
import "./chunk-FVQJYWH7.js";
|
|
21
|
-
import "./chunk-
|
|
21
|
+
import "./chunk-FEB7W5JG.js";
|
|
22
22
|
import "./chunk-G7D6GZ5J.js";
|
|
23
23
|
import "./chunk-VF4XKTX3.js";
|
|
24
|
-
import "./chunk-
|
|
24
|
+
import "./chunk-5J4OL7TJ.js";
|
|
25
25
|
import "./chunk-IQVQJJL7.js";
|
|
26
26
|
import "./chunk-VL7DP3OW.js";
|
|
27
27
|
import "./chunk-L2EXJQJP.js";
|
|
28
28
|
import "./chunk-RGMVMVMF.js";
|
|
29
|
-
import "./chunk-
|
|
29
|
+
import "./chunk-N7RWREIQ.js";
|
|
30
30
|
import "./chunk-J2HSAU72.js";
|
|
31
31
|
import "./chunk-A6XUJE5D.js";
|
|
32
32
|
import "./chunk-P7FMDTKL.js";
|
package/dist/storage.js
CHANGED
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
normalizeEntityName,
|
|
9
9
|
parseEntityFile,
|
|
10
10
|
serializeEntityFile
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-RIC5U67B.js";
|
|
12
12
|
import "./chunk-M7XQSUBB.js";
|
|
13
13
|
import "./chunk-5UZXUTVO.js";
|
|
14
14
|
import "./chunk-5GPPACXK.js";
|
|
@@ -17,24 +17,24 @@ import {
|
|
|
17
17
|
} from "./chunk-SVOZFLIQ.js";
|
|
18
18
|
import "./chunk-J6A3CX5N.js";
|
|
19
19
|
import "./chunk-ZXUOAFUG.js";
|
|
20
|
-
import "./chunk-RULE4VG5.js";
|
|
21
20
|
import "./chunk-SCU65EZI.js";
|
|
22
21
|
import "./chunk-MB5RSUW6.js";
|
|
23
22
|
import "./chunk-6KYMPV2O.js";
|
|
24
23
|
import "./chunk-AWJ2FHCF.js";
|
|
25
24
|
import "./chunk-42JKGUFJ.js";
|
|
26
|
-
import "./chunk-
|
|
25
|
+
import "./chunk-RULE4VG5.js";
|
|
27
26
|
import "./chunk-LDXUBPMO.js";
|
|
27
|
+
import "./chunk-DM2T26WE.js";
|
|
28
28
|
import "./chunk-FVQJYWH7.js";
|
|
29
|
-
import "./chunk-
|
|
29
|
+
import "./chunk-FEB7W5JG.js";
|
|
30
30
|
import "./chunk-G7D6GZ5J.js";
|
|
31
31
|
import "./chunk-VF4XKTX3.js";
|
|
32
|
-
import "./chunk-
|
|
32
|
+
import "./chunk-5J4OL7TJ.js";
|
|
33
33
|
import "./chunk-IQVQJJL7.js";
|
|
34
34
|
import "./chunk-VL7DP3OW.js";
|
|
35
35
|
import "./chunk-L2EXJQJP.js";
|
|
36
36
|
import "./chunk-RGMVMVMF.js";
|
|
37
|
-
import "./chunk-
|
|
37
|
+
import "./chunk-N7RWREIQ.js";
|
|
38
38
|
import "./chunk-J2HSAU72.js";
|
|
39
39
|
import "./chunk-A6XUJE5D.js";
|
|
40
40
|
import "./chunk-P7FMDTKL.js";
|
package/dist/summarizer.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import {
|
|
2
2
|
HourlySummarizer
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-RC3CNIPK.js";
|
|
4
4
|
import "./chunk-XJNBEDFE.js";
|
|
5
5
|
import "./chunk-PWFWCGOO.js";
|
|
6
6
|
import "./chunk-24D66MMN.js";
|
|
7
7
|
import "./chunk-S4DDLTPX.js";
|
|
8
8
|
import "./chunk-FF4KLI5W.js";
|
|
9
9
|
import "./chunk-O75CRYGF.js";
|
|
10
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-5J4OL7TJ.js";
|
|
11
11
|
import "./chunk-IQVQJJL7.js";
|
|
12
12
|
import "./chunk-VL7DP3OW.js";
|
|
13
13
|
import "./chunk-L2EXJQJP.js";
|
|
14
14
|
import "./chunk-RGMVMVMF.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-N7RWREIQ.js";
|
|
16
16
|
import "./chunk-EYIEWJNI.js";
|
|
17
17
|
import "./chunk-JUC24CTX.js";
|
|
18
18
|
import "./chunk-NU3CSQ4H.js";
|
package/dist/transfer/types.d.ts
CHANGED
|
@@ -313,13 +313,13 @@ declare const CapsuleBlockSchema: z.ZodObject<{
|
|
|
313
313
|
peerProfiles: boolean;
|
|
314
314
|
}>;
|
|
315
315
|
}, "strip", z.ZodTypeAny, {
|
|
316
|
+
schemaVersion: string;
|
|
316
317
|
includes: {
|
|
317
318
|
procedural: boolean;
|
|
318
319
|
taxonomy: boolean;
|
|
319
320
|
identityAnchors: boolean;
|
|
320
321
|
peerProfiles: boolean;
|
|
321
322
|
};
|
|
322
|
-
schemaVersion: string;
|
|
323
323
|
id: string;
|
|
324
324
|
description: string;
|
|
325
325
|
version: string;
|
|
@@ -334,13 +334,13 @@ declare const CapsuleBlockSchema: z.ZodObject<{
|
|
|
334
334
|
directAnswerEnabled: boolean;
|
|
335
335
|
};
|
|
336
336
|
}, {
|
|
337
|
+
schemaVersion: string;
|
|
337
338
|
includes: {
|
|
338
339
|
procedural: boolean;
|
|
339
340
|
taxonomy: boolean;
|
|
340
341
|
identityAnchors: boolean;
|
|
341
342
|
peerProfiles: boolean;
|
|
342
343
|
};
|
|
343
|
-
schemaVersion: string;
|
|
344
344
|
id: string;
|
|
345
345
|
description: string;
|
|
346
346
|
version: string;
|
|
@@ -464,13 +464,13 @@ declare const ExportManifestV2Schema: z.ZodObject<{
|
|
|
464
464
|
peerProfiles: boolean;
|
|
465
465
|
}>;
|
|
466
466
|
}, "strip", z.ZodTypeAny, {
|
|
467
|
+
schemaVersion: string;
|
|
467
468
|
includes: {
|
|
468
469
|
procedural: boolean;
|
|
469
470
|
taxonomy: boolean;
|
|
470
471
|
identityAnchors: boolean;
|
|
471
472
|
peerProfiles: boolean;
|
|
472
473
|
};
|
|
473
|
-
schemaVersion: string;
|
|
474
474
|
id: string;
|
|
475
475
|
description: string;
|
|
476
476
|
version: string;
|
|
@@ -485,13 +485,13 @@ declare const ExportManifestV2Schema: z.ZodObject<{
|
|
|
485
485
|
directAnswerEnabled: boolean;
|
|
486
486
|
};
|
|
487
487
|
}, {
|
|
488
|
+
schemaVersion: string;
|
|
488
489
|
includes: {
|
|
489
490
|
procedural: boolean;
|
|
490
491
|
taxonomy: boolean;
|
|
491
492
|
identityAnchors: boolean;
|
|
492
493
|
peerProfiles: boolean;
|
|
493
494
|
};
|
|
494
|
-
schemaVersion: string;
|
|
495
495
|
id: string;
|
|
496
496
|
description: string;
|
|
497
497
|
version: string;
|
|
@@ -518,13 +518,13 @@ declare const ExportManifestV2Schema: z.ZodObject<{
|
|
|
518
518
|
pluginVersion: string;
|
|
519
519
|
includesTranscripts: boolean;
|
|
520
520
|
capsule: {
|
|
521
|
+
schemaVersion: string;
|
|
521
522
|
includes: {
|
|
522
523
|
procedural: boolean;
|
|
523
524
|
taxonomy: boolean;
|
|
524
525
|
identityAnchors: boolean;
|
|
525
526
|
peerProfiles: boolean;
|
|
526
527
|
};
|
|
527
|
-
schemaVersion: string;
|
|
528
528
|
id: string;
|
|
529
529
|
description: string;
|
|
530
530
|
version: string;
|
|
@@ -551,13 +551,13 @@ declare const ExportManifestV2Schema: z.ZodObject<{
|
|
|
551
551
|
pluginVersion: string;
|
|
552
552
|
includesTranscripts: boolean;
|
|
553
553
|
capsule: {
|
|
554
|
+
schemaVersion: string;
|
|
554
555
|
includes: {
|
|
555
556
|
procedural: boolean;
|
|
556
557
|
taxonomy: boolean;
|
|
557
558
|
identityAnchors: boolean;
|
|
558
559
|
peerProfiles: boolean;
|
|
559
560
|
};
|
|
560
|
-
schemaVersion: string;
|
|
561
561
|
id: string;
|
|
562
562
|
description: string;
|
|
563
563
|
version: string;
|
|
@@ -683,13 +683,13 @@ declare const ExportBundleV2Schema: z.ZodObject<{
|
|
|
683
683
|
peerProfiles: boolean;
|
|
684
684
|
}>;
|
|
685
685
|
}, "strip", z.ZodTypeAny, {
|
|
686
|
+
schemaVersion: string;
|
|
686
687
|
includes: {
|
|
687
688
|
procedural: boolean;
|
|
688
689
|
taxonomy: boolean;
|
|
689
690
|
identityAnchors: boolean;
|
|
690
691
|
peerProfiles: boolean;
|
|
691
692
|
};
|
|
692
|
-
schemaVersion: string;
|
|
693
693
|
id: string;
|
|
694
694
|
description: string;
|
|
695
695
|
version: string;
|
|
@@ -704,13 +704,13 @@ declare const ExportBundleV2Schema: z.ZodObject<{
|
|
|
704
704
|
directAnswerEnabled: boolean;
|
|
705
705
|
};
|
|
706
706
|
}, {
|
|
707
|
+
schemaVersion: string;
|
|
707
708
|
includes: {
|
|
708
709
|
procedural: boolean;
|
|
709
710
|
taxonomy: boolean;
|
|
710
711
|
identityAnchors: boolean;
|
|
711
712
|
peerProfiles: boolean;
|
|
712
713
|
};
|
|
713
|
-
schemaVersion: string;
|
|
714
714
|
id: string;
|
|
715
715
|
description: string;
|
|
716
716
|
version: string;
|
|
@@ -737,13 +737,13 @@ declare const ExportBundleV2Schema: z.ZodObject<{
|
|
|
737
737
|
pluginVersion: string;
|
|
738
738
|
includesTranscripts: boolean;
|
|
739
739
|
capsule: {
|
|
740
|
+
schemaVersion: string;
|
|
740
741
|
includes: {
|
|
741
742
|
procedural: boolean;
|
|
742
743
|
taxonomy: boolean;
|
|
743
744
|
identityAnchors: boolean;
|
|
744
745
|
peerProfiles: boolean;
|
|
745
746
|
};
|
|
746
|
-
schemaVersion: string;
|
|
747
747
|
id: string;
|
|
748
748
|
description: string;
|
|
749
749
|
version: string;
|
|
@@ -770,13 +770,13 @@ declare const ExportBundleV2Schema: z.ZodObject<{
|
|
|
770
770
|
pluginVersion: string;
|
|
771
771
|
includesTranscripts: boolean;
|
|
772
772
|
capsule: {
|
|
773
|
+
schemaVersion: string;
|
|
773
774
|
includes: {
|
|
774
775
|
procedural: boolean;
|
|
775
776
|
taxonomy: boolean;
|
|
776
777
|
identityAnchors: boolean;
|
|
777
778
|
peerProfiles: boolean;
|
|
778
779
|
};
|
|
779
|
-
schemaVersion: string;
|
|
780
780
|
id: string;
|
|
781
781
|
description: string;
|
|
782
782
|
version: string;
|
|
@@ -819,13 +819,13 @@ declare const ExportBundleV2Schema: z.ZodObject<{
|
|
|
819
819
|
pluginVersion: string;
|
|
820
820
|
includesTranscripts: boolean;
|
|
821
821
|
capsule: {
|
|
822
|
+
schemaVersion: string;
|
|
822
823
|
includes: {
|
|
823
824
|
procedural: boolean;
|
|
824
825
|
taxonomy: boolean;
|
|
825
826
|
identityAnchors: boolean;
|
|
826
827
|
peerProfiles: boolean;
|
|
827
828
|
};
|
|
828
|
-
schemaVersion: string;
|
|
829
829
|
id: string;
|
|
830
830
|
description: string;
|
|
831
831
|
version: string;
|
|
@@ -858,13 +858,13 @@ declare const ExportBundleV2Schema: z.ZodObject<{
|
|
|
858
858
|
pluginVersion: string;
|
|
859
859
|
includesTranscripts: boolean;
|
|
860
860
|
capsule: {
|
|
861
|
+
schemaVersion: string;
|
|
861
862
|
includes: {
|
|
862
863
|
procedural: boolean;
|
|
863
864
|
taxonomy: boolean;
|
|
864
865
|
identityAnchors: boolean;
|
|
865
866
|
peerProfiles: boolean;
|
|
866
867
|
};
|
|
867
|
-
schemaVersion: string;
|
|
868
868
|
id: string;
|
|
869
869
|
description: string;
|
|
870
870
|
version: string;
|
package/dist/verified-recall.js
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
import {
|
|
2
2
|
compareVerifiedEpisodeResults,
|
|
3
3
|
searchVerifiedEpisodes
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-FSEQXHEZ.js";
|
|
5
5
|
import "./chunk-7FL4CNPV.js";
|
|
6
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-RIC5U67B.js";
|
|
7
7
|
import "./chunk-M7XQSUBB.js";
|
|
8
8
|
import "./chunk-5UZXUTVO.js";
|
|
9
9
|
import "./chunk-5GPPACXK.js";
|
|
10
10
|
import "./chunk-SVOZFLIQ.js";
|
|
11
11
|
import "./chunk-J6A3CX5N.js";
|
|
12
12
|
import "./chunk-ZXUOAFUG.js";
|
|
13
|
-
import "./chunk-RULE4VG5.js";
|
|
14
13
|
import "./chunk-SCU65EZI.js";
|
|
15
14
|
import "./chunk-MB5RSUW6.js";
|
|
16
15
|
import "./chunk-6KYMPV2O.js";
|
|
17
16
|
import "./chunk-AWJ2FHCF.js";
|
|
18
17
|
import "./chunk-42JKGUFJ.js";
|
|
19
|
-
import "./chunk-
|
|
18
|
+
import "./chunk-RULE4VG5.js";
|
|
20
19
|
import "./chunk-LDXUBPMO.js";
|
|
20
|
+
import "./chunk-DM2T26WE.js";
|
|
21
21
|
import "./chunk-FVQJYWH7.js";
|
|
22
|
-
import "./chunk-
|
|
22
|
+
import "./chunk-FEB7W5JG.js";
|
|
23
23
|
import "./chunk-G7D6GZ5J.js";
|
|
24
24
|
import "./chunk-VF4XKTX3.js";
|
|
25
|
-
import "./chunk-
|
|
25
|
+
import "./chunk-5J4OL7TJ.js";
|
|
26
26
|
import "./chunk-IQVQJJL7.js";
|
|
27
27
|
import "./chunk-VL7DP3OW.js";
|
|
28
28
|
import "./chunk-L2EXJQJP.js";
|
|
29
29
|
import "./chunk-RGMVMVMF.js";
|
|
30
|
-
import "./chunk-
|
|
30
|
+
import "./chunk-N7RWREIQ.js";
|
|
31
31
|
import "./chunk-J2HSAU72.js";
|
|
32
32
|
import "./chunk-A6XUJE5D.js";
|
|
33
33
|
import "./chunk-P7FMDTKL.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remnic/core",
|
|
3
|
-
"version": "9.3.
|
|
3
|
+
"version": "9.3.698",
|
|
4
4
|
"description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -421,25 +421,25 @@
|
|
|
421
421
|
"remnic-source": "./src/cli.ts",
|
|
422
422
|
"import": "./dist/cli.js"
|
|
423
423
|
},
|
|
424
|
-
"./
|
|
425
|
-
"types": "./dist/
|
|
426
|
-
"remnic-source": "./src/
|
|
427
|
-
"import": "./dist/
|
|
424
|
+
"./cli-fallback": {
|
|
425
|
+
"types": "./dist/cli-fallback.d.ts",
|
|
426
|
+
"remnic-source": "./src/cli-fallback.ts",
|
|
427
|
+
"import": "./dist/cli-fallback.js"
|
|
428
428
|
},
|
|
429
|
-
"./
|
|
430
|
-
"types": "./dist/
|
|
431
|
-
"remnic-source": "./src/
|
|
432
|
-
"import": "./dist/
|
|
429
|
+
"./cli-fallback.js": {
|
|
430
|
+
"types": "./dist/cli-fallback.d.ts",
|
|
431
|
+
"remnic-source": "./src/cli-fallback.ts",
|
|
432
|
+
"import": "./dist/cli-fallback.js"
|
|
433
433
|
},
|
|
434
|
-
"./
|
|
435
|
-
"types": "./dist/
|
|
436
|
-
"remnic-source": "./src/
|
|
437
|
-
"import": "./dist/
|
|
434
|
+
"./thread-key": {
|
|
435
|
+
"types": "./dist/thread-key.d.ts",
|
|
436
|
+
"remnic-source": "./src/thread-key.ts",
|
|
437
|
+
"import": "./dist/thread-key.js"
|
|
438
438
|
},
|
|
439
|
-
"./
|
|
440
|
-
"types": "./dist/
|
|
441
|
-
"remnic-source": "./src/
|
|
442
|
-
"import": "./dist/
|
|
439
|
+
"./thread-key.js": {
|
|
440
|
+
"types": "./dist/thread-key.d.ts",
|
|
441
|
+
"remnic-source": "./src/thread-key.ts",
|
|
442
|
+
"import": "./dist/thread-key.js"
|
|
443
443
|
},
|
|
444
444
|
"./coding/optional-coding-graph": {
|
|
445
445
|
"types": "./dist/coding/optional-coding-graph.d.ts",
|
|
@@ -2941,7 +2941,7 @@
|
|
|
2941
2941
|
"core"
|
|
2942
2942
|
],
|
|
2943
2943
|
"peerDependencies": {
|
|
2944
|
-
"@remnic/coding-graph": "^9.3.
|
|
2944
|
+
"@remnic/coding-graph": "^9.3.698"
|
|
2945
2945
|
},
|
|
2946
2946
|
"peerDependenciesMeta": {
|
|
2947
2947
|
"@remnic/coding-graph": {
|
package/src/access-service.ts
CHANGED
|
@@ -4665,9 +4665,26 @@ export class EngramAccessService {
|
|
|
4665
4665
|
// non-default namespaces route to memoryDir/namespaces/<token>, so
|
|
4666
4666
|
// session-delta markers must read/write from the routed tree, mirroring
|
|
4667
4667
|
// the decision/architecture siblings (cursor review).
|
|
4668
|
+
// Issue #1630 fix 2: gate the marker write on the WRITE-path resolver
|
|
4669
|
+
// — it mirrors memory_store's exact authorization (base ACL for coding
|
|
4670
|
+
// overlays, selectedLayer.writable for scope-profiles), not the raw
|
|
4671
|
+
// canWriteNamespace which misses overlay/profile grants (cursor+codex
|
|
4672
|
+
// review). A throw = read-only caller; delta computed but no advance.
|
|
4673
|
+
let canAdvanceState = false;
|
|
4674
|
+
try {
|
|
4675
|
+
await this.resolveCodingScopedWriteNamespace({
|
|
4676
|
+
namespace: req.namespace,
|
|
4677
|
+
sessionKey: req.sessionKey,
|
|
4678
|
+
authenticatedPrincipal,
|
|
4679
|
+
});
|
|
4680
|
+
canAdvanceState = true;
|
|
4681
|
+
} catch {
|
|
4682
|
+
canAdvanceState = false;
|
|
4683
|
+
}
|
|
4668
4684
|
return {
|
|
4669
4685
|
memoryDir: storage.dir,
|
|
4670
4686
|
namespace: ns,
|
|
4687
|
+
canAdvanceState,
|
|
4671
4688
|
} satisfies DeltaSurfaceStorage;
|
|
4672
4689
|
},
|
|
4673
4690
|
gitInvoker: (cwd, args) => {
|
|
@@ -81,9 +81,10 @@ function makeContext(overrides: Partial<DeltaSurfaceContext> = {}): DeltaSurface
|
|
|
81
81
|
// shimming its filesystem. The handler imports readLastSeenState / writeLastSeenState
|
|
82
82
|
// from ./session-delta.js, which hit the real fs. We point memoryDir at a
|
|
83
83
|
// temp dir per-test.
|
|
84
|
-
import { mkdtemp, rm } from "node:fs/promises";
|
|
84
|
+
import { mkdtemp, rm, readFile } from "node:fs/promises";
|
|
85
85
|
import { tmpdir } from "node:os";
|
|
86
86
|
import path from "node:path";
|
|
87
|
+
import { sessionDeltaStatePath } from "./session-delta.js";
|
|
87
88
|
|
|
88
89
|
async function makeTempStorage(): Promise<{ storage: DeltaSurfaceStorage; cleanup: () => Promise<void> }> {
|
|
89
90
|
const dir = await mkdtemp(path.join(tmpdir(), "delta-surface-"));
|
|
@@ -383,3 +384,186 @@ test("handler/get: state file is created after a successful first_run", async ()
|
|
|
383
384
|
await cleanup();
|
|
384
385
|
}
|
|
385
386
|
});
|
|
387
|
+
|
|
388
|
+
// ──────────────────────────────────────────────────────────────────────────
|
|
389
|
+
// Issue #1630 fix 1 — uncapped totals surface in the changed response
|
|
390
|
+
// ──────────────────────────────────────────────────────────────────────────
|
|
391
|
+
|
|
392
|
+
test("handler/get: changed response surfaces uncapped totals alongside capped slices (issue #1630 fix 1)", async () => {
|
|
393
|
+
const { storage, cleanup } = await makeTempStorage();
|
|
394
|
+
try {
|
|
395
|
+
// Seed: first run on headA.
|
|
396
|
+
const invoker1 = makeInvoker([
|
|
397
|
+
{ args: ["rev-parse", "HEAD"], stdout: "headA\n" },
|
|
398
|
+
]);
|
|
399
|
+
await handleCodingDelta(
|
|
400
|
+
{ subcommand: "get", sessionKey: "s1" },
|
|
401
|
+
makeContext({ resolveStorage: async () => storage, gitInvoker: invoker1 }),
|
|
402
|
+
);
|
|
403
|
+
|
|
404
|
+
// Now head moved to headB with 25 commits / 60 files — both exceed the
|
|
405
|
+
// caps (MAX_DELTA_COMMITS=20, MAX_DELTA_FILES=50).
|
|
406
|
+
const sep = "\x1f";
|
|
407
|
+
const commitBlocks = Array.from({ length: 25 }, (_, i) => [
|
|
408
|
+
`sha${i}${sep}fix ${i}`,
|
|
409
|
+
"",
|
|
410
|
+
`src/file${i}.ts`,
|
|
411
|
+
"",
|
|
412
|
+
].join("\n"));
|
|
413
|
+
// Add 35 more distinct files so the total crosses the file cap.
|
|
414
|
+
const extraFiles = Array.from({ length: 35 }, (_, i) => `extra${i}.ts`);
|
|
415
|
+
const lastBlock = [
|
|
416
|
+
`shaExtra${sep}extra`,
|
|
417
|
+
"",
|
|
418
|
+
...extraFiles,
|
|
419
|
+
"",
|
|
420
|
+
].join("\n");
|
|
421
|
+
const log = [...commitBlocks, lastBlock].join("\n");
|
|
422
|
+
const invoker2 = makeInvoker([
|
|
423
|
+
{ args: ["rev-parse", "HEAD"], stdout: "headB\n" },
|
|
424
|
+
{ args: ["log", "--reverse", "--pretty=format:%H\x1f%s", "--name-only", "headA..headB"], stdout: log },
|
|
425
|
+
]);
|
|
426
|
+
const result = await handleCodingDelta(
|
|
427
|
+
{ subcommand: "get", sessionKey: "s1" },
|
|
428
|
+
makeContext({ resolveStorage: async () => storage, gitInvoker: invoker2 }),
|
|
429
|
+
);
|
|
430
|
+
if (!("ok" in result) || !result.ok || result.kind !== "changed") {
|
|
431
|
+
assert.fail(`expected changed, got ${JSON.stringify(result)}`);
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
// Capped display slices.
|
|
435
|
+
assert.equal(result.delta.commits.length, 20, "commits slice must be capped to MAX_DELTA_COMMITS");
|
|
436
|
+
assert.equal(result.delta.touchedFiles.length, 50, "touchedFiles slice must be capped to MAX_DELTA_FILES");
|
|
437
|
+
// Uncapped totals — the TRUE delta size, NOT the capped length.
|
|
438
|
+
assert.equal(result.delta.totalCommits, 26, "totalCommits must report the uncapped commit count");
|
|
439
|
+
assert.ok(
|
|
440
|
+
result.delta.totalTouchedFiles > 50,
|
|
441
|
+
`totalTouchedFiles must report the uncapped file count (got ${result.delta.totalTouchedFiles})`,
|
|
442
|
+
);
|
|
443
|
+
} finally {
|
|
444
|
+
await cleanup();
|
|
445
|
+
}
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
// ──────────────────────────────────────────────────────────────────────────
|
|
449
|
+
// Issue #1630 fix 2 — read-only callers do NOT advance the state marker
|
|
450
|
+
// ──────────────────────────────────────────────────────────────────────────
|
|
451
|
+
|
|
452
|
+
test("handler/get: read-only caller (canAdvanceState=false) does NOT advance the state marker (issue #1630 fix 2)", async () => {
|
|
453
|
+
const { storage, cleanup } = await makeTempStorage();
|
|
454
|
+
try {
|
|
455
|
+
// Seed headA with a WRITE-capable caller (default canAdvanceState=true).
|
|
456
|
+
const invoker1 = makeInvoker([
|
|
457
|
+
{ args: ["rev-parse", "HEAD"], stdout: "headA\n" },
|
|
458
|
+
]);
|
|
459
|
+
await handleCodingDelta(
|
|
460
|
+
{ subcommand: "get", sessionKey: "s1" },
|
|
461
|
+
makeContext({
|
|
462
|
+
resolveStorage: async () => ({ ...storage, canAdvanceState: true }),
|
|
463
|
+
gitInvoker: invoker1,
|
|
464
|
+
}),
|
|
465
|
+
);
|
|
466
|
+
// Confirm the marker landed at headA.
|
|
467
|
+
const statePath = sessionDeltaStatePath(storage.memoryDir, storage.namespace);
|
|
468
|
+
const seeded = JSON.parse(await readFile(statePath, "utf8"));
|
|
469
|
+
assert.equal(seeded.head, "headA");
|
|
470
|
+
|
|
471
|
+
// A READ-ONLY caller (canAdvanceState=false) on headB. The delta is
|
|
472
|
+
// computed and returned, but the marker MUST NOT advance.
|
|
473
|
+
const sep = "\x1f";
|
|
474
|
+
const log = [
|
|
475
|
+
`shaRO${sep}read only commit`,
|
|
476
|
+
"",
|
|
477
|
+
"src/ro.ts",
|
|
478
|
+
"",
|
|
479
|
+
].join("\n");
|
|
480
|
+
const invoker2 = makeInvoker([
|
|
481
|
+
{ args: ["rev-parse", "HEAD"], stdout: "headB\n" },
|
|
482
|
+
{ args: ["log", "--reverse", "--pretty=format:%H\x1f%s", "--name-only", "headA..headB"], stdout: log },
|
|
483
|
+
]);
|
|
484
|
+
const result = await handleCodingDelta(
|
|
485
|
+
{ subcommand: "get", sessionKey: "s1" },
|
|
486
|
+
makeContext({
|
|
487
|
+
resolveStorage: async () => ({ ...storage, canAdvanceState: false }),
|
|
488
|
+
gitInvoker: invoker2,
|
|
489
|
+
}),
|
|
490
|
+
);
|
|
491
|
+
// The delta is still computed and returned — read-only callers see the data.
|
|
492
|
+
if (!("ok" in result) || !result.ok || result.kind !== "changed") {
|
|
493
|
+
assert.fail(`expected changed, got ${JSON.stringify(result)}`);
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
assert.equal(result.delta.commits.length, 1);
|
|
497
|
+
// But the persisted marker stayed at headA — read-only did not advance it.
|
|
498
|
+
const persisted = JSON.parse(await readFile(statePath, "utf8"));
|
|
499
|
+
assert.equal(persisted.head, "headA", "read-only caller must NOT advance the state marker");
|
|
500
|
+
} finally {
|
|
501
|
+
await cleanup();
|
|
502
|
+
}
|
|
503
|
+
});
|
|
504
|
+
|
|
505
|
+
test("handler/get: write-capable caller (canAdvanceState=true) DOES advance the state marker (issue #1630 fix 2)", async () => {
|
|
506
|
+
const { storage, cleanup } = await makeTempStorage();
|
|
507
|
+
try {
|
|
508
|
+
// Seed headA.
|
|
509
|
+
const invoker1 = makeInvoker([
|
|
510
|
+
{ args: ["rev-parse", "HEAD"], stdout: "headA\n" },
|
|
511
|
+
]);
|
|
512
|
+
await handleCodingDelta(
|
|
513
|
+
{ subcommand: "get", sessionKey: "s1" },
|
|
514
|
+
makeContext({
|
|
515
|
+
resolveStorage: async () => ({ ...storage, canAdvanceState: true }),
|
|
516
|
+
gitInvoker: invoker1,
|
|
517
|
+
}),
|
|
518
|
+
);
|
|
519
|
+
|
|
520
|
+
// A WRITE-capable caller on headB — the marker MUST advance.
|
|
521
|
+
const sep = "\x1f";
|
|
522
|
+
const log = [
|
|
523
|
+
`shaW${sep}write commit`,
|
|
524
|
+
"",
|
|
525
|
+
"src/w.ts",
|
|
526
|
+
"",
|
|
527
|
+
].join("\n");
|
|
528
|
+
const invoker2 = makeInvoker([
|
|
529
|
+
{ args: ["rev-parse", "HEAD"], stdout: "headB\n" },
|
|
530
|
+
{ args: ["log", "--reverse", "--pretty=format:%H\x1f%s", "--name-only", "headA..headB"], stdout: log },
|
|
531
|
+
]);
|
|
532
|
+
await handleCodingDelta(
|
|
533
|
+
{ subcommand: "get", sessionKey: "s1" },
|
|
534
|
+
makeContext({
|
|
535
|
+
resolveStorage: async () => ({ ...storage, canAdvanceState: true }),
|
|
536
|
+
gitInvoker: invoker2,
|
|
537
|
+
}),
|
|
538
|
+
);
|
|
539
|
+
const statePath = sessionDeltaStatePath(storage.memoryDir, storage.namespace);
|
|
540
|
+
const persisted = JSON.parse(await readFile(statePath, "utf8"));
|
|
541
|
+
assert.equal(persisted.head, "headB", "write-capable caller must advance the state marker");
|
|
542
|
+
} finally {
|
|
543
|
+
await cleanup();
|
|
544
|
+
}
|
|
545
|
+
});
|
|
546
|
+
|
|
547
|
+
test("handler/get: canAdvanceState defaults to true when omitted (back-compat) (issue #1630 fix 2)", async () => {
|
|
548
|
+
// Legacy callers that don't set canAdvanceState keep pre-fix behavior:
|
|
549
|
+
// the marker advances. This protects the existing surface contract.
|
|
550
|
+
const { storage, cleanup } = await makeTempStorage();
|
|
551
|
+
try {
|
|
552
|
+
const invoker = makeInvoker([
|
|
553
|
+
{ args: ["rev-parse", "HEAD"], stdout: "headDefault\n" },
|
|
554
|
+
]);
|
|
555
|
+
await handleCodingDelta(
|
|
556
|
+
{ subcommand: "get", sessionKey: "s1" },
|
|
557
|
+
makeContext({
|
|
558
|
+
// canAdvanceState intentionally omitted.
|
|
559
|
+
resolveStorage: async () => storage,
|
|
560
|
+
gitInvoker: invoker,
|
|
561
|
+
}),
|
|
562
|
+
);
|
|
563
|
+
const statePath = sessionDeltaStatePath(storage.memoryDir, storage.namespace);
|
|
564
|
+
const persisted = JSON.parse(await readFile(statePath, "utf8"));
|
|
565
|
+
assert.equal(persisted.head, "headDefault", "omitted canAdvanceState defaults to true (back-compat)");
|
|
566
|
+
} finally {
|
|
567
|
+
await cleanup();
|
|
568
|
+
}
|
|
569
|
+
});
|