@lore-co/cli 0.1.16 → 0.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.
Files changed (43) hide show
  1. package/README.md +76 -14
  2. package/dist/ask.d.ts.map +1 -1
  3. package/dist/ask.js +3 -26
  4. package/dist/ask.js.map +1 -1
  5. package/dist/cli.d.ts +8 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +566 -39
  8. package/dist/cli.js.map +1 -1
  9. package/dist/context-fallback.d.ts +37 -0
  10. package/dist/context-fallback.d.ts.map +1 -0
  11. package/dist/context-fallback.js +259 -0
  12. package/dist/context-fallback.js.map +1 -0
  13. package/dist/generated-assets.d.ts +4 -4
  14. package/dist/generated-assets.d.ts.map +1 -1
  15. package/dist/generated-assets.js +4 -4
  16. package/dist/generated-assets.js.map +1 -1
  17. package/dist/index.d.ts +1 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +1 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/invocation-health-writer.d.ts +19 -0
  22. package/dist/invocation-health-writer.d.ts.map +1 -0
  23. package/dist/invocation-health-writer.js +131 -0
  24. package/dist/invocation-health-writer.js.map +1 -0
  25. package/dist/reliability-store.d.ts +283 -0
  26. package/dist/reliability-store.d.ts.map +1 -0
  27. package/dist/reliability-store.js +1913 -0
  28. package/dist/reliability-store.js.map +1 -0
  29. package/dist/runtime-version.d.ts +2 -0
  30. package/dist/runtime-version.d.ts.map +1 -0
  31. package/dist/runtime-version.js +5 -0
  32. package/dist/runtime-version.js.map +1 -0
  33. package/dist/runtime.d.ts.map +1 -1
  34. package/dist/runtime.js +1041 -152
  35. package/dist/runtime.js.map +1 -1
  36. package/dist/self-host.d.ts +1 -1
  37. package/dist/self-host.js +2 -2
  38. package/dist/signed-snapshot.d.ts +59 -0
  39. package/dist/signed-snapshot.d.ts.map +1 -0
  40. package/dist/signed-snapshot.js +303 -0
  41. package/dist/signed-snapshot.js.map +1 -0
  42. package/dist/update.js +3 -3
  43. package/package.json +19 -3
