instar 1.3.1111 → 1.3.1113

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +1 -0
  2. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  3. package/dist/core/PostUpdateMigrator.js +54 -2
  4. package/dist/core/PostUpdateMigrator.js.map +1 -1
  5. package/dist/core/TopicAwareness.d.ts +134 -0
  6. package/dist/core/TopicAwareness.d.ts.map +1 -0
  7. package/dist/core/TopicAwareness.js +454 -0
  8. package/dist/core/TopicAwareness.js.map +1 -0
  9. package/dist/core/TopicIntent.d.ts +25 -1
  10. package/dist/core/TopicIntent.d.ts.map +1 -1
  11. package/dist/core/TopicIntent.js +92 -4
  12. package/dist/core/TopicIntent.js.map +1 -1
  13. package/dist/core/TopicIntentBriefing.d.ts +4 -0
  14. package/dist/core/TopicIntentBriefing.d.ts.map +1 -1
  15. package/dist/core/TopicIntentBriefing.js +37 -2
  16. package/dist/core/TopicIntentBriefing.js.map +1 -1
  17. package/dist/core/TopicIntentCapture.d.ts.map +1 -1
  18. package/dist/core/TopicIntentCapture.js +9 -3
  19. package/dist/core/TopicIntentCapture.js.map +1 -1
  20. package/dist/core/TopicIntentExtractor.d.ts +17 -1
  21. package/dist/core/TopicIntentExtractor.d.ts.map +1 -1
  22. package/dist/core/TopicIntentExtractor.js +115 -12
  23. package/dist/core/TopicIntentExtractor.js.map +1 -1
  24. package/dist/core/cartographerDetect.d.ts +7 -1
  25. package/dist/core/cartographerDetect.d.ts.map +1 -1
  26. package/dist/core/cartographerDetect.js +73 -2
  27. package/dist/core/cartographerDetect.js.map +1 -1
  28. package/dist/data/standards-guard-index.json +1 -1
  29. package/dist/data/standards-guard-index.meta.json +2 -2
  30. package/dist/data/standards-registry.meta.json +1 -1
  31. package/dist/server/routes.d.ts.map +1 -1
  32. package/dist/server/routes.js +4 -1
  33. package/dist/server/routes.js.map +1 -1
  34. package/dist/server/topicIntentRoutes.d.ts.map +1 -1
  35. package/dist/server/topicIntentRoutes.js +16 -2
  36. package/dist/server/topicIntentRoutes.js.map +1 -1
  37. package/package.json +1 -1
  38. package/src/data/builtin-manifest.json +65 -65
  39. package/src/data/standards-guard-index.json +1 -1
  40. package/src/data/standards-guard-index.meta.json +2 -2
  41. package/src/data/standards-registry.meta.json +1 -1
  42. package/src/templates/hooks/compaction-recovery.sh +19 -0
  43. package/src/templates/hooks/telegram-topic-context.sh +3 -2
  44. package/upgrades/1.3.1112.md +25 -0
  45. package/upgrades/1.3.1113.md +54 -0
  46. package/upgrades/side-effects/cartographer-non-git-structural-snapshot.md +84 -0
  47. package/upgrades/side-effects/topic-awareness-three-levels.md +303 -0
