@remnic/core 9.3.712 → 9.3.713

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.
Files changed (51) hide show
  1. package/dist/access-boundary.d.ts +1 -1
  2. package/dist/access-boundary.js +2 -2
  3. package/dist/access-cli.js +5 -5
  4. package/dist/access-http.d.ts +1 -1
  5. package/dist/access-http.js +7 -7
  6. package/dist/access-mcp.d.ts +7 -1
  7. package/dist/access-mcp.js +6 -6
  8. package/dist/access-operations-batch.js +3 -3
  9. package/dist/access-operations.d.ts +1 -1
  10. package/dist/access-operations.js +5 -5
  11. package/dist/access-schema.d.ts +10 -0
  12. package/dist/access-schema.js +1 -1
  13. package/dist/{access-service-Dx2rSJjH.d.ts → access-service-DwVmvgBg.d.ts} +8 -1
  14. package/dist/access-service.d.ts +1 -1
  15. package/dist/access-service.js +1 -1
  16. package/dist/access-surface-catalog.d.ts +1 -1
  17. package/dist/{chunk-I3BT2IDW.js → chunk-DJNKN3XY.js} +31 -21
  18. package/dist/chunk-DJNKN3XY.js.map +1 -0
  19. package/dist/{chunk-NUWZFSKC.js → chunk-FVZ2ISIX.js} +9 -1
  20. package/dist/chunk-FVZ2ISIX.js.map +1 -0
  21. package/dist/{chunk-5KQCOIPW.js → chunk-JC3MIKR4.js} +4 -4
  22. package/dist/{chunk-ZVDRL6SK.js → chunk-RMT7PAVW.js} +2 -2
  23. package/dist/{chunk-YVWZW37D.js → chunk-UHN2TNSB.js} +25 -2
  24. package/dist/chunk-UHN2TNSB.js.map +1 -0
  25. package/dist/{chunk-Z3B2YW56.js → chunk-VUNI6Y3D.js} +4 -4
  26. package/dist/{chunk-A2R5NV6O.js → chunk-VW24K2Q4.js} +40 -25
  27. package/dist/chunk-VW24K2Q4.js.map +1 -0
  28. package/dist/{chunk-AMXOCZHE.js → chunk-ZDUF7K5V.js} +3 -3
  29. package/dist/{cli-DTWRoJEI.d.ts → cli-DfDMJqPP.d.ts} +1 -1
  30. package/dist/cli.d.ts +2 -2
  31. package/dist/cli.js +8 -8
  32. package/dist/index.d.ts +2 -2
  33. package/dist/index.js +8 -8
  34. package/dist/mcp-memory-inspector-app.d.ts +1 -1
  35. package/dist/schemas.d.ts +22 -22
  36. package/dist/transfer/types.d.ts +12 -12
  37. package/package.json +2 -2
  38. package/src/access-http.ts +45 -19
  39. package/src/access-mcp.test.ts +1 -0
  40. package/src/access-mcp.ts +34 -17
  41. package/src/access-schema.ts +8 -0
  42. package/src/access-service-observe-idempotency.test.ts +308 -0
  43. package/src/access-service.ts +63 -3
  44. package/dist/chunk-A2R5NV6O.js.map +0 -1
  45. package/dist/chunk-I3BT2IDW.js.map +0 -1
  46. package/dist/chunk-NUWZFSKC.js.map +0 -1
  47. package/dist/chunk-YVWZW37D.js.map +0 -1
  48. /package/dist/{chunk-5KQCOIPW.js.map → chunk-JC3MIKR4.js.map} +0 -0
  49. /package/dist/{chunk-ZVDRL6SK.js.map → chunk-RMT7PAVW.js.map} +0 -0
  50. /package/dist/{chunk-Z3B2YW56.js.map → chunk-VUNI6Y3D.js.map} +0 -0
  51. /package/dist/{chunk-AMXOCZHE.js.map → chunk-ZDUF7K5V.js.map} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { g as EngramAccessService } from './access-service-Dx2rSJjH.js';
2
+ import { g as EngramAccessService } from './access-service-DwVmvgBg.js';
3
3
  import './catalog-CadPvH29.js';
4
4
  import './types-Dr0Cw3L9.js';
