omegon 0.6.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 (160) hide show
  1. package/.gitattributes +3 -0
  2. package/AGENTS.md +16 -0
  3. package/LICENSE +15 -0
  4. package/README.md +289 -0
  5. package/bin/pi.mjs +30 -0
  6. package/extensions/00-secrets/index.ts +1126 -0
  7. package/extensions/01-auth/auth.ts +401 -0
  8. package/extensions/01-auth/index.ts +289 -0
  9. package/extensions/auto-compact.ts +42 -0
  10. package/extensions/bootstrap/deps.ts +291 -0
  11. package/extensions/bootstrap/index.ts +811 -0
  12. package/extensions/chronos/chronos.sh +487 -0
  13. package/extensions/chronos/index.ts +148 -0
  14. package/extensions/cleave/assessment.ts +754 -0
  15. package/extensions/cleave/bridge.ts +31 -0
  16. package/extensions/cleave/conflicts.ts +250 -0
  17. package/extensions/cleave/dispatcher.ts +808 -0
  18. package/extensions/cleave/guardrails.ts +426 -0
  19. package/extensions/cleave/index.ts +3121 -0
  20. package/extensions/cleave/lifecycle-emitter.ts +20 -0
  21. package/extensions/cleave/openspec.ts +811 -0
  22. package/extensions/cleave/planner.ts +260 -0
  23. package/extensions/cleave/review.ts +579 -0
  24. package/extensions/cleave/skills.ts +355 -0
  25. package/extensions/cleave/types.ts +261 -0
  26. package/extensions/cleave/workspace.ts +861 -0
  27. package/extensions/cleave/worktree.ts +243 -0
  28. package/extensions/core-renderers.ts +253 -0
  29. package/extensions/dashboard/context-gauge.ts +58 -0
  30. package/extensions/dashboard/file-watch.ts +14 -0
  31. package/extensions/dashboard/footer.ts +1145 -0
  32. package/extensions/dashboard/git.ts +185 -0
  33. package/extensions/dashboard/index.ts +478 -0
  34. package/extensions/dashboard/memory-audit.ts +34 -0
  35. package/extensions/dashboard/overlay-data.ts +705 -0
  36. package/extensions/dashboard/overlay.ts +365 -0
  37. package/extensions/dashboard/render-utils.ts +54 -0
  38. package/extensions/dashboard/types.ts +191 -0
  39. package/extensions/dashboard/uri-helper.ts +45 -0
  40. package/extensions/debug.ts +69 -0
  41. package/extensions/defaults.ts +282 -0
  42. package/extensions/design-tree/dashboard-state.ts +161 -0
  43. package/extensions/design-tree/design-card.ts +362 -0
  44. package/extensions/design-tree/index.ts +2130 -0
  45. package/extensions/design-tree/lifecycle-emitter.ts +41 -0
  46. package/extensions/design-tree/tree.ts +1607 -0
  47. package/extensions/design-tree/types.ts +163 -0
  48. package/extensions/distill.ts +127 -0
  49. package/extensions/effort/index.ts +395 -0
  50. package/extensions/effort/tiers.ts +146 -0
  51. package/extensions/effort/types.ts +105 -0
  52. package/extensions/lib/git-state.ts +227 -0
  53. package/extensions/lib/local-models.ts +157 -0
  54. package/extensions/lib/model-preferences.ts +51 -0
  55. package/extensions/lib/model-routing.ts +720 -0
  56. package/extensions/lib/operator-fallback.ts +205 -0
  57. package/extensions/lib/operator-profile.ts +360 -0
  58. package/extensions/lib/slash-command-bridge.ts +253 -0
  59. package/extensions/lib/typebox-helpers.ts +16 -0
  60. package/extensions/local-inference/index.ts +727 -0
  61. package/extensions/mcp-bridge/README.md +220 -0
  62. package/extensions/mcp-bridge/index.ts +951 -0
  63. package/extensions/mcp-bridge/lib.ts +365 -0
  64. package/extensions/mcp-bridge/mcp.json +3 -0
  65. package/extensions/mcp-bridge/package.json +11 -0
  66. package/extensions/model-budget.ts +752 -0
  67. package/extensions/offline-driver.ts +403 -0
  68. package/extensions/openspec/archive-gate.ts +164 -0
  69. package/extensions/openspec/branch-cleanup.ts +64 -0
  70. package/extensions/openspec/dashboard-state.ts +50 -0
  71. package/extensions/openspec/index.ts +1917 -0
  72. package/extensions/openspec/lifecycle-emitter.ts +65 -0
  73. package/extensions/openspec/lifecycle-files.ts +70 -0
  74. package/extensions/openspec/lifecycle.ts +50 -0
  75. package/extensions/openspec/reconcile.ts +187 -0
  76. package/extensions/openspec/spec.ts +1385 -0
  77. package/extensions/openspec/types.ts +98 -0
  78. package/extensions/project-memory/DESIGN-global-mind.md +198 -0
  79. package/extensions/project-memory/README.md +202 -0
  80. package/extensions/project-memory/api-types.ts +382 -0
  81. package/extensions/project-memory/compaction-policy.ts +29 -0
  82. package/extensions/project-memory/core.ts +164 -0
  83. package/extensions/project-memory/embeddings.ts +230 -0
  84. package/extensions/project-memory/extraction-v2.ts +861 -0
  85. package/extensions/project-memory/factstore.ts +2177 -0
  86. package/extensions/project-memory/index.ts +3459 -0
  87. package/extensions/project-memory/injection-metrics.ts +91 -0
  88. package/extensions/project-memory/jsonl-io.ts +12 -0
  89. package/extensions/project-memory/lifecycle.ts +331 -0
  90. package/extensions/project-memory/migration.ts +293 -0
  91. package/extensions/project-memory/package.json +9 -0
  92. package/extensions/project-memory/sci-renderers.ts +7 -0
  93. package/extensions/project-memory/template.ts +103 -0
  94. package/extensions/project-memory/triggers.ts +52 -0
  95. package/extensions/project-memory/types.ts +102 -0
  96. package/extensions/render/composition/fonts/Inter-Bold.ttf +0 -0
  97. package/extensions/render/composition/fonts/Inter-Regular.ttf +0 -0
  98. package/extensions/render/composition/fonts/Tomorrow-Bold.ttf +0 -0
  99. package/extensions/render/composition/fonts/Tomorrow-Regular.ttf +0 -0
  100. package/extensions/render/composition/package-lock.json +534 -0
  101. package/extensions/render/composition/package.json +22 -0
  102. package/extensions/render/composition/render.mjs +246 -0
  103. package/extensions/render/composition/test-comp.tsx +87 -0
  104. package/extensions/render/composition/types.ts +24 -0
  105. package/extensions/render/excalidraw/UPSTREAM.md +81 -0
  106. package/extensions/render/excalidraw/elements.ts +764 -0
  107. package/extensions/render/excalidraw/index.ts +66 -0
  108. package/extensions/render/excalidraw/types.ts +223 -0
  109. package/extensions/render/excalidraw-renderer/pyproject.toml +8 -0
  110. package/extensions/render/excalidraw-renderer/render_excalidraw.py +182 -0
  111. package/extensions/render/excalidraw-renderer/render_template.html +59 -0
  112. package/extensions/render/index.ts +830 -0
  113. package/extensions/render/native-diagrams/index.ts +57 -0
  114. package/extensions/render/native-diagrams/motifs.ts +542 -0
  115. package/extensions/render/native-diagrams/raster.ts +8 -0
  116. package/extensions/render/native-diagrams/scene.ts +75 -0
  117. package/extensions/render/native-diagrams/spec.ts +204 -0
  118. package/extensions/render/native-diagrams/svg.ts +116 -0
  119. package/extensions/sci-ui.ts +304 -0
  120. package/extensions/session-log.ts +174 -0
  121. package/extensions/shared-state.ts +146 -0
  122. package/extensions/spinner-verbs.ts +91 -0
  123. package/extensions/style.ts +281 -0
  124. package/extensions/terminal-title.ts +191 -0
  125. package/extensions/tool-profile/index.ts +291 -0
  126. package/extensions/tool-profile/profiles.ts +290 -0
  127. package/extensions/types.d.ts +9 -0
  128. package/extensions/vault/index.ts +185 -0
  129. package/extensions/version-check.ts +90 -0
  130. package/extensions/view/index.ts +859 -0
  131. package/extensions/view/uri-resolver.ts +148 -0
  132. package/extensions/web-search/index.ts +182 -0
  133. package/extensions/web-search/providers.ts +121 -0
  134. package/extensions/web-ui/index.ts +110 -0
  135. package/extensions/web-ui/server.ts +265 -0
  136. package/extensions/web-ui/state.ts +462 -0
  137. package/extensions/web-ui/static/index.html +145 -0
  138. package/extensions/web-ui/types.ts +284 -0
  139. package/package.json +76 -0
  140. package/prompts/init.md +75 -0
  141. package/prompts/new-repo.md +54 -0
  142. package/prompts/oci-login.md +56 -0
  143. package/prompts/status.md +50 -0
  144. package/settings.json +4 -0
  145. package/skills/cleave/SKILL.md +218 -0
  146. package/skills/git/SKILL.md +209 -0
  147. package/skills/git/_reference/ci-validation.md +204 -0
  148. package/skills/oci/SKILL.md +338 -0
  149. package/skills/openspec/SKILL.md +346 -0
  150. package/skills/pi-extensions/SKILL.md +191 -0
  151. package/skills/pi-tui/SKILL.md +517 -0
  152. package/skills/python/SKILL.md +189 -0
  153. package/skills/rust/SKILL.md +268 -0
  154. package/skills/security/SKILL.md +206 -0
  155. package/skills/style/SKILL.md +264 -0
  156. package/skills/typescript/SKILL.md +225 -0
  157. package/skills/vault/SKILL.md +102 -0
  158. package/themes/alpharius-legacy.json +85 -0
  159. package/themes/alpharius.conf +59 -0
  160. package/themes/alpharius.json +88 -0
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Project Memory — Embeddings
3
+ *
4
+ * Provider resolution order (automatic, no config required):
5
+ * 1. Custom OpenAI-compatible endpoint — if MEMORY_EMBEDDING_BASE_URL is set
6
+ * (covers LM Studio, Mistral, Together, any /v1/embeddings-compatible server)
7
+ * 2. Voyage AI — if VOYAGE_API_KEY is set (default model: voyage-3-lite)
8
+ * 3. OpenAI — if OPENAI_API_KEY is set (default model: text-embedding-3-small)
9
+ * 4. Ollama — local inference at OLLAMA_HOST or localhost:11434 (default model: qwen3-embedding:0.6b)
10
+ * Always returns a candidate; isEmbeddingAvailable() validates at startup.
11
+ * 5. FTS5 keyword search — graceful degradation when no provider passes healthcheck
12
+ *
13
+ * Voyage AI is preferred over OpenAI when both keys are present because:
14
+ * - Anthropic-backed, aligned with pi's primary provider
15
+ * - voyage-3-lite: 512 dims, optimized for retrieval, cheaper per token
16
+ * - voyage-3: 1024 dims, higher quality for large corpora
17
+ *
18
+ * All providers speak the OpenAI /v1/embeddings wire format.
19
+ * Vectors stored as raw Float32Array buffers in SQLite BLOB columns.
20
+ * Dimension mismatch between providers is detected and handled by the caller
21
+ * (factstore purges stale vectors on model change).
22
+ */
23
+
24
+ export type EmbeddingProvider = "voyage" | "openai" | "openai-compatible" | "ollama";
25
+
26
+ // --- Endpoint and model defaults ---
27
+
28
+ const VOYAGE_BASE_URL = "https://api.voyageai.com/v1";
29
+ const OPENAI_BASE_URL = "https://api.openai.com/v1";
30
+
31
+ const DEFAULT_VOYAGE_MODEL = "voyage-3-lite";
32
+ const DEFAULT_OPENAI_MODEL = "text-embedding-3-small";
33
+
34
+ /** Known embedding dimensions by model name */
35
+ export const MODEL_DIMS: Record<string, number> = {
36
+ // Voyage AI
37
+ "voyage-3-lite": 512,
38
+ "voyage-3": 1024,
39
+ "voyage-3-large": 1024,
40
+ "voyage-code-3": 1024,
41
+ // OpenAI
42
+ "text-embedding-3-small": 1536,
43
+ "text-embedding-3-large": 3072,
44
+ "text-embedding-ada-002": 1536,
45
+ // Ollama local models
46
+ "qwen3-embedding:0.6b": 1024,
47
+ "qwen3-embedding": 1024,
48
+ "nomic-embed-text": 768,
49
+ "mxbai-embed-large": 1024,
50
+ "all-minilm": 384,
51
+ "snowflake-arctic-embed": 1024,
52
+ };
53
+
54
+ export interface EmbeddingResult {
55
+ embedding: Float32Array;
56
+ model: string;
57
+ dims: number;
58
+ }
59
+
60
+ export interface EmbeddingOptions {
61
+ provider?: EmbeddingProvider;
62
+ model?: string;
63
+ baseUrl?: string;
64
+ timeout?: number;
65
+ apiKey?: string;
66
+ }
67
+
68
+ // --- Provider resolution ---
69
+
70
+ /**
71
+ * Auto-detect the best available provider from environment variables.
72
+ * Called once at startup; result stored in MemoryConfig.embeddingProvider.
73
+ */
74
+ export function resolveEmbeddingProvider(): { provider: EmbeddingProvider; model: string } | null {
75
+ // 1. Custom OpenAI-compatible endpoint (highest priority — explicit user intent)
76
+ if (process.env.MEMORY_EMBEDDING_BASE_URL) {
77
+ const model = process.env.MEMORY_EMBEDDING_MODEL ?? DEFAULT_OPENAI_MODEL;
78
+ return { provider: "openai-compatible", model };
79
+ }
80
+
81
+ // 2. Voyage AI (preferred cloud provider)
82
+ const voyageKey = process.env.VOYAGE_API_KEY ?? process.env.MEMORY_EMBEDDING_API_KEY;
83
+ if (voyageKey && !process.env.MEMORY_EMBEDDING_BASE_URL) {
84
+ // Only use Voyage if no custom base URL is set (custom URL implies a different provider)
85
+ const model = process.env.MEMORY_EMBEDDING_MODEL ?? DEFAULT_VOYAGE_MODEL;
86
+ if (model.startsWith("voyage-")) {
87
+ return { provider: "voyage", model };
88
+ }
89
+ }
90
+
91
+ // Re-check: MEMORY_EMBEDDING_API_KEY with no base URL and a non-voyage model → OpenAI
92
+ if (process.env.VOYAGE_API_KEY) {
93
+ const model = process.env.MEMORY_EMBEDDING_MODEL ?? DEFAULT_VOYAGE_MODEL;
94
+ return { provider: "voyage", model };
95
+ }
96
+
97
+ // 3. OpenAI
98
+ if (process.env.OPENAI_API_KEY) {
99
+ const model = process.env.MEMORY_EMBEDDING_MODEL ?? DEFAULT_OPENAI_MODEL;
100
+ return { provider: "openai", model };
101
+ }
102
+
103
+ // 4. Ollama (local inference — zero config, auto-detected)
104
+ // Ollama exposes an OpenAI-compatible /v1/embeddings endpoint.
105
+ // We always return a candidate here; isEmbeddingAvailable() validates at startup
106
+ // by sending a test embedding. If Ollama isn't running, it fails gracefully → FTS5.
107
+ {
108
+ const model = process.env.MEMORY_EMBEDDING_MODEL ?? "qwen3-embedding:0.6b";
109
+ return { provider: "ollama", model };
110
+ }
111
+ }
112
+
113
+ // --- Embedding implementations ---
114
+
115
+ /**
116
+ * All three providers use the OpenAI /v1/embeddings wire format.
117
+ * This one function handles all of them; only the base URL and API key differ.
118
+ */
119
+ async function embedViaOpenAIFormat(
120
+ text: string,
121
+ baseUrl: string,
122
+ apiKey: string,
123
+ model: string,
124
+ timeout: number,
125
+ ): Promise<EmbeddingResult | null> {
126
+ try {
127
+ const controller = new AbortController();
128
+ const timer = setTimeout(() => controller.abort(), timeout);
129
+
130
+ const resp = await fetch(`${baseUrl.replace(/\/$/, "")}/embeddings`, {
131
+ method: "POST",
132
+ headers: {
133
+ "Content-Type": "application/json",
134
+ Authorization: `Bearer ${apiKey}`,
135
+ },
136
+ body: JSON.stringify({ model, input: text }),
137
+ signal: controller.signal,
138
+ });
139
+
140
+ clearTimeout(timer);
141
+ if (!resp.ok) return null;
142
+
143
+ const data = (await resp.json()) as { data?: Array<{ embedding?: number[] }> };
144
+ const values = data.data?.[0]?.embedding;
145
+ if (!values?.length) return null;
146
+
147
+ const arr = new Float32Array(values);
148
+ return { embedding: arr, model, dims: arr.length };
149
+ } catch {
150
+ return null;
151
+ }
152
+ }
153
+
154
+ function resolveOpts(opts?: EmbeddingOptions): {
155
+ provider: EmbeddingProvider;
156
+ model: string;
157
+ baseUrl: string;
158
+ apiKey: string;
159
+ timeout: number;
160
+ } | null {
161
+ const timeout = opts?.timeout ?? 8_000;
162
+
163
+ // Explicit provider override (e.g. from MemoryConfig)
164
+ const provider = opts?.provider ?? ("voyage" as EmbeddingProvider);
165
+
166
+ if (provider === "openai-compatible") {
167
+ const baseUrl = opts?.baseUrl ?? process.env.MEMORY_EMBEDDING_BASE_URL ?? "";
168
+ const apiKey = opts?.apiKey ?? process.env.MEMORY_EMBEDDING_API_KEY ?? "";
169
+ const model = opts?.model ?? process.env.MEMORY_EMBEDDING_MODEL ?? DEFAULT_OPENAI_MODEL;
170
+ if (!baseUrl || !apiKey) return null;
171
+ return { provider, model, baseUrl, apiKey, timeout };
172
+ }
173
+
174
+ if (provider === "voyage") {
175
+ const baseUrl = opts?.baseUrl ?? VOYAGE_BASE_URL;
176
+ const apiKey = opts?.apiKey ?? process.env.VOYAGE_API_KEY ?? process.env.MEMORY_EMBEDDING_API_KEY ?? "";
177
+ const model = opts?.model ?? process.env.MEMORY_EMBEDDING_MODEL ?? DEFAULT_VOYAGE_MODEL;
178
+ if (!apiKey) return null;
179
+ return { provider, model, baseUrl, apiKey, timeout };
180
+ }
181
+
182
+ if (provider === "ollama") {
183
+ let ollamaHost = process.env.OLLAMA_HOST ?? "http://localhost:11434";
184
+ // OLLAMA_HOST is commonly set without a scheme (e.g., "localhost:11434")
185
+ if (!/^https?:\/\//i.test(ollamaHost)) {
186
+ ollamaHost = `http://${ollamaHost}`;
187
+ }
188
+ const baseUrl = `${ollamaHost.replace(/\/$/, "")}/v1`;
189
+ const model = opts?.model ?? process.env.MEMORY_EMBEDDING_MODEL ?? "qwen3-embedding:0.6b";
190
+ // Ollama doesn't require an API key but the OpenAI-compatible endpoint
191
+ // accepts any non-empty bearer token.
192
+ return { provider, model, baseUrl, apiKey: "ollama", timeout };
193
+ }
194
+
195
+ // openai
196
+ const baseUrl = opts?.baseUrl ?? process.env.MEMORY_EMBEDDING_BASE_URL ?? OPENAI_BASE_URL;
197
+ const apiKey = opts?.apiKey ?? process.env.MEMORY_EMBEDDING_API_KEY ?? process.env.OPENAI_API_KEY ?? "";
198
+ const model = opts?.model ?? process.env.MEMORY_EMBEDDING_MODEL ?? DEFAULT_OPENAI_MODEL;
199
+ if (!apiKey) return null;
200
+ return { provider, model, baseUrl, apiKey, timeout };
201
+ }
202
+
203
+ // --- Public API ---
204
+
205
+ /**
206
+ * Embed a single text string via the configured embedding backend.
207
+ * Returns null if the provider is unreachable or not configured.
208
+ */
209
+ export async function embed(
210
+ text: string,
211
+ opts?: EmbeddingOptions,
212
+ ): Promise<EmbeddingResult | null> {
213
+ const resolved = resolveOpts(opts);
214
+ if (!resolved) return null;
215
+ return embedViaOpenAIFormat(text, resolved.baseUrl, resolved.apiKey, resolved.model, resolved.timeout);
216
+ }
217
+
218
+ /**
219
+ * Check if the configured embedding backend is reachable and usable.
220
+ */
221
+ export async function isEmbeddingAvailable(
222
+ opts?: EmbeddingOptions,
223
+ ): Promise<{ available: boolean; model?: string; dims?: number }> {
224
+ const result = await embed("embedding healthcheck", opts);
225
+ if (!result) return { available: false };
226
+ return { available: true, model: result.model, dims: result.dims };
227
+ }
228
+
229
+ // Re-export pure vector math from core.ts — single source of truth and Rust port target.
230
+ export { cosineSimilarity, vectorToBlob, blobToVector } from "./core.ts";