@@ -0,0 +1,303 @@
1
+ import { createPublicKey, verify } from "node:crypto";
2
+ import { MAX_COMPACT_JWS_BYTES, createCanonicalJsonSha256, } from "@lore-co/core/canonical-json";
3
+ export const SIGNED_SNAPSHOT_CONTRACT_VERSION = "reliability-v1";
4
+ export const DEFAULT_MAX_COMPACT_JWS_BYTES = MAX_COMPACT_JWS_BYTES;
5
+ const MAX_PROTECTED_HEADER_BYTES = 4_096;
6
+ const BASE64URL_PATTERN = /^[A-Za-z0-9_-]+$/u;
7
+ export class SignedSnapshotError extends Error {
8
+ code;
9
+ constructor(code, message) {
10
+ super(message);
11
+ this.name = "SignedSnapshotError";
12
+ this.code = code;
13
+ }
14
+ }
15
+ function snapshotError(code, message) {
16
+ return new SignedSnapshotError(code, message);
17
+ }
18
+ function plainObject(value) {
19
+ if (typeof value !== "object" ||
20
+ value === null ||
21
+ Array.isArray(value) ||
22
+ (Object.getPrototypeOf(value) !== Object.prototype &&
23
+ Object.getPrototypeOf(value) !== null)) {
24
+ throw snapshotError("INVALID_ENVELOPE", "JWS value must be an object");
25
+ }
26
+ return value;
27
+ }
28
+ function decodeBase64url(segment, maxBytes, label) {
29
+ if (segment === "" ||
30
+ segment.includes("=") ||
31
+ !BASE64URL_PATTERN.test(segment)) {
32
+ throw snapshotError("MALFORMED_JWS", `${label} is not canonical base64url`);
33
+ }
34
+ const decoded = Buffer.from(segment, "base64url");
35
+ if (decoded.byteLength > maxBytes ||
36
+ decoded.toString("base64url") !== segment) {
37
+ throw snapshotError(decoded.byteLength > maxBytes ? "TOO_LARGE" : "MALFORMED_JWS", `${label} is invalid`);
38
+ }
39
+ return decoded;
40
+ }
41
+ function parseJson(buffer, label) {
42
+ try {
43
+ return JSON.parse(buffer.toString("utf8"));
44
+ }
45
+ catch {
46
+ throw snapshotError("MALFORMED_JWS", `${label} is not valid JSON`);
47
+ }
48
+ }
49
+ function parseProtectedHeader(value) {
50
+ const header = plainObject(value);
51
+ const fields = Object.keys(header);
52
+ if (fields.some((field) => !["alg", "kid", "typ"].includes(field))) {
53
+ throw snapshotError("UNSUPPORTED_HEADER", "JWS protected header contains unsupported fields");
54
+ }
55
+ if (header.alg !== "EdDSA" ||
56
+ typeof header.kid !== "string" ||
57
+ header.kid.trim() === "" ||
58
+ Array.from(header.kid).length > 200 ||
59
+ (header.typ !== undefined &&
60
+ (typeof header.typ !== "string" ||
61
+ header.typ.trim() === "" ||
62
+ Array.from(header.typ).length > 100))) {
63
+ throw snapshotError("UNSUPPORTED_HEADER", "JWS must use EdDSA and a bounded key ID");
64
+ }
65
+ return {
66
+ alg: "EdDSA",
67
+ kid: header.kid,
68
+ ...(typeof header.typ === "string" ? { typ: header.typ } : {}),
69
+ };
70
+ }
71
+ export function parseCompactJws(compactJws, maxBytes = DEFAULT_MAX_COMPACT_JWS_BYTES) {
72
+ if (!Number.isSafeInteger(maxBytes) || maxBytes <= 0) {
73
+ throw snapshotError("TOO_LARGE", "maxBytes must be a positive integer");
74
+ }
75
+ if (typeof compactJws !== "string" ||
76
+ Buffer.byteLength(compactJws) > maxBytes) {
77
+ throw snapshotError("TOO_LARGE", `Compact JWS exceeds ${maxBytes} bytes`);
78
+ }
79
+ if (!/^[\x21-\x7e]+$/u.test(compactJws)) {
80
+ throw snapshotError("MALFORMED_JWS", "Compact JWS must be ASCII");
81
+ }
82
+ const segments = compactJws.split(".");
83
+ if (segments.length !== 3) {
84
+ throw snapshotError("MALFORMED_JWS", "Compact JWS must contain three segments");
85
+ }
86
+ const protectedSegment = segments[0];
87
+ const payloadSegment = segments[1];
88
+ const signatureSegment = segments[2];
89
+ if (protectedSegment === undefined ||
90
+ payloadSegment === undefined ||
91
+ signatureSegment === undefined) {
92
+ throw snapshotError("MALFORMED_JWS", "Compact JWS is incomplete");
93
+ }
94
+ const protectedHeader = parseProtectedHeader(parseJson(decodeBase64url(protectedSegment, MAX_PROTECTED_HEADER_BYTES, "Protected header"), "Protected header"));
95
+ const payload = parseJson(decodeBase64url(payloadSegment, maxBytes, "Payload"), "Payload");
96
+ const signature = decodeBase64url(signatureSegment, 64, "Signature");
97
+ if (signature.byteLength !== 64) {
98
+ throw snapshotError("MALFORMED_JWS", "Ed25519 signatures must contain 64 bytes");
99
+ }
100
+ return {
101
+ protectedHeader,
102
+ payload,
103
+ signingInput: `${protectedSegment}.${payloadSegment}`,
104
+ signature,
105
+ };
106
+ }
107
+ function canonicalPublicKey(value) {
108
+ const record = value;
109
+ if (record.kty !== "OKP" ||
110
+ record.crv !== "Ed25519" ||
111
+ typeof record.kid !== "string" ||
112
+ record.kid.trim() === "" ||
113
+ typeof record.x !== "string" ||
114
+ record.x.includes("=") ||
115
+ !BASE64URL_PATTERN.test(record.x) ||
116
+ Buffer.from(record.x, "base64url").byteLength !== 32 ||
117
+ Buffer.from(record.x, "base64url").toString("base64url") !== record.x ||
118
+ (record.alg !== undefined && record.alg !== "EdDSA") ||
119
+ (record.use !== undefined && record.use !== "sig") ||
120
+ "d" in record) {
121
+ throw snapshotError("UNTRUSTED_KEY", "Pinned key is not public Ed25519");
122
+ }
123
+ return value;
124
+ }
125
+ function resolvePinnedKey(keys, workspaceId, kid) {
126
+ const keySet = "workspaceId" in keys
127
+ ? keys
128
+ : {
129
+ workspaceId,
130
+ keys: keys.filter((key) => key.workspaceId === undefined ||
131
+ key.workspaceId === workspaceId),
132
+ };
133
+ if (keySet.workspaceId !== workspaceId) {
134
+ throw snapshotError("WORKSPACE_MISMATCH", "Pinned key set belongs to another workspace");
135
+ }
136
+ const matches = keySet.keys.filter((key) => key.kid === kid);
137
+ if (matches.length !== 1) {
138
+ throw snapshotError("UNTRUSTED_KEY", "JWS key ID is not uniquely pinned for this workspace");
139
+ }
140
+ const key = matches[0];
141
+ if (key === undefined) {
142
+ throw snapshotError("UNTRUSTED_KEY", "JWS key is not pinned");
143
+ }
144
+ if (key.workspaceId !== undefined && key.workspaceId !== workspaceId) {
145
+ throw snapshotError("WORKSPACE_MISMATCH", "Pinned key belongs to another workspace");
146
+ }
147
+ return canonicalPublicKey(key);
148
+ }
149
+ function strictIso(value, field) {
150
+ if (typeof value !== "string" ||
151
+ !Number.isFinite(Date.parse(value)) ||
152
+ new Date(value).toISOString() !== value) {
153
+ throw snapshotError("INVALID_ENVELOPE", `${field} must be a canonical ISO timestamp`);
154
+ }
155
+ return value;
156
+ }
157
+ function validateKindPayload(payload, asOf) {
158
+ if (payload.kind === "context") {
159
+ const request = typeof payload.request === "object" &&
160
+ payload.request !== null &&
161
+ !Array.isArray(payload.request)
162
+ ? payload.request
163
+ : null;
164
+ let requestHash = "";
165
+ if (request !== null) {
166
+ try {
167
+ requestHash = createCanonicalJsonSha256(request);
168
+ }
169
+ catch {
170
+ throw snapshotError("INVALID_ENVELOPE", "Context snapshot request is not bounded JSON");
171
+ }
172
+ }
173
+ if (payload.snapshotVersion !== "context-snapshot-v1" ||
174
+ typeof payload.requestId !== "string" ||
175
+ payload.requestId.trim() === "" ||
176
+ Array.from(payload.requestId).length > 128 ||
177
+ typeof payload.requestHash !== "string" ||
178
+ !/^[a-f0-9]{64}$/u.test(payload.requestHash) ||
179
+ payload.requestHash !== requestHash ||
180
+ request === null ||
181
+ typeof payload.eventId !== "string" ||
182
+ typeof payload.receiptId !== "string" ||
183
+ strictIso(payload.deliveredAt, "deliveredAt") !== asOf ||
184
+ typeof payload.context !== "string" ||
185
+ !Array.isArray(payload.memories) ||
186
+ !Array.isArray(payload.hits) ||
187
+ typeof payload.packing !== "object" ||
188
+ payload.packing === null ||
189
+ Array.isArray(payload.packing)) {
190
+ throw snapshotError("INVALID_ENVELOPE", "Context snapshot payload is incomplete or inconsistent");
191
+ }
192
+ return;
193
+ }
194
+ if (payload.snapshotVersion !== "guard-policy-snapshot-v1" ||
195
+ !["off", "assist", "enforce"].includes(String(payload.mode)) ||
196
+ !Array.isArray(payload.overrides) ||
197
+ !Array.isArray(payload.requiredRules)) {
198
+ throw snapshotError("INVALID_ENVELOPE", "Guard policy snapshot payload is incomplete");
199
+ }
200
+ }
201
+ function validateEnvelope(value, options) {
202
+ const payload = plainObject(value);
203
+ if (payload.contractVersion !== SIGNED_SNAPSHOT_CONTRACT_VERSION) {
204
+ throw snapshotError("INVALID_ENVELOPE", "Snapshot contract version is unsupported");
205
+ }
206
+ if (payload.workspaceId !== options.workspaceId) {
207
+ throw snapshotError("WORKSPACE_MISMATCH", "Snapshot belongs to another workspace");
208
+ }
209
+ if (payload.kind !== "context" && payload.kind !== "guard_policy") {
210
+ throw snapshotError("INVALID_ENVELOPE", "Snapshot kind is invalid");
211
+ }
212
+ if (payload.kind !== options.kind) {
213
+ throw snapshotError("KIND_MISMATCH", `Expected a ${options.kind} snapshot`);
214
+ }
215
+ if (typeof payload.policyVersion !== "string" ||
216
+ payload.policyVersion.trim() === "" ||
217
+ Array.from(payload.policyVersion).length > 200) {
218
+ throw snapshotError("INVALID_ENVELOPE", "Snapshot policyVersion is invalid");
219
+ }
220
+ const issuedAt = strictIso(payload.issuedAt, "issuedAt");
221
+ const asOf = strictIso(payload.asOf, "asOf");
222
+ const validUntil = strictIso(payload.validUntil, "validUntil");
223
+ const issuedAtMs = Date.parse(issuedAt);
224
+ const asOfMs = Date.parse(asOf);
225
+ const validUntilMs = Date.parse(validUntil);
226
+ if (validUntilMs <= asOfMs ||
227
+ (payload.kind === "guard_policy" && validUntilMs <= issuedAtMs)) {
228
+ throw snapshotError("INVALID_ENVELOPE", "Snapshot validity is inconsistent with its kind and source time");
229
+ }
230
+ const now = options.now ?? new Date();
231
+ if (!Number.isFinite(now.getTime())) {
232
+ throw snapshotError("INVALID_ENVELOPE", "Verification time is invalid");
233
+ }
234
+ const tolerance = options.clockToleranceMs ?? 5 * 60_000;
235
+ if (!Number.isSafeInteger(tolerance) || tolerance < 0) {
236
+ throw snapshotError("INVALID_ENVELOPE", "clockToleranceMs must be a non-negative integer");
237
+ }
238
+ if (asOfMs > issuedAtMs) {
239
+ throw snapshotError("INVALID_ENVELOPE", "Snapshot source time cannot be after issuance");
240
+ }
241
+ if (issuedAtMs > now.getTime() + tolerance) {
242
+ throw snapshotError("NOT_YET_VALID", "Snapshot is not yet valid");
243
+ }
244
+ if (validUntilMs <= now.getTime() && options.allowExpired !== true) {
245
+ throw snapshotError("EXPIRED", "Snapshot has expired");
246
+ }
247
+ validateKindPayload(payload, asOf);
248
+ return payload;
249
+ }
250
+ export function verifySignedSnapshot(compactJws, options) {
251
+ const workspaceId = options.workspaceId.trim();
252
+ if (workspaceId === "") {
253
+ throw snapshotError("INVALID_ENVELOPE", "workspaceId must not be empty");
254
+ }
255
+ const parsed = parseCompactJws(compactJws, options.maxBytes ?? DEFAULT_MAX_COMPACT_JWS_BYTES);
256
+ const pinned = resolvePinnedKey(options.keys, workspaceId, parsed.protectedHeader.kid);
257
+ let publicKey;
258
+ try {
259
+ publicKey = createPublicKey({
260
+ key: {
261
+ kty: "OKP",
262
+ crv: "Ed25519",
263
+ x: pinned.x,
264
+ },
265
+ format: "jwk",
266
+ });
267
+ }
268
+ catch {
269
+ throw snapshotError("UNTRUSTED_KEY", "Pinned public key is invalid");
270
+ }
271
+ if (!verify(null, Buffer.from(parsed.signingInput, "ascii"), publicKey, parsed.signature)) {
272
+ throw snapshotError("INVALID_SIGNATURE", "Snapshot signature is invalid");
273
+ }
274
+ const payload = validateEnvelope(parsed.payload, {
275
+ ...options,
276
+ workspaceId,
277
+ });
278
+ const expectedType = payload.kind === "context"
279
+ ? "lore-context-snapshot+jws"
280
+ : "lore-guard-policy-snapshot+jws";
281
+ if (parsed.protectedHeader.typ !== expectedType) {
282
+ throw snapshotError("KIND_MISMATCH", "Snapshot protected type does not match its payload");
283
+ }
284
+ const issuedAtMs = Date.parse(payload.issuedAt);
285
+ if (pinned.notBefore !== undefined) {
286
+ const notBefore = strictIso(pinned.notBefore, "key.notBefore");
287
+ const tolerance = options.clockToleranceMs ?? 5 * 60_000;
288
+ if (issuedAtMs + tolerance < Date.parse(notBefore)) {
289
+ throw snapshotError("INVALID_SIGNATURE", "Snapshot predates its signing key");
290
+ }
291
+ }
292
+ if (pinned.retiredAt !== undefined && pinned.retiredAt !== null) {
293
+ const retiredAt = strictIso(pinned.retiredAt, "key.retiredAt");
294
+ if (issuedAtMs > Date.parse(retiredAt)) {
295
+ throw snapshotError("INVALID_SIGNATURE", "Snapshot postdates its signing key");
296
+ }
297
+ }
298
+ return {
299
+ header: parsed.protectedHeader,
300
+ payload: payload,
301
+ };
302
+ }
303
+ //# sourceMappingURL=signed-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signed-snapshot.js","sourceRoot":"","sources":["../src/signed-snapshot.ts"],"names":[],"mappings":"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"}
package/dist/update.js CHANGED
@@ -22,7 +22,7 @@ Usage:
22
22
  lore update [--version <tag>]
