ds4-context-core 0.1.0

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 (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +80 -0
  3. package/dist/artifacts/artifact-manager.d.ts +58 -0
  4. package/dist/artifacts/artifact-manager.d.ts.map +1 -0
  5. package/dist/artifacts/artifact-manager.js +445 -0
  6. package/dist/artifacts/artifact-manager.js.map +1 -0
  7. package/dist/artifacts/artifact-store.d.ts +33 -0
  8. package/dist/artifacts/artifact-store.d.ts.map +1 -0
  9. package/dist/artifacts/artifact-store.js +116 -0
  10. package/dist/artifacts/artifact-store.js.map +1 -0
  11. package/dist/compaction/compaction-record.d.ts +74 -0
  12. package/dist/compaction/compaction-record.d.ts.map +1 -0
  13. package/dist/compaction/compaction-record.js +113 -0
  14. package/dist/compaction/compaction-record.js.map +1 -0
  15. package/dist/compaction/summary-contract.d.ts +68 -0
  16. package/dist/compaction/summary-contract.d.ts.map +1 -0
  17. package/dist/compaction/summary-contract.js +315 -0
  18. package/dist/compaction/summary-contract.js.map +1 -0
  19. package/dist/compaction/summary-graph.d.ts +48 -0
  20. package/dist/compaction/summary-graph.d.ts.map +1 -0
  21. package/dist/compaction/summary-graph.js +123 -0
  22. package/dist/compaction/summary-graph.js.map +1 -0
  23. package/dist/config/config-loader.d.ts +18 -0
  24. package/dist/config/config-loader.d.ts.map +1 -0
  25. package/dist/config/config-loader.js +305 -0
  26. package/dist/config/config-loader.js.map +1 -0
  27. package/dist/config/config.d.ts +113 -0
  28. package/dist/config/config.d.ts.map +1 -0
  29. package/dist/config/config.js +89 -0
  30. package/dist/config/config.js.map +1 -0
  31. package/dist/continuation/native-continuation.d.ts +107 -0
  32. package/dist/continuation/native-continuation.d.ts.map +1 -0
  33. package/dist/continuation/native-continuation.js +374 -0
  34. package/dist/continuation/native-continuation.js.map +1 -0
  35. package/dist/core/budget-manager.d.ts +26 -0
  36. package/dist/core/budget-manager.d.ts.map +1 -0
  37. package/dist/core/budget-manager.js +42 -0
  38. package/dist/core/budget-manager.js.map +1 -0
  39. package/dist/core/canonical-message.d.ts +69 -0
  40. package/dist/core/canonical-message.d.ts.map +1 -0
  41. package/dist/core/canonical-message.js +2 -0
  42. package/dist/core/canonical-message.js.map +1 -0
  43. package/dist/core/model-awareness.d.ts +59 -0
  44. package/dist/core/model-awareness.d.ts.map +1 -0
  45. package/dist/core/model-awareness.js +177 -0
  46. package/dist/core/model-awareness.js.map +1 -0
  47. package/dist/core/model-profile.d.ts +27 -0
  48. package/dist/core/model-profile.d.ts.map +1 -0
  49. package/dist/core/model-profile.js +29 -0
  50. package/dist/core/model-profile.js.map +1 -0
  51. package/dist/core/token-estimator.d.ts +4 -0
  52. package/dist/core/token-estimator.d.ts.map +1 -0
  53. package/dist/core/token-estimator.js +64 -0
  54. package/dist/core/token-estimator.js.map +1 -0
  55. package/dist/index.d.ts +37 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +37 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/manifest/context-manifest.d.ts +163 -0
  60. package/dist/manifest/context-manifest.d.ts.map +1 -0
  61. package/dist/manifest/context-manifest.js +2 -0
  62. package/dist/manifest/context-manifest.js.map +1 -0
  63. package/dist/manifest/observer.d.ts +63 -0
  64. package/dist/manifest/observer.d.ts.map +1 -0
  65. package/dist/manifest/observer.js +150 -0
  66. package/dist/manifest/observer.js.map +1 -0
  67. package/dist/memory/memory-manager.d.ts +112 -0
  68. package/dist/memory/memory-manager.d.ts.map +1 -0
  69. package/dist/memory/memory-manager.js +499 -0
  70. package/dist/memory/memory-manager.js.map +1 -0
  71. package/dist/memory/memory-types.d.ts +126 -0
  72. package/dist/memory/memory-types.d.ts.map +1 -0
  73. package/dist/memory/memory-types.js +73 -0
  74. package/dist/memory/memory-types.js.map +1 -0
  75. package/dist/persistence/migrations.d.ts +17 -0
  76. package/dist/persistence/migrations.d.ts.map +1 -0
  77. package/dist/persistence/migrations.js +588 -0
  78. package/dist/persistence/migrations.js.map +1 -0
  79. package/dist/persistence/repositories/artifact-repository.d.ts +50 -0
  80. package/dist/persistence/repositories/artifact-repository.d.ts.map +1 -0
  81. package/dist/persistence/repositories/artifact-repository.js +186 -0
  82. package/dist/persistence/repositories/artifact-repository.js.map +1 -0
  83. package/dist/persistence/repositories/context-manifest-repository.d.ts +19 -0
  84. package/dist/persistence/repositories/context-manifest-repository.d.ts.map +1 -0
  85. package/dist/persistence/repositories/context-manifest-repository.js +144 -0
  86. package/dist/persistence/repositories/context-manifest-repository.js.map +1 -0
  87. package/dist/persistence/repositories/memory-repository.d.ts +33 -0
  88. package/dist/persistence/repositories/memory-repository.d.ts.map +1 -0
  89. package/dist/persistence/repositories/memory-repository.js +429 -0
  90. package/dist/persistence/repositories/memory-repository.js.map +1 -0
  91. package/dist/persistence/repositories/project-knowledge-repository.d.ts +65 -0
  92. package/dist/persistence/repositories/project-knowledge-repository.d.ts.map +1 -0
  93. package/dist/persistence/repositories/project-knowledge-repository.js +248 -0
  94. package/dist/persistence/repositories/project-knowledge-repository.js.map +1 -0
  95. package/dist/persistence/repositories/session-index-repository.d.ts +81 -0
  96. package/dist/persistence/repositories/session-index-repository.d.ts.map +1 -0
  97. package/dist/persistence/repositories/session-index-repository.js +220 -0
  98. package/dist/persistence/repositories/session-index-repository.js.map +1 -0
  99. package/dist/persistence/repositories/summary-repository.d.ts +16 -0
  100. package/dist/persistence/repositories/summary-repository.d.ts.map +1 -0
  101. package/dist/persistence/repositories/summary-repository.js +242 -0
  102. package/dist/persistence/repositories/summary-repository.js.map +1 -0
  103. package/dist/persistence/sqlite.d.ts +45 -0
  104. package/dist/persistence/sqlite.d.ts.map +1 -0
  105. package/dist/persistence/sqlite.js +137 -0
  106. package/dist/persistence/sqlite.js.map +1 -0
  107. package/dist/planner/atomic-groups.d.ts +15 -0
  108. package/dist/planner/atomic-groups.d.ts.map +1 -0
  109. package/dist/planner/atomic-groups.js +177 -0
  110. package/dist/planner/atomic-groups.js.map +1 -0
  111. package/dist/planner/context-planner.d.ts +49 -0
  112. package/dist/planner/context-planner.d.ts.map +1 -0
  113. package/dist/planner/context-planner.js +367 -0
  114. package/dist/planner/context-planner.js.map +1 -0
  115. package/dist/privacy/privacy-policy.d.ts +58 -0
  116. package/dist/privacy/privacy-policy.d.ts.map +1 -0
  117. package/dist/privacy/privacy-policy.js +412 -0
  118. package/dist/privacy/privacy-policy.js.map +1 -0
  119. package/dist/project/file-indexer.d.ts +32 -0
  120. package/dist/project/file-indexer.d.ts.map +1 -0
  121. package/dist/project/file-indexer.js +374 -0
  122. package/dist/project/file-indexer.js.map +1 -0
  123. package/dist/project/git-state.d.ts +12 -0
  124. package/dist/project/git-state.d.ts.map +1 -0
  125. package/dist/project/git-state.js +109 -0
  126. package/dist/project/git-state.js.map +1 -0
  127. package/dist/project/project-knowledge.d.ts +63 -0
  128. package/dist/project/project-knowledge.d.ts.map +1 -0
  129. package/dist/project/project-knowledge.js +332 -0
  130. package/dist/project/project-knowledge.js.map +1 -0
  131. package/dist/retrieval/retrieval-engine.d.ts +55 -0
  132. package/dist/retrieval/retrieval-engine.d.ts.map +1 -0
  133. package/dist/retrieval/retrieval-engine.js +290 -0
  134. package/dist/retrieval/retrieval-engine.js.map +1 -0
  135. package/dist/retrieval/task-descriptor.d.ts +17 -0
  136. package/dist/retrieval/task-descriptor.d.ts.map +1 -0
  137. package/dist/retrieval/task-descriptor.js +107 -0
  138. package/dist/retrieval/task-descriptor.js.map +1 -0
  139. package/dist/shared/hash.d.ts +2 -0
  140. package/dist/shared/hash.d.ts.map +1 -0
  141. package/dist/shared/hash.js +5 -0
  142. package/dist/shared/hash.js.map +1 -0
  143. package/dist/shared/logging.d.ts +27 -0
  144. package/dist/shared/logging.d.ts.map +1 -0
  145. package/dist/shared/logging.js +83 -0
  146. package/dist/shared/logging.js.map +1 -0
  147. package/dist/shared/stable-json.d.ts +2 -0
  148. package/dist/shared/stable-json.d.ts.map +1 -0
  149. package/dist/shared/stable-json.js +38 -0
  150. package/dist/shared/stable-json.js.map +1 -0
  151. package/package.json +56 -0
@@ -0,0 +1,33 @@
1
+ export interface StoredArtifactObject {
2
+ sha256: string;
3
+ filePath: string;
4
+ mimeType: string;
5
+ sizeBytes: number;
6
+ createdAt: number;
7
+ verifiedAt: number;
8
+ deduplicated: boolean;
9
+ repaired: boolean;
10
+ }
11
+ export type ArtifactVerification = {
12
+ status: "available";
13
+ content: Buffer;
14
+ verifiedAt: number;
15
+ } | {
16
+ status: "missing";
17
+ verifiedAt: number;
18
+ } | {
19
+ status: "corrupt";
20
+ verifiedAt: number;
21
+ actualSha256: string;
22
+ };
23
+ export declare class FileArtifactStore {
24
+ private readonly now;
25
+ private readonly idGenerator;
26
+ readonly root: string;
27
+ constructor(root: string, now?: () => number, idGenerator?: () => string);
28
+ put(content: Uint8Array, mimeType: string): StoredArtifactObject;
29
+ verify(digest: string, maxBytes?: number): ArtifactVerification;
30
+ remove(digest: string): void;
31
+ pathFor(digest: string): string;
32
+ }
33
+ //# sourceMappingURL=artifact-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-store.d.ts","sourceRoot":"","sources":["../../src/artifacts/artifact-store.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAWpE,qBAAa,iBAAiB;IAK1B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAL9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAGpB,IAAI,EAAE,MAAM,EACK,GAAG,GAAE,MAAM,MAAiB,EAC5B,WAAW,GAAE,MAAM,MAAmB;IAOzD,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,oBAAoB;IA+DhE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,oBAAoB;IAe/D,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI5B,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAIhC"}
@@ -0,0 +1,116 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { chmodSync, closeSync, existsSync, fsyncSync, lstatSync, mkdirSync, openSync, readFileSync, renameSync, rmSync, writeFileSync, } from "node:fs";
3
+ import { join, resolve } from "node:path";
4
+ import { sha256 } from "../shared/hash.js";
5
+ const SHA256_PATTERN = /^[0-9a-f]{64}$/u;
6
+ function bestEffortChmod(path, mode) {
7
+ try {
8
+ chmodSync(path, mode);
9
+ }
10
+ catch (error) {
11
+ const code = error && typeof error === "object" && "code" in error ? String(error.code) : "";
12
+ if (!["ENOSYS", "EPERM", "EINVAL"].includes(code))
13
+ throw error;
14
+ }
15
+ }
16
+ export class FileArtifactStore {
17
+ now;
18
+ idGenerator;
19
+ root;
20
+ constructor(root, now = Date.now, idGenerator = randomUUID) {
21
+ this.now = now;
22
+ this.idGenerator = idGenerator;
23
+ this.root = resolve(root);
24
+ mkdirSync(this.root, { recursive: true, mode: 0o700 });
25
+ bestEffortChmod(this.root, 0o700);
26
+ }
27
+ put(content, mimeType) {
28
+ const buffer = Buffer.from(content);
29
+ const digest = sha256(buffer);
30
+ const directory = join(this.root, digest.slice(0, 2));
31
+ const filePath = join(directory, digest);
32
+ const createdAt = this.now();
33
+ mkdirSync(directory, { recursive: true, mode: 0o700 });
34
+ bestEffortChmod(directory, 0o700);
35
+ let repaired = false;
36
+ let quarantinePath;
37
+ if (existsSync(filePath)) {
38
+ const existing = this.verify(digest);
39
+ if (existing.status === "available") {
40
+ return {
41
+ sha256: digest,
42
+ filePath,
43
+ mimeType,
44
+ sizeBytes: buffer.byteLength,
45
+ createdAt,
46
+ verifiedAt: existing.verifiedAt,
47
+ deduplicated: true,
48
+ repaired: false,
49
+ };
50
+ }
51
+ quarantinePath = `${filePath}.corrupt-${this.idGenerator().replace(/[^A-Za-z0-9_-]/gu, "")}`;
52
+ renameSync(filePath, quarantinePath);
53
+ repaired = true;
54
+ }
55
+ const temporaryPath = join(directory, `.tmp-${this.idGenerator().replace(/[^A-Za-z0-9_-]/gu, "")}`);
56
+ let descriptor;
57
+ try {
58
+ descriptor = openSync(temporaryPath, "wx", 0o600);
59
+ writeFileSync(descriptor, buffer);
60
+ fsyncSync(descriptor);
61
+ closeSync(descriptor);
62
+ descriptor = undefined;
63
+ renameSync(temporaryPath, filePath);
64
+ bestEffortChmod(filePath, 0o600);
65
+ if (quarantinePath)
66
+ rmSync(quarantinePath, { force: true });
67
+ }
68
+ catch (error) {
69
+ if (quarantinePath && existsSync(quarantinePath) && !existsSync(filePath)) {
70
+ renameSync(quarantinePath, filePath);
71
+ }
72
+ throw error;
73
+ }
74
+ finally {
75
+ if (descriptor !== undefined)
76
+ closeSync(descriptor);
77
+ rmSync(temporaryPath, { force: true });
78
+ }
79
+ return {
80
+ sha256: digest,
81
+ filePath,
82
+ mimeType,
83
+ sizeBytes: buffer.byteLength,
84
+ createdAt,
85
+ verifiedAt: this.now(),
86
+ deduplicated: false,
87
+ repaired,
88
+ };
89
+ }
90
+ verify(digest, maxBytes) {
91
+ const filePath = this.pathFor(digest);
92
+ const verifiedAt = this.now();
93
+ if (!existsSync(filePath))
94
+ return { status: "missing", verifiedAt };
95
+ const stat = lstatSync(filePath);
96
+ if (!stat.isFile() || stat.isSymbolicLink())
97
+ return { status: "corrupt", verifiedAt, actualSha256: "non-regular-file" };
98
+ if (maxBytes !== undefined && stat.size > maxBytes) {
99
+ throw new Error(`Artifact ${digest} exceeds the ${maxBytes} byte read limit`);
100
+ }
101
+ const content = readFileSync(filePath);
102
+ const actualSha256 = sha256(content);
103
+ if (actualSha256 !== digest)
104
+ return { status: "corrupt", verifiedAt, actualSha256 };
105
+ return { status: "available", content, verifiedAt };
106
+ }
107
+ remove(digest) {
108
+ rmSync(this.pathFor(digest), { force: true });
109
+ }
110
+ pathFor(digest) {
111
+ if (!SHA256_PATTERN.test(digest))
112
+ throw new Error("Artifact SHA-256 must be 64 lowercase hexadecimal characters");
113
+ return join(this.root, digest.slice(0, 2), digest);
114
+ }
115
+ }
116
+ //# sourceMappingURL=artifact-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-store.js","sourceRoot":"","sources":["../../src/artifacts/artifact-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import type { SummaryValidationStatus } from "./summary-contract.ts";
2
+ export type CompactionTrigger = "manual" | "threshold" | "overflow" | "proactive";
3
+ export type SummaryLifecycleStatus = "prepared" | "committed" | "failed";
4
+ export type SummaryKind = "segment" | "aggregate" | "task-state" | "branch";
5
+ export interface EmbeddedSummaryNode {
6
+ id: string;
7
+ kind: SummaryKind;
8
+ content: string;
9
+ sourceHash: string;
10
+ sourceEntryIds: string[];
11
+ childSummaryIds: string[];
12
+ graphLevel: number;
13
+ createdAt: number;
14
+ validationStatus: SummaryValidationStatus;
15
+ validationIssueCodes: string[];
16
+ provider?: string;
17
+ model?: string;
18
+ }
19
+ /**
20
+ * Canonical metadata stored in Pi's CompactionEntry.details.
21
+ *
22
+ * Schema v1 records from M4 are normalized as level-zero segment nodes.
23
+ * Schema v2 adds graph topology plus any nodes created alongside the active
24
+ * summary. The active node content remains CompactionEntry.summary.
25
+ */
26
+ export interface Ds4CompactionMetadata {
27
+ schemaVersion: 1 | 2;
28
+ contractVersion: 1;
29
+ summaryId: string;
30
+ sourceHash: string;
31
+ sourceEntryIds: string[];
32
+ validationStatus: SummaryValidationStatus;
33
+ validationIssueCodes: string[];
34
+ firstKeptEntryId: string;
35
+ tokensBefore: number;
36
+ reason: CompactionTrigger;
37
+ isSplitTurn: boolean;
38
+ messageCount: number;
39
+ generatedAt: number;
40
+ provider: string;
41
+ model: string;
42
+ summaryKind: SummaryKind;
43
+ childSummaryIds: string[];
44
+ graphLevel: number;
45
+ segmentSummaryId: string;
46
+ embeddedNodes: EmbeddedSummaryNode[];
47
+ }
48
+ export interface Ds4CompactionDetails {
49
+ readFiles: string[];
50
+ modifiedFiles: string[];
51
+ ds4ContextEngine: Ds4CompactionMetadata;
52
+ }
53
+ export interface SummaryRecord {
54
+ id: string;
55
+ sessionId: string;
56
+ kind: SummaryKind;
57
+ content: string;
58
+ sourceHash: string;
59
+ sourceEntryIds: string[];
60
+ childSummaryIds: string[];
61
+ graphLevel: number;
62
+ createdAt: number;
63
+ validationStatus: SummaryValidationStatus;
64
+ provider?: string;
65
+ model?: string;
66
+ firstKeptEntryId: string;
67
+ tokensBefore: number;
68
+ reason: CompactionTrigger;
69
+ lifecycleStatus: SummaryLifecycleStatus;
70
+ piCompactionEntryId?: string;
71
+ metadata: Ds4CompactionMetadata;
72
+ }
73
+ export declare function parseDs4CompactionDetails(value: unknown): Ds4CompactionDetails | undefined;
74
+ //# sourceMappingURL=compaction-record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction-record.d.ts","sourceRoot":"","sources":["../../src/compaction/compaction-record.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAErE,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC;AAClF,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;AACzE,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,GAAG,QAAQ,CAAC;AAE5E,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC;IACrB,eAAe,EAAE,CAAC,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC;IACzB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,mBAAmB,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,qBAAqB,CAAC;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,eAAe,EAAE,sBAAsB,CAAC;IACxC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,EAAE,qBAAqB,CAAC;CACjC;AAsDD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,GAAG,SAAS,CAqE1F"}
@@ -0,0 +1,113 @@
1
+ function isRecord(value) {
2
+ return value !== null && typeof value === "object" && !Array.isArray(value);
3
+ }
4
+ function stringArray(value) {
5
+ return Array.isArray(value) && value.every((item) => typeof item === "string");
6
+ }
7
+ function summaryKind(value) {
8
+ return ["segment", "aggregate", "task-state", "branch"].includes(String(value));
9
+ }
10
+ function validationStatus(value) {
11
+ return ["valid", "warning", "invalid"].includes(String(value));
12
+ }
13
+ function parseEmbeddedNode(value) {
14
+ if (!isRecord(value))
15
+ return undefined;
16
+ if (typeof value.id !== "string"
17
+ || !summaryKind(value.kind)
18
+ || typeof value.content !== "string"
19
+ || typeof value.sourceHash !== "string"
20
+ || !stringArray(value.sourceEntryIds)
21
+ || !stringArray(value.childSummaryIds)
22
+ || typeof value.graphLevel !== "number"
23
+ || !Number.isInteger(value.graphLevel)
24
+ || value.graphLevel < 0
25
+ || typeof value.createdAt !== "number"
26
+ || !validationStatus(value.validationStatus)
27
+ || !stringArray(value.validationIssueCodes)
28
+ || (value.provider !== undefined && typeof value.provider !== "string")
29
+ || (value.model !== undefined && typeof value.model !== "string")) {
30
+ return undefined;
31
+ }
32
+ return {
33
+ id: value.id,
34
+ kind: value.kind,
35
+ content: value.content,
36
+ sourceHash: value.sourceHash,
37
+ sourceEntryIds: [...value.sourceEntryIds],
38
+ childSummaryIds: [...value.childSummaryIds],
39
+ graphLevel: value.graphLevel,
40
+ createdAt: value.createdAt,
41
+ validationStatus: value.validationStatus,
42
+ validationIssueCodes: [...value.validationIssueCodes],
43
+ ...(value.provider ? { provider: value.provider } : {}),
44
+ ...(value.model ? { model: value.model } : {}),
45
+ };
46
+ }
47
+ export function parseDs4CompactionDetails(value) {
48
+ if (!isRecord(value) || !isRecord(value.ds4ContextEngine))
49
+ return undefined;
50
+ const metadata = value.ds4ContextEngine;
51
+ const schemaVersion = metadata.schemaVersion;
52
+ if ((schemaVersion !== 1 && schemaVersion !== 2)
53
+ || metadata.contractVersion !== 1
54
+ || typeof metadata.summaryId !== "string"
55
+ || typeof metadata.sourceHash !== "string"
56
+ || !stringArray(metadata.sourceEntryIds)
57
+ || !validationStatus(metadata.validationStatus)
58
+ || !stringArray(metadata.validationIssueCodes)
59
+ || typeof metadata.firstKeptEntryId !== "string"
60
+ || typeof metadata.tokensBefore !== "number"
61
+ || !["manual", "threshold", "overflow", "proactive"].includes(String(metadata.reason))
62
+ || typeof metadata.isSplitTurn !== "boolean"
63
+ || typeof metadata.messageCount !== "number"
64
+ || typeof metadata.generatedAt !== "number"
65
+ || typeof metadata.provider !== "string"
66
+ || typeof metadata.model !== "string") {
67
+ return undefined;
68
+ }
69
+ const kind = schemaVersion === 2 ? metadata.summaryKind : "segment";
70
+ const children = schemaVersion === 2 ? metadata.childSummaryIds : [];
71
+ const level = schemaVersion === 2 ? metadata.graphLevel : 0;
72
+ const segmentSummaryId = schemaVersion === 2 ? metadata.segmentSummaryId : metadata.summaryId;
73
+ const rawEmbedded = schemaVersion === 2 ? metadata.embeddedNodes : [];
74
+ if (!summaryKind(kind)
75
+ || !stringArray(children)
76
+ || typeof level !== "number"
77
+ || !Number.isInteger(level)
78
+ || level < 0
79
+ || typeof segmentSummaryId !== "string"
80
+ || !Array.isArray(rawEmbedded)) {
81
+ return undefined;
82
+ }
83
+ const embeddedNodes = rawEmbedded.map(parseEmbeddedNode);
84
+ if (embeddedNodes.some((node) => !node))
85
+ return undefined;
86
+ return {
87
+ readFiles: stringArray(value.readFiles) ? [...value.readFiles] : [],
88
+ modifiedFiles: stringArray(value.modifiedFiles) ? [...value.modifiedFiles] : [],
89
+ ds4ContextEngine: {
90
+ schemaVersion,
91
+ contractVersion: 1,
92
+ summaryId: metadata.summaryId,
93
+ sourceHash: metadata.sourceHash,
94
+ sourceEntryIds: [...metadata.sourceEntryIds],
95
+ validationStatus: metadata.validationStatus,
96
+ validationIssueCodes: [...metadata.validationIssueCodes],
97
+ firstKeptEntryId: metadata.firstKeptEntryId,
98
+ tokensBefore: metadata.tokensBefore,
99
+ reason: metadata.reason,
100
+ isSplitTurn: metadata.isSplitTurn,
101
+ messageCount: metadata.messageCount,
102
+ generatedAt: metadata.generatedAt,
103
+ provider: metadata.provider,
104
+ model: metadata.model,
105
+ summaryKind: kind,
106
+ childSummaryIds: [...children],
107
+ graphLevel: level,
108
+ segmentSummaryId,
109
+ embeddedNodes: embeddedNodes,
110
+ },
111
+ };
112
+ }
113
+ //# sourceMappingURL=compaction-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction-record.js","sourceRoot":"","sources":["../../src/compaction/compaction-record.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ export declare const SUMMARY_CONTRACT_VERSION = 1;
2
+ export declare const REQUIRED_SUMMARY_SECTIONS: readonly ["Objective", "User Constraints", "Durable Decisions", "Completed Work", "Current State", "Files Read", "Files Modified", "Commands / Tests", "Errors / Risks", "Open Questions", "Next Actions", "Critical Exact Values"];
3
+ export type SummaryValidationStatus = "valid" | "warning" | "invalid";
4
+ export interface SummaryValidationIssue {
5
+ code: string;
6
+ severity: "warning" | "error";
7
+ message: string;
8
+ }
9
+ export interface SummaryValidationResult {
10
+ status: SummaryValidationStatus;
11
+ issues: SummaryValidationIssue[];
12
+ }
13
+ export interface SummaryPromptInput {
14
+ conversationText: string;
15
+ previousSummary?: string;
16
+ customInstructions?: string;
17
+ readFiles: readonly string[];
18
+ modifiedFiles: readonly string[];
19
+ isSplitTurn: boolean;
20
+ purpose?: "segment" | "aggregate";
21
+ }
22
+ export interface AggregateSummaryChild {
23
+ id: string;
24
+ kind: string;
25
+ content: string;
26
+ sourceHash: string;
27
+ graphLevel: number;
28
+ }
29
+ export interface AggregateSummaryPromptInput {
30
+ children: readonly AggregateSummaryChild[];
31
+ customInstructions?: string;
32
+ readFiles: readonly string[];
33
+ modifiedFiles: readonly string[];
34
+ }
35
+ export interface SummaryValidationInput {
36
+ sourceText: string;
37
+ readFiles: readonly string[];
38
+ modifiedFiles: readonly string[];
39
+ }
40
+ /**
41
+ * Replace only well-formed, unique file sections with Pi's sanitized file-operation
42
+ * evidence. The model still owns every semantic section; DS4 owns these inventories
43
+ * so grouped prose or invented paths can never pass as file provenance.
44
+ */
45
+ export declare function groundSummaryFileSections(summary: string, input: Pick<SummaryValidationInput, "readFiles" | "modifiedFiles">): string;
46
+ export interface ExactValuePruneResult {
47
+ content: string;
48
+ removedBullets: number;
49
+ removedCharacters: number;
50
+ }
51
+ /**
52
+ * Reject unsupported exact claims at bullet granularity. This is deliberately
53
+ * conservative: malformed prose, excessive removals, or unsupported values outside
54
+ * a bullet remain invalid and fall back to Pi rather than being silently rewritten.
55
+ */
56
+ export declare function pruneUnsupportedExactValueBullets(summary: string, input: SummaryValidationInput): ExactValuePruneResult | undefined;
57
+ export declare function buildSummaryPrompt(input: SummaryPromptInput): string;
58
+ export declare function buildAggregateSummaryPrompt(input: AggregateSummaryPromptInput): string;
59
+ export declare function computeSummarySourceHash(input: {
60
+ conversationText: string;
61
+ previousSummary?: string;
62
+ sourceEntryIds: readonly string[];
63
+ readFiles?: readonly string[];
64
+ modifiedFiles?: readonly string[];
65
+ }): string;
66
+ export declare function computeAggregateSourceHash(children: readonly AggregateSummaryChild[]): string;
67
+ export declare function validateSummary(summary: string, input: SummaryValidationInput): SummaryValidationResult;
68
+ //# sourceMappingURL=summary-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary-contract.d.ts","sourceRoot":"","sources":["../../src/compaction/summary-contract.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,eAAO,MAAM,yBAAyB,qOAa5B,CAAC;AAEX,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAEtE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,uBAAuB,CAAC;IAChC,MAAM,EAAE,sBAAsB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;CACnC;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC3C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAmCD;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,IAAI,CAAC,sBAAsB,EAAE,WAAW,GAAG,eAAe,CAAC,GACjE,MAAM,CAiBR;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAoCD;;;;GAIG;AACH,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,sBAAsB,GAC5B,qBAAqB,GAAG,SAAS,CAiEnC;AA+BD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAiDpE;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,2BAA2B,GAAG,MAAM,CActF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC,GAAG,MAAM,CAQT;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,SAAS,qBAAqB,EAAE,GAAG,MAAM,CAO7F;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,sBAAsB,GAC5B,uBAAuB,CAqEzB"}