@miller-tech/uap 1.27.0 → 1.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/bin/cli.js +5 -0
- package/dist/bin/cli.js.map +1 -1
- package/dist/cli/deliver.d.ts +5 -0
- package/dist/cli/deliver.d.ts.map +1 -1
- package/dist/cli/deliver.js +91 -10
- package/dist/cli/deliver.js.map +1 -1
- package/dist/delivery/applier.d.ts +11 -0
- package/dist/delivery/applier.d.ts.map +1 -1
- package/dist/delivery/applier.js +189 -6
- package/dist/delivery/applier.js.map +1 -1
- package/dist/delivery/convergence-loop.d.ts +75 -13
- package/dist/delivery/convergence-loop.d.ts.map +1 -1
- package/dist/delivery/convergence-loop.js +209 -58
- package/dist/delivery/convergence-loop.js.map +1 -1
- package/dist/delivery/critic.d.ts +35 -0
- package/dist/delivery/critic.d.ts.map +1 -0
- package/dist/delivery/critic.js +77 -0
- package/dist/delivery/critic.js.map +1 -0
- package/dist/delivery/escalation.d.ts +66 -0
- package/dist/delivery/escalation.d.ts.map +1 -0
- package/dist/delivery/escalation.js +84 -0
- package/dist/delivery/escalation.js.map +1 -0
- package/dist/delivery/explorer.d.ts +77 -0
- package/dist/delivery/explorer.d.ts.map +1 -0
- package/dist/delivery/explorer.js +166 -0
- package/dist/delivery/explorer.js.map +1 -0
- package/dist/delivery/index.d.ts +7 -2
- package/dist/delivery/index.d.ts.map +1 -1
- package/dist/delivery/index.js +6 -1
- package/dist/delivery/index.js.map +1 -1
- package/dist/delivery/judge.d.ts +33 -0
- package/dist/delivery/judge.d.ts.map +1 -0
- package/dist/delivery/judge.js +70 -0
- package/dist/delivery/judge.js.map +1 -0
- package/dist/delivery/practice.d.ts +72 -0
- package/dist/delivery/practice.d.ts.map +1 -0
- package/dist/delivery/practice.js +185 -0
- package/dist/delivery/practice.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Practice Store (Phase 4)
|
|
3
|
+
*
|
|
4
|
+
* Best-practice "cards" learned from past deliveries and injected into future
|
|
5
|
+
* prompts for similar tasks. A card records guidance distilled from a
|
|
6
|
+
* *successful* run — the winning strategy seed and how many turns it took —
|
|
7
|
+
* keyed by task keywords.
|
|
8
|
+
*
|
|
9
|
+
* Provenance matters: cards are derived from the harness's own strategy seeds
|
|
10
|
+
* and gate outcomes, never from raw model output. This keeps the long-term
|
|
11
|
+
* store free of model-authored text (a stored-prompt-injection vector).
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'fs';
|
|
14
|
+
import { dirname, join } from 'path';
|
|
15
|
+
/** Strategy ids are harness-owned seed labels; this guards the template
|
|
16
|
+
* against injection if a tampered store supplies an arbitrary string. */
|
|
17
|
+
const STRATEGY_RE = /^[a-z][a-z0-9-]{0,31}$/;
|
|
18
|
+
const STOP_WORDS = new Set([
|
|
19
|
+
'the', 'a', 'an', 'to', 'of', 'and', 'or', 'in', 'on', 'for', 'with', 'that',
|
|
20
|
+
'returns', 'return', 'create', 'add', 'make', 'write', 'into', 'from', 'as',
|
|
21
|
+
'is', 'it', 'be', 'should', 'when', 'this', 'each', 'two', 'using',
|
|
22
|
+
]);
|
|
23
|
+
/** Extract lowercased keyword tokens from a task instruction. */
|
|
24
|
+
export function extractKeywords(text, max = 12) {
|
|
25
|
+
const seen = new Set();
|
|
26
|
+
const tokens = [];
|
|
27
|
+
for (const raw of text.toLowerCase().split(/[^a-z0-9]+/)) {
|
|
28
|
+
if (raw.length < 3 || STOP_WORDS.has(raw) || seen.has(raw))
|
|
29
|
+
continue;
|
|
30
|
+
seen.add(raw);
|
|
31
|
+
tokens.push(raw);
|
|
32
|
+
if (tokens.length >= max)
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
return tokens;
|
|
36
|
+
}
|
|
37
|
+
/** Jaccard-ish overlap: shared keywords / query keywords. */
|
|
38
|
+
function relevance(card, queryKeywords) {
|
|
39
|
+
if (queryKeywords.length === 0)
|
|
40
|
+
return 0;
|
|
41
|
+
const cardSet = new Set(card.keywords);
|
|
42
|
+
const shared = queryKeywords.filter((k) => cardSet.has(k)).length;
|
|
43
|
+
return shared / queryKeywords.length;
|
|
44
|
+
}
|
|
45
|
+
const MIN_RELEVANCE = 0.25;
|
|
46
|
+
/** In-memory store — the base implementation; the file store persists it. */
|
|
47
|
+
export class InMemoryPracticeStore {
|
|
48
|
+
cards;
|
|
49
|
+
constructor(cards = []) {
|
|
50
|
+
this.cards = cards;
|
|
51
|
+
}
|
|
52
|
+
retrieve(instruction, limit = 3) {
|
|
53
|
+
const keywords = extractKeywords(instruction);
|
|
54
|
+
return this.cards
|
|
55
|
+
.map((card) => ({ card, score: relevance(card, keywords) }))
|
|
56
|
+
.filter(({ score }) => score >= MIN_RELEVANCE)
|
|
57
|
+
.sort((a, b) => {
|
|
58
|
+
if (b.score !== a.score)
|
|
59
|
+
return b.score - a.score;
|
|
60
|
+
if (b.card.successCount !== a.card.successCount)
|
|
61
|
+
return b.card.successCount - a.card.successCount;
|
|
62
|
+
return a.card.bestTurns - b.card.bestTurns;
|
|
63
|
+
})
|
|
64
|
+
.slice(0, limit)
|
|
65
|
+
.map(({ card }) => card);
|
|
66
|
+
}
|
|
67
|
+
record(input) {
|
|
68
|
+
const strategy = STRATEGY_RE.test(input.strategy) ? input.strategy : 'direct';
|
|
69
|
+
// Dedup on strategy, not rendered guidance (which varies by turn count).
|
|
70
|
+
const existing = this.cards.find((c) => c.strategy === strategy);
|
|
71
|
+
if (existing) {
|
|
72
|
+
existing.successCount += 1;
|
|
73
|
+
existing.bestTurns = Math.min(existing.bestTurns, input.turns);
|
|
74
|
+
existing.keywords = [...new Set([...existing.keywords, ...input.keywords])];
|
|
75
|
+
existing.guidance = distillPractice(strategy, existing.bestTurns);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
this.cards.push({
|
|
79
|
+
id: this.nextId(),
|
|
80
|
+
strategy,
|
|
81
|
+
keywords: input.keywords,
|
|
82
|
+
guidance: distillPractice(strategy, input.turns),
|
|
83
|
+
successCount: 1,
|
|
84
|
+
bestTurns: input.turns,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/** Smallest unused pN id — robust to merges and dropped (corrupt) cards. */
|
|
88
|
+
nextId() {
|
|
89
|
+
const used = new Set(this.cards.map((c) => c.id));
|
|
90
|
+
for (let i = 1;; i++) {
|
|
91
|
+
const id = `p${i}`;
|
|
92
|
+
if (!used.has(id))
|
|
93
|
+
return id;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
all() {
|
|
97
|
+
return this.cards;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** File-backed practice store (JSON). Self-heals on missing/corrupt files. */
|
|
101
|
+
export class FilePracticeStore extends InMemoryPracticeStore {
|
|
102
|
+
path;
|
|
103
|
+
constructor(path) {
|
|
104
|
+
super(FilePracticeStore.load(path));
|
|
105
|
+
this.path = path;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Load cards from disk, validating every field. The on-disk file is NOT
|
|
109
|
+
* trusted to supply guidance text — guidance is regenerated from the
|
|
110
|
+
* validated strategy + bestTurns via distillPractice, so a tampered file
|
|
111
|
+
* cannot inject prompt text (the read path enforces the same provenance
|
|
112
|
+
* the write path guarantees). Structurally-invalid cards are dropped.
|
|
113
|
+
*/
|
|
114
|
+
static load(path) {
|
|
115
|
+
if (!existsSync(path))
|
|
116
|
+
return [];
|
|
117
|
+
let parsed;
|
|
118
|
+
try {
|
|
119
|
+
parsed = JSON.parse(readFileSync(path, 'utf-8'));
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
if (!Array.isArray(parsed))
|
|
125
|
+
return [];
|
|
126
|
+
const cards = [];
|
|
127
|
+
for (const raw of parsed) {
|
|
128
|
+
if (typeof raw !== 'object' || raw === null)
|
|
129
|
+
continue;
|
|
130
|
+
const c = raw;
|
|
131
|
+
if (typeof c.strategy !== 'string' || !STRATEGY_RE.test(c.strategy))
|
|
132
|
+
continue;
|
|
133
|
+
if (!Array.isArray(c.keywords) || !c.keywords.every((k) => typeof k === 'string'))
|
|
134
|
+
continue;
|
|
135
|
+
const successCount = Number(c.successCount);
|
|
136
|
+
const bestTurns = Number(c.bestTurns);
|
|
137
|
+
if (!Number.isFinite(successCount) || successCount < 1)
|
|
138
|
+
continue;
|
|
139
|
+
if (!Number.isFinite(bestTurns) || bestTurns < 1)
|
|
140
|
+
continue;
|
|
141
|
+
cards.push({
|
|
142
|
+
id: typeof c.id === 'string' ? c.id : `p${cards.length + 1}`,
|
|
143
|
+
strategy: c.strategy,
|
|
144
|
+
keywords: c.keywords,
|
|
145
|
+
guidance: distillPractice(c.strategy, bestTurns), // regenerated, never trusted from disk
|
|
146
|
+
successCount: Math.floor(successCount),
|
|
147
|
+
bestTurns: Math.floor(bestTurns),
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
return cards;
|
|
151
|
+
}
|
|
152
|
+
record(input) {
|
|
153
|
+
super.record(input);
|
|
154
|
+
this.persist();
|
|
155
|
+
}
|
|
156
|
+
persist() {
|
|
157
|
+
try {
|
|
158
|
+
mkdirSync(dirname(this.path), { recursive: true });
|
|
159
|
+
// Atomic write: temp file + rename, so a crash mid-write cannot corrupt
|
|
160
|
+
// the store and we never follow a pre-planted symlink at the final path.
|
|
161
|
+
const tmp = `${this.path}.tmp`;
|
|
162
|
+
writeFileSync(tmp, JSON.stringify(this.all(), null, 2), 'utf-8');
|
|
163
|
+
renameSync(tmp, this.path);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// Persistence is best-effort; in-memory state remains valid
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/** Default on-disk location for a project's learned practices. */
|
|
171
|
+
export function defaultPracticePath(projectRoot) {
|
|
172
|
+
return join(projectRoot, '.uap', 'delivery-practices.json');
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Distill a one-line practice from a successful delivery. Provenance-safe:
|
|
176
|
+
* built only from the winning strategy and turn count, not model output.
|
|
177
|
+
*/
|
|
178
|
+
export function distillPractice(winningStrategy, turns) {
|
|
179
|
+
const strategy = winningStrategy ?? 'direct';
|
|
180
|
+
if (turns === 1) {
|
|
181
|
+
return `A '${strategy}' approach solved a similar task on the first attempt — lead with it.`;
|
|
182
|
+
}
|
|
183
|
+
return `A '${strategy}' approach converged on a similar task in ${turns} turns — prefer it and verify against the gates early.`;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=practice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"practice.js","sourceRoot":"","sources":["../../src/delivery/practice.ts"],"names":[],"mappings":"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"}
|