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.
- package/dist/{audit-g6phLGMg.mjs → audit-BoZ1ny8J.mjs} +6 -2
- package/dist/chunk-CAm0Jl7e.mjs +38 -0
- package/dist/cli.mjs +7 -7
- package/dist/{helpers-CvI9bVCq.mjs → directives-DjcVEEC8.mjs} +71 -5
- package/dist/{dispatcher-BWa-6qtR.mjs → dispatcher-BjpWdTBs.mjs} +9 -8
- package/dist/embedder-D3hJoryD.mjs +223 -0
- package/dist/{epic-D9ksT1k7.mjs → epic-s_BVNu2z.mjs} +77 -72
- package/dist/{fts-Buk8fkl1.mjs → fts-DUZkPJPD.mjs} +20 -14
- package/dist/{knowledge-BgWoLpv7.mjs → knowledge-C7rEfFSX.mjs} +3 -1
- package/dist/{living-spec-jepeb0NQ.mjs → living-spec-ZVyfPGMW.mjs} +72 -63
- package/dist/post-tool-CfnMwY6j.mjs +11 -0
- package/dist/{post-tool-wXy5oNCh.mjs → post-tool-O8S54qat.mjs} +405 -25
- package/dist/{pre-compact-Cuxb6ryB.mjs → pre-compact-Cdjtld4A.mjs} +54 -43
- package/dist/{pre-tool-DdZortZJ.mjs → pre-tool-KpwIhe2F.mjs} +11 -4
- package/dist/{project-Cz-yOhrW.mjs → project-DCKke4_Q.mjs} +3 -1
- package/dist/{review-gate-Dn4J5Zjt.mjs → review-gate-DM_o8MKx.mjs} +13 -4
- package/dist/{server-CwcGoHSS.mjs → server-B7dI3oXY.mjs} +12 -6
- package/dist/{server-uRcvcepv.mjs → server-BheF_pZr.mjs} +83 -14
- package/dist/{session-start-DEx6rrId.mjs → session-start-Bul0GicD.mjs} +18 -8
- package/dist/{state-DBoJxogd.mjs → state-7LLZFgmO.mjs} +14 -11
- package/dist/{stop-BIwkuqHf.mjs → stop-BQzq19WO.mjs} +10 -4
- package/dist/{store-D4fokoGA.mjs → store-8O9WUwMu.mjs} +256 -243
- package/dist/{types-DFsKNXVY.mjs → types-BBT-j5-a.mjs} +89 -119
- package/dist/{user-prompt-CsCJ1CKL.mjs → user-prompt-Bzfgl80c.mjs} +102 -92
- package/dist/{vectors-DtWMZUgk.mjs → vectors-C3yIO_A5.mjs} +8 -5
- package/package.json +2 -1
- package/dist/directives-BYP81n78.mjs +0 -57
- package/dist/embedder-CFkDPOku.mjs +0 -214
- package/dist/ledger-CbtIEUYw.mjs +0 -342
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
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-
|
|
373
|
-
const { Embedder } = await import("./embedder-
|
|
374
|
-
const { serveMCP } = await import("./server-
|
|
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-
|
|
401
|
-
const { Embedder } = await import("./embedder-
|
|
402
|
-
const { startDashboard } = await import("./server-
|
|
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-
|
|
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 {
|
|
3
|
-
import {
|
|
4
|
-
import { i as
|
|
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
|
-
|
|
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 {
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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 {
|
|
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 {
|
|
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 {
|
|
3
|
-
import {
|
|
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,
|
|
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,
|
|
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 };
|