pi-ghost-autocomplete 0.3.2 → 0.5.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 (170) hide show
  1. package/LICENSE +561 -0
  2. package/README.md +186 -4
  3. package/dist/bench-cli.js +1 -123
  4. package/dist/bench.d.ts +7 -3
  5. package/dist/bench.js +1 -522
  6. package/dist/config.d.ts +46 -3
  7. package/dist/context-aggregator.d.ts +4 -1
  8. package/dist/cycle-manager.d.ts +2 -21
  9. package/dist/entropy-stop.d.ts +4 -1
  10. package/dist/eval-dataset.d.ts +2 -13
  11. package/dist/fuzzy-matcher.d.ts +4 -1
  12. package/dist/ghost-editor.d.ts +11 -2
  13. package/dist/index.d.ts +7 -2
  14. package/dist/index.js +1 -289
  15. package/dist/intent.d.ts +179 -0
  16. package/dist/metrics.d.ts +4 -1
  17. package/dist/path-index.d.ts +4 -1
  18. package/dist/path-matcher.d.ts +4 -1
  19. package/dist/profile-store.d.ts +4 -1
  20. package/dist/profile.d.ts +2 -20
  21. package/dist/providers/cloud-provider.d.ts +4 -1
  22. package/dist/providers/local-provider.d.ts +4 -1
  23. package/dist/providers/openai-compat-chat-provider.d.ts +31 -0
  24. package/dist/providers/openai-compat-provider.d.ts +24 -1
  25. package/dist/providers/race.d.ts +4 -1
  26. package/dist/providers/router.d.ts +59 -0
  27. package/dist/providers/types.d.ts +13 -1
  28. package/dist/recent-paths.d.ts +4 -1
  29. package/dist/replay-cli.js +1 -166
  30. package/dist/replay.d.ts +2 -7
  31. package/package.json +10 -6
  32. package/dist/bench-cli.d.ts +0 -3
  33. package/dist/bench-cli.d.ts.map +0 -1
  34. package/dist/bench-cli.js.map +0 -1
  35. package/dist/bench.d.ts.map +0 -1
  36. package/dist/bench.js.map +0 -1
  37. package/dist/cache.d.ts +0 -124
  38. package/dist/cache.d.ts.map +0 -1
  39. package/dist/cache.js +0 -173
  40. package/dist/cache.js.map +0 -1
  41. package/dist/candidate-rerank.d.ts +0 -57
  42. package/dist/candidate-rerank.d.ts.map +0 -1
  43. package/dist/candidate-rerank.js +0 -78
  44. package/dist/candidate-rerank.js.map +0 -1
  45. package/dist/config.d.ts.map +0 -1
  46. package/dist/config.js +0 -317
  47. package/dist/config.js.map +0 -1
  48. package/dist/context-aggregator.d.ts.map +0 -1
  49. package/dist/context-aggregator.js +0 -87
  50. package/dist/context-aggregator.js.map +0 -1
  51. package/dist/context-selector.d.ts +0 -128
  52. package/dist/context-selector.d.ts.map +0 -1
  53. package/dist/context-selector.js +0 -300
  54. package/dist/context-selector.js.map +0 -1
  55. package/dist/cycle-manager.d.ts.map +0 -1
  56. package/dist/cycle-manager.js +0 -168
  57. package/dist/cycle-manager.js.map +0 -1
  58. package/dist/edit-history-ring.d.ts +0 -148
  59. package/dist/edit-history-ring.d.ts.map +0 -1
  60. package/dist/edit-history-ring.js +0 -262
  61. package/dist/edit-history-ring.js.map +0 -1
  62. package/dist/entropy-stop.d.ts.map +0 -1
  63. package/dist/entropy-stop.js +0 -141
  64. package/dist/entropy-stop.js.map +0 -1
  65. package/dist/eval-dataset.d.ts.map +0 -1
  66. package/dist/eval-dataset.js +0 -127
  67. package/dist/eval-dataset.js.map +0 -1
  68. package/dist/fast-path-engine.d.ts +0 -286
  69. package/dist/fast-path-engine.d.ts.map +0 -1
  70. package/dist/fast-path-engine.js +0 -341
  71. package/dist/fast-path-engine.js.map +0 -1
  72. package/dist/fuzzy-matcher.d.ts.map +0 -1
  73. package/dist/fuzzy-matcher.js +0 -162
  74. package/dist/fuzzy-matcher.js.map +0 -1
  75. package/dist/ghost-editor.d.ts.map +0 -1
  76. package/dist/ghost-editor.js +0 -1491
  77. package/dist/ghost-editor.js.map +0 -1
  78. package/dist/index.d.ts.map +0 -1
  79. package/dist/index.js.map +0 -1
  80. package/dist/keystroke-timer.d.ts +0 -59
  81. package/dist/keystroke-timer.d.ts.map +0 -1
  82. package/dist/keystroke-timer.js +0 -94
  83. package/dist/keystroke-timer.js.map +0 -1
  84. package/dist/metrics-builder.d.ts +0 -71
  85. package/dist/metrics-builder.d.ts.map +0 -1
  86. package/dist/metrics-builder.js +0 -71
  87. package/dist/metrics-builder.js.map +0 -1
  88. package/dist/metrics.d.ts.map +0 -1
  89. package/dist/metrics.js +0 -212
  90. package/dist/metrics.js.map +0 -1
  91. package/dist/path-index.d.ts.map +0 -1
  92. package/dist/path-index.js +0 -148
  93. package/dist/path-index.js.map +0 -1
  94. package/dist/path-matcher.d.ts.map +0 -1
  95. package/dist/path-matcher.js +0 -88
  96. package/dist/path-matcher.js.map +0 -1
  97. package/dist/profile-store.d.ts.map +0 -1
  98. package/dist/profile-store.js +0 -199
  99. package/dist/profile-store.js.map +0 -1
  100. package/dist/profile.d.ts.map +0 -1
  101. package/dist/profile.js +0 -434
  102. package/dist/profile.js.map +0 -1
  103. package/dist/providers/cloud-provider.d.ts.map +0 -1
  104. package/dist/providers/cloud-provider.js +0 -109
  105. package/dist/providers/cloud-provider.js.map +0 -1
  106. package/dist/providers/local-provider.d.ts.map +0 -1
  107. package/dist/providers/local-provider.js +0 -48
  108. package/dist/providers/local-provider.js.map +0 -1
  109. package/dist/providers/openai-compat-provider.d.ts.map +0 -1
  110. package/dist/providers/openai-compat-provider.js +0 -215
  111. package/dist/providers/openai-compat-provider.js.map +0 -1
  112. package/dist/providers/openai-completions-runner.d.ts +0 -52
  113. package/dist/providers/openai-completions-runner.d.ts.map +0 -1
  114. package/dist/providers/openai-completions-runner.js +0 -141
  115. package/dist/providers/openai-completions-runner.js.map +0 -1
  116. package/dist/providers/race.d.ts.map +0 -1
  117. package/dist/providers/race.js +0 -441
  118. package/dist/providers/race.js.map +0 -1
  119. package/dist/providers/truncate.d.ts +0 -7
  120. package/dist/providers/truncate.d.ts.map +0 -1
  121. package/dist/providers/truncate.js +0 -57
  122. package/dist/providers/truncate.js.map +0 -1
  123. package/dist/providers/types.d.ts.map +0 -1
  124. package/dist/providers/types.js +0 -60
  125. package/dist/providers/types.js.map +0 -1
  126. package/dist/provisional-manager.d.ts +0 -93
  127. package/dist/provisional-manager.d.ts.map +0 -1
  128. package/dist/provisional-manager.js +0 -98
  129. package/dist/provisional-manager.js.map +0 -1
  130. package/dist/provisional.d.ts +0 -150
  131. package/dist/provisional.d.ts.map +0 -1
  132. package/dist/provisional.js +0 -238
  133. package/dist/provisional.js.map +0 -1
  134. package/dist/recent-paths.d.ts.map +0 -1
  135. package/dist/recent-paths.js +0 -114
  136. package/dist/recent-paths.js.map +0 -1
  137. package/dist/regret-tracker.d.ts +0 -84
  138. package/dist/regret-tracker.d.ts.map +0 -1
  139. package/dist/regret-tracker.js +0 -145
  140. package/dist/regret-tracker.js.map +0 -1
  141. package/dist/replay-cli.d.ts +0 -13
  142. package/dist/replay-cli.d.ts.map +0 -1
  143. package/dist/replay-cli.js.map +0 -1
  144. package/dist/replay.d.ts.map +0 -1
  145. package/dist/replay.js +0 -225
  146. package/dist/replay.js.map +0 -1
  147. package/dist/reranker.d.ts +0 -181
  148. package/dist/reranker.d.ts.map +0 -1
  149. package/dist/reranker.js +0 -324
  150. package/dist/reranker.js.map +0 -1
  151. package/dist/session-trie.d.ts +0 -103
  152. package/dist/session-trie.d.ts.map +0 -1
  153. package/dist/session-trie.js +0 -280
  154. package/dist/session-trie.js.map +0 -1
  155. package/dist/speculative.d.ts +0 -74
  156. package/dist/speculative.d.ts.map +0 -1
  157. package/dist/speculative.js +0 -107
  158. package/dist/speculative.js.map +0 -1
  159. package/dist/tool-summarize.d.ts +0 -40
  160. package/dist/tool-summarize.d.ts.map +0 -1
  161. package/dist/tool-summarize.js +0 -245
  162. package/dist/tool-summarize.js.map +0 -1
  163. package/dist/trie-sanitize.d.ts +0 -22
  164. package/dist/trie-sanitize.d.ts.map +0 -1
  165. package/dist/trie-sanitize.js +0 -142
  166. package/dist/trie-sanitize.js.map +0 -1
  167. package/dist/versions.d.ts +0 -23
  168. package/dist/versions.d.ts.map +0 -1
  169. package/dist/versions.js +0 -31
  170. package/dist/versions.js.map +0 -1