5
5
  import './types-gb_SNtjR.js';
@@ -7,8 +7,8 @@ import {
7
7
  getOperation,
8
8
  listRegisteredOperations,
9
9
  normalizeOptionalPath
10
- } from "./chunk-ZVDRL6SK.js";
11
- import "./chunk-YVWZW37D.js";
10
+ } from "./chunk-RMT7PAVW.js";
11
+ import "./chunk-UHN2TNSB.js";
12
12
  import "./chunk-GDASG7NC.js";
13
13
  import "./chunk-GDB4J2H3.js";
14
14
  import "./chunk-ARV3AUOM.js";
@@ -119,15 +119,15 @@ import "./chunk-OO42R444.js";
119
119
  import "./chunk-K6MV3TRQ.js";
120
120
  import "./chunk-OADWQ5CR.js";
121
121
  import "./chunk-7WV3F5DQ.js";
122
- import "./chunk-Z3B2YW56.js";
123
- import "./chunk-AMXOCZHE.js";
124
- import "./chunk-NUWZFSKC.js";
122
+ import "./chunk-VUNI6Y3D.js";
123
+ import "./chunk-ZDUF7K5V.js";
124
+ import "./chunk-FVZ2ISIX.js";
125
125
  import {
126
126
  getOperation
127
- } from "./chunk-ZVDRL6SK.js";
127
+ } from "./chunk-RMT7PAVW.js";
128
128
  import {
129
129
  EngramAccessService
130
- } from "./chunk-YVWZW37D.js";
130
+ } from "./chunk-UHN2TNSB.js";
131
131
  import "./chunk-GDASG7NC.js";
132
132
  import "./chunk-GDB4J2H3.js";
133
133
  import "./chunk-ARV3AUOM.js";
@@ -1,5 +1,5 @@
1
1
  import { IncomingMessage } from 'node:http';
2
- import { g as EngramAccessService } from './access-service-Dx2rSJjH.js';
2
+ import { g as EngramAccessService } from './access-service-DwVmvgBg.js';
3
3
  import { ResolvedIdentity } from './adapters/types.js';
4
4
  import { AdapterRegistry } from './adapters/registry.js';
5
5
  import './catalog-CadPvH29.js';
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  EngramAccessHttpServer
3
- } from "./chunk-A2R5NV6O.js";
3
+ } from "./chunk-VW24K2Q4.js";
4
4
  import "./chunk-SEDEKFYQ.js";
5
5
  import "./chunk-JBPKEARU.js";
6
6
  import "./chunk-TMSXWOBZ.js";
@@ -9,14 +9,14 @@ import "./chunk-RSUYKGGZ.js";
9
9
  import "./chunk-42NQ7AVG.js";
10
10
  import "./chunk-7RXCMVFQ.js";
11
11
  import "./chunk-7WV3F5DQ.js";
12
- import "./chunk-I3BT2IDW.js";
12
+ import "./chunk-DJNKN3XY.js";
13
13
  import "./chunk-T4WDJPEZ.js";
14
14
  import "./chunk-D24OXEPB.js";
15
- import "./chunk-Z3B2YW56.js";
16
- import "./chunk-AMXOCZHE.js";
17
- import "./chunk-NUWZFSKC.js";
18
- import "./chunk-ZVDRL6SK.js";
19
- import "./chunk-YVWZW37D.js";
15
+ import "./chunk-VUNI6Y3D.js";
16
+ import "./chunk-ZDUF7K5V.js";
17
+ import "./chunk-FVZ2ISIX.js";
18
+ import "./chunk-RMT7PAVW.js";
19
+ import "./chunk-UHN2TNSB.js";
20
20
  import "./chunk-GDASG7NC.js";
21
21
  import "./chunk-GDB4J2H3.js";
22
22
  import "./chunk-ARV3AUOM.js";
@@ -1,5 +1,5 @@
1
1
  import { Readable, Writable } from 'node:stream';
2
- import { g as EngramAccessService } from './access-service-Dx2rSJjH.js';
2
+ import { g as EngramAccessService } from './access-service-DwVmvgBg.js';
3
3
  import './catalog-CadPvH29.js';
4
4
  import './types-Dr0Cw3L9.js';
5
5
  import './types-gb_SNtjR.js';
