@remnic/core 1.1.17 → 1.1.18
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 +16 -16
- package/dist/access-http.d.ts +2 -1
- package/dist/access-http.js +10 -10
- package/dist/access-mcp.d.ts +1 -1
- package/dist/access-mcp.js +9 -9
- package/dist/access-schema.d.ts +23 -3
- package/dist/access-schema.js +6 -1
- package/dist/{access-service-DZXc7qwR.d.ts → access-service-DT9L2DW4.d.ts} +14 -2
- package/dist/access-service.d.ts +1 -1
- package/dist/access-service.js +7 -7
- package/dist/briefing.js +4 -4
- package/dist/causal-consolidation.js +5 -5
- package/dist/{chunk-NOHC2L57.js → chunk-2IRT26RZ.js} +2 -2
- package/dist/{chunk-CDQNR7SV.js → chunk-2XX25T6U.js} +15 -15
- package/dist/{chunk-66H2DZYB.js → chunk-4J3BTQRB.js} +13 -1
- package/dist/chunk-4J3BTQRB.js.map +1 -0
- package/dist/{chunk-MS3ULOZF.js → chunk-5IQC4OG6.js} +2 -2
- package/dist/{chunk-ZPXYWTN5.js → chunk-5ML4TH3E.js} +4 -4
- package/dist/{chunk-V7WH7DEM.js → chunk-6ORWKANA.js} +2 -2
- package/dist/{chunk-IOAY54RF.js → chunk-7Q2P774N.js} +11 -11
- package/dist/{chunk-JFEH2LZM.js → chunk-CN4P6SVA.js} +2 -2
- package/dist/{chunk-OGROP7ZN.js → chunk-FFU4GMST.js} +5 -5
- package/dist/{chunk-C7DGCHJE.js → chunk-FSODDMR2.js} +2 -2
- package/dist/{chunk-AAX3SUM3.js → chunk-GGCJ253V.js} +11 -11
- package/dist/{chunk-HMZYQPT5.js → chunk-J4VRI4BH.js} +97 -4
- package/dist/chunk-J4VRI4BH.js.map +1 -0
- package/dist/{chunk-IG5VGHYB.js → chunk-KSFBM6TV.js} +2 -2
- package/dist/{chunk-M3AA636B.js → chunk-NOQ74SJN.js} +2 -2
- package/dist/{chunk-GCR4JFKK.js → chunk-P7FRFY6S.js} +38 -4
- package/dist/chunk-P7FRFY6S.js.map +1 -0
- package/dist/{chunk-QLKBF3TI.js → chunk-QOHBYVZG.js} +2 -2
- package/dist/{chunk-OJRKZLZ4.js → chunk-SGIXDVSF.js} +2 -2
- package/dist/{chunk-BYACCC5C.js → chunk-SPEVF47M.js} +4 -4
- package/dist/{chunk-YCVWX2NF.js → chunk-SZKCBLS5.js} +2 -2
- package/dist/{chunk-BEB4GUU5.js → chunk-TLM762GT.js} +2 -2
- package/dist/{chunk-65HQPW6O.js → chunk-TOFUTKQN.js} +2 -2
- package/dist/{chunk-VLQWOGYM.js → chunk-TUQXQOGR.js} +34 -9
- package/dist/chunk-TUQXQOGR.js.map +1 -0
- package/dist/{chunk-G7JBLD65.js → chunk-YO3AZEE5.js} +3 -3
- package/dist/{cli-kVwab1_L.d.ts → cli-BN0CkYzI.d.ts} +1 -1
- package/dist/cli.d.ts +2 -2
- package/dist/cli.js +19 -19
- package/dist/compounding/engine.js +4 -4
- package/dist/connectors/codex-materialize-runner.js +4 -4
- package/dist/connectors/index.js +4 -4
- package/dist/entity-retrieval.js +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +50 -46
- package/dist/index.js.map +1 -1
- package/dist/maintenance/memory-governance.js +4 -4
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +4 -4
- package/dist/maintenance/rebuild-memory-projection.js +5 -5
- package/dist/mcp-memory-inspector-app.d.ts +1 -1
- package/dist/namespaces/migrate.js +5 -5
- package/dist/namespaces/storage.js +4 -4
- package/dist/offline-sync.d.ts +16 -1
- package/dist/offline-sync.js +8 -2
- package/dist/operator-toolkit.js +7 -7
- package/dist/orchestrator.js +12 -12
- package/dist/secure-store/index.js +17 -17
- package/dist/semantic-consolidation.js +5 -5
- package/dist/semantic-rule-promotion.js +4 -4
- package/dist/semantic-rule-verifier.js +4 -4
- package/dist/storage.js +3 -3
- package/dist/verified-recall.js +4 -4
- package/package.json +1 -1
- package/src/access-http.test.ts +90 -0
- package/src/access-http.ts +47 -0
- package/src/access-schema.ts +13 -0
- package/src/access-service.ts +48 -0
- package/src/index.ts +3 -0
- package/src/offline-sync.test.ts +32 -0
- package/src/offline-sync.ts +114 -0
- package/dist/chunk-66H2DZYB.js.map +0 -1
- package/dist/chunk-GCR4JFKK.js.map +0 -1
- package/dist/chunk-HMZYQPT5.js.map +0 -1
- package/dist/chunk-VLQWOGYM.js.map +0 -1
- /package/dist/{chunk-NOHC2L57.js.map → chunk-2IRT26RZ.js.map} +0 -0
- /package/dist/{chunk-CDQNR7SV.js.map → chunk-2XX25T6U.js.map} +0 -0
- /package/dist/{chunk-MS3ULOZF.js.map → chunk-5IQC4OG6.js.map} +0 -0
- /package/dist/{chunk-ZPXYWTN5.js.map → chunk-5ML4TH3E.js.map} +0 -0
- /package/dist/{chunk-V7WH7DEM.js.map → chunk-6ORWKANA.js.map} +0 -0
- /package/dist/{chunk-IOAY54RF.js.map → chunk-7Q2P774N.js.map} +0 -0
- /package/dist/{chunk-JFEH2LZM.js.map → chunk-CN4P6SVA.js.map} +0 -0
- /package/dist/{chunk-OGROP7ZN.js.map → chunk-FFU4GMST.js.map} +0 -0
- /package/dist/{chunk-C7DGCHJE.js.map → chunk-FSODDMR2.js.map} +0 -0
- /package/dist/{chunk-AAX3SUM3.js.map → chunk-GGCJ253V.js.map} +0 -0
- /package/dist/{chunk-IG5VGHYB.js.map → chunk-KSFBM6TV.js.map} +0 -0
- /package/dist/{chunk-M3AA636B.js.map → chunk-NOQ74SJN.js.map} +0 -0
- /package/dist/{chunk-QLKBF3TI.js.map → chunk-QOHBYVZG.js.map} +0 -0
- /package/dist/{chunk-OJRKZLZ4.js.map → chunk-SGIXDVSF.js.map} +0 -0
- /package/dist/{chunk-BYACCC5C.js.map → chunk-SPEVF47M.js.map} +0 -0
- /package/dist/{chunk-YCVWX2NF.js.map → chunk-SZKCBLS5.js.map} +0 -0
- /package/dist/{chunk-BEB4GUU5.js.map → chunk-TLM762GT.js.map} +0 -0
- /package/dist/{chunk-65HQPW6O.js.map → chunk-TOFUTKQN.js.map} +0 -0
- /package/dist/{chunk-G7JBLD65.js.map → chunk-YO3AZEE5.js.map} +0 -0
|
@@ -4,6 +4,9 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
CAPSULE_ID_PATTERN
|
|
6
6
|
} from "./chunk-WEHSQBFR.js";
|
|
7
|
+
import {
|
|
8
|
+
OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES
|
|
9
|
+
} from "./chunk-J4VRI4BH.js";
|
|
7
10
|
import {
|
|
8
11
|
ACTION_CONFIDENCE_CONTEXT_READINESS,
|
|
9
12
|
ACTION_CONFIDENCE_RISK_CATEGORIES,
|
|
@@ -258,6 +261,13 @@ var offlineSyncFilesRequestSchema = z.object({
|
|
|
258
261
|
includeTranscripts: z.boolean().optional(),
|
|
259
262
|
paths: z.array(z.string().trim().min(1, "path must be non-empty").max(4096)).max(5e3, "paths must contain 5000 or fewer entries")
|
|
260
263
|
});
|
|
264
|
+
var offlineSyncFileContentRequestSchema = z.object({
|
|
265
|
+
namespace: namespaceSchema,
|
|
266
|
+
includeTranscripts: z.boolean().optional(),
|
|
267
|
+
path: z.string().trim().min(1, "path must be non-empty").max(4096),
|
|
268
|
+
offset: z.number().int().min(0).optional(),
|
|
269
|
+
length: z.number().int().min(1).max(OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES).optional()
|
|
270
|
+
});
|
|
261
271
|
var nullableOptional = (schema) => schema.optional().nullable().transform((value) => value ?? void 0);
|
|
262
272
|
var actionConfidenceRuleSchema = z.object({
|
|
263
273
|
kind: z.enum(ACTION_CONFIDENCE_RULE_KINDS),
|
|
@@ -306,6 +316,7 @@ var schemas = {
|
|
|
306
316
|
capsuleImport: capsuleImportRequestSchema,
|
|
307
317
|
capsuleList: capsuleListRequestSchema,
|
|
308
318
|
offlineSyncFiles: offlineSyncFilesRequestSchema,
|
|
319
|
+
offlineSyncFileContent: offlineSyncFileContentRequestSchema,
|
|
309
320
|
offlineSyncApply: offlineSyncApplyRequestSchema,
|
|
310
321
|
actionConfidence: actionConfidenceRequestSchema
|
|
311
322
|
};
|
|
@@ -351,7 +362,8 @@ export {
|
|
|
351
362
|
capsuleListRequestSchema,
|
|
352
363
|
offlineSyncApplyRequestSchema,
|
|
353
364
|
offlineSyncFilesRequestSchema,
|
|
365
|
+
offlineSyncFileContentRequestSchema,
|
|
354
366
|
actionConfidenceRequestSchema,
|
|
355
367
|
validateRequest
|
|
356
368
|
};
|
|
357
|
-
//# sourceMappingURL=chunk-
|
|
369
|
+
//# sourceMappingURL=chunk-4J3BTQRB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/access-schema.ts"],"sourcesContent":["// Request/response schema validation for the Remnic HTTP API.\n// Uses zod for runtime validation — returns structured 400 errors with\n// field-level detail so consumers get clear feedback on malformed requests.\n\nimport { z } from \"zod\";\nimport {\n ACTION_CONFIDENCE_CONTEXT_READINESS,\n ACTION_CONFIDENCE_RISK_CATEGORIES,\n ACTION_CONFIDENCE_RULE_KINDS,\n} from \"./action-confidence.js\";\nimport { isValidCapsuleSince } from \"./transfer/capsule-export.js\";\nimport { CAPSULE_ID_PATTERN } from \"./transfer/types.js\";\nimport { OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES } from \"./offline-sync.js\";\n\n// ---------------------------------------------------------------------------\n// Error formatting\n// ---------------------------------------------------------------------------\n\nexport interface SchemaValidationError {\n error: string;\n code: \"validation_error\";\n details: Array<{ field: string; message: string }>;\n}\n\nexport function formatZodError(error: z.ZodError): SchemaValidationError {\n return {\n error: \"request validation failed\",\n code: \"validation_error\",\n details: error.issues.map((issue) => ({\n field: issue.path.join(\".\") || \"(root)\",\n message: issue.message,\n })),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Shared fields\n// ---------------------------------------------------------------------------\n\nconst namespaceSchema = z.string().trim().max(256).optional();\nconst sessionKeySchema = z.string().trim().min(1).max(512).optional();\nconst idempotencyKeySchema = z.string().trim().min(1).max(256).optional();\nconst dryRunSchema = z.boolean().optional();\nconst schemaVersionSchema = z.number().int().optional();\n\n// ---------------------------------------------------------------------------\n// Recall\n// ---------------------------------------------------------------------------\n\n/**\n * Coding-agent context (issue #569). Optional payload that connectors may\n * ship with a recall request so the project/branch namespace overlay\n * applies to that recall. All fields are validated per CLAUDE.md #51 —\n * empty-string projectId / rootPath is rejected, not silently accepted.\n */\nexport const codingContextSchema = z\n .object({\n projectId: z.string().trim().min(1, \"codingContext.projectId is required\").max(128),\n branch: z.string().trim().max(256).nullable(),\n rootPath: z.string().trim().min(1, \"codingContext.rootPath is required\").max(1024),\n defaultBranch: z.string().trim().max(256).nullable(),\n })\n .nullable();\n\n/**\n * Recall disclosure depth (issue #677). Mirrors the `RecallDisclosure`\n * type in `types.ts` — keep these in sync. Default-application happens\n * inside `EngramAccessService.recall()`; the schema only accepts/rejects.\n * Invalid values throw a structured 400 instead of silently defaulting,\n * per CLAUDE.md rule 51.\n */\nexport const recallDisclosureSchema = z.enum([\"chunk\", \"section\", \"raw\"]);\n\n/**\n * Tag-match semantics (issue #689). `any` (default when `tags` is provided\n * and `tagMatch` is omitted) admits a result when it carries at least one\n * of the filter tags. `all` requires every filter tag to be present.\n * Schema rejects unknown values up front — never silently defaults\n * (CLAUDE.md rule 51).\n */\nexport const tagMatchSchema = z.enum([\"any\", \"all\"]);\n\nexport const recallRequestSchema = z.object({\n query: z.string().min(1, \"query is required\"),\n sessionKey: sessionKeySchema,\n namespace: namespaceSchema,\n topK: z.number().int().min(0).max(200).optional(),\n mode: z.enum([\"auto\", \"no_recall\", \"minimal\", \"full\", \"graph_mode\"]).optional(),\n includeDebug: z.boolean().optional(),\n idempotencyKey: idempotencyKeySchema,\n disclosure: recallDisclosureSchema.optional(),\n codingContext: codingContextSchema.optional(),\n /** Working directory for auto git-context resolution (issue #569). */\n cwd: z.string().trim().min(1, \"cwd must be non-empty when provided\").max(2048).optional(),\n /**\n * Arbitrary project tag for non-git-based project scoping (issue #569).\n * Creates a coding context with `projectId: \"tag:<projectTag>\"`.\n */\n projectTag: z.string().trim().min(1, \"projectTag must be non-empty when provided\").max(256).optional(),\n /**\n * Historical recall pin (issue #680). ISO 8601 timestamp. The\n * schema only enforces the basic shape; the access service runs\n * `Date.parse` and emits a structured 400 on malformed input\n * (CLAUDE.md rule 51).\n */\n asOf: z.string().trim().min(1, \"asOf must be a non-empty ISO 8601 timestamp\").max(64).optional(),\n /**\n * Free-form recall tag filter (issue #689). When provided, recall results\n * whose frontmatter `tags` do not match the filter are removed before the\n * response is returned. Comparison is case-sensitive exact match.\n */\n tags: z.array(z.string().trim().min(1).max(256)).max(50).optional(),\n /**\n * Match mode for `tags` (issue #689). Defaults to `\"any\"` when `tags` is\n * provided and `tagMatch` is omitted. Ignored when `tags` is absent.\n */\n tagMatch: tagMatchSchema.optional(),\n /**\n * Include graph edges below `graphTraversalConfidenceFloor` for diagnostic\n * recall traversal (issue #681). Defaults to false.\n */\n includeLowConfidence: z.boolean().optional(),\n});\n\nexport const recallExplainRequestSchema = z.object({\n sessionKey: sessionKeySchema,\n namespace: namespaceSchema,\n});\n\n/**\n * Standalone \"set coding context\" request. Used by the HTTP endpoint\n * `POST /engram/v1/coding-context` and the MCP `remnic.set_coding_context`\n * tool (PR 7). `codingContext: null` clears the attached context.\n */\nexport const setCodingContextRequestSchema = z.object({\n sessionKey: z.string().trim().min(1, \"sessionKey is required\").max(512),\n codingContext: codingContextSchema,\n});\n\n// ---------------------------------------------------------------------------\n// Observe\n// ---------------------------------------------------------------------------\n\nconst messageSchema = z.object({\n role: z.enum([\"user\", \"assistant\"]),\n content: z.string().min(1, \"message content must be non-empty\"),\n sourceFormat: z\n .enum([\"openai\", \"anthropic\", \"openclaw\", \"pi\", \"lossless-claw\", \"remnic\"])\n .nullable()\n .optional(),\n rawContent: z.unknown().nullable().optional(),\n parts: z\n .array(\n z.object({\n ordinal: z.number().int().min(0).nullable().optional(),\n kind: z.enum([\n \"text\",\n \"tool_call\",\n \"tool_result\",\n \"patch\",\n \"file_read\",\n \"file_write\",\n \"step_start\",\n \"step_finish\",\n \"snapshot\",\n \"retry\",\n ]),\n payload: z.record(z.string(), z.unknown()),\n toolName: z.string().nullable().optional(),\n tool_name: z.string().nullable().optional(),\n filePath: z.string().nullable().optional(),\n file_path: z.string().nullable().optional(),\n createdAt: z.string().nullable().optional(),\n created_at: z.string().nullable().optional(),\n }),\n )\n .nullable()\n .optional(),\n});\n\nexport const observeRequestSchema = z.object({\n sessionKey: z.string().trim().min(1, \"sessionKey is required\").max(512),\n messages: z.array(messageSchema).min(1, \"messages must be a non-empty array\"),\n namespace: namespaceSchema,\n skipExtraction: z.boolean().optional(),\n /** Working directory for auto git-context resolution (issue #569). */\n cwd: z.string().trim().min(1, \"cwd must be non-empty when provided\").max(2048).optional(),\n /**\n * Arbitrary project tag for non-git-based project scoping (issue #569).\n * Creates a coding context with `projectId: \"tag:<projectTag>\"`.\n */\n projectTag: z.string().trim().min(1, \"projectTag must be non-empty when provided\").max(256).optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Memory store / suggestion submit\n// ---------------------------------------------------------------------------\n\nconst writeContentSchema = z.string().min(1, \"content is required\").max(50000);\nconst categorySchema = z\n .enum([\n \"fact\", \"preference\", \"correction\", \"entity\", \"decision\",\n \"relationship\", \"principle\", \"commitment\", \"moment\", \"skill\", \"rule\", \"procedure\",\n \"reasoning_trace\",\n ])\n .optional();\nconst confidenceSchema = z.number().min(0).max(1).optional();\nconst tagsSchema = z.array(z.string().max(256)).max(50).optional();\nconst entityRefSchema = z.string().trim().max(512).optional();\nconst ttlSchema = z.string().trim().max(128).optional();\nconst sourceReasonSchema = z.string().trim().max(2000).optional();\n\nexport const memoryStoreRequestSchema = z.object({\n schemaVersion: schemaVersionSchema,\n idempotencyKey: idempotencyKeySchema,\n dryRun: dryRunSchema,\n sessionKey: sessionKeySchema,\n content: writeContentSchema,\n category: categorySchema,\n confidence: confidenceSchema,\n namespace: namespaceSchema,\n tags: tagsSchema,\n entityRef: entityRefSchema,\n ttl: ttlSchema,\n sourceReason: sourceReasonSchema,\n});\n\nexport const suggestionSubmitRequestSchema = memoryStoreRequestSchema;\n\n// ---------------------------------------------------------------------------\n// Review disposition\n// ---------------------------------------------------------------------------\n\nexport const reviewDispositionRequestSchema = z.object({\n memoryId: z.string().trim().min(1, \"memoryId is required\"),\n status: z.enum([\n \"active\", \"pending_review\", \"quarantined\", \"rejected\", \"superseded\", \"archived\",\n ]),\n reasonCode: z.string().trim().min(1, \"reasonCode is required\"),\n namespace: namespaceSchema,\n});\n\n// ---------------------------------------------------------------------------\n// Trust-zone promote\n// ---------------------------------------------------------------------------\n\nexport const trustZonePromoteRequestSchema = z.object({\n recordId: z.string().trim().min(1, \"recordId is required\"),\n targetZone: z.enum([\"working\", \"trusted\"], {\n errorMap: () => ({ message: \"targetZone must be 'working' or 'trusted'\" }),\n }),\n promotionReason: z.string().trim().min(1, \"promotionReason is required\"),\n recordedAt: z.string().trim().optional(),\n summary: z.string().trim().max(5000).optional(),\n dryRun: dryRunSchema,\n namespace: namespaceSchema,\n});\n\n// ---------------------------------------------------------------------------\n// Trust-zone demo-seed\n// ---------------------------------------------------------------------------\n\nexport const trustZoneDemoSeedRequestSchema = z.object({\n scenario: z.string().trim().max(256).optional(),\n recordedAt: z.string().trim().optional(),\n dryRun: dryRunSchema,\n namespace: namespaceSchema,\n});\n\n// ---------------------------------------------------------------------------\n// LCM search\n// ---------------------------------------------------------------------------\n\nexport const lcmSearchRequestSchema = z.object({\n query: z.string().min(1, \"query is required\"),\n sessionKey: sessionKeySchema,\n namespace: namespaceSchema,\n limit: z.number().int().min(1).max(100).optional(),\n});\n\nexport const lcmCompactionFlushRequestSchema = z.object({\n sessionKey: z.string().trim().min(1, \"sessionKey is required\").max(512),\n namespace: namespaceSchema,\n});\n\nexport const lcmCompactionRecordRequestSchema = z.object({\n sessionKey: z.string().trim().min(1, \"sessionKey is required\").max(512),\n namespace: namespaceSchema,\n tokensBefore: z.number().int().min(0, \"tokensBefore must be a non-negative integer\"),\n tokensAfter: z.number().int().min(0, \"tokensAfter must be a non-negative integer\"),\n});\n\n// ---------------------------------------------------------------------------\n// Day summary\n// ---------------------------------------------------------------------------\n\nexport const daySummaryRequestSchema = z.object({\n memories: z.string().max(100000).optional(),\n sessionKey: sessionKeySchema,\n namespace: namespaceSchema,\n});\n\n// ---------------------------------------------------------------------------\n// Capsule export\n// ---------------------------------------------------------------------------\n\nconst capsuleTopLevelSegmentSchema = z\n .string()\n .trim()\n .min(1)\n .max(128)\n .refine(\n (value) => !value.includes(\"/\") && !value.includes(\"\\\\\"),\n \"must be a top-level directory name without path separators\",\n );\n\nconst capsulePeerIdSchema = z\n .string()\n .trim()\n .min(1)\n .max(256)\n .refine(\n (value) => value !== \".\" && value !== \"..\" && !value.includes(\"/\") && !value.includes(\"\\\\\"),\n \"must be a plain peer id without path separators\",\n );\n\nconst capsuleIsoSinceSchema = z\n .string()\n .trim()\n .min(1, \"since must be a non-empty ISO 8601 timestamp\")\n .max(128)\n .refine(\n isValidCapsuleSince,\n \"since must be a valid ISO 8601 timestamp with no calendar overflow\",\n );\n\nexport const capsuleExportRequestSchema = z\n .object({\n name: z\n .string()\n .trim()\n .min(1, \"name is required\")\n .max(64, \"name must be 64 characters or fewer\")\n .regex(\n CAPSULE_ID_PATTERN,\n \"name must be alphanumeric with single dashes (no spaces, no leading/trailing dashes)\",\n ),\n namespace: namespaceSchema,\n since: capsuleIsoSinceSchema.optional(),\n includeKinds: z.array(capsuleTopLevelSegmentSchema).max(50).optional(),\n peerIds: z.array(capsulePeerIdSchema).max(100).optional(),\n includeTranscripts: z.boolean().optional(),\n encrypt: z.boolean().optional(),\n });\n\nexport const capsuleImportRequestSchema = z\n .object({\n archivePath: z.string().trim().min(1, \"archivePath is required\").max(4096),\n namespace: namespaceSchema,\n mode: z.enum([\"skip\", \"overwrite\", \"fork\"]).optional(),\n });\n\nexport const capsuleListRequestSchema = z\n .object({\n namespace: namespaceSchema,\n });\n\n// ---------------------------------------------------------------------------\n// Offline sync\n// ---------------------------------------------------------------------------\n\nexport const offlineSyncApplyRequestSchema = z\n .object({\n namespace: namespaceSchema,\n changeset: z.unknown(),\n })\n .refine((value) => value.changeset !== undefined && value.changeset !== null, {\n message: \"changeset is required\",\n path: [\"changeset\"],\n });\n\nexport const offlineSyncFilesRequestSchema = z.object({\n namespace: namespaceSchema,\n includeTranscripts: z.boolean().optional(),\n paths: z\n .array(z.string().trim().min(1, \"path must be non-empty\").max(4096))\n .max(5000, \"paths must contain 5000 or fewer entries\"),\n});\n\nexport const offlineSyncFileContentRequestSchema = z.object({\n namespace: namespaceSchema,\n includeTranscripts: z.boolean().optional(),\n path: z.string().trim().min(1, \"path must be non-empty\").max(4096),\n offset: z.number().int().min(0).optional(),\n length: z.number().int().min(1).max(OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES).optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Action confidence\n// ---------------------------------------------------------------------------\n\nconst nullableOptional = <T extends z.ZodTypeAny>(schema: T) =>\n schema.optional().nullable().transform((value) => value ?? undefined);\n\nconst actionConfidenceRuleSchema = z\n .object({\n kind: z.enum(ACTION_CONFIDENCE_RULE_KINDS),\n description: nullableOptional(z.string().trim().min(1).max(2000)),\n matched: nullableOptional(z.boolean()),\n })\n .strict();\n\nconst actionConfidenceMemorySchema = z\n .object({\n source: nullableOptional(z.string().trim().min(1).max(256)),\n created: nullableOptional(z.string().trim().min(1).max(128)),\n updated: nullableOptional(z.string().trim().min(1).max(128)),\n scope: nullableOptional(z.string().trim().min(1).max(512)),\n userContextScopes: nullableOptional(z.array(z.string().trim().min(1).max(128)).max(50)),\n retrievalReason: nullableOptional(z.string().trim().min(1).max(2000)),\n confidence: nullableOptional(z.number().min(0).max(1)),\n stale: nullableOptional(z.boolean()),\n corrected: nullableOptional(z.boolean()),\n correctionState: nullableOptional(z.enum([\"none\", \"correction\", \"superseded\", \"disputed\", \"forgotten\"])),\n safeToUse: nullableOptional(z.boolean()),\n safety: nullableOptional(z.enum([\"safe\", \"requires-review\", \"blocked\"])),\n safetyReasons: nullableOptional(z.array(z.string().trim().min(1).max(1000)).max(50)),\n })\n .strict();\n\nexport const actionConfidenceRequestSchema = z\n .object({\n intendedAction: nullableOptional(z.string().trim().min(1).max(1000)),\n confidence: nullableOptional(z.number().min(0).max(1)),\n risk: nullableOptional(z.enum(ACTION_CONFIDENCE_RISK_CATEGORIES)),\n contextReadiness: nullableOptional(z.enum(ACTION_CONFIDENCE_CONTEXT_READINESS)),\n currentContextScopes: nullableOptional(z.array(z.string().trim().min(1).max(128)).max(50)),\n userRules: nullableOptional(z.array(actionConfidenceRuleSchema).max(100)),\n retrievedMemories: nullableOptional(z.array(actionConfidenceMemorySchema).max(200)),\n })\n .strict();\n\n// ---------------------------------------------------------------------------\n// Inferred types\n// ---------------------------------------------------------------------------\n\nexport type RecallRequest = z.infer<typeof recallRequestSchema>;\nexport type RecallExplainRequest = z.infer<typeof recallExplainRequestSchema>;\nexport type SetCodingContextRequest = z.infer<typeof setCodingContextRequestSchema>;\nexport type ObserveRequest = z.infer<typeof observeRequestSchema>;\nexport type MemoryStoreRequest = z.infer<typeof memoryStoreRequestSchema>;\nexport type SuggestionSubmitRequest = z.infer<typeof suggestionSubmitRequestSchema>;\nexport type ReviewDispositionRequest = z.infer<typeof reviewDispositionRequestSchema>;\nexport type TrustZonePromoteRequest = z.infer<typeof trustZonePromoteRequestSchema>;\nexport type TrustZoneDemoSeedRequest = z.infer<typeof trustZoneDemoSeedRequestSchema>;\nexport type LcmSearchRequest = z.infer<typeof lcmSearchRequestSchema>;\nexport type LcmCompactionFlushRequest = z.infer<typeof lcmCompactionFlushRequestSchema>;\nexport type LcmCompactionRecordRequest = z.infer<typeof lcmCompactionRecordRequestSchema>;\nexport type DaySummaryRequest = z.infer<typeof daySummaryRequestSchema>;\nexport type CapsuleExportRequest = z.infer<typeof capsuleExportRequestSchema>;\nexport type CapsuleImportRequest = z.infer<typeof capsuleImportRequestSchema>;\nexport type CapsuleListRequest = z.infer<typeof capsuleListRequestSchema>;\nexport type OfflineSyncApplyRequest = z.infer<typeof offlineSyncApplyRequestSchema>;\nexport type OfflineSyncFilesRequest = z.infer<typeof offlineSyncFilesRequestSchema>;\nexport type OfflineSyncFileContentRequest = z.infer<typeof offlineSyncFileContentRequestSchema>;\nexport type ActionConfidenceRequest = z.infer<typeof actionConfidenceRequestSchema>;\n\n// ---------------------------------------------------------------------------\n// Validation helper\n// ---------------------------------------------------------------------------\n\nexport type SchemaName =\n | \"recall\"\n | \"recallExplain\"\n | \"setCodingContext\"\n | \"observe\"\n | \"memoryStore\"\n | \"suggestionSubmit\"\n | \"reviewDisposition\"\n | \"trustZonePromote\"\n | \"trustZoneDemoSeed\"\n | \"lcmSearch\"\n | \"lcmCompactionFlush\"\n | \"lcmCompactionRecord\"\n | \"daySummary\"\n | \"capsuleExport\"\n | \"capsuleImport\"\n | \"capsuleList\"\n | \"offlineSyncFiles\"\n | \"offlineSyncFileContent\"\n | \"offlineSyncApply\"\n | \"actionConfidence\";\n\nexport type SchemaTypeFor<N extends SchemaName> =\n N extends \"recall\" ? RecallRequest\n : N extends \"recallExplain\" ? RecallExplainRequest\n : N extends \"setCodingContext\" ? SetCodingContextRequest\n : N extends \"observe\" ? ObserveRequest\n : N extends \"memoryStore\" ? MemoryStoreRequest\n : N extends \"suggestionSubmit\" ? SuggestionSubmitRequest\n : N extends \"reviewDisposition\" ? ReviewDispositionRequest\n : N extends \"trustZonePromote\" ? TrustZonePromoteRequest\n : N extends \"trustZoneDemoSeed\" ? TrustZoneDemoSeedRequest\n : N extends \"lcmSearch\" ? LcmSearchRequest\n : N extends \"lcmCompactionFlush\" ? LcmCompactionFlushRequest\n : N extends \"lcmCompactionRecord\" ? LcmCompactionRecordRequest\n : N extends \"daySummary\" ? DaySummaryRequest\n : N extends \"capsuleExport\" ? CapsuleExportRequest\n : N extends \"capsuleImport\" ? CapsuleImportRequest\n : N extends \"capsuleList\" ? CapsuleListRequest\n : N extends \"offlineSyncFiles\" ? OfflineSyncFilesRequest\n : N extends \"offlineSyncFileContent\" ? OfflineSyncFileContentRequest\n : N extends \"offlineSyncApply\" ? OfflineSyncApplyRequest\n : N extends \"actionConfidence\" ? ActionConfidenceRequest\n : never;\n\nconst schemas: Record<SchemaName, z.ZodTypeAny> = {\n recall: recallRequestSchema,\n recallExplain: recallExplainRequestSchema,\n setCodingContext: setCodingContextRequestSchema,\n observe: observeRequestSchema,\n memoryStore: memoryStoreRequestSchema,\n suggestionSubmit: suggestionSubmitRequestSchema,\n reviewDisposition: reviewDispositionRequestSchema,\n trustZonePromote: trustZonePromoteRequestSchema,\n trustZoneDemoSeed: trustZoneDemoSeedRequestSchema,\n lcmSearch: lcmSearchRequestSchema,\n lcmCompactionFlush: lcmCompactionFlushRequestSchema,\n lcmCompactionRecord: lcmCompactionRecordRequestSchema,\n daySummary: daySummaryRequestSchema,\n capsuleExport: capsuleExportRequestSchema,\n capsuleImport: capsuleImportRequestSchema,\n capsuleList: capsuleListRequestSchema,\n offlineSyncFiles: offlineSyncFilesRequestSchema,\n offlineSyncFileContent: offlineSyncFileContentRequestSchema,\n offlineSyncApply: offlineSyncApplyRequestSchema,\n actionConfidence: actionConfidenceRequestSchema,\n};\n\n/**\n * Validate a request body against the named schema.\n * Returns `{ success: true, data }` on pass or\n * `{ success: false, error }` on failure with field-level detail.\n */\nexport function validateRequest<T = unknown>(\n schemaName: SchemaName,\n body: unknown,\n): { success: true; data: T } | { success: false; error: SchemaValidationError } {\n const schema = schemas[schemaName];\n if (!schema) {\n return {\n success: false,\n error: {\n error: `unknown schema: ${schemaName}`,\n code: \"validation_error\",\n details: [],\n },\n };\n }\n const result = schema.safeParse(body);\n if (result.success) {\n return { success: true, data: result.data as T };\n }\n return { success: false, error: formatZodError(result.error) };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-NZL6GGQE.js";
|
|
4
4
|
import {
|
|
5
5
|
StorageManager
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-7Q2P774N.js";
|
|
7
7
|
import {
|
|
8
8
|
getCachedEpisodeMap,
|
|
9
9
|
setCachedEpisodeMap
|
|
@@ -105,4 +105,4 @@ async function searchVerifiedEpisodes(options) {
|
|
|
105
105
|
export {
|
|
106
106
|
searchVerifiedEpisodes
|
|
107
107
|
};
|
|
108
|
-
//# sourceMappingURL=chunk-
|
|
108
|
+
//# sourceMappingURL=chunk-5IQC4OG6.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
listNamespaces
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-SGIXDVSF.js";
|
|
4
4
|
import {
|
|
5
5
|
runConsolidationProvenanceCheck
|
|
6
6
|
} from "./chunk-5HRY2WRF.js";
|
|
@@ -36,13 +36,13 @@ import {
|
|
|
36
36
|
import {
|
|
37
37
|
listMemoryGovernanceRuns,
|
|
38
38
|
readMemoryGovernanceRunArtifact
|
|
39
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-TOFUTKQN.js";
|
|
40
40
|
import {
|
|
41
41
|
analyzeGraphHealth
|
|
42
42
|
} from "./chunk-RK2Y4XOM.js";
|
|
43
43
|
import {
|
|
44
44
|
StorageManager
|
|
45
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-7Q2P774N.js";
|
|
46
46
|
import {
|
|
47
47
|
lintWorkspaceFiles
|
|
48
48
|
} from "./chunk-DM2T26WE.js";
|
|
@@ -1314,4 +1314,4 @@ export {
|
|
|
1314
1314
|
runBenchmarkRecall,
|
|
1315
1315
|
runOperatorRepair
|
|
1316
1316
|
};
|
|
1317
|
-
//# sourceMappingURL=chunk-
|
|
1317
|
+
//# sourceMappingURL=chunk-5ML4TH3E.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
StorageManager,
|
|
3
3
|
normalizeEntityName
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-7Q2P774N.js";
|
|
5
5
|
import {
|
|
6
6
|
readEnvVar,
|
|
7
7
|
resolveHomeDir
|
|
@@ -824,4 +824,4 @@ export {
|
|
|
824
824
|
resolveBriefingSaveDir,
|
|
825
825
|
briefingFilename
|
|
826
826
|
};
|
|
827
|
-
//# sourceMappingURL=chunk-
|
|
827
|
+
//# sourceMappingURL=chunk-6ORWKANA.js.map
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isErrnoCode
|
|
3
3
|
} from "./chunk-5UZXUTVO.js";
|
|
4
|
-
import {
|
|
5
|
-
SecureStoreLockedError,
|
|
6
|
-
isEncryptedFile,
|
|
7
|
-
readMaybeEncryptedFile,
|
|
8
|
-
readMaybeEncryptedFileBuffer,
|
|
9
|
-
writeMaybeEncryptedFile
|
|
10
|
-
} from "./chunk-SH5S7XYD.js";
|
|
11
4
|
import {
|
|
12
5
|
DEFAULT_CITATION_FORMAT,
|
|
13
6
|
hasCitation,
|
|
@@ -17,9 +10,6 @@ import {
|
|
|
17
10
|
SPECULATIVE_TTL_DAYS,
|
|
18
11
|
confidenceTier
|
|
19
12
|
} from "./chunk-Q7P4WJDP.js";
|
|
20
|
-
import {
|
|
21
|
-
parseFlexibleIsoTimestamp
|
|
22
|
-
} from "./chunk-P7FMDTKL.js";
|
|
23
13
|
import {
|
|
24
14
|
normalizeProjectionPreview,
|
|
25
15
|
normalizeProjectionTags
|
|
@@ -71,6 +61,16 @@ import {
|
|
|
71
61
|
import {
|
|
72
62
|
log
|
|
73
63
|
} from "./chunk-2ODBA7MQ.js";
|
|
64
|
+
import {
|
|
65
|
+
SecureStoreLockedError,
|
|
66
|
+
isEncryptedFile,
|
|
67
|
+
readMaybeEncryptedFile,
|
|
68
|
+
readMaybeEncryptedFileBuffer,
|
|
69
|
+
writeMaybeEncryptedFile
|
|
70
|
+
} from "./chunk-SH5S7XYD.js";
|
|
71
|
+
import {
|
|
72
|
+
parseFlexibleIsoTimestamp
|
|
73
|
+
} from "./chunk-P7FMDTKL.js";
|
|
74
74
|
|
|
75
75
|
// src/storage.ts
|
|
76
76
|
import { access, readdir, readFile, stat, writeFile, mkdir, unlink, appendFile } from "fs/promises";
|
|
@@ -5166,4 +5166,4 @@ export {
|
|
|
5166
5166
|
serializeEntityFile,
|
|
5167
5167
|
StorageManager
|
|
5168
5168
|
};
|
|
5169
|
-
//# sourceMappingURL=chunk-
|
|
5169
|
+
//# sourceMappingURL=chunk-7Q2P774N.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
StorageManager
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-7Q2P774N.js";
|
|
4
4
|
|
|
5
5
|
// src/semantic-rule-promotion.ts
|
|
6
6
|
function normalizeRuleWhitespace(value) {
|
|
@@ -132,4 +132,4 @@ async function promoteSemanticRuleFromMemory(options) {
|
|
|
132
132
|
export {
|
|
133
133
|
promoteSemanticRuleFromMemory
|
|
134
134
|
};
|
|
135
|
-
//# sourceMappingURL=chunk-
|
|
135
|
+
//# sourceMappingURL=chunk-CN4P6SVA.js.map
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
decryptMemoryDirToPlaintext,
|
|
3
|
-
migrateMemoryDirToEncrypted
|
|
4
|
-
} from "./chunk-SH5S7XYD.js";
|
|
5
1
|
import {
|
|
6
2
|
buildHeaderFromPassphrase,
|
|
7
3
|
deriveKeyFromHeader,
|
|
@@ -20,6 +16,10 @@ import {
|
|
|
20
16
|
DEFAULT_SCRYPT_PARAMS,
|
|
21
17
|
KDF_SALT_LENGTH
|
|
22
18
|
} from "./chunk-FP2373TW.js";
|
|
19
|
+
import {
|
|
20
|
+
decryptMemoryDirToPlaintext,
|
|
21
|
+
migrateMemoryDirToEncrypted
|
|
22
|
+
} from "./chunk-SH5S7XYD.js";
|
|
23
23
|
import {
|
|
24
24
|
generateSalt
|
|
25
25
|
} from "./chunk-A6XUJE5D.js";
|
|
@@ -451,4 +451,4 @@ export {
|
|
|
451
451
|
renderStatusReport,
|
|
452
452
|
createPassphraseReader
|
|
453
453
|
};
|
|
454
|
-
//# sourceMappingURL=chunk-
|
|
454
|
+
//# sourceMappingURL=chunk-FFU4GMST.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "./chunk-U4SCL7B7.js";
|
|
5
5
|
import {
|
|
6
6
|
StorageManager
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-7Q2P774N.js";
|
|
8
8
|
import {
|
|
9
9
|
parseContinuityImprovementLoops
|
|
10
10
|
} from "./chunk-QSVPYQPG.js";
|
|
@@ -1259,4 +1259,4 @@ export {
|
|
|
1259
1259
|
defaultTierMigrationCycleBudget,
|
|
1260
1260
|
CompoundingEngine
|
|
1261
1261
|
};
|
|
1262
|
-
//# sourceMappingURL=chunk-
|
|
1262
|
+
//# sourceMappingURL=chunk-FSODDMR2.js.map
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
import {
|
|
23
23
|
CompoundingEngine,
|
|
24
24
|
defaultTierMigrationCycleBudget
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-FSODDMR2.js";
|
|
26
26
|
import {
|
|
27
27
|
SharedContextManager
|
|
28
28
|
} from "./chunk-U4SCL7B7.js";
|
|
@@ -168,7 +168,7 @@ import {
|
|
|
168
168
|
buildEntityRecallSection,
|
|
169
169
|
entityRecentTranscriptLookbackHours,
|
|
170
170
|
readRecentEntityTranscriptEntries
|
|
171
|
-
} from "./chunk-
|
|
171
|
+
} from "./chunk-2IRT26RZ.js";
|
|
172
172
|
import {
|
|
173
173
|
buildEventOrderRecallSection,
|
|
174
174
|
shouldRecallEventOrderEvidence
|
|
@@ -203,7 +203,7 @@ import {
|
|
|
203
203
|
materializeAfterSemanticConsolidation,
|
|
204
204
|
parseConsolidationResponse,
|
|
205
205
|
parseOperatorAwareConsolidationResponse
|
|
206
|
-
} from "./chunk-
|
|
206
|
+
} from "./chunk-SZKCBLS5.js";
|
|
207
207
|
import {
|
|
208
208
|
normalizeReplaySessionKey
|
|
209
209
|
} from "./chunk-2PRQG7PV.js";
|
|
@@ -212,13 +212,13 @@ import {
|
|
|
212
212
|
} from "./chunk-LUDTDZLK.js";
|
|
213
213
|
import {
|
|
214
214
|
searchVerifiedEpisodes
|
|
215
|
-
} from "./chunk-
|
|
215
|
+
} from "./chunk-5IQC4OG6.js";
|
|
216
216
|
import {
|
|
217
217
|
ThreadingManager
|
|
218
218
|
} from "./chunk-W4RVMTHR.js";
|
|
219
219
|
import {
|
|
220
220
|
searchVerifiedSemanticRules
|
|
221
|
-
} from "./chunk-
|
|
221
|
+
} from "./chunk-QOHBYVZG.js";
|
|
222
222
|
import {
|
|
223
223
|
searchWorkProductLedgerEntries
|
|
224
224
|
} from "./chunk-CULXMQJH.js";
|
|
@@ -230,7 +230,7 @@ import {
|
|
|
230
230
|
} from "./chunk-EABGC2TL.js";
|
|
231
231
|
import {
|
|
232
232
|
NamespaceStorageRouter
|
|
233
|
-
} from "./chunk-
|
|
233
|
+
} from "./chunk-TLM762GT.js";
|
|
234
234
|
import {
|
|
235
235
|
NamespaceSearchRouter
|
|
236
236
|
} from "./chunk-W7DK3CYM.js";
|
|
@@ -340,7 +340,7 @@ import {
|
|
|
340
340
|
normalizeAttributePairs,
|
|
341
341
|
normalizeEntityName,
|
|
342
342
|
parseEntityFile
|
|
343
|
-
} from "./chunk-
|
|
343
|
+
} from "./chunk-7Q2P774N.js";
|
|
344
344
|
import {
|
|
345
345
|
attachCitation,
|
|
346
346
|
hasCitationForTemplate,
|
|
@@ -349,9 +349,6 @@ import {
|
|
|
349
349
|
import {
|
|
350
350
|
confidenceTier
|
|
351
351
|
} from "./chunk-Q7P4WJDP.js";
|
|
352
|
-
import {
|
|
353
|
-
parseFlexibleIsoTimestamp
|
|
354
|
-
} from "./chunk-P7FMDTKL.js";
|
|
355
352
|
import {
|
|
356
353
|
isActiveMemoryStatus
|
|
357
354
|
} from "./chunk-RULE4VG5.js";
|
|
@@ -385,6 +382,9 @@ import {
|
|
|
385
382
|
keyring_exports,
|
|
386
383
|
secureStoreDir
|
|
387
384
|
} from "./chunk-BJMBJZ2Y.js";
|
|
385
|
+
import {
|
|
386
|
+
parseFlexibleIsoTimestamp
|
|
387
|
+
} from "./chunk-P7FMDTKL.js";
|
|
388
388
|
import {
|
|
389
389
|
buildRetrievedMemoryProvenance
|
|
390
390
|
} from "./chunk-AC5LO7IU.js";
|
|
@@ -12433,4 +12433,4 @@ export {
|
|
|
12433
12433
|
resolvePersistedMemoryRelativePath,
|
|
12434
12434
|
Orchestrator
|
|
12435
12435
|
};
|
|
12436
|
-
//# sourceMappingURL=chunk-
|
|
12436
|
+
//# sourceMappingURL=chunk-GGCJ253V.js.map
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
parseFlexibleIsoTimestamp
|
|
3
|
-
} from "./chunk-P7FMDTKL.js";
|
|
4
1
|
import {
|
|
5
2
|
DEFAULT_TRANSFER_EXCLUDE_DIRS
|
|
6
3
|
} from "./chunk-I6K5FBRQ.js";
|
|
@@ -10,12 +7,20 @@ import {
|
|
|
10
7
|
sha256Bytes,
|
|
11
8
|
validateArchiveRelativePath
|
|
12
9
|
} from "./chunk-AGZQD76C.js";
|
|
10
|
+
import {
|
|
11
|
+
MAGIC_HEADER_SIZE,
|
|
12
|
+
isEncryptedFile
|
|
13
|
+
} from "./chunk-SH5S7XYD.js";
|
|
14
|
+
import {
|
|
15
|
+
parseFlexibleIsoTimestamp
|
|
16
|
+
} from "./chunk-P7FMDTKL.js";
|
|
13
17
|
|
|
14
18
|
// src/offline-sync.ts
|
|
15
19
|
import { createHash, randomUUID } from "crypto";
|
|
16
20
|
import {
|
|
17
21
|
lstat,
|
|
18
22
|
mkdir,
|
|
23
|
+
open,
|
|
19
24
|
readdir,
|
|
20
25
|
readFile,
|
|
21
26
|
rename,
|
|
@@ -27,6 +32,7 @@ import path from "path";
|
|
|
27
32
|
var OFFLINE_SYNC_SNAPSHOT_FORMAT = "remnic.offline-sync.snapshot.v1";
|
|
28
33
|
var OFFLINE_SYNC_CHANGESET_FORMAT = "remnic.offline-sync.changeset.v1";
|
|
29
34
|
var OFFLINE_SYNC_STATE_VERSION = 1;
|
|
35
|
+
var OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES = 64 * 1024 * 1024;
|
|
30
36
|
var SYNC_INTERNAL_DIR = ".offline-sync";
|
|
31
37
|
var EXCLUDED_FILE_NAMES = /* @__PURE__ */ new Set([
|
|
32
38
|
".sync-state.json"
|
|
@@ -280,6 +286,28 @@ async function readOfflineSyncFileRecord(options) {
|
|
|
280
286
|
...options.includeContent ? { contentBase64: bytes.toString("base64") } : {}
|
|
281
287
|
};
|
|
282
288
|
}
|
|
289
|
+
async function fileIsSecureStoreEncrypted(filePath) {
|
|
290
|
+
const handle = await open(filePath, "r");
|
|
291
|
+
try {
|
|
292
|
+
const header = Buffer.alloc(MAGIC_HEADER_SIZE);
|
|
293
|
+
const { bytesRead } = await handle.read(header, 0, header.length, 0);
|
|
294
|
+
return bytesRead >= MAGIC_HEADER_SIZE && isEncryptedFile(header);
|
|
295
|
+
} finally {
|
|
296
|
+
await handle.close();
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
async function readPlainFileContentChunk(options) {
|
|
300
|
+
const chunkBytes = Math.min(options.length, options.bytes - options.offset);
|
|
301
|
+
const chunk = Buffer.alloc(chunkBytes);
|
|
302
|
+
if (chunkBytes === 0) return chunk;
|
|
303
|
+
const handle = await open(options.filePath, "r");
|
|
304
|
+
try {
|
|
305
|
+
const { bytesRead } = await handle.read(chunk, 0, chunk.length, options.offset);
|
|
306
|
+
return bytesRead === chunk.length ? chunk : chunk.subarray(0, bytesRead);
|
|
307
|
+
} finally {
|
|
308
|
+
await handle.close();
|
|
309
|
+
}
|
|
310
|
+
}
|
|
283
311
|
async function buildOfflineSyncSnapshot(options) {
|
|
284
312
|
const rootAbs = path.resolve(options.root);
|
|
285
313
|
const root = await prepareSafeArchiveRoot(rootAbs, "buildOfflineSyncSnapshot", "root");
|
|
@@ -353,6 +381,69 @@ async function buildOfflineSyncSnapshotForPaths(options) {
|
|
|
353
381
|
files: files.sort(compareByPath)
|
|
354
382
|
};
|
|
355
383
|
}
|
|
384
|
+
async function readOfflineSyncFileContentChunk(options) {
|
|
385
|
+
const rootAbs = path.resolve(options.root);
|
|
386
|
+
const root = await prepareSafeArchiveRoot(rootAbs, "readOfflineSyncFileContentChunk", "root");
|
|
387
|
+
const includeTranscripts = options.includeTranscripts !== false;
|
|
388
|
+
const relPath = normalizeRelativePath(options.path, "path");
|
|
389
|
+
if (shouldExcludeRelPath(relPath, includeTranscripts)) {
|
|
390
|
+
throw new Error(`offline sync file content path is excluded: ${relPath}`);
|
|
391
|
+
}
|
|
392
|
+
const offset = options.offset === void 0 ? 0 : assertNonNegativeInteger(options.offset, "offset");
|
|
393
|
+
const requestedLength = options.length === void 0 ? OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES : assertNonNegativeInteger(options.length, "length");
|
|
394
|
+
if (requestedLength < 1 || requestedLength > OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES) {
|
|
395
|
+
throw new Error(
|
|
396
|
+
`length must be an integer from 1 to ${OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES}`
|
|
397
|
+
);
|
|
398
|
+
}
|
|
399
|
+
const filePath = await resolveSafeArchiveTarget(root, relPath);
|
|
400
|
+
const st = await lstat(filePath).catch((error) => {
|
|
401
|
+
if (error.code === "ENOENT") return null;
|
|
402
|
+
throw error;
|
|
403
|
+
});
|
|
404
|
+
if (!st || st.isSymbolicLink() || !st.isFile()) {
|
|
405
|
+
throw new Error(`offline sync file content path not found: ${relPath}`);
|
|
406
|
+
}
|
|
407
|
+
const encrypted = await fileIsSecureStoreEncrypted(filePath);
|
|
408
|
+
if (!encrypted) {
|
|
409
|
+
if (offset > st.size) {
|
|
410
|
+
throw new Error(`offset must be <= file size for ${relPath}`);
|
|
411
|
+
}
|
|
412
|
+
const chunk2 = await readPlainFileContentChunk({
|
|
413
|
+
filePath,
|
|
414
|
+
offset,
|
|
415
|
+
length: requestedLength,
|
|
416
|
+
bytes: st.size
|
|
417
|
+
});
|
|
418
|
+
return {
|
|
419
|
+
path: relPath,
|
|
420
|
+
bytes: st.size,
|
|
421
|
+
mtimeMs: st.mtimeMs,
|
|
422
|
+
offset,
|
|
423
|
+
chunkBytes: chunk2.length,
|
|
424
|
+
content: chunk2
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
if (!options.readFile) {
|
|
428
|
+
throw new Error(`offline sync file content requires a secure-store read hook: ${relPath}`);
|
|
429
|
+
}
|
|
430
|
+
const content = await options.readFile({ root: root.abs, path: relPath, filePath });
|
|
431
|
+
if (offset > content.length) {
|
|
432
|
+
throw new Error(`offset must be <= file size for ${relPath}`);
|
|
433
|
+
}
|
|
434
|
+
const digest = sha256Buffer(content);
|
|
435
|
+
const end = Math.min(content.length, offset + requestedLength);
|
|
436
|
+
const chunk = content.subarray(offset, end);
|
|
437
|
+
return {
|
|
438
|
+
path: relPath,
|
|
439
|
+
sha256: digest.sha256,
|
|
440
|
+
bytes: digest.bytes,
|
|
441
|
+
mtimeMs: st.mtimeMs,
|
|
442
|
+
offset,
|
|
443
|
+
chunkBytes: chunk.length,
|
|
444
|
+
content: Buffer.from(chunk)
|
|
445
|
+
};
|
|
446
|
+
}
|
|
356
447
|
async function buildOfflineSyncChangeset(options) {
|
|
357
448
|
const includeTranscripts = options.includeTranscripts !== false;
|
|
358
449
|
const base = byPath(filterBaseFilesForMode(
|
|
@@ -817,10 +908,12 @@ export {
|
|
|
817
908
|
OFFLINE_SYNC_SNAPSHOT_FORMAT,
|
|
818
909
|
OFFLINE_SYNC_CHANGESET_FORMAT,
|
|
819
910
|
OFFLINE_SYNC_STATE_VERSION,
|
|
911
|
+
OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES,
|
|
820
912
|
normalizeOfflineSyncSnapshot,
|
|
821
913
|
normalizeOfflineSyncChangeset,
|
|
822
914
|
buildOfflineSyncSnapshot,
|
|
823
915
|
buildOfflineSyncSnapshotForPaths,
|
|
916
|
+
readOfflineSyncFileContentChunk,
|
|
824
917
|
buildOfflineSyncChangeset,
|
|
825
918
|
summarizeOfflineSyncChangeset,
|
|
826
919
|
applyOfflineSyncSnapshot,
|
|
@@ -832,4 +925,4 @@ export {
|
|
|
832
925
|
normalizeOfflineSyncState,
|
|
833
926
|
fileStatesFromSnapshot
|
|
834
927
|
};
|
|
835
|
-
//# sourceMappingURL=chunk-
|
|
928
|
+
//# sourceMappingURL=chunk-J4VRI4BH.js.map
|