taskflow-core 0.1.4 → 0.1.6
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/LICENSE +21 -0
- package/README.md +120 -27
- package/dist/agents.d.ts +20 -0
- package/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +51 -2
- package/dist/agents.js.map +1 -1
- package/dist/detached-runner.js +17 -0
- package/dist/detached-runner.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/interpolate.d.ts +5 -0
- package/dist/interpolate.d.ts.map +1 -1
- package/dist/interpolate.js +14 -3
- package/dist/interpolate.js.map +1 -1
- package/dist/jsonc.d.ts +30 -0
- package/dist/jsonc.d.ts.map +1 -0
- package/dist/jsonc.js +108 -0
- package/dist/jsonc.js.map +1 -0
- package/dist/library/meta.d.ts +31 -0
- package/dist/library/meta.d.ts.map +1 -0
- package/dist/library/meta.js +154 -0
- package/dist/library/meta.js.map +1 -0
- package/dist/library/search.d.ts +32 -0
- package/dist/library/search.d.ts.map +1 -0
- package/dist/library/search.js +298 -0
- package/dist/library/search.js.map +1 -0
- package/dist/library/types.d.ts +121 -0
- package/dist/library/types.d.ts.map +1 -0
- package/dist/library/types.js +18 -0
- package/dist/library/types.js.map +1 -0
- package/dist/reflexion.d.ts +46 -0
- package/dist/reflexion.d.ts.map +1 -0
- package/dist/reflexion.js +100 -0
- package/dist/reflexion.js.map +1 -0
- package/dist/runner-core.d.ts +54 -4
- package/dist/runner-core.d.ts.map +1 -1
- package/dist/runner-core.js +237 -10
- package/dist/runner-core.js.map +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +353 -16
- package/dist/runtime.js.map +1 -1
- package/dist/schema.d.ts +11 -5
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +113 -2
- package/dist/schema.js.map +1 -1
- package/dist/scorer-runtime.d.ts +30 -0
- package/dist/scorer-runtime.d.ts.map +1 -0
- package/dist/scorer-runtime.js +134 -0
- package/dist/scorer-runtime.js.map +1 -0
- package/dist/scorers.d.ts +120 -0
- package/dist/scorers.d.ts.map +1 -0
- package/dist/scorers.js +313 -0
- package/dist/scorers.js.map +1 -0
- package/dist/store.d.ts +56 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +129 -1
- package/dist/store.js.map +1 -1
- package/package.json +6 -7
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Library — search ranking (structural + keyword; Phase 1).
|
|
3
|
+
*
|
|
4
|
+
* Phase 2 adds the embedding/cosine path; the seam (LibraryDeps.embedder) is
|
|
5
|
+
* already in place but left unused here. When no embedder is configured OR
|
|
6
|
+
* structureOnly is set, search degrades to keyword + structural ranking.
|
|
7
|
+
*
|
|
8
|
+
* Refs: docs/rfc-library-reuse.md §5.2 (blend), §5.2.1 (structScore),
|
|
9
|
+
* §5.2.2 (staleness), §5.3 (why/reuseHint templates).
|
|
10
|
+
*/
|
|
11
|
+
import { getFlow, listFlows, readMeta } from "../store.js";
|
|
12
|
+
import { computeGenerality, computePhaseSignature, countPhases, extractAgentUsage, } from "./meta.js";
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Levenshtein (RFC §5.2.1)
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/** Standard Levenshtein edit distance (insert/delete/replace cost 1).
|
|
17
|
+
* O(m·n) DP; signature strings are short (<50 chars) so cost is negligible. */
|
|
18
|
+
export function levenshtein(a, b) {
|
|
19
|
+
if (a === b)
|
|
20
|
+
return 0;
|
|
21
|
+
if (a.length === 0)
|
|
22
|
+
return b.length;
|
|
23
|
+
if (b.length === 0)
|
|
24
|
+
return a.length;
|
|
25
|
+
const m = a.length;
|
|
26
|
+
const n = b.length;
|
|
27
|
+
// Two rolling rows; allocate fresh each call (signatures are tiny).
|
|
28
|
+
let prev = new Array(n + 1);
|
|
29
|
+
for (let j = 0; j <= n; j++)
|
|
30
|
+
prev[j] = j;
|
|
31
|
+
for (let i = 1; i <= m; i++) {
|
|
32
|
+
const curr = new Array(n + 1);
|
|
33
|
+
curr[0] = i;
|
|
34
|
+
for (let j = 1; j <= n; j++) {
|
|
35
|
+
const cost = a.charCodeAt(i - 1) === b.charCodeAt(j - 1) ? 0 : 1;
|
|
36
|
+
curr[j] = Math.min(curr[j - 1] + 1, prev[j] + 1, prev[j - 1] + cost);
|
|
37
|
+
}
|
|
38
|
+
prev = curr;
|
|
39
|
+
}
|
|
40
|
+
return prev[n];
|
|
41
|
+
}
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Candidate resolution (RFC §5.2.2 staleness detection)
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
/** Resolve a saved flow + its sidecar into a candidate whose structural fields
|
|
46
|
+
* are ALWAYS freshly derived from the current def, and whose embedding is only
|
|
47
|
+
* trusted when the sidecar's phaseSignature matches the fresh one. */
|
|
48
|
+
export function resolveCandidate(def, scope, name, sidecar) {
|
|
49
|
+
const freshSig = computePhaseSignature(def);
|
|
50
|
+
const freshGen = computeGenerality(def);
|
|
51
|
+
const freshAgents = extractAgentUsage(def);
|
|
52
|
+
const freshCount = countPhases(def);
|
|
53
|
+
if (!sidecar) {
|
|
54
|
+
return {
|
|
55
|
+
name,
|
|
56
|
+
scope,
|
|
57
|
+
def,
|
|
58
|
+
phaseSignature: freshSig,
|
|
59
|
+
phaseCount: freshCount,
|
|
60
|
+
agentUsage: freshAgents,
|
|
61
|
+
generality: freshGen,
|
|
62
|
+
reuseCount: 0,
|
|
63
|
+
version: 1,
|
|
64
|
+
embedding: null,
|
|
65
|
+
embeddingStale: true,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const sigMatch = sidecar.phaseSignature === freshSig;
|
|
69
|
+
return {
|
|
70
|
+
name,
|
|
71
|
+
scope,
|
|
72
|
+
def,
|
|
73
|
+
phaseSignature: freshSig,
|
|
74
|
+
phaseCount: freshCount,
|
|
75
|
+
agentUsage: freshAgents,
|
|
76
|
+
generality: freshGen,
|
|
77
|
+
purpose: sidecar.purpose,
|
|
78
|
+
tags: sidecar.tags,
|
|
79
|
+
notes: sidecar.notes,
|
|
80
|
+
reuseCount: sidecar.reuseCount ?? 0,
|
|
81
|
+
version: sidecar.version ?? 1,
|
|
82
|
+
derivedFrom: sidecar.derivedFrom,
|
|
83
|
+
embedding: sigMatch ? sidecar.embedding ?? null : null,
|
|
84
|
+
embeddingStale: !sigMatch,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
// Scoring
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
/** structScore ∈ [0,1]. RFC §5.2.1: 0.7*sigSim + 0.3*countPenalty. */
|
|
91
|
+
function computeStructScore(query, cand) {
|
|
92
|
+
let sigSim = 0;
|
|
93
|
+
if (cand.phaseSignature && query.phaseSignature) {
|
|
94
|
+
const d = levenshtein(query.phaseSignature, cand.phaseSignature);
|
|
95
|
+
const denom = Math.max(query.phaseSignature.length, cand.phaseSignature.length, 1);
|
|
96
|
+
sigSim = 1 - d / denom;
|
|
97
|
+
if (sigSim < 0)
|
|
98
|
+
sigSim = 0;
|
|
99
|
+
}
|
|
100
|
+
let countPenalty = 0;
|
|
101
|
+
if (query.phaseCount > 0 && cand.phaseCount > 0) {
|
|
102
|
+
const diff = Math.abs(query.phaseCount - cand.phaseCount);
|
|
103
|
+
countPenalty = 1 - Math.min(1, diff / Math.max(query.phaseCount, cand.phaseCount));
|
|
104
|
+
}
|
|
105
|
+
return 0.7 * sigSim + 0.3 * countPenalty;
|
|
106
|
+
}
|
|
107
|
+
/** textScore ∈ [0,1]. Token-overlap between query and the flow's text fields
|
|
108
|
+
* (name + purpose + tags + phase task text). CJK-aware: queries tokenized on
|
|
109
|
+
* whitespace AND matched as substrings, so a Chinese query token like "鉴权"
|
|
110
|
+
* still matches a purpose containing "...缺少鉴权检查..." (which whitespace
|
|
111
|
+
* alone would never split out). */
|
|
112
|
+
function computeTextScore(queryTokens, cand) {
|
|
113
|
+
if (queryTokens.length === 0)
|
|
114
|
+
return 0;
|
|
115
|
+
const fieldText = ((cand.name ?? "") +
|
|
116
|
+
" " +
|
|
117
|
+
(cand.purpose ?? "") +
|
|
118
|
+
" " +
|
|
119
|
+
(cand.tags ?? []).join(" ") +
|
|
120
|
+
" " +
|
|
121
|
+
cand.phaseTaskText).toLowerCase();
|
|
122
|
+
if (!fieldText.trim())
|
|
123
|
+
return 0;
|
|
124
|
+
// Substring match per query token (CJK-friendly). Longer tokens weigh more
|
|
125
|
+
// (they carry more signal) so e.g. a 2-char Chinese term counts more than a
|
|
126
|
+
// 2-char English one only marginally; this keeps the [0,1] shape intuitive.
|
|
127
|
+
let hits = 0;
|
|
128
|
+
for (const t of queryTokens) {
|
|
129
|
+
if (!t)
|
|
130
|
+
continue;
|
|
131
|
+
if (fieldText.includes(t))
|
|
132
|
+
hits++;
|
|
133
|
+
}
|
|
134
|
+
return hits / queryTokens.length;
|
|
135
|
+
}
|
|
136
|
+
function tokenize(query) {
|
|
137
|
+
return query
|
|
138
|
+
.toLowerCase()
|
|
139
|
+
.split(/[^\p{L}\p{N}]+/u)
|
|
140
|
+
.filter((t) => t.length > 1);
|
|
141
|
+
}
|
|
142
|
+
function phaseTaskText(def) {
|
|
143
|
+
if (!Array.isArray(def.phases))
|
|
144
|
+
return "";
|
|
145
|
+
const parts = [];
|
|
146
|
+
for (const p of def.phases) {
|
|
147
|
+
if (typeof p.task === "string")
|
|
148
|
+
parts.push(p.task);
|
|
149
|
+
if (Array.isArray(p.branches)) {
|
|
150
|
+
for (const b of p.branches ?? []) {
|
|
151
|
+
if (b?.task)
|
|
152
|
+
parts.push(b.task);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return parts.join(" ");
|
|
157
|
+
}
|
|
158
|
+
// ---------------------------------------------------------------------------
|
|
159
|
+
// why / reuseHint templates (RFC §5.3, Tier 1, zero-token)
|
|
160
|
+
// ---------------------------------------------------------------------------
|
|
161
|
+
function buildWhy(s) {
|
|
162
|
+
const hits = [];
|
|
163
|
+
if ((s.searchMode === "semantic" || s.searchMode === "mixed") && s.semScore != null && s.semScore > 0.7) {
|
|
164
|
+
hits.push(`语义命中(sem=${s.semScore.toFixed(2)})`);
|
|
165
|
+
}
|
|
166
|
+
if (s.structScore > 0.8)
|
|
167
|
+
hits.push(`结构一致(struct=${s.structScore.toFixed(2)})`);
|
|
168
|
+
if (s.textScore > 0.3)
|
|
169
|
+
hits.push(`关键词匹配(text=${s.textScore.toFixed(2)})`);
|
|
170
|
+
return hits.length > 0 ? hits.join(" + ") : "低分命中,建议检查";
|
|
171
|
+
}
|
|
172
|
+
function buildReuseHint(r) {
|
|
173
|
+
if (r.score >= 0.8)
|
|
174
|
+
return `直接复用${r.argCount > 0 ? `,注意 ${r.argCount} 个 args 参数` : ""}`;
|
|
175
|
+
if (r.score >= 0.5)
|
|
176
|
+
return `结构相似,建议 copy + 泛化后使用`;
|
|
177
|
+
return `低相关度,建议从头编写或大幅改写`;
|
|
178
|
+
}
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
// searchLibrary
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
function argCountOf(def) {
|
|
183
|
+
return def.args && typeof def.args === "object" ? Object.keys(def.args).length : 0;
|
|
184
|
+
}
|
|
185
|
+
/** Search the library. Returns ranked top-N. Degrades to structural/keyword
|
|
186
|
+
* when no embedder is configured or structureOnly is requested. */
|
|
187
|
+
export async function searchLibrary(deps, input) {
|
|
188
|
+
const limit = Math.min(20, Math.max(1, input.limit ?? 5));
|
|
189
|
+
const minScore = input.minScore ?? 0;
|
|
190
|
+
const scope = input.scope ?? deps.settings.scope ?? "both";
|
|
191
|
+
// gather candidates
|
|
192
|
+
const flows = listFlows(deps.cwd).filter((f) => {
|
|
193
|
+
if (scope === "both")
|
|
194
|
+
return true;
|
|
195
|
+
return f.scope === scope;
|
|
196
|
+
});
|
|
197
|
+
const queryTokens = tokenize(input.query);
|
|
198
|
+
// embed the query if an embedder is available and not structureOnly
|
|
199
|
+
let queryVec = null;
|
|
200
|
+
const hasEmbedder = !!deps.embedder && !input.structureOnly;
|
|
201
|
+
if (hasEmbedder && deps.embedder) {
|
|
202
|
+
try {
|
|
203
|
+
queryVec = await deps.embedder.embed(input.query);
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
queryVec = null; // degrade
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const scored = [];
|
|
210
|
+
for (const f of flows) {
|
|
211
|
+
const sidecar = readMeta(deps.cwd, f.name);
|
|
212
|
+
const cand = resolveCandidate(f.def, f.scope, f.name, sidecar);
|
|
213
|
+
const qShape = {
|
|
214
|
+
phaseSignature: input.phaseSignatureHint ?? "",
|
|
215
|
+
phaseCount: input.phaseCountHint ?? 0,
|
|
216
|
+
};
|
|
217
|
+
const structScore = computeStructScore(qShape, cand);
|
|
218
|
+
const textScore = computeTextScore(queryTokens, {
|
|
219
|
+
name: cand.name,
|
|
220
|
+
purpose: cand.purpose,
|
|
221
|
+
tags: cand.tags,
|
|
222
|
+
phaseTaskText: phaseTaskText(cand.def),
|
|
223
|
+
});
|
|
224
|
+
let score;
|
|
225
|
+
let semScore;
|
|
226
|
+
const hasVectors = queryVec != null && cand.embedding != null && !cand.embeddingStale;
|
|
227
|
+
if (hasVectors && queryVec && cand.embedding) {
|
|
228
|
+
semScore = cosine(queryVec, cand.embedding);
|
|
229
|
+
score = 0.6 * semScore + 0.25 * structScore + 0.15 * textScore;
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
score = 0.6 * textScore + 0.4 * structScore;
|
|
233
|
+
}
|
|
234
|
+
if (score < minScore)
|
|
235
|
+
continue;
|
|
236
|
+
if (score <= 0)
|
|
237
|
+
continue; // zero-relevance results are noise; don't surface them
|
|
238
|
+
scored.push({ cand, score: Math.round(score * 100) / 100, semScore, structScore, textScore });
|
|
239
|
+
}
|
|
240
|
+
scored.sort((a, b) => b.score - a.score);
|
|
241
|
+
const top = scored.slice(0, limit);
|
|
242
|
+
const withVectors = top.filter((s) => s.cand.embedding != null && !s.cand.embeddingStale).length;
|
|
243
|
+
let searchMode;
|
|
244
|
+
if (input.structureOnly || !deps.embedder || withVectors === 0)
|
|
245
|
+
searchMode = "structural";
|
|
246
|
+
else if (withVectors === top.length)
|
|
247
|
+
searchMode = "semantic";
|
|
248
|
+
else
|
|
249
|
+
searchMode = "mixed";
|
|
250
|
+
const results = top.map((s) => ({
|
|
251
|
+
name: s.cand.name,
|
|
252
|
+
scope: s.cand.scope,
|
|
253
|
+
purpose: s.cand.purpose,
|
|
254
|
+
tags: s.cand.tags,
|
|
255
|
+
phaseSignature: s.cand.phaseSignature,
|
|
256
|
+
phaseCount: s.cand.phaseCount,
|
|
257
|
+
generality: s.cand.generality,
|
|
258
|
+
reuseCount: s.cand.reuseCount,
|
|
259
|
+
version: s.cand.version,
|
|
260
|
+
score: s.score,
|
|
261
|
+
why: buildWhy({ semScore: s.semScore, structScore: s.structScore, textScore: s.textScore, searchMode }),
|
|
262
|
+
reuseHint: buildReuseHint({ score: s.score, argCount: argCountOf(s.cand.def) }),
|
|
263
|
+
}));
|
|
264
|
+
return {
|
|
265
|
+
results,
|
|
266
|
+
searchMode,
|
|
267
|
+
embedder: deps.embedder?.model,
|
|
268
|
+
counts: { scanned: flows.length, withVectors },
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
/** Pure cosine similarity. Zero-dep. Accepts non-normalized vectors. */
|
|
272
|
+
export function cosine(a, b) {
|
|
273
|
+
const n = Math.min(a.length, b.length);
|
|
274
|
+
if (n === 0)
|
|
275
|
+
return 0;
|
|
276
|
+
let dot = 0;
|
|
277
|
+
let normA = 0;
|
|
278
|
+
let normB = 0;
|
|
279
|
+
for (let i = 0; i < n; i++) {
|
|
280
|
+
const x = a[i];
|
|
281
|
+
const y = b[i];
|
|
282
|
+
if (!Number.isFinite(x) || !Number.isFinite(y))
|
|
283
|
+
continue;
|
|
284
|
+
dot += x * y;
|
|
285
|
+
normA += x * x;
|
|
286
|
+
normB += y * y;
|
|
287
|
+
}
|
|
288
|
+
if (normA === 0 || normB === 0)
|
|
289
|
+
return 0;
|
|
290
|
+
return dot / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
291
|
+
}
|
|
292
|
+
/** Bump reuseCount for a flow by name (RFC §6 reuse flywheel).
|
|
293
|
+
* Phase 1: structural-only; the caller (tool handler) decides whether to
|
|
294
|
+
* bump based on a `reusedFromSearch` flag. Returns the new count or null if
|
|
295
|
+
* the flow has no sidecar yet. The actual sidecar write is done by
|
|
296
|
+
* `bumpReuseInSidecar` in store.ts under withLock. */
|
|
297
|
+
export { getFlow };
|
|
298
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/library/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,EACN,iBAAiB,EACjB,qBAAqB,EACrB,WAAW,EACX,iBAAiB,GACjB,MAAM,WAAW,CAAC;AASnB,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E;gFACgF;AAChF,MAAM,UAAU,WAAW,CAAC,CAAS,EAAE,CAAS;IAC/C,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IACpC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,oEAAoE;IACpE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,KAAK,CAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,GAAG,IAAI,CAAC;IACb,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,wDAAwD;AACxD,8EAA8E;AAE9E;;uEAEuE;AACvE,MAAM,UAAU,gBAAgB,CAC/B,GAAa,EACb,KAAyB,EACzB,IAAY,EACZ,OAAoC;IAEpC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAEpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO;YACN,IAAI;YACJ,KAAK;YACL,GAAG;YACH,cAAc,EAAE,QAAQ;YACxB,UAAU,EAAE,UAAU;YACtB,UAAU,EAAE,WAAW;YACvB,UAAU,EAAE,QAAQ;YACpB,UAAU,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,IAAI;YACf,cAAc,EAAE,IAAI;SACpB,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,KAAK,QAAQ,CAAC;IACrD,OAAO;QACN,IAAI;QACJ,KAAK;QACL,GAAG;QACH,cAAc,EAAE,QAAQ;QACxB,UAAU,EAAE,UAAU;QACtB,UAAU,EAAE,WAAW;QACvB,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC;QACnC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC;QAC7B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI;QACtD,cAAc,EAAE,CAAC,QAAQ;KACzB,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,sEAAsE;AACtE,SAAS,kBAAkB,CAC1B,KAAqD,EACrD,IAAoD;IAEpD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACjD,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnF,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACvB,IAAI,MAAM,GAAG,CAAC;YAAE,MAAM,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1D,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,GAAG,GAAG,MAAM,GAAG,GAAG,GAAG,YAAY,CAAC;AAC1C,CAAC;AAED;;;;oCAIoC;AACpC,SAAS,gBAAgB,CAAC,WAAqB,EAAE,IAKhD;IACA,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,CACjB,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QACjB,GAAG;QACH,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QACpB,GAAG;QACH,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC3B,GAAG;QACH,IAAI,CAAC,aAAa,CAClB,CAAC,WAAW,EAAE,CAAC;IAChB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,CAAC;IAChC,2EAA2E;IAC3E,4EAA4E;IAC5E,4EAA4E;IAC5E,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC7B,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,IAAI,EAAE,CAAC;IACnC,CAAC;IACD,OAAO,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC;AAClC,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC9B,OAAO,KAAK;SACV,WAAW,EAAE;SACb,KAAK,CAAC,iBAAiB,CAAC;SACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,aAAa,CAAC,GAAa;IACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,KAAK,CAAC,OAAO,CAAE,CAA4B,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3D,KAAK,MAAM,CAAC,IAAK,CAA6C,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;gBAC/E,IAAI,CAAC,EAAE,IAAI;oBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAED,8EAA8E;AAC9E,2DAA2D;AAC3D,8EAA8E;AAE9E,SAAS,QAAQ,CAAC,CAKjB;IACA,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,IAAI,CAAC,CAAC,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI,IAAI,CAAC,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC;QACzG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,CAAC,CAAC,WAAW,GAAG,GAAG;QAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/E,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG;QAAE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1E,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;AACzD,CAAC;AAED,SAAS,cAAc,CAAC,CAAsC;IAC7D,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG;QAAE,OAAO,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACxF,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG;QAAE,OAAO,sBAAsB,CAAC;IAClD,OAAO,kBAAkB,CAAC;AAC3B,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,SAAS,UAAU,CAAC,GAAa;IAChC,OAAO,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAA+B,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/G,CAAC;AAED;oEACoE;AACpE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAiB,EAAE,KAAkB;IACxE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,MAAM,CAAC;IAE3D,oBAAoB;IACpB,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9C,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;QAClC,OAAO,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE1C,oEAAoE;IACpE,IAAI,QAAQ,GAAoB,IAAI,CAAC;IACrC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;IAC5D,IAAI,WAAW,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,IAAI,CAAC;YACJ,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACR,QAAQ,GAAG,IAAI,CAAC,CAAC,UAAU;QAC5B,CAAC;IACF,CAAC;IAED,MAAM,MAAM,GAAiH,EAAE,CAAC;IAChI,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG;YACd,cAAc,EAAE,KAAK,CAAC,kBAAkB,IAAI,EAAE;YAC9C,UAAU,EAAE,KAAK,CAAC,cAAc,IAAI,CAAC;SACrC,CAAC;QACF,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,gBAAgB,CAAC,WAAW,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,aAAa,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;SACtC,CAAC,CAAC;QAEH,IAAI,KAAa,CAAC;QAClB,IAAI,QAA4B,CAAC;QACjC,MAAM,UAAU,GAAG,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;QACtF,IAAI,UAAU,IAAI,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC9C,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC5C,KAAK,GAAG,GAAG,GAAG,QAAQ,GAAG,IAAI,GAAG,WAAW,GAAG,IAAI,GAAG,SAAS,CAAC;QAChE,CAAC;aAAM,CAAC;YACP,KAAK,GAAG,GAAG,GAAG,SAAS,GAAG,GAAG,GAAG,WAAW,CAAC;QAC7C,CAAC;QACD,IAAI,KAAK,GAAG,QAAQ;YAAE,SAAS;QAC/B,IAAI,KAAK,IAAI,CAAC;YAAE,SAAS,CAAC,uDAAuD;QACjF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAEnC,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC;IACjG,IAAI,UAA+C,CAAC;IACpD,IAAI,KAAK,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,WAAW,KAAK,CAAC;QAAE,UAAU,GAAG,YAAY,CAAC;SACrF,IAAI,WAAW,KAAK,GAAG,CAAC,MAAM;QAAE,UAAU,GAAG,UAAU,CAAC;;QACxD,UAAU,GAAG,OAAO,CAAC;IAE1B,MAAM,OAAO,GAAmB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;QACjB,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK;QACnB,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO;QACvB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;QACjB,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc;QACrC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU;QAC7B,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU;QAC7B,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU;QAC7B,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO;QACvB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;QACvG,SAAS,EAAE,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;KAC/E,CAAC,CAAC,CAAC;IAEJ,OAAO;QACN,OAAO;QACP,UAAU;QACV,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK;QAC9B,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE;KAC9C,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,MAAM,CAAC,CAAW,EAAE,CAAW;IAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACf,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,SAAS;QACzD,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;IACD,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACzC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACpD,CAAC;AAED;;;;uDAIuD;AACvD,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Library — reusable-flow asset layer types.
|
|
3
|
+
*
|
|
4
|
+
* The library lets taskflow accumulate, retrieve, and iteratively generalize
|
|
5
|
+
* saved flows. Phase 1 (this module) defines the data shapes and the
|
|
6
|
+
* host-neutral interfaces; the runtime logic (meta derivation, search ranking)
|
|
7
|
+
* lives in `meta.ts` / `search.ts`, and persistence (sidecar `.meta.json`)
|
|
8
|
+
* lives in `store.ts`.
|
|
9
|
+
*
|
|
10
|
+
* Design refs: docs/rfc-library-reuse.md (§3 data format, §4 embedder, §5
|
|
11
|
+
* search). Embedding support is Phase 2 — Phase 1 ships with structural /
|
|
12
|
+
* keyword search only and every embedding field is optional.
|
|
13
|
+
*/
|
|
14
|
+
import type { Taskflow } from "../schema.ts";
|
|
15
|
+
/** Library-side settings, nested under `settings.json → taskflow.library`. */
|
|
16
|
+
export interface LibrarySettings {
|
|
17
|
+
/** Master switch. Default true. When false, search/save-meta are no-ops. */
|
|
18
|
+
enabled: boolean;
|
|
19
|
+
/** Which scopes to search: "project" | "user" | "both" (default both). */
|
|
20
|
+
scope: "project" | "user" | "both";
|
|
21
|
+
/** Optional blend weights for mixed search ranking (Phase 2). */
|
|
22
|
+
searchWeights?: {
|
|
23
|
+
semantic: number;
|
|
24
|
+
structural: number;
|
|
25
|
+
textual: number;
|
|
26
|
+
};
|
|
27
|
+
/** Optional Phase-3 auto-prune threshold. */
|
|
28
|
+
maxFlows?: number;
|
|
29
|
+
}
|
|
30
|
+
export declare const DEFAULT_LIBRARY_SETTINGS: LibrarySettings;
|
|
31
|
+
/** The sidecar `.meta.json` record. Persisted next to a flow file. */
|
|
32
|
+
export interface FlowMeta {
|
|
33
|
+
schemaVersion: 1;
|
|
34
|
+
/** Agent-provided (optional). */
|
|
35
|
+
purpose?: string;
|
|
36
|
+
tags?: string[];
|
|
37
|
+
notes?: string;
|
|
38
|
+
/** Auto-derived at save time. */
|
|
39
|
+
phaseSignature: string;
|
|
40
|
+
phaseCount: number;
|
|
41
|
+
agentUsage: string[];
|
|
42
|
+
generality: number;
|
|
43
|
+
argShape?: Record<string, string>;
|
|
44
|
+
/** Reuse flywheel. */
|
|
45
|
+
reuseCount: number;
|
|
46
|
+
lastUsedAt: number | null;
|
|
47
|
+
createdAt: number;
|
|
48
|
+
version: number;
|
|
49
|
+
derivedFrom?: string;
|
|
50
|
+
/** Embedding (Phase 2; always optional / may be null). */
|
|
51
|
+
embeddingModel?: string;
|
|
52
|
+
embeddingDim?: number;
|
|
53
|
+
embedding?: number[] | null;
|
|
54
|
+
embeddedAt?: number | null;
|
|
55
|
+
}
|
|
56
|
+
/** A candidate resolved for search: live-derived structural fields + trusted
|
|
57
|
+
* sidecar fields (purpose/tags/...) + embedding gated on signature match.
|
|
58
|
+
* (RFC §5.2.2 staleness detection.) */
|
|
59
|
+
export interface ResolvedCandidate {
|
|
60
|
+
name: string;
|
|
61
|
+
scope: "user" | "project";
|
|
62
|
+
def: Taskflow;
|
|
63
|
+
phaseSignature: string;
|
|
64
|
+
phaseCount: number;
|
|
65
|
+
agentUsage: string[];
|
|
66
|
+
generality: number;
|
|
67
|
+
purpose?: string;
|
|
68
|
+
tags?: string[];
|
|
69
|
+
notes?: string;
|
|
70
|
+
reuseCount: number;
|
|
71
|
+
version: number;
|
|
72
|
+
derivedFrom?: string;
|
|
73
|
+
embedding: number[] | null;
|
|
74
|
+
embeddingStale: boolean;
|
|
75
|
+
}
|
|
76
|
+
export interface SearchResult {
|
|
77
|
+
name: string;
|
|
78
|
+
scope: "user" | "project";
|
|
79
|
+
purpose?: string;
|
|
80
|
+
tags?: string[];
|
|
81
|
+
phaseSignature: string;
|
|
82
|
+
phaseCount: number;
|
|
83
|
+
generality: number;
|
|
84
|
+
reuseCount: number;
|
|
85
|
+
version: number;
|
|
86
|
+
score: number;
|
|
87
|
+
why: string;
|
|
88
|
+
reuseHint: string;
|
|
89
|
+
}
|
|
90
|
+
export interface SearchResponse {
|
|
91
|
+
results: SearchResult[];
|
|
92
|
+
searchMode: "semantic" | "structural" | "mixed";
|
|
93
|
+
embedder?: string;
|
|
94
|
+
counts: {
|
|
95
|
+
scanned: number;
|
|
96
|
+
withVectors: number;
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** Input to searchLibrary(). */
|
|
100
|
+
export interface SearchInput {
|
|
101
|
+
query: string;
|
|
102
|
+
limit?: number;
|
|
103
|
+
structureOnly?: boolean;
|
|
104
|
+
minScore?: number;
|
|
105
|
+
scope?: "project" | "user" | "both";
|
|
106
|
+
phaseSignatureHint?: string;
|
|
107
|
+
phaseCountHint?: number;
|
|
108
|
+
}
|
|
109
|
+
/** The minimal host-neutral dependency the library functions need.
|
|
110
|
+
* Embedder is Phase 2; Phase 1 leaves it undefined and search degrades to
|
|
111
|
+
* structural/keyword (RFC §4.3, A2: stays OUT of RuntimeDeps). */
|
|
112
|
+
export interface LibraryDeps {
|
|
113
|
+
embedder?: {
|
|
114
|
+
embed(text: string): Promise<number[]>;
|
|
115
|
+
readonly model: string;
|
|
116
|
+
readonly dim: number;
|
|
117
|
+
};
|
|
118
|
+
settings: LibrarySettings;
|
|
119
|
+
cwd: string;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/library/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC/B,4EAA4E;IAC5E,OAAO,EAAE,OAAO,CAAC;IACjB,0EAA0E;IAC1E,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IACnC,iEAAiE;IACjE,aAAa,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,wBAAwB,EAAE,eAGtC,CAAC;AAEF,sEAAsE;AACtE,MAAM,WAAW,QAAQ;IACxB,aAAa,EAAE,CAAC,CAAC;IAEjB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,iCAAiC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAElC,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;wCAEwC;AACxC,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,GAAG,EAAE,QAAQ,CAAC;IAGd,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IAGnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,UAAU,EAAE,UAAU,GAAG,YAAY,GAAG,OAAO,CAAC;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CACjD;AAED,gCAAgC;AAChC,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IACpC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;mEAEmE;AACnE,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,EAAE;QACV,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,QAAQ,EAAE,eAAe,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;CACZ"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Library — reusable-flow asset layer types.
|
|
3
|
+
*
|
|
4
|
+
* The library lets taskflow accumulate, retrieve, and iteratively generalize
|
|
5
|
+
* saved flows. Phase 1 (this module) defines the data shapes and the
|
|
6
|
+
* host-neutral interfaces; the runtime logic (meta derivation, search ranking)
|
|
7
|
+
* lives in `meta.ts` / `search.ts`, and persistence (sidecar `.meta.json`)
|
|
8
|
+
* lives in `store.ts`.
|
|
9
|
+
*
|
|
10
|
+
* Design refs: docs/rfc-library-reuse.md (§3 data format, §4 embedder, §5
|
|
11
|
+
* search). Embedding support is Phase 2 — Phase 1 ships with structural /
|
|
12
|
+
* keyword search only and every embedding field is optional.
|
|
13
|
+
*/
|
|
14
|
+
export const DEFAULT_LIBRARY_SETTINGS = {
|
|
15
|
+
enabled: true,
|
|
16
|
+
scope: "both",
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/library/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAgBH,MAAM,CAAC,MAAM,wBAAwB,GAAoB;IACxD,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,MAAM;CACb,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reflexion memory for loop phases — pure helpers.
|
|
3
|
+
*
|
|
4
|
+
* When a loop phase sets `reflexion: true`, each iteration i > 1 receives a
|
|
5
|
+
* `{reflexion}` placeholder carrying a structured failure summary of the
|
|
6
|
+
* immediately-prior iteration: what happened (contract violation / subagent
|
|
7
|
+
* error / until-not-met), the precise diagnostics, and a truncated output
|
|
8
|
+
* snippet. The model iterates WITH the failure signal instead of re-guessing
|
|
9
|
+
* from a bare output (Reflexion, Shinn et al. 2023 — as a declarative field).
|
|
10
|
+
*
|
|
11
|
+
* Pure and total: assembly never throws on any input (the runtime additionally
|
|
12
|
+
* wraps the call fail-open — a reflexion bug must never sink the phase).
|
|
13
|
+
*/
|
|
14
|
+
/** Cap on the assembled reflexion block (chars). Keeps the injected context
|
|
15
|
+
* from crowding out the actual task in the iteration prompt. */
|
|
16
|
+
export declare const REFLEXION_MAX_CHARS = 2000;
|
|
17
|
+
/** What iteration 1 sees: there is no prior iteration to reflect on. */
|
|
18
|
+
export declare const REFLEXION_SENTINEL = "_(first iteration \u2014 no prior feedback yet)_";
|
|
19
|
+
/** How the prior iteration ended, for the summary headline. */
|
|
20
|
+
export type ReflexionOutcome = "until-not-met" | "contract-violation" | "subagent-error";
|
|
21
|
+
export interface ReflexionInput {
|
|
22
|
+
/** 1-based index of the PRIOR iteration being summarized. */
|
|
23
|
+
iteration: number;
|
|
24
|
+
outcome: ReflexionOutcome;
|
|
25
|
+
/** The prior iteration's raw output (or error-bearing output on failure). */
|
|
26
|
+
output?: string;
|
|
27
|
+
/** errorMessage of a failed prior iteration (contract diagnostics live here). */
|
|
28
|
+
errorMessage?: string;
|
|
29
|
+
/** The loop's `until` expression (shown when outcome is until-not-met). */
|
|
30
|
+
until?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Build the reflexion summary block injected into the next iteration's prompt.
|
|
34
|
+
* Sections are conditional — no empty headings. Total: never throws.
|
|
35
|
+
*/
|
|
36
|
+
export declare function buildReflexionSummary(input: ReflexionInput, maxChars?: number): string;
|
|
37
|
+
/**
|
|
38
|
+
* Pull the per-path diagnostics out of a runOne contract-violation
|
|
39
|
+
* errorMessage ("Output contract violated:\n- $.score: …\n- …").
|
|
40
|
+
* Returns [] for any other error shape.
|
|
41
|
+
*/
|
|
42
|
+
export declare function extractContractDiagnostics(errorMessage?: string): string[];
|
|
43
|
+
/** True when the errorMessage carries a contract violation (classification
|
|
44
|
+
* for ReflexionInput.outcome). */
|
|
45
|
+
export declare function isContractViolation(errorMessage?: string): boolean;
|
|
46
|
+
//# sourceMappingURL=reflexion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflexion.d.ts","sourceRoot":"","sources":["../src/reflexion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;iEACiE;AACjE,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC,wEAAwE;AACxE,eAAO,MAAM,kBAAkB,qDAAgD,CAAC;AAEhF,+DAA+D;AAC/D,MAAM,MAAM,gBAAgB,GACzB,eAAe,GACf,oBAAoB,GACpB,gBAAgB,CAAC;AAEpB,MAAM,WAAW,cAAc;IAC9B,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,GAAE,MAA4B,GAAG,MAAM,CAkC3G;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAO1E;AAED;mCACmC;AACnC,wBAAgB,mBAAmB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAElE"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reflexion memory for loop phases — pure helpers.
|
|
3
|
+
*
|
|
4
|
+
* When a loop phase sets `reflexion: true`, each iteration i > 1 receives a
|
|
5
|
+
* `{reflexion}` placeholder carrying a structured failure summary of the
|
|
6
|
+
* immediately-prior iteration: what happened (contract violation / subagent
|
|
7
|
+
* error / until-not-met), the precise diagnostics, and a truncated output
|
|
8
|
+
* snippet. The model iterates WITH the failure signal instead of re-guessing
|
|
9
|
+
* from a bare output (Reflexion, Shinn et al. 2023 — as a declarative field).
|
|
10
|
+
*
|
|
11
|
+
* Pure and total: assembly never throws on any input (the runtime additionally
|
|
12
|
+
* wraps the call fail-open — a reflexion bug must never sink the phase).
|
|
13
|
+
*/
|
|
14
|
+
/** Cap on the assembled reflexion block (chars). Keeps the injected context
|
|
15
|
+
* from crowding out the actual task in the iteration prompt. */
|
|
16
|
+
export const REFLEXION_MAX_CHARS = 2000;
|
|
17
|
+
/** What iteration 1 sees: there is no prior iteration to reflect on. */
|
|
18
|
+
export const REFLEXION_SENTINEL = "_(first iteration — no prior feedback yet)_";
|
|
19
|
+
/**
|
|
20
|
+
* Build the reflexion summary block injected into the next iteration's prompt.
|
|
21
|
+
* Sections are conditional — no empty headings. Total: never throws.
|
|
22
|
+
*/
|
|
23
|
+
export function buildReflexionSummary(input, maxChars = REFLEXION_MAX_CHARS) {
|
|
24
|
+
const lines = [`## Reflexion: iteration ${input.iteration} (prior)`];
|
|
25
|
+
switch (input.outcome) {
|
|
26
|
+
case "contract-violation":
|
|
27
|
+
lines.push("- Outcome: FAILED — output contract violated");
|
|
28
|
+
break;
|
|
29
|
+
case "subagent-error":
|
|
30
|
+
lines.push("- Outcome: FAILED — subagent error");
|
|
31
|
+
break;
|
|
32
|
+
case "until-not-met":
|
|
33
|
+
lines.push("- Outcome: succeeded, but the stop condition was not met");
|
|
34
|
+
if (input.until)
|
|
35
|
+
lines.push(`- Stop condition still false: \`${oneLine(input.until, 200)}\``);
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
const diags = extractContractDiagnostics(input.errorMessage);
|
|
39
|
+
if (diags.length > 0) {
|
|
40
|
+
lines.push("- Contract diagnostics:");
|
|
41
|
+
for (const d of diags)
|
|
42
|
+
lines.push(` - ${oneLine(d, 200)}`);
|
|
43
|
+
}
|
|
44
|
+
else if (input.outcome !== "until-not-met" && input.errorMessage) {
|
|
45
|
+
lines.push(`- Error: ${oneLine(input.errorMessage, 400)}`);
|
|
46
|
+
}
|
|
47
|
+
lines.push("- Fix the issues above in this iteration.");
|
|
48
|
+
const head = lines.join("\n");
|
|
49
|
+
const output = (input.output ?? "").trim();
|
|
50
|
+
if (!output)
|
|
51
|
+
return truncateBlock(head, maxChars);
|
|
52
|
+
// Fit the output snippet into whatever budget the headline left over.
|
|
53
|
+
const frame = "\n- Prior output (truncated):\n```\n";
|
|
54
|
+
const close = "\n```";
|
|
55
|
+
const budget = maxChars - head.length - frame.length - close.length;
|
|
56
|
+
if (budget < 40)
|
|
57
|
+
return truncateBlock(head, maxChars); // no room for a useful snippet
|
|
58
|
+
const snippet = truncateMiddle(output, budget);
|
|
59
|
+
return `${head}${frame}${snippet}${close}`;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Pull the per-path diagnostics out of a runOne contract-violation
|
|
63
|
+
* errorMessage ("Output contract violated:\n- $.score: …\n- …").
|
|
64
|
+
* Returns [] for any other error shape.
|
|
65
|
+
*/
|
|
66
|
+
export function extractContractDiagnostics(errorMessage) {
|
|
67
|
+
if (!errorMessage || !errorMessage.startsWith("Output contract violated"))
|
|
68
|
+
return [];
|
|
69
|
+
return errorMessage
|
|
70
|
+
.split("\n")
|
|
71
|
+
.slice(1)
|
|
72
|
+
.map((l) => l.replace(/^-\s*/, "").trim())
|
|
73
|
+
.filter((l) => l.length > 0);
|
|
74
|
+
}
|
|
75
|
+
/** True when the errorMessage carries a contract violation (classification
|
|
76
|
+
* for ReflexionInput.outcome). */
|
|
77
|
+
export function isContractViolation(errorMessage) {
|
|
78
|
+
return typeof errorMessage === "string" && errorMessage.startsWith("Output contract violated");
|
|
79
|
+
}
|
|
80
|
+
/** Keep first ~60% and last ~30% of an over-budget string (errors often sit
|
|
81
|
+
* at the end; intent at the start). */
|
|
82
|
+
function truncateMiddle(s, budget) {
|
|
83
|
+
if (s.length <= budget)
|
|
84
|
+
return s;
|
|
85
|
+
const marker = `\n…[truncated ${s.length - budget} chars]…\n`;
|
|
86
|
+
const usable = budget - marker.length;
|
|
87
|
+
if (usable < 20)
|
|
88
|
+
return s.slice(0, Math.max(0, budget));
|
|
89
|
+
const headLen = Math.floor(usable * 0.65);
|
|
90
|
+
const tailLen = usable - headLen;
|
|
91
|
+
return s.slice(0, headLen) + marker + s.slice(s.length - tailLen);
|
|
92
|
+
}
|
|
93
|
+
function truncateBlock(s, maxChars) {
|
|
94
|
+
return s.length <= maxChars ? s : `${s.slice(0, maxChars - 1)}…`;
|
|
95
|
+
}
|
|
96
|
+
function oneLine(s, max) {
|
|
97
|
+
const flat = s.replace(/\s+/g, " ").trim();
|
|
98
|
+
return flat.length <= max ? flat : `${flat.slice(0, max - 1)}…`;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=reflexion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflexion.js","sourceRoot":"","sources":["../src/reflexion.ts"],"names":[],"mappings":"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"}
|