@@ -87,6 +87,12 @@ type McpRequestOptions = {
87
87
  sessionKeyOverride?: string;
88
88
  sessionId?: string;
89
89
  correlationId?: string;
90
+ /**
91
+ * Write-quota enforcer forwarded into observe's idempotency lock
92
+ * (issue #1649). Only the MCP-over-HTTP transport supplies this (it owns
93
+ * the write-rate-limit window); the standalone MCP server has no quota.
94
+ */
95
+ enforceWriteQuota?: () => void | Promise<void>;
90
96
  };
91
97
  declare class EngramMcpServer {
92
98
  private readonly service;
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  EngramMcpServer
3
- } from "./chunk-I3BT2IDW.js";
3
+ } from "./chunk-DJNKN3XY.js";
4
4
  import "./chunk-T4WDJPEZ.js";
5
5
  import "./chunk-D24OXEPB.js";
6
- import "./chunk-Z3B2YW56.js";
7
- import "./chunk-AMXOCZHE.js";
8
- import "./chunk-NUWZFSKC.js";
9
- import "./chunk-ZVDRL6SK.js";
10
- import "./chunk-YVWZW37D.js";
6
+ import "./chunk-VUNI6Y3D.js";
7
+ import "./chunk-ZDUF7K5V.js";
8
+ import "./chunk-FVZ2ISIX.js";
9
+ import "./chunk-RMT7PAVW.js";
10
+ import "./chunk-UHN2TNSB.js";
11
11
  import "./chunk-GDASG7NC.js";
12
12
  import "./chunk-GDB4J2H3.js";
13
13
  import "./chunk-ARV3AUOM.js";
@@ -1,6 +1,6 @@
1
- import "./chunk-AMXOCZHE.js";
2
- import "./chunk-ZVDRL6SK.js";
3
- import "./chunk-YVWZW37D.js";
1
+ import "./chunk-ZDUF7K5V.js";
2
+ import "./chunk-RMT7PAVW.js";
3
+ import "./chunk-UHN2TNSB.js";
4
4
  import "./chunk-GDASG7NC.js";
5
5
  import "./chunk-GDB4J2H3.js";
6
6
  import "./chunk-ARV3AUOM.js";
@@ -1,6 +1,6 @@
1
1
  import { OperationName, BoundOperation } from './access-boundary.js';
2
2
  import { MemoryStoreRequest } from './access-schema.js';
3
- import { A as ArchitectureSurfaceRequest, a as ArchitectureSurfaceResponse, D as DecisionSurfaceRequest, b as DecisionSurfaceResponse, c as DeltaSurfaceRequest, d as DeltaSurfaceResponse, E as EngramAccessMemoryResponse, e as EngramAccessWriteResponse, C as CodegraphSurfaceRequest, f as CodegraphSurfaceResponse } from './access-service-Dx2rSJjH.js';
3
+ import { A as ArchitectureSurfaceRequest, a as ArchitectureSurfaceResponse, D as DecisionSurfaceRequest, b as DecisionSurfaceResponse, c as DeltaSurfaceRequest, d as DeltaSurfaceResponse, E as EngramAccessMemoryResponse, e as EngramAccessWriteResponse, C as CodegraphSurfaceRequest, f as CodegraphSurfaceResponse } from './access-service-DwVmvgBg.js';
4
4
  import 'zod';
5
5
  import './catalog-CadPvH29.js';
6
6
  import './types-Dr0Cw3L9.js';
@@ -22,11 +22,11 @@ import {
22
22
  memoryGetOperation,
23
23
  memorySearchOperation,
24
24
  memoryStoreOperation
25
- } from "./chunk-Z3B2YW56.js";
26
- import "./chunk-AMXOCZHE.js";
27
- import "./chunk-NUWZFSKC.js";
28
- import "./chunk-ZVDRL6SK.js";
29
- import "./chunk-YVWZW37D.js";
25
+ } from "./chunk-VUNI6Y3D.js";
26
+ import "./chunk-ZDUF7K5V.js";
27
+ import "./chunk-FVZ2ISIX.js";
28
+ import "./chunk-RMT7PAVW.js";
29
+ import "./chunk-UHN2TNSB.js";
30
30
  import "./chunk-GDASG7NC.js";
