pi-ghost-autocomplete 0.3.2 → 0.4.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 (168) hide show
  1. package/LICENSE +561 -0
  2. package/README.md +464 -331
  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 +4 -1
  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 +4 -1
  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-provider.d.ts +24 -1
  24. package/dist/providers/race.d.ts +4 -1
  25. package/dist/providers/types.d.ts +13 -1
  26. package/dist/recent-paths.d.ts +4 -1
  27. package/dist/replay-cli.js +1 -166
  28. package/dist/replay.d.ts +2 -7
  29. package/package.json +90 -80
  30. package/dist/bench-cli.d.ts +0 -3
  31. package/dist/bench-cli.d.ts.map +0 -1
  32. package/dist/bench-cli.js.map +0 -1
  33. package/dist/bench.d.ts.map +0 -1
  34. package/dist/bench.js.map +0 -1
  35. package/dist/cache.d.ts +0 -124
  36. package/dist/cache.d.ts.map +0 -1
  37. package/dist/cache.js +0 -173
  38. package/dist/cache.js.map +0 -1
  39. package/dist/candidate-rerank.d.ts +0 -57
  40. package/dist/candidate-rerank.d.ts.map +0 -1
  41. package/dist/candidate-rerank.js +0 -78
  42. package/dist/candidate-rerank.js.map +0 -1
  43. package/dist/config.d.ts.map +0 -1
  44. package/dist/config.js +0 -317
  45. package/dist/config.js.map +0 -1
  46. package/dist/context-aggregator.d.ts.map +0 -1
  47. package/dist/context-aggregator.js +0 -87
  48. package/dist/context-aggregator.js.map +0 -1
  49. package/dist/context-selector.d.ts +0 -128
  50. package/dist/context-selector.d.ts.map +0 -1
  51. package/dist/context-selector.js +0 -300
  52. package/dist/context-selector.js.map +0 -1
  53. package/dist/cycle-manager.d.ts.map +0 -1
  54. package/dist/cycle-manager.js +0 -168
  55. package/dist/cycle-manager.js.map +0 -1
  56. package/dist/edit-history-ring.d.ts +0 -148
  57. package/dist/edit-history-ring.d.ts.map +0 -1
  58. package/dist/edit-history-ring.js +0 -262
  59. package/dist/edit-history-ring.js.map +0 -1
  60. package/dist/entropy-stop.d.ts.map +0 -1
  61. package/dist/entropy-stop.js +0 -141
  62. package/dist/entropy-stop.js.map +0 -1
  63. package/dist/eval-dataset.d.ts.map +0 -1
  64. package/dist/eval-dataset.js +0 -127
  65. package/dist/eval-dataset.js.map +0 -1
  66. package/dist/fast-path-engine.d.ts +0 -286
  67. package/dist/fast-path-engine.d.ts.map +0 -1
  68. package/dist/fast-path-engine.js +0 -341
  69. package/dist/fast-path-engine.js.map +0 -1
  70. package/dist/fuzzy-matcher.d.ts.map +0 -1
  71. package/dist/fuzzy-matcher.js +0 -162
  72. package/dist/fuzzy-matcher.js.map +0 -1
  73. package/dist/ghost-editor.d.ts.map +0 -1
  74. package/dist/ghost-editor.js +0 -1491
  75. package/dist/ghost-editor.js.map +0 -1
  76. package/dist/index.d.ts.map +0 -1
  77. package/dist/index.js.map +0 -1
  78. package/dist/keystroke-timer.d.ts +0 -59
  79. package/dist/keystroke-timer.d.ts.map +0 -1
  80. package/dist/keystroke-timer.js +0 -94
  81. package/dist/keystroke-timer.js.map +0 -1
  82. package/dist/metrics-builder.d.ts +0 -71
  83. package/dist/metrics-builder.d.ts.map +0 -1
  84. package/dist/metrics-builder.js +0 -71
  85. package/dist/metrics-builder.js.map +0 -1
  86. package/dist/metrics.d.ts.map +0 -1
  87. package/dist/metrics.js +0 -212
  88. package/dist/metrics.js.map +0 -1
  89. package/dist/path-index.d.ts.map +0 -1
  90. package/dist/path-index.js +0 -148
  91. package/dist/path-index.js.map +0 -1
  92. package/dist/path-matcher.d.ts.map +0 -1
  93. package/dist/path-matcher.js +0 -88
  94. package/dist/path-matcher.js.map +0 -1
  95. package/dist/profile-store.d.ts.map +0 -1
  96. package/dist/profile-store.js +0 -199
  97. package/dist/profile-store.js.map +0 -1
  98. package/dist/profile.d.ts.map +0 -1
  99. package/dist/profile.js +0 -434
  100. package/dist/profile.js.map +0 -1
  101. package/dist/providers/cloud-provider.d.ts.map +0 -1
  102. package/dist/providers/cloud-provider.js +0 -109
  103. package/dist/providers/cloud-provider.js.map +0 -1
  104. package/dist/providers/local-provider.d.ts.map +0 -1
  105. package/dist/providers/local-provider.js +0 -48
  106. package/dist/providers/local-provider.js.map +0 -1
  107. package/dist/providers/openai-compat-provider.d.ts.map +0 -1
  108. package/dist/providers/openai-compat-provider.js +0 -215
  109. package/dist/providers/openai-compat-provider.js.map +0 -1
  110. package/dist/providers/openai-completions-runner.d.ts +0 -52
  111. package/dist/providers/openai-completions-runner.d.ts.map +0 -1
  112. package/dist/providers/openai-completions-runner.js +0 -141
  113. package/dist/providers/openai-completions-runner.js.map +0 -1
  114. package/dist/providers/race.d.ts.map +0 -1
  115. package/dist/providers/race.js +0 -441
  116. package/dist/providers/race.js.map +0 -1
  117. package/dist/providers/truncate.d.ts +0 -7
  118. package/dist/providers/truncate.d.ts.map +0 -1
  119. package/dist/providers/truncate.js +0 -57
  120. package/dist/providers/truncate.js.map +0 -1
  121. package/dist/providers/types.d.ts.map +0 -1
  122. package/dist/providers/types.js +0 -60
  123. package/dist/providers/types.js.map +0 -1
  124. package/dist/provisional-manager.d.ts +0 -93
  125. package/dist/provisional-manager.d.ts.map +0 -1
  126. package/dist/provisional-manager.js +0 -98
  127. package/dist/provisional-manager.js.map +0 -1
  128. package/dist/provisional.d.ts +0 -150
  129. package/dist/provisional.d.ts.map +0 -1
  130. package/dist/provisional.js +0 -238
  131. package/dist/provisional.js.map +0 -1
  132. package/dist/recent-paths.d.ts.map +0 -1
  133. package/dist/recent-paths.js +0 -114
  134. package/dist/recent-paths.js.map +0 -1
  135. package/dist/regret-tracker.d.ts +0 -84
  136. package/dist/regret-tracker.d.ts.map +0 -1
  137. package/dist/regret-tracker.js +0 -145
  138. package/dist/regret-tracker.js.map +0 -1
  139. package/dist/replay-cli.d.ts +0 -13
  140. package/dist/replay-cli.d.ts.map +0 -1
  141. package/dist/replay-cli.js.map +0 -1
  142. package/dist/replay.d.ts.map +0 -1
  143. package/dist/replay.js +0 -225
  144. package/dist/replay.js.map +0 -1
  145. package/dist/reranker.d.ts +0 -181
  146. package/dist/reranker.d.ts.map +0 -1
  147. package/dist/reranker.js +0 -324
  148. package/dist/reranker.js.map +0 -1
  149. package/dist/session-trie.d.ts +0 -103
  150. package/dist/session-trie.d.ts.map +0 -1
  151. package/dist/session-trie.js +0 -280
  152. package/dist/session-trie.js.map +0 -1
  153. package/dist/speculative.d.ts +0 -74
  154. package/dist/speculative.d.ts.map +0 -1
  155. package/dist/speculative.js +0 -107
  156. package/dist/speculative.js.map +0 -1
  157. package/dist/tool-summarize.d.ts +0 -40
  158. package/dist/tool-summarize.d.ts.map +0 -1
  159. package/dist/tool-summarize.js +0 -245
  160. package/dist/tool-summarize.js.map +0 -1
  161. package/dist/trie-sanitize.d.ts +0 -22
  162. package/dist/trie-sanitize.d.ts.map +0 -1
  163. package/dist/trie-sanitize.js +0 -142
  164. package/dist/trie-sanitize.js.map +0 -1
  165. package/dist/versions.d.ts +0 -23
  166. package/dist/versions.d.ts.map +0 -1
  167. package/dist/versions.js +0 -31
  168. package/dist/versions.js.map +0 -1