23
23
 
24
24
  Options:
25
- --version <tag> Release tag to install, for example v0.1.16
25
+ --version <tag> Release tag to install, for example v0.1.18
26
26
  -h, --help Show this help
27
27
 
28
28
  Environment:
@@ -32,7 +32,7 @@ Environment:
32
32
 
33
33
  Examples:
34
34
  lore update
35
- lore update --version v0.1.16
35
+ lore update --version v0.1.18
36
36
  `;
37
37
  export function isReleaseTag(value) {
38
38
  return RELEASE_TAG_PATTERN.test(value);
@@ -50,7 +50,7 @@ export function parseUpdateVersion(args) {
50
50
  if (version !== undefined && isReleaseTag(version)) {
51
51
  return version;
52
52
  }
53
- throw new Error("--version must be a release tag such as v0.1.16");
53
+ throw new Error("--version must be a release tag such as v0.1.18");
54
54
  }
55
55
  throw new Error("Unknown update options. Try: lore update --help");
56
56
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lore-co/cli",
3
- "version": "0.1.16",
3
+ "version": "0.1.18",
4
4
  "description": "Connect Claude Code, Codex, Cursor, OpenCode, Polytoken, and T3 Code to Lore shared engineering memory",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -12,6 +12,22 @@
12
12
  ".": {
13
13
  "types": "./dist/index.d.ts",
14
14
  "import": "./dist/index.js"
15
+ },
16
+ "./reliability-store": {
17
+ "types": "./dist/reliability-store.d.ts",
18
+ "import": "./dist/reliability-store.js"
19
+ },
20
+ "./signed-snapshot": {
21
+ "types": "./dist/signed-snapshot.d.ts",
22
+ "import": "./dist/signed-snapshot.js"
23
+ },
24
+ "./context-fallback": {
25
+ "types": "./dist/context-fallback.d.ts",
26
+ "import": "./dist/context-fallback.js"
27
+ },
28
+ "./invocation-health-writer": {
29
+ "types": "./dist/invocation-health-writer.d.ts",
30
+ "import": "./dist/invocation-health-writer.js"
15
31
  }
16
32
  },
17
33
  "files": [
@@ -44,8 +60,8 @@
44
60
  "dependencies": {
45
61
  "ws": "^8.21.3",
46
62
  "zod": "^4.4.3",
47
- "@lore-co/core": "0.1.16",
48
- "@lore-co/sdk": "0.1.16"
63
+ "@lore-co/sdk": "0.1.18",
64
+ "@lore-co/core": "0.1.18"
49
65
  },
50
66
  "devDependencies": {
51
67
  "@types/ws": "^8.18.1"