31
31
  import "./chunk-GDB4J2H3.js";
32
32
  import "./chunk-ARV3AUOM.js";
@@ -294,6 +294,14 @@ declare const observeRequestSchema: z.ZodObject<{
294
294
  }>, "many">;
295
295
  namespace: z.ZodOptional<z.ZodString>;
296
296
  skipExtraction: z.ZodOptional<z.ZodBoolean>;
297
+ /**
298
+ * Optional idempotency key for server-side dedup of retried observe POSTs
299
+ * (issue #1649). A retry that reaches the daemon after the first attempt
300
+ * already processed is replayed from cache instead of re-ingested. When the
301
+ * key is reused with a DIFFERENT payload the request is rejected as a
302
+ * conflict (same contract as memory_store/suggestion_submit).
303
+ */
304
+ idempotencyKey: z.ZodOptional<z.ZodString>;
297
305
  /** Working directory for auto git-context resolution (issue #569). */
298
306
  cwd: z.ZodOptional<z.ZodString>;
299
307
  /**
@@ -322,6 +330,7 @@ declare const observeRequestSchema: z.ZodObject<{
322
330
  }[];
323
331
  cwd?: string | undefined;
324
332
  namespace?: string | undefined;
333
+ idempotencyKey?: string | undefined;
325
334
  projectTag?: string | undefined;
326
335
  skipExtraction?: boolean | undefined;
327
336
  }, {
@@ -345,6 +354,7 @@ declare const observeRequestSchema: z.ZodObject<{
345
354
  }[];
346
355
  cwd?: string | undefined;
347
356
  namespace?: string | undefined;
357
+ idempotencyKey?: string | undefined;
348
358
  projectTag?: string | undefined;
349
359
  skipExtraction?: boolean | undefined;
350
360
  }>;
@@ -25,7 +25,7 @@ import {
25
25
  trustZoneDemoSeedRequestSchema,
26
26
  trustZonePromoteRequestSchema,
27
27
  validateRequest
28
- } from "./chunk-NUWZFSKC.js";
28
+ } from "./chunk-FVZ2ISIX.js";
29
29
  import "./chunk-KQAFEZQX.js";
30
30
  import "./chunk-WEHSQBFR.js";
31
31
  import "./chunk-X7Y7WX73.js";
@@ -1569,6 +1569,8 @@ interface EngramAccessObserveRequest {
1569
1569
  namespace?: string;
1570
1570
  authenticatedPrincipal?: string;
1571
1571
  skipExtraction?: boolean;
1572
+ /** Optional idempotency key (issue #1649): a retried POST with the same key is deduplicated server-side; divergent reuse is a conflict. */
1573
+ idempotencyKey?: string;
1572
1574
  /**
1573
1575
  * Working directory of the calling agent session (issue #569 wiring).
1574
1576
  * When provided and no `codingContext` is attached for this session,
@@ -1626,6 +1628,8 @@ interface EngramAccessObserveResponse {
1626
1628
  scopeDebug?: EngramAccessScopeDebug;
1627
1629
  lcmArchived: boolean;
1628
1630
  extractionQueued: boolean;
1631
+ /** True when replayed from the idempotency cache (issue #1649); lets the HTTP surface skip the write-quota slot, matching memory_store replay semantics. */
1632
+ idempotencyReplay?: boolean;
1629
1633
  }