@@ -1,109 +0,0 @@
1
- import { complete, getEnvApiKey, getModels, stream, } from "@earendil-works/pi-ai";
2
- import { streamWithSanitize } from "./openai-completions-runner.js";
3
- import { buildPromptMessages, sanitizeCompletion } from "./truncate.js";
4
- /** SEC-3: absolute upper bound for a single cloud completion call. */
5
- const REQUEST_TIMEOUT_MS = 10_000;
6
- export class CloudProvider {
7
- config;
8
- name = "ghost-cloud";
9
- constructor(config) {
10
- this.config = config;
11
- }
12
- get debounceMs() {
13
- return this.config.debounceMs;
14
- }
15
- async predict(req) {
16
- const apiKey = this.config.apiKey ?? getEnvApiKey(this.config.provider);
17
- if (!apiKey)
18
- return null;
19
- const model = resolveModel(this.config.provider, this.config.modelId);
20
- if (!model)
21
- return null;
22
- const { systemPrompt, user } = buildPromptMessages(req, this.config.maxRecentMessages);
23
- const messages = [{ role: "user", content: user, timestamp: Date.now() }];
24
- const ctx = { systemPrompt, messages };
25
- // SEC-3: cap the call at REQUEST_TIMEOUT_MS in addition to the
26
- // user's keystroke-driven abort.
27
- const localCtrl = new AbortController();
28
- const onUserAbort = () => localCtrl.abort();
29
- if (req.signal.aborted)
30
- localCtrl.abort();
31
- else
32
- req.signal.addEventListener("abort", onUserAbort, { once: true });
33
- const timeoutHandle = setTimeout(() => localCtrl.abort(), REQUEST_TIMEOUT_MS);
34
- try {
35
- const result = await complete(model, ctx, {
36
- signal: localCtrl.signal,
37
- temperature: this.config.temperature,
38
- maxTokens: this.config.maxTokens,
39
- apiKey,
40
- });
41
- if (result.stopReason === "error" || result.stopReason === "aborted")
42
- return null;
43
- const text = result.content
44
- .filter((c) => c.type === "text")
45
- .map((c) => c.text)
46
- .join("");
47
- return sanitizeCompletion(text, req.editorTextBeforeCursor, 200);
48
- }
49
- finally {
50
- clearTimeout(timeoutHandle);
51
- req.signal.removeEventListener("abort", onUserAbort);
52
- }
53
- }
54
- /**
55
- * PRD §M3.5a — stream tokens from the upstream provider via pi-ai's
56
- * `stream()`. Yields `text_delta` events as `StreamDelta` chunks
57
- * including a running `cumulative` to spare the editor from tracking
58
- * concatenation state. `sanitizeCompletion` runs once on the final
59
- * assembled text after the stream ends — running it per-chunk would
60
- * truncate mid-token and break ghost rendering.
61
- */
62
- async *predictStream(req) {
63
- const apiKey = this.config.apiKey ?? getEnvApiKey(this.config.provider);
64
- if (!apiKey)
65
- return;
66
- const model = resolveModel(this.config.provider, this.config.modelId);
67
- if (!model)
68
- return;
69
- const { systemPrompt, user } = buildPromptMessages(req, this.config.maxRecentMessages);
70
- const messages = [{ role: "user", content: user, timestamp: Date.now() }];
71
- const ctx = { systemPrompt, messages };
72
- const localCtrl = new AbortController();
73
- const onUserAbort = () => localCtrl.abort();
74
- if (req.signal.aborted)
75
- localCtrl.abort();
76
- else
77
- req.signal.addEventListener("abort", onUserAbort, { once: true });
78
- const timeoutHandle = setTimeout(() => localCtrl.abort(), REQUEST_TIMEOUT_MS);
79
- try {
80
- const events = stream(model, ctx, {
81
- signal: localCtrl.signal,
82
- temperature: this.config.temperature,
83
- maxTokens: this.config.maxTokens,
84
- apiKey,
85
- });
86
- yield* streamWithSanitize(events, req.editorTextBeforeCursor);
87
- }
88
- finally {
89
- clearTimeout(timeoutHandle);
90
- req.signal.removeEventListener("abort", onUserAbort);
91
- }
92
- }
93
- }
94
- /**
95
- * Look up a model by id from pi-ai's registry. Returns null if the provider
96
- * has no model with that id; the caller drops the prediction silently.
97
- *
98
- * Avoids `getModel(provider, id as never)` — the registry's typed lookup
99
- * requires a literal id and would otherwise need an unsafe cast.
100
- */
101
- function resolveModel(provider, modelId) {
102
- const models = getModels(provider);
103
- for (const m of models) {
104
- if (m.id === modelId)
105
- return m;
106
- }
107
- return null;
108
- }
109
- //# sourceMappingURL=cloud-provider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cloud-provider.js","sourceRoot":"","sources":["../../src/providers/cloud-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,MAAM,GAMN,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGxE,sEAAsE;AACtE,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,MAAM,OAAO,aAAa;IAGI;IAFpB,IAAI,GAAG,aAAa,CAAC;IAE9B,YAA6B,MAA2B;QAA3B,WAAM,GAAN,MAAM,CAAqB;IAAG,CAAC;IAE5D,IAAI,UAAU;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAiB;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtE,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACvF,MAAM,QAAQ,GAAc,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrF,MAAM,GAAG,GAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;QAEhD,+DAA+D;QAC/D,iCAAiC;QACjC,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,GAAS,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAClD,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO;YAAE,SAAS,CAAC,KAAK,EAAE,CAAC;;YACrC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAE9E,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;gBACzC,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;gBACpC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;gBAChC,MAAM;aACN,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,UAAU,KAAK,OAAO,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC;YAClF,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO;iBACzB,MAAM,CAAC,CAAC,CAAC,EAAuC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBACrE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBAClB,IAAI,CAAC,EAAE,CAAC,CAAC;YACX,OAAO,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;QAClE,CAAC;gBAAS,CAAC;YACV,YAAY,CAAC,aAAa,CAAC,CAAC;YAC5B,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACtD,CAAC;IACF,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,CAAC,aAAa,CAAC,GAAiB;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtE,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACvF,MAAM,QAAQ,GAAc,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrF,MAAM,GAAG,GAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;QAEhD,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,GAAS,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAClD,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO;YAAE,SAAS,CAAC,KAAK,EAAE,CAAC;;YACrC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAE9E,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjC,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;gBACpC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;gBAChC,MAAM;aACN,CAAC,CAAC;YACH,KAAK,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAC/D,CAAC;gBAAS,CAAC;YACV,YAAY,CAAC,aAAa,CAAC,CAAC;YAC5B,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACtD,CAAC;IACF,CAAC;CACD;AAED;;;;;;GAMG;AACH,SAAS,YAAY,CAAC,QAAuB,EAAE,OAAe;IAC7D,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO;YAAE,OAAO,CAAe,CAAC;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"local-provider.d.ts","sourceRoot":"","sources":["../../src/providers/local-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAMxD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI3E,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,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAY7B,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxD;;;;OAIG;IACH,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,aAAa,CAAC,WAAW,CAAC;IAI5D,OAAO,CAAC,QAAQ;CAYhB"}
@@ -1,48 +0,0 @@
1
- import { runOpenAICompletion, runOpenAICompletionStream, trimSlash, } from "./openai-completions-runner.js";
2
- const DEFAULT_CONTEXT_WINDOW = 8192;
3
- export class LocalProvider {
4
- config;
5
- name = "ghost-local";
6
- constructor(config) {
7
- this.config = config;
8
- }
9
- get debounceMs() {
10
- return this.config.debounceMs;
11
- }
12
- async preflight() {
13
- try {
14
- const ctrl = new AbortController();
15
- const timeout = setTimeout(() => ctrl.abort(), 750);
16
- const res = await fetch(`${trimSlash(this.config.baseUrl)}/api/tags`, { signal: ctrl.signal });
17
- clearTimeout(timeout);
18
- return res.ok;
19
- }
20
- catch {
21
- return false;
22
- }
23
- }
24
- async predict(req) {
25
- return runOpenAICompletion(req, this.callOpts());
26
- }
27
- /**
28
- * PRD §M3.5a — Ollama/vLLM streaming via the OpenAI-completions stream
29
- * endpoint. Same opts as `predict`, just driven by the runner's
30
- * streaming variant.
31
- */
32
- predictStream(req) {
33
- return runOpenAICompletionStream(req, this.callOpts());
34
- }
35
- callOpts() {
36
- return {
37
- baseUrl: `${trimSlash(this.config.baseUrl)}/v1`,
38
- apiKey: "ollama",
39
- modelId: this.config.modelId,
40
- providerTag: "ollama",
41
- maxTokens: this.config.maxTokens,
42
- maxRecentMessages: this.config.maxRecentMessages,
43
- contextWindow: this.config.contextWindow ?? DEFAULT_CONTEXT_WINDOW,
44
- temperature: this.config.temperature,
45
- };
46
- }
47
- }
48
- //# sourceMappingURL=local-provider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"local-provider.js","sourceRoot":"","sources":["../../src/providers/local-provider.ts"],"names":[],"mappings":"AACA,OAAO,EACN,mBAAmB,EACnB,yBAAyB,EACzB,SAAS,GACT,MAAM,gCAAgC,CAAC;AAGxC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAEpC,MAAM,OAAO,aAAa;IAGI;IAFpB,IAAI,GAAG,aAAa,CAAC;IAE9B,YAA6B,MAA2B;QAA3B,WAAM,GAAN,MAAM,CAAqB;IAAG,CAAC;IAE5D,IAAI,UAAU;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,SAAS;QACd,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;YACpD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/F,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,GAAG,CAAC,EAAE,CAAC;QACf,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAiB;QAC9B,OAAO,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClD,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,GAAiB;QAC9B,OAAO,yBAAyB,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACxD,CAAC;IAEO,QAAQ;QACf,OAAO;YACN,OAAO,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK;YAC/C,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;YAC5B,WAAW,EAAE,QAAQ;YACrB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;YAChC,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB;YAChD,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,sBAAsB;YAClE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;SACpC,CAAC;IACH,CAAC;CACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-compat-provider.d.ts","sourceRoot":"","sources":["../../src/providers/openai-compat-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAE/D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAU5E,MAAM,WAAW,eAAe;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IAG7C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEO,MAAM,EAAE,0BAA0B;IAI/D,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IA+BrC,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxD;;;;;;OAMG;IACG,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAsBnE,OAAO,CAAC,kBAAkB;YAgBZ,OAAO;CAoDrB"}
@@ -1,215 +0,0 @@
1
- import { sanitizeCompletion } from "./truncate.js";
2
- const PREFLIGHT_TIMEOUT_MS = 5_000;
3
- /**
4
- * Absolute upper bound on a single FIM POST. The user's abort signal still
5
- * cancels earlier under normal typing; this guards against hung connections
6
- * when the user isn't typing (no fresh keystroke → no fresh abort). SEC-3.
7
- */
8
- const REQUEST_TIMEOUT_MS = 10_000;
9
- /**
10
- * Provider for FIM-completions backends (e.g. Mercury Edit 2 by Inception
11
- * Labs). Calls `/fim/completions` with `prompt`/`suffix` and returns the
12
- * raw text completion.
13
- *
14
- * A {@link preflight} method validates the API key at startup so the host
15
- * can surface configuration errors early instead of silently dropping
16
- * every prediction.
17
- */
18
- export class OpenAICompatProvider {
19
- config;
20
- name;
21
- constructor(config) {
22
- this.config = config;
23
- this.name = `ghost-${config.providerName}`;
24
- }
25
- get debounceMs() {
26
- return this.config.debounceMs;
27
- }
28
- /**
29
- * Validate the API key with a minimal FIM request. A successful
30
- * response (even an empty completion) proves auth + connectivity.
31
- */
32
- async preflight() {
33
- const apiKey = this.config.apiKey;
34
- if (!apiKey)
35
- return { ok: false, message: "no API key configured" };
36
- const ctrl = new AbortController();
37
- const timeout = setTimeout(() => ctrl.abort(), PREFLIGHT_TIMEOUT_MS);
38
- try {
39
- const res = await fetch(`${trimSlash(this.config.baseUrl)}/fim/completions`, {
40
- method: "POST",
41
- headers: {
42
- "Content-Type": "application/json",
43
- Authorization: `Bearer ${apiKey}`,
44
- },
45
- body: JSON.stringify({
46
- model: this.config.modelId,
47
- prompt: " ",
48
- max_tokens: 1,
49
- }),
50
- signal: ctrl.signal,
51
- });
52
- clearTimeout(timeout);
53
- if (res.ok)
54
- return { ok: true, status: res.status, message: "ok" };
55
- return { ok: false, status: res.status, message: describeHttpError(res.status) };
56
- }
57
- catch (err) {
58
- clearTimeout(timeout);
59
- const aborted = err?.name === "AbortError";
60
- if (aborted)
61
- return { ok: false, message: "endpoint timed out" };
62
- return { ok: false, message: "endpoint unreachable" };
63
- }
64
- }
65
- async predict(req) {
66
- return this.fireOne(req);
67
- }
68
- /**
69
- * Multi-candidate prediction. Fires `config.parallelN` FIM requests in
70
- * parallel and dedupes by exact text. PRD §M3b: FIM does not support
71
- * the `n` parameter, so parallel POSTs are the only n>1 path. Parallel
72
- * fire is only useful at temperature > 0 — at temp=0 every call returns
73
- * the same greedy result. We downgrade silently to n=1 in that case.
74
- */
75
- async predictMulti(req) {
76
- const n = this.effectiveParallelN();
77
- if (n <= 1) {
78
- const text = await this.fireOne(req);
79
- if (!text)
80
- return null;
81
- return { candidates: [{ text }] };
82
- }
83
- const results = await Promise.all(Array.from({ length: n }, () => this.fireOne(req)));
84
- const seen = new Set();
85
- const candidates = [];
86
- for (const text of results) {
87
- if (!text)
88
- continue;
89
- if (seen.has(text))
90
- continue;
91
- seen.add(text);
92
- candidates.push({ text });
93
- }
94
- if (candidates.length === 0)
95
- return null;
96
- return { candidates };
97
- }
98
- effectiveParallelN() {
99
- const n = this.config.parallelN;
100
- // Guard against NaN / non-finite — a corrupted config should never
101
- // make us hit Array.from({length: NaN}).
102
- if (!Number.isFinite(n) || n <= 1)
103
- return 1;
104
- // At temp=0 parallel-fire produces identical greedy outputs. Cost
105
- // without value → downgrade. PRD §M3b documents this case.
106
- //
107
- // Assumption: at temperature>0 the backend (Mercury Edit FIM) actually
108
- // samples non-deterministically. If a future backend caches by
109
- // prompt+temp without sampling jitter, parallel-fire degenerates to
110
- // the same downgrade scenario. Worth re-testing per-vendor.
111
- if (this.config.temperature === 0)
112
- return 1;
113
- return Math.floor(n);
114
- }
115
- async fireOne(req) {
116
- const apiKey = this.config.apiKey;
117
- if (!apiKey)
118
- return null;
119
- const { prompt, suffix } = buildFIMPrompt(req, this.config.maxRecentMessages);
120
- // Combine the caller's abort with an absolute timeout. SEC-3:
121
- // without this, a hung TCP connection could pin resources until
122
- // the user types again (the only thing that fires `req.signal`).
123
- const localCtrl = new AbortController();
124
- const onUserAbort = () => localCtrl.abort();
125
- if (req.signal.aborted)
126
- localCtrl.abort();
127
- else
128
- req.signal.addEventListener("abort", onUserAbort, { once: true });
129
- const timeoutHandle = setTimeout(() => localCtrl.abort(), REQUEST_TIMEOUT_MS);
130
- try {
131
- const res = await fetch(`${trimSlash(this.config.baseUrl)}/fim/completions`, {
132
- method: "POST",
133
- headers: {
134
- "Content-Type": "application/json",
135
- Authorization: `Bearer ${apiKey}`,
136
- },
137
- body: JSON.stringify({
138
- model: this.config.modelId,
139
- prompt,
140
- suffix,
141
- max_tokens: this.config.maxTokens,
142
- temperature: this.config.temperature,
143
- }),
144
- signal: localCtrl.signal,
145
- });
146
- if (!res.ok)
147
- return null;
148
- try {
149
- const data = (await res.json());
150
- const text = data.choices?.[0]?.text ?? "";
151
- return sanitizeCompletion(text, req.editorTextBeforeCursor, 200);
152
- }
153
- catch (parseErr) {
154
- if (parseErr instanceof SyntaxError) {
155
- console.error(`[OpenAICompatProvider] malformed JSON response (status ${res.status})`);
156
- return null;
157
- }
158
- throw parseErr;
159
- }
160
- }
161
- catch {
162
- return null;
163
- }
164
- finally {
165
- clearTimeout(timeoutHandle);
166
- req.signal.removeEventListener("abort", onUserAbort);
167
- }
168
- }
169
- }
170
- /**
171
- * Build the FIM prompt/suffix pair from the ghost request.
172
- *
173
- * Recent conversation messages are prepended as comments in the prompt
174
- * so the model has context about what the user is working on.
175
- */
176
- function buildFIMPrompt(req, maxRecent) {
177
- const recent = req.recentMessages
178
- .slice(-maxRecent)
179
- .map((m) => {
180
- // PRD §M6a: tool entries render with a distinguishing prefix so
181
- // the model can tell prior tool output from conversational turns.
182
- if (m.role === "tool") {
183
- const label = m.toolName ? `tool ${m.toolName}` : "tool";
184
- return `# ${label}: ${truncate(m.text, 280)}`;
185
- }
186
- return `# ${m.role}: ${truncate(m.text, 280)}`;
187
- })
188
- .join("\n");
189
- const ctx = recent ? `${recent}\n\n` : "";
190
- // Split the editor text at cursor to form prompt (before) / suffix (after).
191
- // Ghost autocomplete only fires when cursor is at end, so suffix is empty
192
- // in the common case — but we handle the general case for correctness.
193
- const before = req.editorTextBeforeCursor;
194
- const after = req.editorText.slice(req.editorTextBeforeCursor.length);
195
- return {
196
- prompt: `${ctx}${before}`,
197
- suffix: after,
198
- };
199
- }
200
- function truncate(s, n) {
201
- return s.length > n ? `${s.slice(0, n)}…` : s;
202
- }
203
- function trimSlash(url) {
204
- return url.endsWith("/") ? url.slice(0, -1) : url;
205
- }
206
- function describeHttpError(status) {
207
- switch (status) {
208
- case 401: return "invalid API key (401 Unauthorized)";
209
- case 402: return "API key has no credits — please top up (402 Payment Required)";
210
- case 403: return "API key not permitted (403 Forbidden)";
211
- case 429: return "rate limited (429 Too Many Requests)";
212
- default: return `HTTP ${status}`;
213
- }
214
- }
215
- //# sourceMappingURL=openai-compat-provider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-compat-provider.js","sourceRoot":"","sources":["../../src/providers/openai-compat-provider.ts"],"names":[],"mappings":"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"}
@@ -1,52 +0,0 @@
1
- import { type AssistantMessageEventStream } from "@earendil-works/pi-ai";
2
- import type { GhostRequest, StreamDelta } from "./types.js";
3
- export interface OpenAICompletionsCallOpts {
4
- baseUrl: string;
5
- apiKey: string;
6
- modelId: string;
7
- /**
8
- * Metadata tag for pi-ai's `Model.provider`. Cosmetic for logs — the
9
- * actual endpoint is driven by `baseUrl`. Accepts any string; cast to
10
- * `KnownProvider` at the call site since the field is purely descriptive.
11
- */
12
- providerTag: string;
13
- maxTokens: number;
14
- maxRecentMessages: number;
15
- contextWindow: number;
16
- temperature: number;
17
- }
18
- /**
19
- * Shared OpenAI-completions request path used by both {@link LocalProvider}
20
- * and {@link OpenAICompatProvider}. Builds the pi-ai model record, sends one
21
- * `complete()` call with the user's abort signal, and returns a sanitized
22
- * completion string (or null when the call aborts/errors/produces nothing
23
- * usable).
24
- *
25
- * Kept as a free function rather than a base class to avoid one-method
26
- * inheritance.
27
- */
28
- export declare function runOpenAICompletion(req: GhostRequest, opts: OpenAICompletionsCallOpts): Promise<string | null>;
29
- export declare function trimSlash(url: string): string;
30
- /**
31
- * Streaming variant of {@link runOpenAICompletion}. Yields {@link StreamDelta}
32
- * chunks as pi-ai's `stream()` produces `text_delta` events. Sanitization
33
- * runs on the running cumulative (not per-delta) — per-delta would clip
34
- * mid-token and break ghost rendering.
35
- *
36
- * Yields nothing on auth/connectivity failure, abort, or when the model
37
- * record can't be built. The generator's `finally` block clears the
38
- * SEC-3 timer and detaches the user-abort listener.
39
- */
40
- export declare function runOpenAICompletionStream(req: GhostRequest, opts: OpenAICompletionsCallOpts): AsyncIterable<StreamDelta>;
41
- /**
42
- * Iterate a pi-ai `AssistantMessageEventStream`, filtering for non-empty
43
- * `text_delta` events and emitting them through `sanitizeCompletion` as
44
- * `StreamDelta` chunks. Sanitization runs on the running cumulative
45
- * (NOT per-delta) since per-token clipping would break ghost rendering.
46
- *
47
- * Shared by `runOpenAICompletionStream` (Local) and CloudProvider's
48
- * `predictStream` so the two paths can't drift on filter/sanitize
49
- * semantics.
50
- */
51
- export declare function streamWithSanitize(events: AssistantMessageEventStream, prefix: string): AsyncIterable<StreamDelta>;
52
- //# sourceMappingURL=openai-completions-runner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-completions-runner.d.ts","sourceRoot":"","sources":["../../src/providers/openai-completions-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,KAAK,2BAA2B,EAKhC,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAU5D,MAAM,WAAW,yBAAyB;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACxC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,yBAAyB,GAC7B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2CxB;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED;;;;;;;;;GASG;AACH,wBAAuB,yBAAyB,CAC/C,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,yBAAyB,GAC7B,aAAa,CAAC,WAAW,CAAC,CAoC5B;AAED;;;;;;;;;GASG;AACH,wBAAuB,kBAAkB,CACxC,MAAM,EAAE,2BAA2B,EACnC,MAAM,EAAE,MAAM,GACZ,aAAa,CAAC,WAAW,CAAC,CAa5B"}
@@ -1,141 +0,0 @@
1
- import { complete, stream, } from "@earendil-works/pi-ai";
2
- import { buildPromptMessages, sanitizeCompletion } from "./truncate.js";
3
- /**
4
- * Absolute upper bound on a single completion call. Backs SEC-3 for the
5
- * pi-ai-backed paths (CloudProvider, LocalProvider). The user's keystroke
6
- * abort still cancels earlier; this is the guard for a stationary user
7
- * facing a hung backend.
8
- */
9
- const REQUEST_TIMEOUT_MS = 10_000;
10
- /**
11
- * Shared OpenAI-completions request path used by both {@link LocalProvider}
12
- * and {@link OpenAICompatProvider}. Builds the pi-ai model record, sends one
13
- * `complete()` call with the user's abort signal, and returns a sanitized
14
- * completion string (or null when the call aborts/errors/produces nothing
15
- * usable).
16
- *
17
- * Kept as a free function rather than a base class to avoid one-method
18
- * inheritance.
19
- */
20
- export async function runOpenAICompletion(req, opts) {
21
- const model = {
22
- id: opts.modelId,
23
- name: opts.modelId,
24
- api: "openai-completions",
25
- provider: opts.providerTag,
26
- baseUrl: trimSlash(opts.baseUrl),
27
- reasoning: false,
28
- input: ["text"],
29
- cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
30
- contextWindow: opts.contextWindow,
31
- maxTokens: opts.maxTokens,
32
- };
33
- const { systemPrompt, user } = buildPromptMessages(req, opts.maxRecentMessages);
34
- const messages = [{ role: "user", content: user, timestamp: Date.now() }];
35
- const ctx = { systemPrompt, messages };
36
- // Combine the caller's abort with an absolute timeout (SEC-3).
37
- const localCtrl = new AbortController();
38
- const onUserAbort = () => localCtrl.abort();
39
- if (req.signal.aborted)
40
- localCtrl.abort();
41
- else
42
- req.signal.addEventListener("abort", onUserAbort, { once: true });
43
- const timeoutHandle = setTimeout(() => localCtrl.abort(), REQUEST_TIMEOUT_MS);
44
- try {
45
- const result = await complete(model, ctx, {
46
- signal: localCtrl.signal,
47
- temperature: opts.temperature,
48
- maxTokens: opts.maxTokens,
49
- apiKey: opts.apiKey,
50
- });
51
- if (result.stopReason === "error" || result.stopReason === "aborted")
52
- return null;
53
- const text = result.content
54
- .filter((c) => c.type === "text")
55
- .map((c) => c.text)
56
- .join("");
57
- return sanitizeCompletion(text, req.editorTextBeforeCursor, 200);
58
- }
59
- finally {
60
- clearTimeout(timeoutHandle);
61
- req.signal.removeEventListener("abort", onUserAbort);
62
- }
63
- }
64
- export function trimSlash(url) {
65
- return url.endsWith("/") ? url.slice(0, -1) : url;
66
- }
67
- /**
68
- * Streaming variant of {@link runOpenAICompletion}. Yields {@link StreamDelta}
69
- * chunks as pi-ai's `stream()` produces `text_delta` events. Sanitization
70
- * runs on the running cumulative (not per-delta) — per-delta would clip
71
- * mid-token and break ghost rendering.
72
- *
73
- * Yields nothing on auth/connectivity failure, abort, or when the model
74
- * record can't be built. The generator's `finally` block clears the
75
- * SEC-3 timer and detaches the user-abort listener.
76
- */
77
- export async function* runOpenAICompletionStream(req, opts) {
78
- const model = {
79
- id: opts.modelId,
80
- name: opts.modelId,
81
- api: "openai-completions",
82
- provider: opts.providerTag,
83
- baseUrl: trimSlash(opts.baseUrl),
84
- reasoning: false,
85
- input: ["text"],
86
- cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
87
- contextWindow: opts.contextWindow,
88
- maxTokens: opts.maxTokens,
89
- };
90
- const { systemPrompt, user } = buildPromptMessages(req, opts.maxRecentMessages);
91
- const messages = [{ role: "user", content: user, timestamp: Date.now() }];
92
- const ctx = { systemPrompt, messages };
93
- const localCtrl = new AbortController();
94
- const onUserAbort = () => localCtrl.abort();
95
- if (req.signal.aborted)
96
- localCtrl.abort();
97
- else
98
- req.signal.addEventListener("abort", onUserAbort, { once: true });
99
- const timeoutHandle = setTimeout(() => localCtrl.abort(), REQUEST_TIMEOUT_MS);
100
- try {
101
- const events = stream(model, ctx, {
102
- signal: localCtrl.signal,
103
- temperature: opts.temperature,
104
- maxTokens: opts.maxTokens,
105
- apiKey: opts.apiKey,
106
- });
107
- yield* streamWithSanitize(events, req.editorTextBeforeCursor);
108
- }
109
- finally {
110
- clearTimeout(timeoutHandle);
111
- req.signal.removeEventListener("abort", onUserAbort);
112
- }
113
- }
114
- /**
115
- * Iterate a pi-ai `AssistantMessageEventStream`, filtering for non-empty
116
- * `text_delta` events and emitting them through `sanitizeCompletion` as
117
- * `StreamDelta` chunks. Sanitization runs on the running cumulative
118
- * (NOT per-delta) since per-token clipping would break ghost rendering.
119
- *
120
- * Shared by `runOpenAICompletionStream` (Local) and CloudProvider's
121
- * `predictStream` so the two paths can't drift on filter/sanitize
122
- * semantics.
123
- */
124
- export async function* streamWithSanitize(events, prefix) {
125
- let raw = "";
126
- let firstEmitted = false;
127
- for await (const ev of events) {
128
- if (ev.type !== "text_delta")
129
- continue;
130
- if (!ev.delta)
131
- continue;
132
- raw += ev.delta;
133
- const sanitized = sanitizeCompletion(raw, prefix, 200);
134
- if (!sanitized)
135
- continue;
136
- const firstChunk = !firstEmitted;
137
- firstEmitted = true;
138
- yield { delta: ev.delta, cumulative: sanitized, firstChunk };
139
- }
140
- }
141
- //# sourceMappingURL=openai-completions-runner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-completions-runner.js","sourceRoot":"","sources":["../../src/providers/openai-completions-runner.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"race.d.ts","sourceRoot":"","sources":["../../src/providers/race.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAgB,MAAM,YAAY,CAAC;AAEnG,MAAM,WAAW,UAAU;IAC1B,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACzB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAqBD;;;;;;;GAOG;AACH,qBAAa,YAAa,YAAW,aAAa;IAOhD,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAPrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;gBAG/B,OAAO,EAAE,aAAa,EAAE,EACxB,GAAG,EAAE,UAAU;IASjC,oEAAoE;IACpE,cAAc,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAYjG,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,gBAAgB,IAAI,SAAS,GAAG,IAAI;IAMpC;;;;;OAKG;IACH,gBAAgB,CAAC,GAAG,GAAE,MAAmB,GAAG;QAC3C,MAAM,EAAE,OAAO,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;KACpB;IAKK,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgFxD;;;;;;;;;;OAUG;IACH,OAAO,CAAC,iBAAiB;IA6BzB;;;;;;;;;;OAUG;IACI,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,aAAa,CAAC,WAAW,CAAC;IAgHnE;;;;;;OAMG;YACW,YAAY;IA4C1B;;;OAGG;IACH,UAAU,IAAI,IAAI;YAQJ,SAAS;CA8BvB;AAqCD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAyBrF"}