claude-alfred 0.3.6 → 0.3.8

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 (29) hide show
  1. package/dist/{audit-g6phLGMg.mjs → audit-BoZ1ny8J.mjs} +6 -2
  2. package/dist/chunk-CAm0Jl7e.mjs +38 -0
  3. package/dist/cli.mjs +7 -7
  4. package/dist/{helpers-CvI9bVCq.mjs → directives-DjcVEEC8.mjs} +71 -5
  5. package/dist/{dispatcher-BWa-6qtR.mjs → dispatcher-BjpWdTBs.mjs} +9 -8
  6. package/dist/embedder-D3hJoryD.mjs +223 -0
  7. package/dist/{epic-D9ksT1k7.mjs → epic-s_BVNu2z.mjs} +77 -72
  8. package/dist/{fts-Buk8fkl1.mjs → fts-DUZkPJPD.mjs} +20 -14
  9. package/dist/{knowledge-BgWoLpv7.mjs → knowledge-C7rEfFSX.mjs} +3 -1
  10. package/dist/{living-spec-jepeb0NQ.mjs → living-spec-ZVyfPGMW.mjs} +72 -63
  11. package/dist/post-tool-CfnMwY6j.mjs +11 -0
  12. package/dist/{post-tool-wXy5oNCh.mjs → post-tool-O8S54qat.mjs} +405 -25
  13. package/dist/{pre-compact-Cuxb6ryB.mjs → pre-compact-Cdjtld4A.mjs} +54 -43
  14. package/dist/{pre-tool-DdZortZJ.mjs → pre-tool-KpwIhe2F.mjs} +11 -4
  15. package/dist/{project-Cz-yOhrW.mjs → project-DCKke4_Q.mjs} +3 -1
  16. package/dist/{review-gate-Dn4J5Zjt.mjs → review-gate-DM_o8MKx.mjs} +13 -4
  17. package/dist/{server-CwcGoHSS.mjs → server-B7dI3oXY.mjs} +12 -6
  18. package/dist/{server-uRcvcepv.mjs → server-BheF_pZr.mjs} +83 -14
  19. package/dist/{session-start-DEx6rrId.mjs → session-start-Bul0GicD.mjs} +18 -8
  20. package/dist/{state-DBoJxogd.mjs → state-7LLZFgmO.mjs} +14 -11
  21. package/dist/{stop-BIwkuqHf.mjs → stop-BQzq19WO.mjs} +10 -4
  22. package/dist/{store-D4fokoGA.mjs → store-8O9WUwMu.mjs} +256 -243
  23. package/dist/{types-DFsKNXVY.mjs → types-BBT-j5-a.mjs} +89 -119
  24. package/dist/{user-prompt-CsCJ1CKL.mjs → user-prompt-Bzfgl80c.mjs} +102 -92
  25. package/dist/{vectors-DtWMZUgk.mjs → vectors-C3yIO_A5.mjs} +8 -5
  26. package/package.json +2 -1
  27. package/dist/directives-BYP81n78.mjs +0 -57
  28. package/dist/embedder-CFkDPOku.mjs +0 -214
  29. package/dist/ledger-CbtIEUYw.mjs +0 -342
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { u as rootDir } from "./types-DFsKNXVY.mjs";
2
+ import { n as __esmMin } from "./chunk-CAm0Jl7e.mjs";
3
+ import { d as rootDir, o as init_types } from "./types-BBT-j5-a.mjs";
3
4
  import { appendFileSync, mkdirSync } from "node:fs";
4
5
  import { join } from "node:path";
5
6
  //#region src/spec/audit.ts
@@ -14,5 +15,8 @@ function appendAudit(projectPath, entry) {
14
15
  appendFileSync(join(dir, "audit.jsonl"), `${line}\n`);
15
16
  } catch {}
16
17
  }
18
+ var init_audit = __esmMin((() => {
19
+ init_types();
20
+ }));
17
21
  //#endregion
