iranti 0.3.30 → 0.3.32

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.
@@ -0,0 +1,47 @@
1
+ export type SubTurnLoopOutcome = 'declined_phase' | 'declined_post_response' | 'declined_no_partial' | 'declined_too_short' | 'declined_no_new_tokens' | 'budget_exhausted' | 'attempted_empty' | 'attempted_added';
2
+ export interface SubTurnLoopPlan {
3
+ outcome: SubTurnLoopOutcome;
4
+ attempted: boolean;
5
+ partialResponseLength: number;
6
+ initialFactCount: number;
7
+ addedFactCount: number;
8
+ rescoreTokens: string[];
9
+ proposedHints: string[];
10
+ budgetMax: number;
11
+ reason: string;
12
+ note: string;
13
+ }
14
+ export interface PlanSubTurnLoopInput {
15
+ phase?: 'pre-response' | 'mid-turn' | 'post-response';
16
+ partialResponse?: string;
17
+ latestMessage?: string;
18
+ originalEntityHints: readonly string[];
19
+ initialFactCount: number;
20
+ /** Max retry budget (default 1). Caller fires one extra observe when attempted=true. */
21
+ budget?: number;
22
+ }
23
+ export declare const SUB_TURN_LOOP_DEFAULT_BUDGET = 1;
24
+ export declare const SUB_TURN_LOOP_MIN_PARTIAL_LENGTH = 40;
25
+ export declare const SUB_TURN_LOOP_MAX_RESCORE_TOKENS = 5;
26
+ export declare const SUB_TURN_LOOP_MAX_PROPOSED_HINTS = 3;
27
+ export declare const SUB_TURN_LOOP_MIN_TOKEN_LENGTH = 4;
28
+ /**
29
+ * Pure function. Decides whether the Attendant should run a bounded sub-turn
30
+ * retrieval retry against its own partial response. Never calls observe().
31
+ * Never hits I/O.
32
+ *
33
+ * Gate order:
34
+ * 1. Phase gate — post-response and pre-response reject immediately. M6 only
35
+ * fires on mid-turn attends.
36
+ * 2. Partial response presence — no field → declined_no_partial.
37
+ * 3. Length gate — partial under MIN_PARTIAL_LENGTH → declined_too_short.
38
+ * 4. Budget gate — budgetMax <= 0 → budget_exhausted.
39
+ * 5. Novelty gate — extract tokens + type/id hints from partial; if every
40
+ * token and hint is already in the baseline (original entity hints +
41
+ * latest message), decline as declined_no_new_tokens.
42
+ * 6. Otherwise set attempted=true with rescoreTokens + proposedHints
43
+ * populated. Outcome starts as 'attempted_empty' and the caller flips it
44
+ * to 'attempted_added' when the retry observe returns new facts.
45
+ */
46
+ export declare function planSubTurnLoop(input: PlanSubTurnLoopInput): SubTurnLoopPlan;
47
+ //# sourceMappingURL=subTurnLoop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subTurnLoop.d.ts","sourceRoot":"","sources":["../../../src/staff/subTurnLoop.ts"],"names":[],"mappings":"AA4BA,MAAM,MAAM,kBAAkB,GACxB,gBAAgB,GAChB,wBAAwB,GACxB,qBAAqB,GACrB,oBAAoB,GACpB,wBAAwB,GACxB,kBAAkB,GAClB,iBAAiB,GACjB,iBAAiB,CAAC;AAExB,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACjC,KAAK,CAAC,EAAE,cAAc,GAAG,UAAU,GAAG,eAAe,CAAC;IACtD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAC9C,eAAO,MAAM,gCAAgC,KAAK,CAAC;AACnD,eAAO,MAAM,gCAAgC,IAAI,CAAC;AAClD,eAAO,MAAM,gCAAgC,IAAI,CAAC;AAClD,eAAO,MAAM,8BAA8B,IAAI,CAAC;AA6EhD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,eAAe,CAgJ5E"}
@@ -0,0 +1,259 @@
1
+ "use strict";
2
+ // src/staff/subTurnLoop.ts
3
+ //
4
+ // B8 M6 — Sub-turn reasoning loop.
5
+ //
6
+ // Pure helper. Given a mid-turn attend input that carries a partial assistant
7
+ // response, decides whether the Attendant should re-score its own in-progress
8
+ // output against memory and re-run retrieval with new entity hints harvested
9
+ // from the partial text. Never executes observe() itself — the caller fires at
10
+ // most one extra retrieval when the plan says `attempted=true`.
11
+ //
12
+ // This is A3's iterative refinement pattern re-applied on response progress
13
+ // rather than initial-pass emptiness. Gates follow the same shape as
14
+ // planRefinementPass: post-response closeout is gated off, pre-response is
15
+ // rejected (pre-response is the initial pass, not a sub-turn loop), empty or
16
+ // short partial responses are declined, and a no-new-tokens verdict declines
17
+ // the retry so we don't thrash on text the caller already searched for.
18
+ //
19
+ // When the plan does propose a retry it surfaces `rescoreTokens` (novel
20
+ // lowercase tokens from the partial) + `proposedHints` (novel type/id
21
+ // patterns extracted by regex). The caller UNIONs those proposed hints with
22
+ // the original entity hints before firing observe() again — same fix pattern
23
+ // as B6's refinement retry (see the union-of-original+widened comment in
24
+ // AttendantInstance.ts around line 5228).
25
+ //
26
+ // Pure function. No LLM. No I/O. Deterministic. Fully unit-testable.
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.SUB_TURN_LOOP_MIN_TOKEN_LENGTH = exports.SUB_TURN_LOOP_MAX_PROPOSED_HINTS = exports.SUB_TURN_LOOP_MAX_RESCORE_TOKENS = exports.SUB_TURN_LOOP_MIN_PARTIAL_LENGTH = exports.SUB_TURN_LOOP_DEFAULT_BUDGET = void 0;
29
+ exports.planSubTurnLoop = planSubTurnLoop;
30
+ // ─── Constants ───────────────────────────────────────────────────────────────
31
+ exports.SUB_TURN_LOOP_DEFAULT_BUDGET = 1;
32
+ exports.SUB_TURN_LOOP_MIN_PARTIAL_LENGTH = 40;
33
+ exports.SUB_TURN_LOOP_MAX_RESCORE_TOKENS = 5;
34
+ exports.SUB_TURN_LOOP_MAX_PROPOSED_HINTS = 3;
35
+ exports.SUB_TURN_LOOP_MIN_TOKEN_LENGTH = 4;
36
+ const SUB_TURN_LOOP_STOPWORDS = new Set([
37
+ 'the', 'and', 'for', 'with', 'from', 'that', 'this', 'these', 'those',
38
+ 'have', 'has', 'had', 'will', 'would', 'should', 'could', 'about',
39
+ 'into', 'then', 'than', 'also', 'just', 'some', 'such', 'very', 'like',
40
+ 'been', 'being', 'because', 'before', 'after', 'while', 'where', 'when',
41
+ 'what', 'which', 'they', 'them', 'their', 'there', 'here', 'your', 'yours',
42
+ 'mine', 'ours', 'theirs', 'over', 'under', 'between', 'against', 'every',
43
+ 'more', 'most', 'much', 'many', 'each', 'any', 'all', 'not', 'nor',
44
+ 'only', 'own', 'same', 'once', 'other', 'another',
45
+ ]);
46
+ // Match "type/id" or "type/id/key" patterns in free-form text. Entity segments
47
+ // must start with a letter and contain at least 2 chars total to avoid matching
48
+ // ratios like "2/3" or short paths like "a/b". Three-segment form also
49
+ // supported so we can harvest "project/iranti/feature_idea_user_rules" but we
50
+ // always return the two-segment prefix for retrieval widening.
51
+ const ENTITY_HINT_REGEX = /([a-zA-Z][a-zA-Z0-9_-]{1,})\/([a-zA-Z][a-zA-Z0-9_-]{1,})(?:\/([a-zA-Z][a-zA-Z0-9_-]{1,}))?/g;
52
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
53
+ function normalizeTokens(text) {
54
+ if (!text)
55
+ return [];
56
+ const normalized = text
57
+ .toLowerCase()
58
+ .replace(/[^a-z0-9_\-\s\/]/g, ' ');
59
+ const tokens = [];
60
+ for (const raw of normalized.split(/\s+/)) {
61
+ if (!raw)
62
+ continue;
63
+ // Split entity-shaped tokens into parts so "project/iranti" contributes
64
+ // "project" and "iranti" to the baseline set, too.
65
+ for (const piece of raw.split('/')) {
66
+ if (!piece)
67
+ continue;
68
+ if (piece.length < exports.SUB_TURN_LOOP_MIN_TOKEN_LENGTH)
69
+ continue;
70
+ if (SUB_TURN_LOOP_STOPWORDS.has(piece))
71
+ continue;
72
+ tokens.push(piece);
73
+ }
74
+ }
75
+ return tokens;
76
+ }
77
+ function extractProposedHintsFromText(text, existingHints) {
78
+ const existingSet = new Set(existingHints.map((h) => h.toLowerCase().trim()));
79
+ // Also consider two-segment prefixes of any three-segment existing hint
80
+ // as "already covered" so we don't re-propose a widening of what the
81
+ // caller already supplied.
82
+ for (const hint of existingHints) {
83
+ const parts = hint.toLowerCase().split('/');
84
+ if (parts.length >= 2) {
85
+ existingSet.add(`${parts[0]}/${parts[1]}`);
86
+ }
87
+ }
88
+ const proposed = [];
89
+ const seen = new Set();
90
+ ENTITY_HINT_REGEX.lastIndex = 0;
91
+ let match;
92
+ while ((match = ENTITY_HINT_REGEX.exec(text)) !== null) {
93
+ const entityType = match[1];
94
+ const entityId = match[2];
95
+ if (!entityType || !entityId)
96
+ continue;
97
+ const hint = `${entityType}/${entityId}`.toLowerCase();
98
+ if (existingSet.has(hint))
99
+ continue;
100
+ if (seen.has(hint))
101
+ continue;
102
+ seen.add(hint);
103
+ proposed.push(hint);
104
+ if (proposed.length >= exports.SUB_TURN_LOOP_MAX_PROPOSED_HINTS)
105
+ break;
106
+ }
107
+ return proposed;
108
+ }
109
+ // ─── planSubTurnLoop ─────────────────────────────────────────────────────────
110
+ /**
111
+ * Pure function. Decides whether the Attendant should run a bounded sub-turn
112
+ * retrieval retry against its own partial response. Never calls observe().
113
+ * Never hits I/O.
114
+ *
115
+ * Gate order:
116
+ * 1. Phase gate — post-response and pre-response reject immediately. M6 only
117
+ * fires on mid-turn attends.
118
+ * 2. Partial response presence — no field → declined_no_partial.
119
+ * 3. Length gate — partial under MIN_PARTIAL_LENGTH → declined_too_short.
120
+ * 4. Budget gate — budgetMax <= 0 → budget_exhausted.
121
+ * 5. Novelty gate — extract tokens + type/id hints from partial; if every
122
+ * token and hint is already in the baseline (original entity hints +
123
+ * latest message), decline as declined_no_new_tokens.
124
+ * 6. Otherwise set attempted=true with rescoreTokens + proposedHints
125
+ * populated. Outcome starts as 'attempted_empty' and the caller flips it
126
+ * to 'attempted_added' when the retry observe returns new facts.
127
+ */
128
+ function planSubTurnLoop(input) {
129
+ const { phase, partialResponse, latestMessage, originalEntityHints, initialFactCount, budget, } = input;
130
+ const budgetMax = Math.max(0, Math.floor(budget ?? exports.SUB_TURN_LOOP_DEFAULT_BUDGET));
131
+ const partialText = (partialResponse ?? '').trim();
132
+ const partialResponseLength = partialText.length;
133
+ // Gate 1a: post-response is always a closeout path.
134
+ if (phase === 'post-response') {
135
+ return {
136
+ outcome: 'declined_post_response',
137
+ attempted: false,
138
+ partialResponseLength,
139
+ initialFactCount,
140
+ addedFactCount: 0,
141
+ rescoreTokens: [],
142
+ proposedHints: [],
143
+ budgetMax,
144
+ reason: 'post_response_closeout',
145
+ note: 'Sub-turn loop is gated off on post-response attends.',
146
+ };
147
+ }
148
+ // Gate 1b: M6 only fires on mid-turn. Pre-response is the initial pass;
149
+ // an undefined phase is treated the same as pre-response.
150
+ if (phase !== 'mid-turn') {
151
+ return {
152
+ outcome: 'declined_phase',
153
+ attempted: false,
154
+ partialResponseLength,
155
+ initialFactCount,
156
+ addedFactCount: 0,
157
+ rescoreTokens: [],
158
+ proposedHints: [],
159
+ budgetMax,
160
+ reason: 'phase_not_mid_turn',
161
+ note: `Sub-turn loop only fires on mid-turn attend; current phase = ${phase ?? 'unknown'}.`,
162
+ };
163
+ }
164
+ // Gate 2: no partial response supplied — nothing to rescore.
165
+ if (!partialResponse || partialResponseLength === 0) {
166
+ return {
167
+ outcome: 'declined_no_partial',
168
+ attempted: false,
169
+ partialResponseLength,
170
+ initialFactCount,
171
+ addedFactCount: 0,
172
+ rescoreTokens: [],
173
+ proposedHints: [],
174
+ budgetMax,
175
+ reason: 'no_partial_response',
176
+ note: 'Sub-turn loop requires a partialResponse field on mid-turn attend.',
177
+ };
178
+ }
179
+ // Gate 3: partial response too short to be worth re-scoring.
180
+ if (partialResponseLength < exports.SUB_TURN_LOOP_MIN_PARTIAL_LENGTH) {
181
+ return {
182
+ outcome: 'declined_too_short',
183
+ attempted: false,
184
+ partialResponseLength,
185
+ initialFactCount,
186
+ addedFactCount: 0,
187
+ rescoreTokens: [],
188
+ proposedHints: [],
189
+ budgetMax,
190
+ reason: 'partial_response_below_min_length',
191
+ note: `Partial response is ${partialResponseLength} chars, below minimum of ${exports.SUB_TURN_LOOP_MIN_PARTIAL_LENGTH}.`,
192
+ };
193
+ }
194
+ // Gate 4: budget check — can't fire a retry with zero budget.
195
+ if (budgetMax === 0) {
196
+ return {
197
+ outcome: 'budget_exhausted',
198
+ attempted: false,
199
+ partialResponseLength,
200
+ initialFactCount,
201
+ addedFactCount: 0,
202
+ rescoreTokens: [],
203
+ proposedHints: [],
204
+ budgetMax,
205
+ reason: 'budget_zero',
206
+ note: 'Sub-turn loop budget is 0; not firing a retry.',
207
+ };
208
+ }
209
+ // Token extraction: collect normalized tokens from the partial response
210
+ // and diff them against the baseline of original hints + latest message.
211
+ // Tokens that match the baseline don't count — we're looking for what's
212
+ // NEW in the partial.
213
+ const hintText = originalEntityHints.join(' ');
214
+ const baselineTokens = new Set(normalizeTokens(`${latestMessage ?? ''} ${hintText}`));
215
+ const partialTokens = normalizeTokens(partialText);
216
+ const rescoreTokens = [];
217
+ const seenRescore = new Set();
218
+ for (const token of partialTokens) {
219
+ if (baselineTokens.has(token))
220
+ continue;
221
+ if (seenRescore.has(token))
222
+ continue;
223
+ seenRescore.add(token);
224
+ rescoreTokens.push(token);
225
+ if (rescoreTokens.length >= exports.SUB_TURN_LOOP_MAX_RESCORE_TOKENS)
226
+ break;
227
+ }
228
+ // Proposed hints: extract type/id patterns from the partial text that
229
+ // weren't already in the original hints.
230
+ const proposedHints = extractProposedHintsFromText(partialText, originalEntityHints);
231
+ // Gate 5: no novel tokens AND no novel hints → nothing to rescore.
232
+ if (rescoreTokens.length === 0 && proposedHints.length === 0) {
233
+ return {
234
+ outcome: 'declined_no_new_tokens',
235
+ attempted: false,
236
+ partialResponseLength,
237
+ initialFactCount,
238
+ addedFactCount: 0,
239
+ rescoreTokens: [],
240
+ proposedHints: [],
241
+ budgetMax,
242
+ reason: 'all_partial_tokens_covered_by_baseline',
243
+ note: 'Partial response tokens already present in original hints/message — no new retrieval needed.',
244
+ };
245
+ }
246
+ return {
247
+ outcome: 'attempted_empty', // caller flips to attempted_added when retry returns facts
248
+ attempted: true,
249
+ partialResponseLength,
250
+ initialFactCount,
251
+ addedFactCount: 0,
252
+ rescoreTokens,
253
+ proposedHints,
254
+ budgetMax,
255
+ reason: 'mid_turn_partial_response_has_novel_signal',
256
+ note: `Mid-turn partial response surfaced ${rescoreTokens.length} novel token(s) and ${proposedHints.length} proposed hint(s). Planning one bounded retry.`,
257
+ };
258
+ }
259
+ //# sourceMappingURL=subTurnLoop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subTurnLoop.js","sourceRoot":"","sources":["../../../src/staff/subTurnLoop.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iranti",
3
- "version": "0.3.30",
3
+ "version": "0.3.32",
4
4
  "description": "Memory infrastructure for multi-agent AI systems",
5
5
  "main": "dist/src/sdk/index.js",
6
6
  "files": [
@@ -98,7 +98,9 @@
98
98
  "test:b5-objective-autocheckpoint": "ts-node tests/attendant/run_b5_objective_autocheckpoint_tests.ts",
99
99
  "test:b6-refinement-tool-plan": "ts-node tests/attendant/run_b6_refinement_tool_plan_tests.ts",
100
100
  "test:b7-reasoning-council": "ts-node tests/staff/run_b7_reasoning_council_tests.ts",
101
+ "test:b8-subturn-loop": "ts-node tests/staff/run_b8_subturn_loop_tests.ts",
101
102
  "test:file-change-recall": "ts-node tests/attendant/run_file_change_recall_tests.ts",
103
+ "test:m7-response-file-capture": "ts-node tests/attendant/run_m7_response_file_capture_tests.ts",
102
104
  "test:copilot-setup": "ts-node tests/runtime-lifecycle/run_copilot_setup_tests.ts",
103
105
  "test:setup-upgrade-lifecycle": "ts-node tests/runtime-lifecycle/run_setup_upgrade_tests.ts",
104
106
  "test:setup-metadata-persistence": "ts-node tests/runtime-lifecycle/run_setup_metadata_persistence_tests.ts",