1630
1634
  interface EngramAccessLcmSearchRequest {
1631
1635
  query: string;
@@ -2087,7 +2091,10 @@ declare class EngramAccessService {
2087
2091
  reviewDisposition(request: EngramAccessReviewDispositionRequest): Promise<EngramAccessReviewDispositionResponse>;
2088
2092
  private serializeMemory;
2089
2093
  private serializeMemorySummary;
2090
- observe(request: EngramAccessObserveRequest): Promise<EngramAccessObserveResponse>;
2094
+ observe(request: EngramAccessObserveRequest, hooks?: {
2095
+ enforceWriteQuota?: () => void | Promise<void>;
2096
+ }): Promise<EngramAccessObserveResponse>;
2097
+ private runObserve;
2091
2098
  lcmSearch(request: EngramAccessLcmSearchRequest): Promise<EngramAccessLcmSearchResponse>;
2092
2099
  /**
2093
2100
  * Resolve the LCM `session_id` a same-session READER (compaction flush/record,
@@ -1,4 +1,4 @@
1
- export { o as CodingScopedWriteInput, p as ENGRAM_ACCESS_WRITE_SCHEMA_VERSION, q as EngramAccessActionConfidenceRequest, r as EngramAccessActionConfidenceResponse, s as EngramAccessBriefingRequest, t as EngramAccessBriefingResponse, u as EngramAccessCapsuleListResponse, v as EngramAccessDaySummaryRequest, w as EngramAccessEntityListResponse, x as EngramAccessEntityResponse, y as EngramAccessEntitySummary, z as EngramAccessHealthResponse, i as EngramAccessInputError, B as EngramAccessLcmCompactionFlushRequest, F as EngramAccessLcmCompactionFlushResponse, G as EngramAccessLcmCompactionRecordRequest, H as EngramAccessLcmCompactionRecordResponse, I as EngramAccessLcmSearchRequest, J as EngramAccessLcmSearchResponse, K as EngramAccessLcmStatusResponse, L as EngramAccessMaintenanceResponse, M as EngramAccessMemoryBrowseRequest, N as EngramAccessMemoryBrowseResponse, O as EngramAccessMemoryRecord, E as EngramAccessMemoryResponse, Q as EngramAccessMemoryStoreRequest, R as EngramAccessMemorySummary, S as EngramAccessObserveMessage, T as EngramAccessObserveRequest, U as EngramAccessObserveResponse, V as EngramAccessOfflineSyncApplyFileContentRequest, W as EngramAccessOfflineSyncApplyFileContentResponse, X as EngramAccessOfflineSyncApplyRequest, Y as EngramAccessOfflineSyncApplyResponse, Z as EngramAccessOfflineSyncFileContentRequest, _ as EngramAccessOfflineSyncFileContentResponse, $ as EngramAccessOfflineSyncFilesRequest, a0 as EngramAccessOfflineSyncFilesResponse, a1 as EngramAccessOfflineSyncSnapshotRequest, a2 as EngramAccessOfflineSyncSnapshotResponse, a3 as EngramAccessOfflineSyncSnapshotStreamResponse, a4 as EngramAccessQmdCollectionState, a5 as EngramAccessQmdHealthResponse, a6 as EngramAccessQualityResponse, a7 as EngramAccessRecallExplainRequest, a8 as EngramAccessRecallExplainResponse, a9 as EngramAccessRecallRequest, h as EngramAccessRecallResponse, aa as EngramAccessReviewDispositionRequest, ab as EngramAccessReviewDispositionResponse, ac as EngramAccessReviewQueueResponse, ad as EngramAccessScopeDebug, g as EngramAccessService, ae as EngramAccessSetCodingContextRequest, af as EngramAccessSuggestionSubmitRequest, ag as EngramAccessTimelineResponse, ah as EngramAccessTrustZoneBrowseRequest, ai as EngramAccessTrustZoneBrowseResponse, aj as EngramAccessTrustZoneDemoSeedRequest, ak as EngramAccessTrustZoneDemoSeedResponse, al as EngramAccessTrustZonePromoteRequest, am as EngramAccessTrustZonePromoteResponse, an as EngramAccessTrustZoneRecordSummary, ao as EngramAccessTrustZoneStatusResponse, ap as EngramAccessWriteEnvelope, e as EngramAccessWriteResponse, aq as MemoryScopePlan, ar as shapeMemorySummary } from './access-service-Dx2rSJjH.js';
1
+ export { o as CodingScopedWriteInput, p as ENGRAM_ACCESS_WRITE_SCHEMA_VERSION, q as EngramAccessActionConfidenceRequest, r as EngramAccessActionConfidenceResponse, s as EngramAccessBriefingRequest, t as EngramAccessBriefingResponse, u as EngramAccessCapsuleListResponse, v as EngramAccessDaySummaryRequest, w as EngramAccessEntityListResponse, x as EngramAccessEntityResponse, y as EngramAccessEntitySummary, z as EngramAccessHealthResponse, i as EngramAccessInputError, B as EngramAccessLcmCompactionFlushRequest, F as EngramAccessLcmCompactionFlushResponse, G as EngramAccessLcmCompactionRecordRequest, H as EngramAccessLcmCompactionRecordResponse, I as EngramAccessLcmSearchRequest, J as EngramAccessLcmSearchResponse, K as EngramAccessLcmStatusResponse, L as EngramAccessMaintenanceResponse, M as EngramAccessMemoryBrowseRequest, N as EngramAccessMemoryBrowseResponse, O as EngramAccessMemoryRecord, E as EngramAccessMemoryResponse, Q as EngramAccessMemoryStoreRequest, R as EngramAccessMemorySummary, S as EngramAccessObserveMessage, T as EngramAccessObserveRequest, U as EngramAccessObserveResponse, V as EngramAccessOfflineSyncApplyFileContentRequest, W as EngramAccessOfflineSyncApplyFileContentResponse, X as EngramAccessOfflineSyncApplyRequest, Y as EngramAccessOfflineSyncApplyResponse, Z as EngramAccessOfflineSyncFileContentRequest, _ as EngramAccessOfflineSyncFileContentResponse, $ as EngramAccessOfflineSyncFilesRequest, a0 as EngramAccessOfflineSyncFilesResponse, a1 as EngramAccessOfflineSyncSnapshotRequest, a2 as EngramAccessOfflineSyncSnapshotResponse, a3 as EngramAccessOfflineSyncSnapshotStreamResponse, a4 as EngramAccessQmdCollectionState, a5 as EngramAccessQmdHealthResponse, a6 as EngramAccessQualityResponse, a7 as EngramAccessRecallExplainRequest, a8 as EngramAccessRecallExplainResponse, a9 as EngramAccessRecallRequest, h as EngramAccessRecallResponse, aa as EngramAccessReviewDispositionRequest, ab as EngramAccessReviewDispositionResponse, ac as EngramAccessReviewQueueResponse, ad as EngramAccessScopeDebug, g as EngramAccessService, ae as EngramAccessSetCodingContextRequest, af as EngramAccessSuggestionSubmitRequest, ag as EngramAccessTimelineResponse, ah as EngramAccessTrustZoneBrowseRequest, ai as EngramAccessTrustZoneBrowseResponse, aj as EngramAccessTrustZoneDemoSeedRequest, ak as EngramAccessTrustZoneDemoSeedResponse, al as EngramAccessTrustZonePromoteRequest, am as EngramAccessTrustZonePromoteResponse, an as EngramAccessTrustZoneRecordSummary, ao as EngramAccessTrustZoneStatusResponse, ap as EngramAccessWriteEnvelope, e as EngramAccessWriteResponse, aq as MemoryScopePlan, ar as shapeMemorySummary } from './access-service-DwVmvgBg.js';
2
2
  import './storage.js';
3
3
  import './types-B1VHaf2w.js';
4
4
  import './recall-explain-renderer.js';
@@ -3,7 +3,7 @@ import {
3
3
  EngramAccessInputError,
4
4
  EngramAccessService,
5
5
  shapeMemorySummary
6
- } from "./chunk-YVWZW37D.js";
6
+ } from "./chunk-UHN2TNSB.js";
7
7
  import "./chunk-GDASG7NC.js";
8
8
  import "./chunk-GDB4J2H3.js";
9
9
  import "./chunk-ARV3AUOM.js";
@@ -1,6 +1,6 @@
1
1
  import { OperationName } from './access-boundary.js';
2
2
  import 'zod';
3
- import './access-service-Dx2rSJjH.js';
3
+ import './access-service-DwVmvgBg.js';
4
4
  import './catalog-CadPvH29.js';
5
5
  import './types-Dr0Cw3L9.js';
6
6
  import './types-gb_SNtjR.js';
@@ -11,13 +11,13 @@ import {
11
11
  } from "./chunk-D24OXEPB.js";
12
12
  import {
13
13
  validateRequest
14
- } from "./chunk-NUWZFSKC.js";
14
+ } from "./chunk-FVZ2ISIX.js";
15
15
  import {
16
16
  getOperation
17
- } from "./chunk-ZVDRL6SK.js";
17
+ } from "./chunk-RMT7PAVW.js";
18
18
  import {
19
19
  EngramAccessInputError
20
- } from "./chunk-YVWZW37D.js";
20
+ } from "./chunk-UHN2TNSB.js";
21
21
  import {
22
22
  projectTagProjectId
23
23
  } from "./chunk-SHRRWOVY.js";
@@ -960,6 +960,10 @@ var EngramMcpServer = class {
960
960
  },
961
961
  description: "Conversation messages to observe"
962
962
  },
963
+ idempotencyKey: {
964
+ type: "string",
965
+ description: "Optional idempotency key (issue #1649). Deduplicates a retried observe POST server-side so the batch is ingested once even when the HTTP response is lost. Reusing the key with a different payload is rejected."
966
+ },
963
967
  namespace: { type: "string" },
964
968
  skipExtraction: { type: "boolean" },
965
969
  cwd: { type: "string", description: "Working directory for auto git-context resolution." },
@@ -2186,7 +2190,7 @@ var EngramMcpServer = class {
2186
2190
  argumentsObject = { ...argumentsObject, sessionKey: options.sessionKeyOverride };
2187
2191
  }
2188
2192
  const effectivePrincipal = options?.principalOverride ?? this.authenticatedPrincipal;
2189
- const result = await this.callTool(name, argumentsObject, effectivePrincipal, options?.sessionId);
2193
+ const result = await this.callTool(name, argumentsObject, effectivePrincipal, options?.sessionId, options?.enforceWriteQuota);
2190
2194
  return {
2191
2195
  jsonrpc: "2.0",
2192
2196
  id,
@@ -2351,7 +2355,7 @@ ${body}`;
2351
2355
  noteDefault: r.preview?.slice(0, 60) || r.id
2352
2356
  }));
2353
2357
  }
2354
- async callTool(name, args, effectivePrincipal, mcpSessionId) {
2358
+ async callTool(name, args, effectivePrincipal, mcpSessionId, enforceWriteQuota) {
2355
2359
  const migrated = MCP_MIGRATED_OPERATIONS[toLegacyToolName(name)];
2356
2360
  if (migrated) {
2357
2361
  const op = getOperation(migrated);
@@ -2773,21 +2777,27 @@ ${body}`;
2773
2777
  );
2774
2778
  case "engram.observe": {
2775
2779
  const body = parseMcpRequest("observe", args);
2776
- return this.service.observe({
2777
- sessionKey: body.sessionKey,
2778
- messages: body.messages.map((message) => ({
2779
- role: message.role,
2780
- content: message.content,
2781
- parts: message.parts ?? void 0,
2782
- rawContent: message.rawContent ?? void 0,
2783
- sourceFormat: message.sourceFormat ?? void 0
2784
- })),
2785
- namespace: body.namespace,
2786
- authenticatedPrincipal: effectivePrincipal,
2787
- skipExtraction: body.skipExtraction === true,
2788
- cwd: body.cwd,
2789
- projectTag: body.projectTag
2790
- });
2780
+ return this.service.observe(
2781
+ {
2782
+ sessionKey: body.sessionKey,
2783
+ messages: body.messages.map((message) => ({
2784
+ role: message.role,
2785
+ content: message.content,
2786
+ parts: message.parts ?? void 0,
2787
+ rawContent: message.rawContent ?? void 0,
2788
+ sourceFormat: message.sourceFormat ?? void 0
2789
+ })),
2790
+ skipExtraction: body.skipExtraction === true,
2791
+ idempotencyKey: body.idempotencyKey,
2792
+ namespace: body.namespace,
2793
+ authenticatedPrincipal: effectivePrincipal,
2794
+ cwd: body.cwd,
2795
+ projectTag: body.projectTag
2796
+ },
2797
+ // Forward the transport's write-quota enforcer into observe's
2798
+ // idempotency lock so a replay is never 429'd (issue #1649).
2799
+ enforceWriteQuota ? { enforceWriteQuota } : void 0
2800
+ );
2791
2801
  }
2792
2802
  case "engram.lcm_search":
2793
2803
  return this.service.lcmSearch({
@@ -3359,4 +3369,4 @@ ${body}`;
3359
3369
  export {
3360
3370
  EngramMcpServer
3361
3371
  };
3362
- //# sourceMappingURL=chunk-I3BT2IDW.js.map
3372
+ //# sourceMappingURL=chunk-DJNKN3XY.js.map