18
- export { appendAudit as t };
22
+ export { init_audit as n, appendAudit as t };
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from "node:module";
3
+ //#region \0rolldown/runtime.js
4
+ var __create = Object.create;
5
+ var __defProp = Object.defineProperty;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getProtoOf = Object.getPrototypeOf;
9
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
10
+ var __esmMin = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
11
+ var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
12
+ var __exportAll = (all, no_symbols) => {
13
+ let target = {};
14
+ for (var name in all) __defProp(target, name, {
15
+ get: all[name],
16
+ enumerable: true
17
+ });
18
+ if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
19
+ return target;
20
+ };
21
+ var __copyProps = (to, from, except, desc) => {
22
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
23
+ key = keys[i];
24
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
25
+ get: ((k) => from[k]).bind(null, key),
26
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
27
+ });
28
+ }
29
+ return to;
30
+ };
31
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
32
+ value: mod,
33
+ enumerable: true
34
+ }) : target, mod));
35
+ var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
36
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
37
+ //#endregion
38
+ export { __toCommonJS as a, __require as i, __esmMin as n, __toESM as o, __exportAll as r, __commonJSMin as t };
package/dist/cli.mjs CHANGED
@@ -369,9 +369,9 @@ const main = defineCommand({
369
369
  serve: defineCommand({
370
370
  meta: { description: "Start MCP server (stdio)" },
371
371
  async run() {
372
- const { Store } = await import("./store-D4fokoGA.mjs");
373
- const { Embedder } = await import("./embedder-CFkDPOku.mjs");
374
- const { serveMCP } = await import("./server-uRcvcepv.mjs");
372
+ const { Store } = await import("./store-8O9WUwMu.mjs").then((n) => (n.t(), n.r));
373
+ const { Embedder } = await import("./embedder-D3hJoryD.mjs");
374
+ const { serveMCP } = await import("./server-BheF_pZr.mjs");
375
375
  const store = Store.openDefault();
376
376
  let emb = null;
377
377
  try {
@@ -397,9 +397,9 @@ const main = defineCommand({
397
397
  }
398
398
  },
399
399
  async run({ args }) {
400
- const { Store } = await import("./store-D4fokoGA.mjs");
401
- const { Embedder } = await import("./embedder-CFkDPOku.mjs");
402
- const { startDashboard } = await import("./server-CwcGoHSS.mjs");
400
+ const { Store } = await import("./store-8O9WUwMu.mjs").then((n) => (n.t(), n.r));
401
+ const { Embedder } = await import("./embedder-D3hJoryD.mjs");
402
+ const { startDashboard } = await import("./server-B7dI3oXY.mjs");
403
403
  const projectPath = process.cwd();
404
404
  const store = Store.openDefault();
405
405
  let emb = null;
@@ -422,7 +422,7 @@ const main = defineCommand({
422
422
  description: "Event name"
423
423
  } },
424
424
  async run({ args }) {
425
- const { runHook } = await import("./dispatcher-BWa-6qtR.mjs").then((n) => n.t);
425
+ const { runHook } = await import("./dispatcher-BjpWdTBs.mjs").then((n) => (n.i(), n.t));
426
426
  await runHook(args.event);
427
427
  }
428
428
  }),
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import { c as incrementHitCount, d as searchKnowledgeKeyword, i as getKnowledgeByIDs } from "./knowledge-BgWoLpv7.mjs";
3
- import { r as vectorSearchKnowledge } from "./vectors-DtWMZUgk.mjs";
4
- import { i as subTypeHalfLife, n as searchKnowledgeFTS, r as subTypeBoost } from "./fts-Buk8fkl1.mjs";
2
+ import { n as __esmMin } from "./chunk-CAm0Jl7e.mjs";
3
+ import { c as incrementHitCount, f as searchKnowledgeKeyword, i as getKnowledgeByIDs, l as init_knowledge } from "./knowledge-C7rEfFSX.mjs";
4
+ import { i as vectorSearchKnowledge, r as init_vectors } from "./vectors-C3yIO_A5.mjs";
5
+ import { a as subTypeHalfLife, i as subTypeBoost, n as init_fts, r as searchKnowledgeFTS } from "./fts-DUZkPJPD.mjs";
6
+ import { i as init_dispatcher, n as emitAdditionalContext } from "./dispatcher-BjpWdTBs.mjs";
5
7
  //#region src/mcp/helpers.ts
6
- const RECENCY_FLOOR = .5;
7
8
  function truncate(s, maxLen) {
8
9
  const runes = [...s];
9
10
  if (runes.length <= maxLen) return s;
@@ -93,5 +94,70 @@ function trackHitCounts(store, scoredDocs) {
93
94
  if (scoredDocs.length === 0) return;
94
95
  incrementHitCount(store, scoredDocs.filter((sd) => sd.doc.id > 0).map((sd) => sd.doc.id));
95
96
  }
97
+ var RECENCY_FLOOR;
98
+ var init_helpers = __esmMin((() => {
99
+ init_fts();
100
+ init_knowledge();
101
+ init_vectors();
102
+ RECENCY_FLOOR = .5;
103
+ }));
96
104
  //#endregion
97
- export { trackHitCounts as n, truncate as r, searchPipeline as t };
105
+ //#region src/hooks/directives.ts
106
+ /**
107
+ * Build a single additionalContext string from directive items.
108
+ * Order: DIRECTIVE → WARNING → CONTEXT.
109
+ * Max 3 DIRECTIVE items (NFR-5). Excess DIRECTIVEs downgraded to WARNING.
110
+ */
111
+ function buildDirectiveOutput(items) {
112
+ if (items.length === 0) return "";
113
+ let directiveCount = 0;
114
+ return items.map((item) => {
115
+ if (item.level === "DIRECTIVE") {
116
+ directiveCount++;
117
+ if (directiveCount > MAX_DIRECTIVES) return {
118
+ level: "WARNING",
119
+ message: item.message
120
+ };
121
+ }
122
+ return item;
123
+ }).slice().sort((a, b) => LEVEL_ORDER[a.level] - LEVEL_ORDER[b.level]).map((item) => {
124
+ let block = `[${item.level}] ${item.message}`;
125
+ if (item.level === "DIRECTIVE") {
126
+ const rats = (item.rationalizations ?? []).slice();
127
+ const suffix = item.spiritVsLetter ? `\n${SPIRIT_VS_LETTER}` : "";
128
+ while (rats.length > 0) {
129
+ if (`${block}\n${rats.map((r) => `- ${r}`).join("\n")}${suffix}`.length <= MAX_DIRECTIVE_BLOCK_CHARS) break;
130
+ rats.pop();
131
+ }
132
+ if (rats.length > 0) block += `\n${rats.map((r) => `- ${r}`).join("\n")}`;
133
+ block += suffix;
134
+ if (block.length > MAX_DIRECTIVE_BLOCK_CHARS) {
135
+ const messageOnly = `[${item.level}] ${item.message}`;
136
+ if (messageOnly.length > MAX_DIRECTIVE_BLOCK_CHARS) block = `${messageOnly.slice(0, MAX_DIRECTIVE_BLOCK_CHARS - 3)}...`;
137
+ else block = messageOnly;
138
+ }
139
+ }
140
+ return block;
141
+ }).join("\n");
142
+ }
143
+ /**
144
+ * Emit directives via single emitAdditionalContext call (NFR-4).
145
+ */
146
+ function emitDirectives(eventName, items) {
147
+ const output = buildDirectiveOutput(items);
148
+ if (output) emitAdditionalContext(eventName, output);
149
+ }
150
+ var LEVEL_ORDER, MAX_DIRECTIVES, MAX_DIRECTIVE_BLOCK_CHARS, SPIRIT_VS_LETTER;
151
+ var init_directives = __esmMin((() => {
152
+ init_dispatcher();
153
+ LEVEL_ORDER = {
154
+ DIRECTIVE: 0,
155
+ WARNING: 1,
156
+ CONTEXT: 2
157
+ };
158
+ MAX_DIRECTIVES = 3;
159
+ MAX_DIRECTIVE_BLOCK_CHARS = 500;
160
+ SPIRIT_VS_LETTER = "Adapting or shortcutting these steps violates the rule, even if you believe the spirit is preserved.";
161
+ }));
162
+ //#endregion
163
+ export { trackHitCounts as a, searchPipeline as i, init_directives as n, truncate as o, init_helpers as r, emitDirectives as t };
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { g as __exportAll } from "./types-DFsKNXVY.mjs";
2
+ import { n as __esmMin, r as __exportAll } from "./chunk-CAm0Jl7e.mjs";
3
3
  import { resolve } from "node:path";
4
4
  //#region src/hooks/dispatcher.ts
5
5
  var dispatcher_exports = /* @__PURE__ */ __exportAll({
@@ -89,28 +89,29 @@ async function runHook(event) {
89
89
  }
90
90
  }
91
91
  async function handleSessionStart(ev, signal) {
92
- const { sessionStart } = await import("./session-start-DEx6rrId.mjs");
92
+ const { sessionStart } = await import("./session-start-Bul0GicD.mjs");
93
93
  await sessionStart(ev, signal);
94
94
  }
95
95
  async function handlePreCompact(ev, signal) {
96
- const { preCompact } = await import("./pre-compact-Cuxb6ryB.mjs");
96
+ const { preCompact } = await import("./pre-compact-Cdjtld4A.mjs");
97
97
  await preCompact(ev, signal);
98
98
  }
99
99
  async function handleUserPromptSubmit(ev, signal) {
100
- const { userPromptSubmit } = await import("./user-prompt-CsCJ1CKL.mjs");
100
+ const { userPromptSubmit } = await import("./user-prompt-Bzfgl80c.mjs");
101
101
  await userPromptSubmit(ev, signal);
102
102
  }
103
103
  async function handlePostToolUse(ev, signal) {
104
- const { postToolUse } = await import("./post-tool-wXy5oNCh.mjs");
104
+ const { postToolUse } = await import("./post-tool-CfnMwY6j.mjs");
105
105
  await postToolUse(ev, signal);
106
106
  }
107
107
  async function handlePreToolUse(ev, _signal) {
108
- const { preToolUse } = await import("./pre-tool-DdZortZJ.mjs");
108
+ const { preToolUse } = await import("./pre-tool-KpwIhe2F.mjs");
109
109
  await preToolUse(ev);
110
110
  }
111
111
  async function handleStop(ev, _signal) {
112
- const { stop } = await import("./stop-BIwkuqHf.mjs");
112
+ const { stop } = await import("./stop-BQzq19WO.mjs");
113
113
  await stop(ev);
114
114
  }
115
+ var init_dispatcher = __esmMin((() => {}));
115
116
  //#endregion
116
- export { notifyUser as i, emitAdditionalContext as n, extractSection as r, dispatcher_exports as t };
117
+ export { notifyUser as a, init_dispatcher as i, emitAdditionalContext as n, extractSection as r, dispatcher_exports as t };
@@ -0,0 +1,223 @@
1
+ #!/usr/bin/env node
2
+ import { n as __esmMin } from "./chunk-CAm0Jl7e.mjs";
3
+ //#region src/embedder/voyage.ts
4
+ function envOr(key, fallback) {
5
+ return process.env[key] || fallback;
6
+ }
7
+ function envIntOr(key, fallback) {
8
+ const v = process.env[key];
9
+ if (v) {
10
+ const n = parseInt(v, 10);
11
+ if (!Number.isNaN(n) && n > 0) return n;
12
+ }
13
+ return fallback;
14
+ }
15
+ function isVoyageTransient(detail) {
16
+ const lower = detail.toLowerCase();
17
+ return TRANSIENT_MESSAGE_PATTERNS.some((p) => lower.includes(p));
18
+ }
19
+ function isVoyageTransientStructured(errResp) {
20
+ if (!errResp) return false;
21
+ if (errResp.type && TRANSIENT_ERROR_TYPES.has(errResp.type.toLowerCase())) return true;
22
+ if (errResp.code && TRANSIENT_ERROR_TYPES.has(errResp.code.toLowerCase())) return true;
23
+ return false;
24
+ }
25
+ async function retryVoyage(fn, signal) {
26
+ let lastErr;
27
+ for (let attempt = 0; attempt < 3; attempt++) {
28
+ if (attempt > 0) {
29
+ const delay = (1 << attempt) * 1e3;
30
+ await new Promise((resolve, reject) => {
31
+ const onAbort = () => {
32
+ clearTimeout(timer);
33
+ reject(signal.reason);
34
+ };
35
+ const timer = setTimeout(() => {
36
+ signal?.removeEventListener("abort", onAbort);
37
+ resolve();
38
+ }, delay);
39
+ signal?.addEventListener("abort", onAbort, { once: true });
40
+ });
41
+ }
42
+ try {
43
+ return await fn();
44
+ } catch (err) {
45
+ lastErr = err;
46
+ if (err instanceof VoyageError) {
47
+ if (err.status === 429 || err.status >= 500) continue;
48
+ if (err.status === 400 && (isVoyageTransient(err.detail) || isVoyageTransientStructured(err.errResp))) continue;
49
+ throw err;
50
+ }
51
+ }
52
+ }
53
+ throw lastErr;
54
+ }
55
+ var DEFAULT_API_URL, DEFAULT_RERANK_URL, DEFAULT_MODEL, DEFAULT_RERANK_MODEL, DEFAULT_DIMS, VoyageError, TRANSIENT_ERROR_TYPES, TRANSIENT_MESSAGE_PATTERNS, VoyageClient;
56
+ var init_voyage = __esmMin((() => {
57
+ DEFAULT_API_URL = "https://api.voyageai.com/v1/embeddings";
58
+ DEFAULT_RERANK_URL = "https://api.voyageai.com/v1/rerank";
59
+ DEFAULT_MODEL = "voyage-4-large";
60
+ DEFAULT_RERANK_MODEL = "rerank-2.5";
61
+ DEFAULT_DIMS = 2048;
62
+ VoyageError = class extends Error {
63
+ status;
64
+ detail;
65
+ raw;
66
+ errResp;
67
+ constructor(status, detail, raw, errResp) {
68
+ super(status === 401 || status === 403 ? `embedder: voyage returned ${status}: authentication failed (check VOYAGE_API_KEY)` : `embedder: voyage returned ${status}: ${detail}`);
69
+ this.status = status;
70
+ this.detail = detail;
71
+ this.raw = raw;
72
+ this.errResp = errResp;
73
+ }
74
+ };
75
+ TRANSIENT_ERROR_TYPES = new Set([
76
+ "temporary_error",
77
+ "transient_error",
78
+ "overloaded",
79
+ "rate_limited",
80
+ "capacity_exceeded",
81
+ "service_unavailable"
82
+ ]);
83
+ TRANSIENT_MESSAGE_PATTERNS = [
84
+ "request to model",
85
+ "model is overloaded",
86
+ "temporarily",
87
+ "try again",
88
+ "service unavailable",
89
+ "internal server error",
90
+ "over capacity"
91
+ ];
92
+ VoyageClient = class {
93
+ apiKey;
94
+ apiURL;
95
+ rerankURL;
96
+ model;
97
+ rerankModel;
98
+ dims;
99
+ constructor(apiKey) {
100
+ this.apiKey = apiKey;
101
+ this.apiURL = envOr("VOYAGE_API_URL", DEFAULT_API_URL);
102
+ this.rerankURL = envOr("VOYAGE_RERANK_API_URL", DEFAULT_RERANK_URL);
103
+ this.model = envOr("VOYAGE_MODEL", DEFAULT_MODEL);
104
+ this.rerankModel = envOr("VOYAGE_RERANK_MODEL", DEFAULT_RERANK_MODEL);
105
+ this.dims = envIntOr("VOYAGE_DIMS", DEFAULT_DIMS);
106
+ }
107
+ async embed(texts, inputType, signal) {
108
+ const payload = {
109
+ input: texts,
110
+ model: this.model,
111
+ input_type: inputType,
112
+ output_dimension: this.dims
113
+ };
114
+ return retryVoyage(() => this.doEmbed(payload, signal), signal);
115
+ }
116
+ async doEmbed(payload, signal) {
117
+ const resp = await fetch(this.apiURL, {
118
+ method: "POST",
119
+ headers: {
120
+ "Content-Type": "application/json",
121
+ Authorization: `Bearer ${this.apiKey}`
122
+ },
123
+ body: JSON.stringify(payload),
124
+ signal: signal ?? AbortSignal.timeout(3e4)
125
+ });
126
+ if (!resp.ok) {
127
+ const raw = await resp.text().catch(() => "");
128
+ let errResp;
129
+ try {
130
+ const parsed = JSON.parse(raw);
131
+ if (parsed.detail) errResp = parsed;
132
+ } catch {}
133
+ throw new VoyageError(resp.status, errResp?.detail ?? raw, raw, errResp);
134
+ }
135
+ return (await resp.json()).data.map((d) => d.embedding);
136
+ }
137
+ async embedForSearch(query, signal) {
138
+ const vecs = await this.embed([query], "query", signal);
139
+ if (vecs.length === 0) throw new Error("embedder: no embeddings returned");
140
+ return vecs[0];
141
+ }
142
+ async embedForStorage(text, signal) {
143
+ const vecs = await this.embed([text], "document", signal);
144
+ if (vecs.length === 0) throw new Error("embedder: no embeddings returned");
145
+ return vecs[0];
146
+ }
147
+ async rerank(query, documents, topK, signal) {
148
+ const payload = {
149
+ query,
150
+ documents,
151
+ model: this.rerankModel,
152
+ top_k: topK,
153
+ return_documents: false
154
+ };
155
+ return retryVoyage(() => this.doRerank(payload, signal), signal);
156
+ }
157
+ async doRerank(payload, signal) {
158
+ const resp = await fetch(this.rerankURL, {
159
+ method: "POST",
160
+ headers: {
161
+ "Content-Type": "application/json",
162
+ Authorization: `Bearer ${this.apiKey}`
163
+ },
164
+ body: JSON.stringify(payload),
165
+ signal: signal ?? AbortSignal.timeout(3e4)
166
+ });
167
+ if (!resp.ok) {
168
+ const raw = await resp.text().catch(() => "");
169
+ let errResp;
170
+ try {
171
+ const parsed = JSON.parse(raw);
172
+ if (parsed.detail) errResp = parsed;
173
+ } catch {}
174
+ throw new VoyageError(resp.status, errResp?.detail ?? raw, raw, errResp);
175
+ }
176
+ return (await resp.json()).data.map((d) => ({
177
+ index: d.index,
178
+ relevanceScore: d.relevance_score
179
+ }));
180
+ }
181
+ };
182
+ }));
183
+ //#endregion
184
+ //#region src/embedder/index.ts
185
+ var Embedder;
186
+ var init_embedder = __esmMin((() => {
187
+ init_voyage();
188
+ Embedder = class Embedder {
189
+ client;
190
+ constructor(client) {
191
+ this.client = client;
192
+ }
193
+ static create() {
194
+ const apiKey = process.env.VOYAGE_API_KEY;
195
+ if (!apiKey) throw new Error("VOYAGE_API_KEY is required but not set (get a key at https://dash.voyageai.com/)");
196
+ return new Embedder(new VoyageClient(apiKey));
197
+ }
198
+ get dims() {
199
+ return this.client.dims;
200
+ }
201
+ get model() {
202
+ return this.client.model;
203
+ }
204
+ async embedForSearch(query, signal) {
205
+ return this.client.embedForSearch(query, signal);
206
+ }
207
+ async embedForStorage(text, signal) {
208
+ return this.client.embedForStorage(text, signal);
209
+ }
210
+ async embedBatchForStorage(texts, signal) {
211
+ return this.client.embed(texts, "document", signal);
212
+ }
213
+ async validate(signal) {
214
+ await this.client.embed(["test"], "query", signal);
215
+ }
216
+ async rerank(query, documents, topK, signal) {
217
+ return this.client.rerank(query, documents, topK, signal);
218
+ }
219
+ };
220
+ }));
221
+ //#endregion
222
+ init_embedder();
223
+ export { Embedder, init_embedder as t };
@@ -1,84 +1,15 @@
1
1
  #!/usr/bin/env node
2
- import { m as require_dist, n as VALID_SLUG } from "./types-DFsKNXVY.mjs";
2
+ import { n as __esmMin } from "./chunk-CAm0Jl7e.mjs";
3
+ import { h as require_dist, n as VALID_SLUG, o as init_types } from "./types-BBT-j5-a.mjs";
3
4
  import { mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
4
5
  import { join } from "node:path";
5
6
  //#region src/epic/index.ts
6
- var import_dist = require_dist();
7
7
  function epicsDir(projectPath) {
8
8
  return join(projectPath, ".alfred", "epics");
9
9
  }
10
10
  function epicActivePath(projectPath) {
11
11
  return join(epicsDir(projectPath), "_active.yaml");
12
12
  }
13
- const STATUS_DRAFT = "draft";
14
- const STATUS_IN_PROGRESS = "in-progress";
15
- const STATUS_COMPLETED = "completed";
16
- const STATUS_NOT_STARTED = "not-started";
17
- var EpicDir = class {
18
- projectPath;
19
- slug;
20
- constructor(projectPath, slug) {
21
- this.projectPath = projectPath;
22
- this.slug = slug;
23
- }
24
- dir() {
25
- return join(epicsDir(this.projectPath), this.slug);
26
- }
27
- epicPath() {
28
- return join(this.dir(), "epic.yaml");
29
- }
30
- exists() {
31
- try {
32
- return statSync(this.dir()).isDirectory();
33
- } catch {
34
- return false;
35
- }
36
- }
37
- read() {
38
- return (0, import_dist.parse)(readFileSync(this.epicPath(), "utf-8"));
39
- }
40
- save(ep) {
41
- const data = (0, import_dist.stringify)(ep);
42
- const tmp = `${this.epicPath()}.tmp`;
43
- writeFileSync(tmp, data);
44
- renameSync(tmp, this.epicPath());
45
- }
46
- link(taskSlug, dependsOn) {
47
- const ep = this.read();
48
- const tasks = ep.tasks ?? [];
49
- if (tasks.some((t) => t.slug === taskSlug)) throw new Error(`task "${taskSlug}" already linked to epic "${this.slug}"`);
50
- const taskSet = new Set(tasks.map((t) => t.slug));
51
- for (const dep of dependsOn) if (!taskSet.has(dep)) throw new Error(`dependency "${dep}" not found in epic "${this.slug}"`);
52
- tasks.push({
53
- slug: taskSlug,
54
- status: STATUS_NOT_STARTED,
55
- depends_on: dependsOn.length > 0 ? dependsOn : void 0
56
- });
57
- ep.tasks = tasks;
58
- if (ep.status === "draft") ep.status = STATUS_IN_PROGRESS;
59
- this.save(ep);
60
- }
61
- unlink(taskSlug) {
62
- const ep = this.read();
63
- const tasks = ep.tasks ?? [];
64
- const idx = tasks.findIndex((t) => t.slug === taskSlug);
65
- if (idx === -1) throw new Error(`task "${taskSlug}" not linked to epic "${this.slug}"`);
66
- tasks.splice(idx, 1);
67
- for (const t of tasks) if (t.depends_on) {
68
- t.depends_on = t.depends_on.filter((d) => d !== taskSlug);
69
- if (t.depends_on.length === 0) t.depends_on = void 0;
70
- }
71
- ep.tasks = tasks;
72
- this.save(ep);
73
- }
74
- progress() {
75
- const tasks = this.read().tasks ?? [];
76
- return {
77
- completed: tasks.filter((t) => t.status === STATUS_COMPLETED).length,
78
- total: tasks.length
79
- };
80
- }
81
- };
82
13
  function initEpic(projectPath, slug, name) {
83
14
  if (!VALID_SLUG.test(slug)) throw new Error(`invalid epic_slug "${slug}": must be lowercase alphanumeric with hyphens`);
84
15
  const ed = new EpicDir(projectPath, slug);
@@ -221,5 +152,79 @@ function writeActiveEpics(projectPath, state) {
221
152
  writeFileSync(tmp, data);
222
153
  renameSync(tmp, path);
223
154
  }
155
+ var import_dist, STATUS_DRAFT, STATUS_IN_PROGRESS, STATUS_COMPLETED, STATUS_NOT_STARTED, EpicDir;
156
+ var init_epic = __esmMin((() => {
157
+ import_dist = require_dist();
158
+ init_types();
159
+ STATUS_DRAFT = "draft";
160
+ STATUS_IN_PROGRESS = "in-progress";
161
+ STATUS_COMPLETED = "completed";
162
+ STATUS_NOT_STARTED = "not-started";
163
+ EpicDir = class {
164
+ projectPath;
165
+ slug;
166
+ constructor(projectPath, slug) {
167
+ this.projectPath = projectPath;
168
+ this.slug = slug;
169
+ }
170
+ dir() {
171
+ return join(epicsDir(this.projectPath), this.slug);
172
+ }
173
+ epicPath() {
174
+ return join(this.dir(), "epic.yaml");
175
+ }
176
+ exists() {
177
+ try {
178
+ return statSync(this.dir()).isDirectory();
179
+ } catch {
180
+ return false;
181
+ }
182
+ }
183
+ read() {
184
+ return (0, import_dist.parse)(readFileSync(this.epicPath(), "utf-8"));
185
+ }
186
+ save(ep) {
187
+ const data = (0, import_dist.stringify)(ep);
188
+ const tmp = `${this.epicPath()}.tmp`;
189
+ writeFileSync(tmp, data);
190
+ renameSync(tmp, this.epicPath());
191
+ }
192
+ link(taskSlug, dependsOn) {
193
+ const ep = this.read();
194
+ const tasks = ep.tasks ?? [];
195
+ if (tasks.some((t) => t.slug === taskSlug)) throw new Error(`task "${taskSlug}" already linked to epic "${this.slug}"`);
196
+ const taskSet = new Set(tasks.map((t) => t.slug));
197
+ for (const dep of dependsOn) if (!taskSet.has(dep)) throw new Error(`dependency "${dep}" not found in epic "${this.slug}"`);
198
+ tasks.push({
199
+ slug: taskSlug,
200
+ status: STATUS_NOT_STARTED,
201
+ depends_on: dependsOn.length > 0 ? dependsOn : void 0
202
+ });
203
+ ep.tasks = tasks;
204
+ if (ep.status === "draft") ep.status = STATUS_IN_PROGRESS;
205
+ this.save(ep);
206
+ }
207
+ unlink(taskSlug) {
208
+ const ep = this.read();
209
+ const tasks = ep.tasks ?? [];
210
+ const idx = tasks.findIndex((t) => t.slug === taskSlug);
211
+ if (idx === -1) throw new Error(`task "${taskSlug}" not linked to epic "${this.slug}"`);
212
+ tasks.splice(idx, 1);
213
+ for (const t of tasks) if (t.depends_on) {
214
+ t.depends_on = t.depends_on.filter((d) => d !== taskSlug);
215
+ if (t.depends_on.length === 0) t.depends_on = void 0;
216
+ }
217
+ ep.tasks = tasks;
218
+ this.save(ep);
219
+ }
220
+ progress() {
221
+ const tasks = this.read().tasks ?? [];
222
+ return {
223
+ completed: tasks.filter((t) => t.status === STATUS_COMPLETED).length,
224
+ total: tasks.length
225
+ };
226
+ }
227
+ };
228
+ }));
224
229
  //#endregion
225
- export { removeEpic as a, unlinkTaskFromAllEpics as c, nextActionable as i, initEpic as n, syncTaskStatus as o, listAllEpics as r, topologicalOrder as s, EpicDir as t };
230
+ export { nextActionable as a, topologicalOrder as c, listAllEpics as i, unlinkTaskFromAllEpics as l, initEpic as n, removeEpic as o, init_epic as r, syncTaskStatus as s, EpicDir as t };
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { d as searchKnowledgeKeyword, i as getKnowledgeByIDs, l as mapRow } from "./knowledge-BgWoLpv7.mjs";
3
- import { n as deserializeFloat32, t as cosineSimilarity } from "./vectors-DtWMZUgk.mjs";
2
+ import { n as __esmMin } from "./chunk-CAm0Jl7e.mjs";
3
+ import { f as searchKnowledgeKeyword, i as getKnowledgeByIDs, l as init_knowledge, u as mapRow } from "./knowledge-C7rEfFSX.mjs";
4
+ import { n as deserializeFloat32, r as init_vectors, t as cosineSimilarity } from "./vectors-C3yIO_A5.mjs";
4
5
  //#region src/store/fts.ts
5
6
  function subTypeHalfLife(subType) {
6
7
  switch (subType) {
@@ -142,17 +143,6 @@ function expandAliases(store, terms) {
142
143
  function sanitizeFTSTerm(term) {
143
144
  return term.replace(/["*^{}]/g, "");
144
145
  }
145
- const CONTRADICTION_PAIRS = [
146
- ["always", "never"],
147
- ["must", "must not"],
148
- ["use", "avoid"],
149
- ["enable", "disable"],
150
- ["allow", "deny"],
151
- ["required", "optional"],
152
- ["do", "don't"],
153
- ["add", "remove"],
154
- ["include", "exclude"]
155
- ];
156
146
  function classifyConflict(contentA, contentB) {
157
147
  const lowerA = contentA.toLowerCase();
158
148
  const lowerB = contentB.toLowerCase();
@@ -191,5 +181,21 @@ function fuzzyMatch(query, target) {
191
181
  if (maxDist === 0) maxDist = 1;
192
182
  return levenshtein(query.toLowerCase(), target.toLowerCase()) <= maxDist;
193
183
  }
184
+ var CONTRADICTION_PAIRS;
185
+ var init_fts = __esmMin((() => {
186
+ init_knowledge();
187
+ init_vectors();
188
+ CONTRADICTION_PAIRS = [
189
+ ["always", "never"],
190
+ ["must", "must not"],
191
+ ["use", "avoid"],
192
+ ["enable", "disable"],
193
+ ["allow", "deny"],
194
+ ["required", "optional"],
195
+ ["do", "don't"],
196
+ ["add", "remove"],
197
+ ["include", "exclude"]
198
+ ];
199
+ }));
194
200
  //#endregion
195
- export { subTypeHalfLife as i, searchKnowledgeFTS as n, subTypeBoost as r, detectKnowledgeConflicts as t };
201
+ export { subTypeHalfLife as a, subTypeBoost as i, init_fts as n, searchKnowledgeFTS as r, detectKnowledgeConflicts as t };
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+ import { n as __esmMin } from "./chunk-CAm0Jl7e.mjs";
2
3
  import { createHash } from "node:crypto";
3
4
  //#region src/store/knowledge.ts
4
5
  function contentHash(content) {
@@ -168,5 +169,6 @@ function mapRow(r) {
168
169
  enabled: r.enabled === 1
169
170
  };
170
171
  }
172
+ var init_knowledge = __esmMin((() => {}));
171
173
  //#endregion
172
- export { getKnowledgeStats as a, incrementHitCount as c, searchKnowledgeKeyword as d, setKnowledgeEnabled as f, getKnowledgeByIDs as i, mapRow as l, deleteOrphanKnowledge as n, getPromotionCandidates as o, upsertKnowledge as p, getKnowledgeByID as r, getRecentDecisions as s, countKnowledge as t, promoteSubType as u };
174
+ export { getKnowledgeStats as a, incrementHitCount as c, promoteSubType as d, searchKnowledgeKeyword as f, getKnowledgeByIDs as i, init_knowledge as l, upsertKnowledge as m, deleteOrphanKnowledge as n, getPromotionCandidates as o, setKnowledgeEnabled as p, getKnowledgeByID as r, getRecentDecisions as s, countKnowledge as t, mapRow as u };