@@ -1,199 +0,0 @@
1
- /**
2
- * Stateful wrapper around `profile.ts` for the editor. Holds the in-memory
3
- * `ProfileIndex`, serializes writes, triggers periodic compaction, and
4
- * exposes a synchronous lookup surface for the editor's hot path.
5
- *
6
- * Lifecycle:
7
- * 1. `create(cwd)` — loads + indexes the JSONL once. Returns a disabled
8
- * store if `PI_GHOST_PROFILE=off`. Errors during load yield an empty
9
- * index (best-effort).
10
- * 2. `captureCommit(text)` / `captureAccept(prefix, completion, weight)`
11
- * — append to disk (async, fire-and-forget) and merge into the
12
- * in-memory index so the next lookup sees them immediately.
13
- * 3. Every `COMPACT_CHECK_EVERY` writes the store runs `compactIfNeeded`
14
- * in the background. Compaction reloads the index after rewrite.
15
- *
16
- * `disabled` is a public boolean so callers can short-circuit lookups
17
- * without an extra function call on the keystroke path.
18
- */
19
- import { appendRecords, bestSlashMatch, buildIndex, compactIfNeeded, DEFAULT_DECAY_DAYS, emptyIndex, loadRecords, parseDecayDaysEnv, prefixHash, profileBias, profilePathBoost, recordsFromCommit, recordFromAccept, } from "./profile.js";
20
- // `loadRecords` referenced only inside the `create` static; `buildIndex`
21
- // likewise. Both retained in imports. Keep this import block fixed so
22
- // future additions don't bring in unused symbols silently.
23
- const COMPACT_CHECK_EVERY = 100;
24
- export class ProfileStore {
25
- cwd;
26
- disabled;
27
- index = emptyIndex();
28
- writeQueue = Promise.resolve();
29
- writesSinceCompact = 0;
30
- decayDays;
31
- constructor(cwd, opts) {
32
- this.cwd = cwd;
33
- this.disabled = opts.disabled;
34
- this.decayDays = opts.decayDays;
35
- }
36
- /**
37
- * Build a store and load the JSONL into memory. Caller awaits before
38
- * exposing the store to the editor so the index is hot on first
39
- * keystroke. Disabled stores short-circuit load entirely.
40
- */
41
- static async create(cwd, env = process.env) {
42
- const disabled = env.PI_GHOST_PROFILE === "off";
43
- const decayDays = parseDecayDaysEnv(env.PI_GHOST_PROFILE_DECAY_DAYS);
44
- const store = new ProfileStore(cwd, { disabled, decayDays });
45
- if (!disabled) {
46
- try {
47
- const records = await loadRecords(cwd);
48
- store.index = buildIndex(records, { decayDays });
49
- }
50
- catch {
51
- // best-effort
52
- }
53
- }
54
- return store;
55
- }
56
- getIndex() {
57
- return this.index;
58
- }
59
- get decayDaysSetting() {
60
- return this.decayDays;
61
- }
62
- /**
63
- * Capture user-committed text. Extracts paths + slash + trigrams, drops
64
- * sensitive messages entirely. Returns the count of records emitted —
65
- * useful for tests/diagnostics.
66
- */
67
- captureCommit(text, ts = Date.now()) {
68
- if (this.disabled)
69
- return 0;
70
- const recs = recordsFromCommit(text, ts);
71
- if (recs.length === 0)
72
- return 0;
73
- this.mergeAndPersist(recs);
74
- return recs.length;
75
- }
76
- /**
77
- * Capture an accept (full or partial). `weight` defaults to 3 to match
78
- * PRD §M2 trie weights. Returns true when a record was emitted.
79
- */
80
- captureAccept(prefix, completion, weight = 3, ts = Date.now()) {
81
- if (this.disabled)
82
- return false;
83
- const rec = recordFromAccept(prefix, completion, weight, ts);
84
- if (!rec)
85
- return false;
86
- this.mergeAndPersist([rec]);
87
- return true;
88
- }
89
- /** Public lookup surfaces — thin wrappers around `profile.ts`. */
90
- bestSlashMatch(prefix) {
91
- if (this.disabled)
92
- return null;
93
- return bestSlashMatch(this.index, prefix);
94
- }
95
- profileBias(text) {
96
- if (this.disabled)
97
- return 0;
98
- return profileBias(this.index, text);
99
- }
100
- profilePathBoost(path) {
101
- if (this.disabled)
102
- return 0;
103
- return profilePathBoost(this.index, path);
104
- }
105
- /**
106
- * Provisional fallback (PRD §M3.5b) — look up an exact-prefix accept
107
- * record. Returns the completion tokens + summed weight, or null when
108
- * the prefix has never been the exact key of a captured accept.
109
- * `prefix` is hashed in-process; the raw string never leaves memory.
110
- */
111
- lookupAcceptByPrefix(prefix) {
112
- if (this.disabled || !prefix)
113
- return null;
114
- const hit = this.index.acceptByPrefix.get(prefixHash(prefix));
115
- return hit ? { completionTokens: hit.completionTokens, weight: hit.weight } : null;
116
- }
117
- /** Flush any pending writes — call before process exit. */
118
- async flush() {
119
- await this.writeQueue;
120
- }
121
- /**
122
- * Append records both in-memory and to disk. In-memory merge happens
123
- * synchronously so the very next lookup sees the new weight; the disk
124
- * write is queued through `writeQueue` to serialize concurrent commits.
125
- */
126
- mergeAndPersist(recs) {
127
- // Merge into in-memory index. Rebuilding from scratch is wasteful
128
- // for one record; instead apply the same buildIndex rules inline.
129
- this.applyToIndex(recs);
130
- this.writesSinceCompact += recs.length;
131
- const shouldCompact = this.writesSinceCompact >= COMPACT_CHECK_EVERY;
132
- if (shouldCompact)
133
- this.writesSinceCompact = 0;
134
- this.writeQueue = this.writeQueue
135
- .then(() => appendRecords(this.cwd, recs))
136
- .then(async () => {
137
- if (!shouldCompact)
138
- return;
139
- // Background compaction rewrites the file. The in-memory
140
- // index is NOT reloaded afterward: between the loadRecords
141
- // step inside `compactIfNeeded` and our reload, additional
142
- // `applyToIndex` calls would have mutated `this.index` —
143
- // reloading would lose them. The in-memory index is the
144
- // authoritative session view; compaction's purpose is
145
- // disk-size reduction. Next session start re-reads the
146
- // compacted file via `ProfileStore.create`.
147
- await compactIfNeeded(this.cwd, { decayDays: this.decayDays });
148
- })
149
- .catch(() => {
150
- /* logging must never break completions */
151
- });
152
- }
153
- /**
154
- * Inline equivalent of `buildIndex` for a small record batch. The
155
- * fresh-record path skips decay since we just wrote `ts`. Keeping this
156
- * separate from `profile.buildIndex` avoids reindexing the whole store
157
- * on every keystroke.
158
- */
159
- applyToIndex(recs) {
160
- for (const r of recs) {
161
- const w = r.weight;
162
- switch (r.kind) {
163
- case "ngram":
164
- if (r.tokens && r.tokens.length > 0) {
165
- const key = r.tokens.join(" ");
166
- this.index.ngram.set(key, (this.index.ngram.get(key) ?? 0) + w);
167
- }
168
- break;
169
- case "path":
170
- if (r.value)
171
- this.index.path.set(r.value, (this.index.path.get(r.value) ?? 0) + w);
172
- break;
173
- case "slash":
174
- if (r.value)
175
- this.index.slash.set(r.value, (this.index.slash.get(r.value) ?? 0) + w);
176
- break;
177
- case "accept":
178
- if (r.prefixHash && r.completionTokens) {
179
- const existing = this.index.acceptByPrefix.get(r.prefixHash);
180
- if (existing) {
181
- existing.weight += w;
182
- existing.completionTokens = r.completionTokens;
183
- }
184
- else {
185
- this.index.acceptByPrefix.set(r.prefixHash, {
186
- completionTokens: r.completionTokens,
187
- weight: w,
188
- });
189
- }
190
- this.index.totalAcceptRecords += 1;
191
- }
192
- break;
193
- }
194
- }
195
- }
196
- }
197
- /** Exported for tests — surface compactor knob without re-exporting `profile.ts`. */
198
- export { DEFAULT_DECAY_DAYS };
199
- //# sourceMappingURL=profile-store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"profile-store.js","sourceRoot":"","sources":["../src/profile-store.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,eAAO,MAAM,WAAW,yCAAyC,CAAC;AAClE,eAAO,MAAM,iBAAiB,QAAkB,CAAC;AACjD,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,SAAS,IAAI,CAAC;AAK3B,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhE;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,wCAAwC;IACxC,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,kBAAkB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,UAAU,IAAI,YAAY,CAQzC;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAO/C;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAO9D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAQnD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAQnD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAE,MAAmB,GAAG,aAAa,EAAE,CAexF;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC/B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,MAAU,EAClB,EAAE,GAAE,MAAmB,GACrB,aAAa,GAAG,IAAI,CActB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAUrF;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CASvE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAe1D;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACzB,OAAO,EAAE,aAAa,EAAE,EACxB,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7C,YAAY,CA2Cd;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAOvE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAC1B,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7D,MAAM,CAcR;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,MAAM,CAAC;AAClC,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMxE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASxG;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACpC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAChE,OAAO,CAAC,OAAO,CAAC,CA0BlB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC7B,OAAO,EAAE,aAAa,EAAE,EACxB,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7C,aAAa,EAAE,CAgCjB;AAeD,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAKjE"}
package/dist/profile.js DELETED
@@ -1,434 +0,0 @@
1
- /**
2
- * User profile — long-lived, cross-session frequency store. PRD §M4.
3
- *
4
- * Storage: `.pi/ghost-autocomplete/profile.jsonl` (append-only). One JSON
5
- * record per line, written via the in-process writer.
6
- *
7
- * The profile feeds three local-only signals:
8
- * - ngram trigrams → reranker `profileBias` (PRD §M3c hook)
9
- * - path frequency → bounded boost to deterministic path/fuzzy ranking
10
- * - slash-command frequency → editor fast-path for `/cmd…` prefixes
11
- *
12
- * Privacy: raw full prefixes and full completions are NEVER persisted. We
13
- * store sanitized n-grams (≤4), absolute paths, slash commands, and SHA-256
14
- * hashes of prefix keys (`prefixHash`) for exact-prefix lookup without
15
- * writing prompt text. The sanitizer is shared with `trie-sanitize.ts` so
16
- * the entropy + key-prefix rules drop the same tokens.
17
- *
18
- * The on-disk format is intentionally append-only + line-delimited so a
19
- * crash mid-write never corrupts the existing index; partial trailing lines
20
- * are skipped on load. Rotation compacts when the file exceeds 2 MB.
21
- */
22
- import { createHash } from "node:crypto";
23
- import { appendFile, mkdir, readFile, rename, stat, writeFile } from "node:fs/promises";
24
- import { dirname, join } from "node:path";
25
- import { containsSensitive } from "./trie-sanitize.js";
26
- export const PROFILE_REL = ".pi/ghost-autocomplete/profile.jsonl";
27
- export const DEFAULT_MAX_BYTES = 2 * 1024 * 1024;
28
- export const DEFAULT_DECAY_DAYS = 90;
29
- export const DROP_BELOW_WEIGHT = 0.1;
30
- export const MAX_NGRAM_N = 4;
31
- export const TRIGRAM_N = 3;
32
- const PATH_RE = /(?:^|[\s"'`(])((?:[\w.-]+\/)+[\w.-]+\.[a-zA-Z]{1,6})\b/g;
33
- const SLASH_RE = /(?:^|\s)(\/[a-z][a-z0-9_-]{0,30})\b/g;
34
- const TOKEN_RE = /\b[\w][\w-]*\b/g;
35
- export function emptyIndex() {
36
- return {
37
- ngram: new Map(),
38
- path: new Map(),
39
- slash: new Map(),
40
- acceptByPrefix: new Map(),
41
- totalAcceptRecords: 0,
42
- };
43
- }
44
- /**
45
- * Tokenize a string into the same word-token form the profile stores. Drops
46
- * the empty string, deduplicates whitespace, and lowercases nothing — code
47
- * identifiers are case-sensitive.
48
- */
49
- export function tokenize(text) {
50
- if (!text)
51
- return [];
52
- const out = [];
53
- for (const m of text.matchAll(TOKEN_RE)) {
54
- if (m[0])
55
- out.push(m[0]);
56
- }
57
- return out;
58
- }
59
- /**
60
- * Generate n-grams of size `n` from `tokens`. Returns empty when there are
61
- * fewer than `n` tokens.
62
- */
63
- export function ngrams(tokens, n) {
64
- if (n <= 0 || tokens.length < n)
65
- return [];
66
- const out = [];
67
- for (let i = 0; i + n <= tokens.length; i++) {
68
- out.push(tokens.slice(i, i + n));
69
- }
70
- return out;
71
- }
72
- /**
73
- * SHA-256 hex of a prefix string. The hash is the disk-storable surrogate
74
- * for the prefix — same prefix always maps to the same key, but the raw
75
- * prefix never leaves the process.
76
- */
77
- export function prefixHash(prefix) {
78
- return `sha256:${createHash("sha256").update(prefix).digest("hex")}`;
79
- }
80
- /**
81
- * Extract candidate paths from free text. Same shape used by `recent-paths.ts`
82
- * but kept independent so changes to recent-paths semantics don't drift
83
- * the profile schema. Matches `foo/bar.ts`, `src/a/b.tsx`, etc.
84
- */
85
- export function extractPaths(text) {
86
- if (!text)
87
- return [];
88
- const out = [];
89
- PATH_RE.lastIndex = 0;
90
- for (const m of text.matchAll(PATH_RE)) {
91
- if (m[1])
92
- out.push(m[1]);
93
- }
94
- return out;
95
- }
96
- /**
97
- * Extract `/slash-command` tokens from free text. Limited to a-z prefix
98
- * plus alphanumerics/hyphen/underscore to avoid false matches on URLs
99
- * (`https://…`) or expressions (`x/y`).
100
- */
101
- export function extractSlash(text) {
102
- if (!text)
103
- return [];
104
- const out = [];
105
- SLASH_RE.lastIndex = 0;
106
- for (const m of text.matchAll(SLASH_RE)) {
107
- if (m[1])
108
- out.push(m[1]);
109
- }
110
- return out;
111
- }
112
- /**
113
- * Build profile records from a committed user message. Capture path +
114
- * slash + trigram ngrams. Sanitize check runs FIRST: messages with
115
- * sensitive content are dropped entirely (consistent with session trie).
116
- */
117
- export function recordsFromCommit(text, ts = Date.now()) {
118
- if (!text)
119
- return [];
120
- if (containsSensitive(text))
121
- return [];
122
- const out = [];
123
- for (const p of extractPaths(text)) {
124
- out.push({ ts, kind: "path", value: p, weight: 1 });
125
- }
126
- for (const s of extractSlash(text)) {
127
- out.push({ ts, kind: "slash", value: s, weight: 1 });
128
- }
129
- const toks = tokenize(text);
130
- for (const g of ngrams(toks, TRIGRAM_N)) {
131
- out.push({ ts, kind: "ngram", n: TRIGRAM_N, tokens: g, weight: 1 });
132
- }
133
- return out;
134
- }
135
- /**
136
- * Build an `accept` record for a full or partial acceptance. `prefix` is
137
- * hashed; `completion` is tokenized. The raw prefix never appears in the
138
- * returned record. Drops the whole record if either side fails sanitize.
139
- */
140
- export function recordFromAccept(prefix, completion, weight = 3, ts = Date.now()) {
141
- if (!prefix || !completion)
142
- return null;
143
- if (containsSensitive(prefix) || containsSensitive(completion))
144
- return null;
145
- const prefixTailTokens = tokenize(prefix).slice(-MAX_NGRAM_N);
146
- const completionTokens = tokenize(completion).slice(0, 8);
147
- if (completionTokens.length === 0)
148
- return null;
149
- return {
150
- ts,
151
- kind: "accept",
152
- weight,
153
- prefixHash: prefixHash(prefix),
154
- prefixTailTokens,
155
- completionTokens,
156
- };
157
- }
158
- /**
159
- * Append one or more records to the JSONL file. Returns silently on write
160
- * failure — profile logging must never break ghost completion.
161
- */
162
- export async function appendRecords(cwd, recs) {
163
- if (recs.length === 0)
164
- return;
165
- const path = join(cwd, PROFILE_REL);
166
- try {
167
- await mkdir(dirname(path), { recursive: true });
168
- const body = recs.map((r) => JSON.stringify(r)).join("\n") + "\n";
169
- await appendFile(path, body, "utf8");
170
- }
171
- catch {
172
- // best-effort
173
- }
174
- }
175
- /**
176
- * Parse the JSONL file into an array of records. Silently skips malformed
177
- * lines (partial trailing write) and records missing required fields.
178
- * Returns an empty array when the file does not exist.
179
- */
180
- export async function loadRecords(cwd) {
181
- const path = join(cwd, PROFILE_REL);
182
- let body;
183
- try {
184
- body = await readFile(path, "utf8");
185
- }
186
- catch {
187
- return [];
188
- }
189
- return parseRecords(body);
190
- }
191
- export function parseRecords(body) {
192
- const out = [];
193
- for (const line of body.split("\n")) {
194
- if (!line)
195
- continue;
196
- try {
197
- const r = JSON.parse(line);
198
- if (typeof r.ts !== "number")
199
- continue;
200
- if (typeof r.weight !== "number")
201
- continue;
202
- if (r.kind !== "ngram" && r.kind !== "path" && r.kind !== "slash" && r.kind !== "accept")
203
- continue;
204
- out.push(r);
205
- }
206
- catch {
207
- // partial trailing write — ignore
208
- }
209
- }
210
- return out;
211
- }
212
- /**
213
- * Build the in-memory aggregated index from a record list. Decays records
214
- * older than `decayDays` by halving their weight; drops weights below
215
- * `DROP_BELOW_WEIGHT` (0.1). `now` defaults to `Date.now()`; expose for
216
- * deterministic tests.
217
- */
218
- export function buildIndex(records, opts = {}) {
219
- const now = opts.now ?? Date.now();
220
- const decayDays = opts.decayDays ?? DEFAULT_DECAY_DAYS;
221
- const decayCutoff = now - decayDays * 24 * 60 * 60 * 1000;
222
- const idx = emptyIndex();
223
- for (const r of records) {
224
- let w = r.weight;
225
- if (r.ts < decayCutoff)
226
- w *= 0.5;
227
- if (w < DROP_BELOW_WEIGHT)
228
- continue;
229
- switch (r.kind) {
230
- case "ngram":
231
- if (r.tokens && r.tokens.length > 0) {
232
- const key = r.tokens.join(" ");
233
- idx.ngram.set(key, (idx.ngram.get(key) ?? 0) + w);
234
- }
235
- break;
236
- case "path":
237
- if (r.value)
238
- idx.path.set(r.value, (idx.path.get(r.value) ?? 0) + w);
239
- break;
240
- case "slash":
241
- if (r.value)
242
- idx.slash.set(r.value, (idx.slash.get(r.value) ?? 0) + w);
243
- break;
244
- case "accept":
245
- if (r.prefixHash && r.completionTokens && r.completionTokens.length > 0) {
246
- const existing = idx.acceptByPrefix.get(r.prefixHash);
247
- if (existing) {
248
- existing.weight += w;
249
- // Newer completion tokens win if more frequent; keep the
250
- // most-recent tokens as the surrogate (last-write-wins is
251
- // fine here — accept records carry the actual user choice).
252
- existing.completionTokens = r.completionTokens;
253
- }
254
- else {
255
- idx.acceptByPrefix.set(r.prefixHash, {
256
- completionTokens: r.completionTokens,
257
- weight: w,
258
- });
259
- }
260
- idx.totalAcceptRecords += 1;
261
- }
262
- break;
263
- }
264
- }
265
- return idx;
266
- }
267
- /**
268
- * Look up the weight of a trigram (already tokenized + joined). Returns 0
269
- * when missing. Callers should also tokenize the candidate text the same
270
- * way the writer did.
271
- */
272
- export function ngramWeight(idx, tokens) {
273
- if (tokens.length === 0)
274
- return 0;
275
- let total = 0;
276
- for (const g of ngrams(tokens, TRIGRAM_N)) {
277
- total += idx.ngram.get(g.join(" ")) ?? 0;
278
- }
279
- return total;
280
- }
281
- /**
282
- * Profile-bias score for a candidate completion. PRD §M4
283
- * "Ranking-from-prior": `α·log(1 + ngramWeight) + β·pathWeight + γ·slashWeight`.
284
- * Returns 0 when the index is empty or the candidate has no signal —
285
- * neutral input to the reranker.
286
- */
287
- export function profileBias(idx, text, weights = {}) {
288
- if (idx.totalAcceptRecords === 0 && idx.ngram.size === 0 && idx.path.size === 0 && idx.slash.size === 0) {
289
- return 0;
290
- }
291
- const alpha = weights.alpha ?? 0.3;
292
- const beta = weights.beta ?? 0.5;
293
- const gamma = weights.gamma ?? 0.5;
294
- const toks = tokenize(text);
295
- const ng = ngramWeight(idx, toks);
296
- let pathW = 0;
297
- for (const p of extractPaths(text))
298
- pathW += idx.path.get(p) ?? 0;
299
- let slashW = 0;
300
- for (const s of extractSlash(text))
301
- slashW += idx.slash.get(s) ?? 0;
302
- return alpha * Math.log(1 + ng) + beta * pathW + gamma * slashW;
303
- }
304
- /**
305
- * Bounded boost for deterministic path matches. Capped so persistent
306
- * frequency cannot beat a fresh exact-prefix path-prefix match (PRD §M4
307
- * "Deterministic path/fuzzy ranking"). The cap is a constant 0.2 — tune
308
- * once we have replay data.
309
- */
310
- export const MAX_PATH_BOOST = 0.2;
311
- export function profilePathBoost(idx, path) {
312
- const w = idx.path.get(path) ?? 0;
313
- if (w === 0)
314
- return 0;
315
- // Log + clamp so a path with 1000 accepts isn't 1000× a path with 1.
316
- const raw = Math.log(1 + w) / 10;
317
- return Math.min(MAX_PATH_BOOST, raw);
318
- }
319
- /**
320
- * Slash-command frequency score. Used by the editor's slash fast-path:
321
- * given a `/cmd-prefix`, return the best-matching full command by weight.
322
- * Returns null when nothing in the index extends `prefix`.
323
- */
324
- export function bestSlashMatch(idx, prefix) {
325
- if (!prefix.startsWith("/"))
326
- return null;
327
- let best = null;
328
- for (const [cmd, w] of idx.slash) {
329
- if (!cmd.startsWith(prefix))
330
- continue;
331
- if (cmd === prefix)
332
- continue;
333
- if (!best || w > best.weight)
334
- best = { cmd, weight: w };
335
- }
336
- return best;
337
- }
338
- /**
339
- * Rotate + compact when the file exceeds `maxBytes`. Strategy: load all
340
- * records, decay them, sum weights per (kind, key), drop sub-threshold
341
- * entries, write the compacted file back. Returns true when a rotation
342
- * happened. Best-effort — swallows errors.
343
- */
344
- export async function compactIfNeeded(cwd, opts = {}) {
345
- const maxBytes = opts.maxBytes ?? DEFAULT_MAX_BYTES;
346
- const path = join(cwd, PROFILE_REL);
347
- let size;
348
- try {
349
- const s = await stat(path);
350
- size = s.size;
351
- }
352
- catch {
353
- return false;
354
- }
355
- if (size < maxBytes)
356
- return false;
357
- const records = await loadRecords(cwd);
358
- const compacted = compactRecords(records, {
359
- decayDays: opts.decayDays ?? DEFAULT_DECAY_DAYS,
360
- now: opts.now ?? Date.now(),
361
- });
362
- try {
363
- // Move the original aside first so a crash mid-write keeps the old
364
- // data recoverable as `profile.jsonl.1`.
365
- await rename(path, `${path}.1`);
366
- const body = compacted.map((r) => JSON.stringify(r)).join("\n") + "\n";
367
- await writeFile(path, body, "utf8");
368
- return true;
369
- }
370
- catch {
371
- return false;
372
- }
373
- }
374
- /**
375
- * Compact a record list in memory: decay aged weights, sum per (kind,key),
376
- * drop sub-threshold. Pure function — exposed for unit tests.
377
- */
378
- export function compactRecords(records, opts = {}) {
379
- const now = opts.now ?? Date.now();
380
- const decayDays = opts.decayDays ?? DEFAULT_DECAY_DAYS;
381
- const decayCutoff = now - decayDays * 24 * 60 * 60 * 1000;
382
- // Map<groupKey, { rec template, summedWeight, latestTs }>
383
- const groups = new Map();
384
- for (const r of records) {
385
- let w = r.weight;
386
- if (r.ts < decayCutoff)
387
- w *= 0.5;
388
- if (w < DROP_BELOW_WEIGHT)
389
- continue;
390
- const key = groupKey(r);
391
- if (!key)
392
- continue;
393
- const existing = groups.get(key);
394
- if (existing) {
395
- existing.weight += w;
396
- if (r.ts > existing.ts)
397
- existing.ts = r.ts;
398
- // For `accept`, keep the latest completion tokens.
399
- if (r.kind === "accept" && r.completionTokens) {
400
- existing.template.completionTokens = r.completionTokens;
401
- }
402
- }
403
- else {
404
- groups.set(key, { template: { ...r }, weight: w, ts: r.ts });
405
- }
406
- }
407
- return [...groups.values()].map(({ template, weight, ts }) => ({
408
- ...template,
409
- weight,
410
- ts,
411
- }));
412
- }
413
- function groupKey(r) {
414
- switch (r.kind) {
415
- case "ngram":
416
- return r.tokens ? `ngram:${r.tokens.join(" ")}` : null;
417
- case "path":
418
- return r.value ? `path:${r.value}` : null;
419
- case "slash":
420
- return r.value ? `slash:${r.value}` : null;
421
- case "accept":
422
- return r.prefixHash ? `accept:${r.prefixHash}` : null;
423
- }
424
- }
425
- /** Parse `PI_GHOST_PROFILE_DECAY_DAYS`. Falls back to default when invalid. */
426
- export function parseDecayDaysEnv(raw) {
427
- if (raw === undefined)
428
- return DEFAULT_DECAY_DAYS;
429
- const v = Number(raw);
430
- if (!Number.isFinite(v) || v <= 0)
431
- return DEFAULT_DECAY_DAYS;
432
- return Math.floor(v);
433
- }
434
- //# sourceMappingURL=profile.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"cloud-provider.d.ts","sourceRoot":"","sources":["../../src/providers/cloud-provider.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGxD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK3E,qBAAa,aAAc,YAAW,aAAa;IAGtC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,QAAQ,CAAC,IAAI,iBAAiB;gBAED,MAAM,EAAE,mBAAmB;IAExD,IAAI,UAAU,IAAI,MAAM,CAEvB;IAEK,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAuCxD;;;;;;;OAOG;IACI,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,aAAa,CAAC,WAAW,CAAC;CA8BnE"}