@@ -0,0 +1,134 @@
1
+ /**
2
+ * TopicAwareness — the temporal projection over Topic Intent evidence.
3
+ *
4
+ * Topic Intent confidence tiers answer "how well supported is this ref?".
5
+ * These three awareness levels answer the orthogonal question "over what
6
+ * horizon is the conversation moving?": whole topic, most-recent arc, and
7
+ * current work. The projection is orientation only; it never promotes a ref
8
+ * or grants authority.
9
+ */
10
+ export type AwarenessSpeaker = 'user' | 'agent';
11
+ export interface AwarenessLayerDraft {
12
+ goal: string;
13
+ trend: string;
14
+ themes: string[];
15
+ }
16
+ export interface ArcTransitionDraft {
17
+ kind: 'continue' | 'new';
18
+ /** Exact excerpt from the current USER message that grounds a requested transition. */
19
+ evidenceQuote?: string;
20
+ }
21
+ export interface AwarenessDraft {
22
+ topic: AwarenessLayerDraft;
23
+ recentArc: AwarenessLayerDraft;
24
+ currentWork: AwarenessLayerDraft;
25
+ arcTransition?: ArcTransitionDraft;
26
+ }
27
+ export interface AwarenessLayer extends AwarenessLayerDraft {
28
+ updatedAt: string;
29
+ sourceMessageId: string;
30
+ sourceSpeaker: AwarenessSpeaker;
31
+ sourceTurn: number;
32
+ }
33
+ export interface TopicAnchor {
34
+ goal: string;
35
+ capturedAt: string;
36
+ sourceMessageId: string;
37
+ /** Conversation order, so completion order cannot choose the origin. */
38
+ sourceTurn: number;
39
+ }
40
+ export interface TopicAwarenessArc {
41
+ arcId: string;
42
+ /** Stable conversation-order ordinal; 1 retains the legacy arc id. */
43
+ sequence: number;
44
+ status: 'active' | 'closed';
45
+ startedAt: string;
46
+ startedTurn: number;
47
+ boundaryKind: 'initial' | 'explicit' | 'implicit';
48
+ boundaryMessageId: string;
49
+ endedAt?: string;
50
+ endedTurn?: number;
51
+ layer: AwarenessLayer;
52
+ }
53
+ /**
54
+ * Bounded reorder journal for the semantic arc dimension. LLM calls run
55
+ * concurrently, so a later completion can arrive before an earlier boundary.
56
+ * Keeping the last two rate windows lets us refold that boundary in
57
+ * conversation order without serialising the intelligence calls.
58
+ */
59
+ export interface RecentArcEvent {
60
+ messageId: string;
61
+ at: string;
62
+ turn: number;
63
+ speaker: AwarenessSpeaker;
64
+ layer: AwarenessLayerDraft;
65
+ requestedNew: boolean;
66
+ grounded: boolean;
67
+ explicit: boolean;
68
+ }
69
+ export interface PendingArcCandidate {
70
+ goal: string;
71
+ firstSeenAt: string;
72
+ lastSeenAt: string;
73
+ confirmations: number;
74
+ }
75
+ export interface TopicAwarenessState {
76
+ version: 1;
77
+ /** Immutable first user-grounded topic goal. Evolution never overwrites it. */
78
+ anchor: TopicAnchor;
79
+ /** Evolving whole-topic view. */
80
+ topic: AwarenessLayer;
81
+ /** Compact semantic arc history; exactly one arc is active. */
82
+ arcs: TopicAwarenessArc[];
83
+ currentArcId: string;
84
+ /** Immediate work view, updated independently of the broader arc. */
85
+ currentWork: AwarenessLayer;
86
+ /** Hysteresis for an implicit (not explicitly phrased) arc transition. */
87
+ pendingArcCandidate?: PendingArcCandidate;
88
+ /** Bounded completion-reorder journal; never an authority/evidence store. */
89
+ recentArcEvents: RecentArcEvent[];
90
+ /** Closed arcs omitted from `arcs` by the hard history cap. */
91
+ archivedArcCount: number;
92
+ updatedAt: string;
93
+ turnAtUpdate: number;
94
+ }
95
+ export interface AwarenessUpdateInput {
96
+ topicId: number;
97
+ messageId: string;
98
+ messageText: string;
99
+ fromUser: boolean;
100
+ at: string;
101
+ turn: number;
102
+ }
103
+ export interface AwarenessUpdateResult {
104
+ state: TopicAwarenessState;
105
+ effectiveArcId: string;
106
+ transitioned: boolean;
107
+ /** False when a slower, older extraction completed after newer state. */
108
+ applied: boolean;
109
+ stale: boolean;
110
+ /** A stale completion may still move the anchor monotonically earlier. */
111
+ anchorCorrected: boolean;
112
+ /** True when stale input still changed the bounded order journal/arcs. */
113
+ stateReconciled: boolean;
114
+ }
115
+ /** 30 captures/minute × 60s provider wall; 64 covers the full inversion window. */
116
+ export declare const MAX_RECENT_ARC_EVENTS = 64;
117
+ /** Initial arc + 63 most-recent arcs; older closed history is counted, not retained. */
118
+ export declare const MAX_RETAINED_ARCS = 64;
119
+ /** Validate + bound model-authored awareness before it can touch durable state. */
120
+ export declare function normalizeAwarenessDraft(value: unknown): AwarenessDraft | null;
121
+ /** Bounded lexical similarity is used only for transition hysteresis, never meaning/authority. */
122
+ export declare function awarenessGoalSimilarity(a: string, b: string): number;
123
+ /**
124
+ * Apply one validated projection update.
125
+ *
126
+ * An explicit user shift (grounded by an exact quote containing shift language)
127
+ * transitions immediately. An implicit shift requires two similar consecutive
128
+ * user-grounded candidates. Agent turns can update orientation but can never
129
+ * create the topic anchor or switch arcs by themselves.
130
+ */
131
+ export declare function applyAwarenessUpdate(existing: TopicAwarenessState | undefined, draft: AwarenessDraft, input: AwarenessUpdateInput): AwarenessUpdateResult | null;
132
+ /** Safe, bounded representation for the extractor's untrusted-data prompt block. */
133
+ export declare function awarenessForPrompt(state: TopicAwarenessState | undefined): string;
134
+ //# sourceMappingURL=TopicAwareness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TopicAwareness.d.ts","sourceRoot":"","sources":["../../src/core/TopicAwareness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,454 @@
1
+ /**
2
+ * TopicAwareness — the temporal projection over Topic Intent evidence.
3
+ *
4
+ * Topic Intent confidence tiers answer "how well supported is this ref?".
5
+ * These three awareness levels answer the orthogonal question "over what
6
+ * horizon is the conversation moving?": whole topic, most-recent arc, and
7
+ * current work. The projection is orientation only; it never promotes a ref
8
+ * or grants authority.
9
+ */
10
+ const MAX_GOAL_CHARS = 500;
11
+ const MAX_TREND_CHARS = 600;
12
+ const MAX_THEME_CHARS = 240;
13
+ const MAX_THEMES = 5;
14
+ /** 30 captures/minute × 60s provider wall; 64 covers the full inversion window. */
15
+ export const MAX_RECENT_ARC_EVENTS = 64;
16
+ /** Initial arc + 63 most-recent arcs; older closed history is counted, not retained. */
17
+ export const MAX_RETAINED_ARCS = 64;
18
+ const EXPLICIT_SHIFT = /\b(?:instead|now|switch(?:ing|ed)?|move(?:d|ing)? on|next|new (?:goal|phase|focus|task)|different (?:goal|phase|focus|task)|no longer|from here)\b/i;
19
+ function compact(value, max) {
20
+ if (typeof value !== 'string')
21
+ return null;
22
+ const text = value.replace(/\s+/g, ' ').trim();
23
+ if (!text)
24
+ return null;
25
+ return text.slice(0, max);
26
+ }
27
+ /** Validate + bound model-authored awareness before it can touch durable state. */
28
+ export function normalizeAwarenessDraft(value) {
29
+ if (!value || typeof value !== 'object')
30
+ return null;
31
+ const raw = value;
32
+ const layer = (candidate) => {
33
+ if (!candidate || typeof candidate !== 'object')
34
+ return null;
35
+ const c = candidate;
36
+ const goal = compact(c.goal, MAX_GOAL_CHARS);
37
+ const trend = compact(c.trend, MAX_TREND_CHARS);
38
+ if (!goal || !trend || !Array.isArray(c.themes))
39
+ return null;
40
+ const themes = c.themes
41
+ .map((theme) => compact(theme, MAX_THEME_CHARS))
42
+ .filter((theme) => Boolean(theme))
43
+ .slice(0, MAX_THEMES);
44
+ if (themes.length === 0)
45
+ return null;
46
+ return { goal, trend, themes };
47
+ };
48
+ const topic = layer(raw.topic);
49
+ const recentArc = layer(raw.recentArc);
50
+ const currentWork = layer(raw.currentWork);
51
+ if (!topic || !recentArc || !currentWork)
52
+ return null;
53
+ let arcTransition;
54
+ if (raw.arcTransition && typeof raw.arcTransition === 'object') {
55
+ const transition = raw.arcTransition;
56
+ if (transition.kind === 'continue') {
57
+ arcTransition = { kind: 'continue' };
58
+ }
59
+ else if (transition.kind === 'new') {
60
+ const evidenceQuote = compact(transition.evidenceQuote, 300);
61
+ arcTransition = { kind: 'new', ...(evidenceQuote ? { evidenceQuote } : {}) };
62
+ }
63
+ }
64
+ return { topic, recentArc, currentWork, arcTransition };
65
+ }
66
+ function materializeLayer(draft, input) {
67
+ return {
68
+ ...draft,
69
+ updatedAt: input.at,
70
+ sourceMessageId: input.messageId,
71
+ sourceSpeaker: input.fromUser ? 'user' : 'agent',
72
+ sourceTurn: input.turn,
73
+ };
74
+ }
75
+ function normalizedWords(text) {
76
+ return new Set(text.toLowerCase()
77
+ .replace(/[^a-z0-9\s-]/g, ' ')
78
+ .split(/\s+/)
79
+ .filter((word) => word.length >= 4));
80
+ }
81
+ /** Bounded lexical similarity is used only for transition hysteresis, never meaning/authority. */
82
+ export function awarenessGoalSimilarity(a, b) {
83
+ const left = normalizedWords(a);
84
+ const right = normalizedWords(b);
85
+ if (left.size === 0 || right.size === 0)
86
+ return 0;
87
+ let intersection = 0;
88
+ for (const word of left)
89
+ if (right.has(word))
90
+ intersection++;
91
+ return intersection / new Set([...left, ...right]).size;
92
+ }
93
+ function quoteIsGrounded(quote, messageText) {
94
+ if (!quote)
95
+ return false;
96
+ return messageText.toLowerCase().includes(quote.toLowerCase());
97
+ }
98
+ function arcId(topicId, sequence) {
99
+ return sequence === 1 ? `arc-${topicId}` : `arc-${topicId}-${sequence}`;
100
+ }
101
+ function compareArcEvents(a, b) {
102
+ if (a.turn !== b.turn)
103
+ return a.turn - b.turn;
104
+ if (a.speaker !== b.speaker)
105
+ return a.speaker === 'user' ? -1 : 1;
106
+ const byTime = Date.parse(a.at) - Date.parse(b.at);
107
+ if (Number.isFinite(byTime) && byTime !== 0)
108
+ return byTime;
109
+ return a.messageId.localeCompare(b.messageId);
110
+ }
111
+ function recordArcEvent(state, draft, input) {
112
+ const requestedNew = input.fromUser && draft.arcTransition?.kind === 'new';
113
+ const quote = draft.arcTransition?.evidenceQuote;
114
+ const grounded = Boolean(requestedNew && quoteIsGrounded(quote, input.messageText));
115
+ const event = {
116
+ messageId: input.messageId,
117
+ at: input.at,
118
+ turn: input.turn,
119
+ speaker: input.fromUser ? 'user' : 'agent',
120
+ layer: draft.recentArc,
121
+ requestedNew,
122
+ grounded,
123
+ explicit: Boolean(grounded && EXPLICIT_SHIFT.test(quote ?? '')),
124
+ };
125
+ const events = state.recentArcEvents ?? [];
126
+ const existingIndex = events.findIndex((candidate) => candidate.messageId === event.messageId && candidate.speaker === event.speaker);
127
+ if (existingIndex >= 0) {
128
+ if (JSON.stringify(events[existingIndex]) === JSON.stringify(event))
129
+ return false;
130
+ events[existingIndex] = event;
131
+ }
132
+ else {
133
+ events.push(event);
134
+ }
135
+ events.sort(compareArcEvents);
136
+ state.recentArcEvents = events.slice(-MAX_RECENT_ARC_EVENTS);
137
+ return true;
138
+ }
139
+ function deriveRecentBoundaries(events) {
140
+ const boundaries = [];
141
+ let pendingEvent;
142
+ for (const event of events.filter((candidate) => candidate.speaker === 'user').sort(compareArcEvents)) {
143
+ if (event.requestedNew && event.grounded && event.explicit) {
144
+ boundaries.push({ event, kind: 'explicit' });
145
+ pendingEvent = undefined;
146
+ continue;
147
+ }
148
+ if (event.requestedNew && event.grounded) {
149
+ if (pendingEvent && awarenessGoalSimilarity(pendingEvent.layer.goal, event.layer.goal) >= 0.55) {
150
+ boundaries.push({ event, kind: 'implicit' });
151
+ pendingEvent = undefined;
152
+ }
153
+ else {
154
+ pendingEvent = event;
155
+ }
156
+ continue;
157
+ }
158
+ // A later user continuation/ungrounded proposal disconfirms the candidate.
159
+ pendingEvent = undefined;
160
+ }
161
+ return {
162
+ boundaries,
163
+ ...(pendingEvent ? {
164
+ pending: {
165
+ goal: pendingEvent.layer.goal,
166
+ firstSeenAt: pendingEvent.at,
167
+ lastSeenAt: pendingEvent.at,
168
+ confirmations: 1,
169
+ },
170
+ } : {}),
171
+ };
172
+ }
173
+ function layerFromEvent(event) {
174
+ return {
175
+ ...event.layer,
176
+ updatedAt: event.at,
177
+ sourceMessageId: event.messageId,
178
+ sourceSpeaker: event.speaker,
179
+ sourceTurn: event.turn,
180
+ };
181
+ }
182
+ function boundaryFingerprint(arcs) {
183
+ return arcs
184
+ .map((arc) => `${arc.startedTurn}:${arc.boundaryKind}:${arc.boundaryMessageId}:${arc.sequence}`)
185
+ .join('|');
186
+ }
187
+ /**
188
+ * Refold the bounded transition journal in conversation order. Existing arcs
189
+ * older than the journal are frozen compact history. Arcs inside the journal
190
+ * are rebuilt, so a late earlier boundary can insert itself and an apparent
191
+ * implicit pair can be withdrawn when its intervening user turn arrives.
192
+ */
193
+ function reconcileArcs(state, topicId) {
194
+ const before = boundaryFingerprint(state.arcs);
195
+ const events = [...(state.recentArcEvents ?? [])].sort(compareArcEvents);
196
+ if (events.length === 0)
197
+ return { changed: false, addedBoundary: false };
198
+ const oldestTurn = events[0].turn;
199
+ const existingArcs = state.arcs.map((arc, index) => ({
200
+ ...arc,
201
+ sequence: arc.sequence ?? index + 1,
202
+ startedTurn: arc.startedTurn ?? (index === 0 ? state.anchor.sourceTurn : state.turnAtUpdate),
203
+ boundaryKind: arc.boundaryKind ?? (index === 0 ? 'initial' : 'explicit'),
204
+ boundaryMessageId: arc.boundaryMessageId ?? arc.layer.sourceMessageId,
205
+ }));
206
+ // The first successful completion is not necessarily the first user turn.
207
+ // When a slower earlier completion corrects the anchor, the initial arc must
208
+ // move with it; otherwise its later startedTurn freezes out real boundaries
209
+ // between the corrected anchor and the first completion.
210
+ if (existingArcs[0]) {
211
+ existingArcs[0] = {
212
+ ...existingArcs[0],
213
+ arcId: arcId(topicId, 1),
214
+ sequence: 1,
215
+ startedAt: state.anchor.capturedAt,
216
+ startedTurn: state.anchor.sourceTurn,
217
+ boundaryKind: 'initial',
218
+ boundaryMessageId: state.anchor.sourceMessageId,
219
+ };
220
+ }
221
+ // Initial history is always retained. Other arcs older than the reorder
222
+ // window are immutable compact history and keep their sequence/id.
223
+ const frozen = existingArcs.filter((arc, index) => index === 0 || arc.startedTurn < oldestTurn);
224
+ const lastFrozenTurn = frozen.reduce((max, arc) => Math.max(max, arc.startedTurn), state.anchor.sourceTurn);
225
+ const { boundaries, pending } = deriveRecentBoundaries(events);
226
+ const derived = boundaries
227
+ .filter(({ event }) => event.turn > lastFrozenTurn)
228
+ .sort((a, b) => compareArcEvents(a.event, b.event));
229
+ const starts = frozen
230
+ .sort((a, b) => a.startedTurn - b.startedTurn)
231
+ .map((arc) => ({
232
+ turn: arc.startedTurn,
233
+ at: arc.startedAt,
234
+ kind: arc.boundaryKind,
235
+ messageId: arc.boundaryMessageId,
236
+ sequence: arc.sequence,
237
+ existing: arc,
238
+ }));
239
+ if (starts.length === 0) {
240
+ starts.push({
241
+ turn: state.anchor.sourceTurn,
242
+ at: state.anchor.capturedAt,
243
+ kind: 'initial',
244
+ messageId: state.anchor.sourceMessageId,
245
+ sequence: 1,
246
+ });
247
+ }
248
+ // `archivedArcCount` represents omitted middle history. Together with the
249
+ // retained frozen starts it gives the exact next conversation-order ordinal,
250
+ // even after the hard arc cap has pruned old objects.
251
+ let nextSequence = (state.archivedArcCount ?? 0) + starts.length + 1;
252
+ for (const boundary of derived) {
253
+ if (starts.some((start) => start.turn === boundary.event.turn))
254
+ continue;
255
+ starts.push({
256
+ turn: boundary.event.turn,
257
+ at: boundary.event.at,
258
+ kind: boundary.kind,
259
+ messageId: boundary.event.messageId,
260
+ sequence: nextSequence++,
261
+ });
262
+ }
263
+ starts.sort((a, b) => a.turn - b.turn || a.sequence - b.sequence);
264
+ let arcs = starts.map((start, index) => {
265
+ const next = starts[index + 1];
266
+ const candidates = events.filter((event) => event.turn >= start.turn && (!next || event.turn < next.turn));
267
+ const latest = candidates.sort(compareArcEvents).at(-1);
268
+ const fallback = start.existing?.layer
269
+ ?? existingArcs.find((arc) => arc.startedTurn === start.turn)?.layer
270
+ ?? state.arcs.at(-1)?.layer;
271
+ const layer = latest ? layerFromEvent(latest) : fallback;
272
+ // An awareness state always has at least its initial event/layer.
273
+ if (!layer)
274
+ throw new Error('TopicAwareness reconcile has no layer');
275
+ return {
276
+ arcId: arcId(topicId, start.sequence),
277
+ sequence: start.sequence,
278
+ status: next ? 'closed' : 'active',
279
+ startedAt: start.at,
280
+ startedTurn: start.turn,
281
+ boundaryKind: start.kind,
282
+ boundaryMessageId: start.messageId,
283
+ ...(next ? { endedAt: next.at, endedTurn: next.turn } : {}),
284
+ layer,
285
+ };
286
+ });
287
+ if (arcs.length > MAX_RETAINED_ARCS) {
288
+ const removedArcs = arcs.slice(1, arcs.length - (MAX_RETAINED_ARCS - 1));
289
+ const tail = arcs.slice(-(MAX_RETAINED_ARCS - 1));
290
+ const removed = removedArcs.length;
291
+ arcs = [arcs[0], ...tail];
292
+ state.archivedArcCount = (state.archivedArcCount ?? 0) + removed;
293
+ const cutoffTurn = Math.max(...removedArcs.map((arc) => arc.startedTurn));
294
+ // The pruned boundaries are now represented by archivedArcCount. Drop their
295
+ // reorder events too so a later refold cannot materialize them a second time.
296
+ state.recentArcEvents = state.recentArcEvents.filter((event) => event.turn > cutoffTurn);
297
+ }
298
+ const effective = [...arcs]
299
+ .filter((arc) => arc.startedTurn <= state.turnAtUpdate)
300
+ .sort((a, b) => b.startedTurn - a.startedTurn)[0] ?? arcs[arcs.length - 1];
301
+ state.arcs = arcs;
302
+ state.currentArcId = effective.arcId;
303
+ if (pending)
304
+ state.pendingArcCandidate = pending;
305
+ else
306
+ delete state.pendingArcCandidate;
307
+ const after = boundaryFingerprint(arcs);
308
+ const beforeKeys = new Set(before.split('|').filter(Boolean));
309
+ const afterKeys = after.split('|').filter(Boolean);
310
+ return {
311
+ changed: before !== after,
312
+ addedBoundary: afterKeys.some((key) => !beforeKeys.has(key) && !key.includes(':initial:')),
313
+ };
314
+ }
315
+ function effectiveArcIdForTurn(state, turn) {
316
+ return [...state.arcs]
317
+ .filter((arc) => arc.startedTurn <= turn)
318
+ .sort((a, b) => b.startedTurn - a.startedTurn)[0]?.arcId ?? state.currentArcId;
319
+ }
320
+ /**
321
+ * Capture is deliberately fire-and-forget, so LLM completions can arrive out
322
+ * of message order. User-turn number is the primary clock. Within one turn an
323
+ * agent reply follows its user message; same-speaker ties use event time.
324
+ */
325
+ function isOlderThanProjection(existing, input) {
326
+ if (input.turn !== existing.turnAtUpdate)
327
+ return input.turn < existing.turnAtUpdate;
328
+ const existingFromUser = existing.currentWork.sourceSpeaker === 'user';
329
+ if (input.fromUser !== existingFromUser) {
330
+ // For a shared turn number, user message first, agent reply second.
331
+ return input.fromUser;
332
+ }
333
+ const priorMs = Date.parse(existing.updatedAt);
334
+ const inputMs = Date.parse(input.at);
335
+ if (Number.isFinite(priorMs) && Number.isFinite(inputMs))
336
+ return inputMs <= priorMs;
337
+ // With no usable tie-breaker, preserve already-durable state.
338
+ return true;
339
+ }
340
+ /**
341
+ * Apply one validated projection update.
342
+ *
343
+ * An explicit user shift (grounded by an exact quote containing shift language)
344
+ * transitions immediately. An implicit shift requires two similar consecutive
345
+ * user-grounded candidates. Agent turns can update orientation but can never
346
+ * create the topic anchor or switch arcs by themselves.
347
+ */
348
+ export function applyAwarenessUpdate(existing, draft, input) {
349
+ const normalized = normalizeAwarenessDraft(draft);
350
+ if (!normalized)
351
+ return null;
352
+ if (!existing) {
353
+ // Do not let an agent-authored observation become the immutable user anchor.
354
+ if (!input.fromUser)
355
+ return null;
356
+ const arcId = `arc-${input.topicId}`;
357
+ const topic = materializeLayer(normalized.topic, input);
358
+ const state = {
359
+ version: 1,
360
+ anchor: {
361
+ goal: normalized.topic.goal,
362
+ capturedAt: input.at,
363
+ sourceMessageId: input.messageId,
364
+ sourceTurn: input.turn,
365
+ },
366
+ topic,
367
+ arcs: [{
368
+ arcId,
369
+ sequence: 1,
370
+ status: 'active',
371
+ startedAt: input.at,
372
+ startedTurn: input.turn,
373
+ boundaryKind: 'initial',
374
+ boundaryMessageId: input.messageId,
375
+ layer: materializeLayer(normalized.recentArc, input),
376
+ }],
377
+ currentArcId: arcId,
378
+ currentWork: materializeLayer(normalized.currentWork, input),
379
+ recentArcEvents: [],
380
+ archivedArcCount: 0,
381
+ updatedAt: input.at,
382
+ turnAtUpdate: input.turn,
383
+ };
384
+ recordArcEvent(state, normalized, input);
385
+ return {
386
+ state,
387
+ effectiveArcId: arcId,
388
+ transitioned: false,
389
+ applied: true,
390
+ stale: false,
391
+ anchorCorrected: false,
392
+ stateReconciled: false,
393
+ };
394
+ }
395
+ if (isOlderThanProjection(existing, input)) {
396
+ const state = structuredClone(existing);
397
+ state.recentArcEvents ??= [];
398
+ state.archivedArcCount ??= 0;
399
+ const anchorCorrected = input.fromUser && input.turn < existing.anchor.sourceTurn;
400
+ if (anchorCorrected) {
401
+ // The projection itself is stale, but the earliest valid user projection
402
+ // wins the origin regardless of LLM completion order. This is monotonic:
403
+ // a later turn can never rewrite the anchor.
404
+ state.anchor = {
405
+ goal: normalized.topic.goal,
406
+ capturedAt: input.at,
407
+ sourceMessageId: input.messageId,
408
+ sourceTurn: input.turn,
409
+ };
410
+ }
411
+ const eventRecorded = recordArcEvent(state, normalized, input);
412
+ const reconciled = reconcileArcs(state, input.topicId);
413
+ return {
414
+ state,
415
+ effectiveArcId: effectiveArcIdForTurn(state, input.turn),
416
+ transitioned: reconciled.addedBoundary,
417
+ applied: false,
418
+ stale: true,
419
+ anchorCorrected,
420
+ stateReconciled: anchorCorrected || eventRecorded || reconciled.changed,
421
+ };
422
+ }
423
+ const state = structuredClone(existing);
424
+ state.recentArcEvents ??= [];
425
+ state.archivedArcCount ??= 0;
426
+ state.topic = materializeLayer(normalized.topic, input);
427
+ state.currentWork = materializeLayer(normalized.currentWork, input);
428
+ state.updatedAt = input.at;
429
+ state.turnAtUpdate = input.turn;
430
+ recordArcEvent(state, normalized, input);
431
+ const reconciled = reconcileArcs(state, input.topicId);
432
+ return {
433
+ state,
434
+ effectiveArcId: effectiveArcIdForTurn(state, input.turn),
435
+ transitioned: reconciled.addedBoundary,
436
+ applied: true,
437
+ stale: false,
438
+ anchorCorrected: false,
439
+ stateReconciled: reconciled.changed,
440
+ };
441
+ }
442
+ /** Safe, bounded representation for the extractor's untrusted-data prompt block. */
443
+ export function awarenessForPrompt(state) {
444
+ if (!state)
445
+ return '(no awareness projection yet)';
446
+ const active = state.arcs.find((arc) => arc.arcId === state.currentArcId);
447
+ return JSON.stringify({
448
+ initialTopicAnchor: state.anchor.goal,
449
+ topic: state.topic,
450
+ recentArc: active?.layer ?? null,
451
+ currentWork: state.currentWork,
452
+ }).slice(0, 5000);
453
+ }
454
+ //# sourceMappingURL=TopicAwareness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TopicAwareness.js","sourceRoot":"","sources":["../../src/core/TopicAwareness.ts"],"names":[],"mappings":"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"}