agentfootprint-lens 0.53.2 → 0.53.3

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.
@@ -80,7 +80,7 @@ function ContextView(props) {
80
80
  const [mode, setMode] = useState(props.initialMode ?? "keys");
81
81
  const context = useMemo(
82
82
  () => contextAt(snapshot, servedCursorOf(cursor), {
83
- previous: previousOf(cursor, ownPositions),
83
+ previous: props.previous ?? previousOf(cursor, ownPositions),
84
84
  events
85
85
  }),
86
86
  [snapshot, cursor.at.runtimeStageId, cursor.at.commitIdx, cursor.at.step, ownPositions, events]
@@ -315,4 +315,4 @@ export {
315
315
  MILESTONE_AXIS,
316
316
  ContextView
317
317
  };
318
- //# sourceMappingURL=chunk-OUYJGQWK.js.map
318
+ //# sourceMappingURL=chunk-SJKOL3IK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/components/ContextView.tsx"],"sourcesContent":["/**\n * <ContextView> — the context object at the cursor, key by key: who wrote\n * each, what moved since the previous stop, what was served beside it.\n *\n * Standalone, like the Skill Graph: mount it anywhere with a recording and it\n * walks its own milestone axis; or hand it the ONE cursor (`cursor` from\n * `<Lens>`'s detail slot, or `lensCursorFrom`) and it never makes a second.\n *\n * <ContextView runner={recording} /> // its own cursor\n * <ContextView runner={recording} cursor={p.cursor} /> // the Lens's\n *\n * Everything printed is the record: key paths, values, stage ids, commit\n * indices, event names, the Served row's verdict badge. `LABELS` is every\n * string this view owns — names for things on the screen, never a sentence\n * about the run (test/served/no-own-claims.test.ts walks this file).\n */\nimport React, { useMemo, useState } from 'react';\n\nimport { contextAt, type ContextAt, type ContextKey } from '../../core/context/contextAt.js';\nimport type { LensCursor } from '../../core/cursor/lensCursor.js';\nimport { lensCursorFrom } from '../../core/cursor/lensCursor.js';\nimport type { CursorPosition } from '../../core/group/cursorPositionsAtDrill.js';\nimport type { ServedCursor } from '../../core/served/types.js';\nimport { tagAxisPositions } from '../../core/tags/tagAxis.js';\nimport type { EventLogEntry } from '../../core/types.js';\nimport { snapshotLogKey, snapshotOfRunner } from '../../core/utils/snapshotOfRunner.js';\nimport { Badge } from './ServedBadge.js';\n\nexport const LABELS = Object.freeze({\n view: 'Context',\n keys: 'keys',\n wroteBy: 'wrote by',\n at: 'at',\n entered: 'entered',\n changed: 'changed',\n unchanged: 'unchanged',\n left: 'left',\n unattributed: 'unattributed',\n rows: 'rows',\n served: 'served',\n why: 'why',\n epoch: 'epoch',\n system: 'system',\n tools: 'tools',\n redacted: 'redacted',\n skipped: 'skipped',\n foldError: 'fold error',\n servedError: 'served error',\n previous: 'previous',\n next: 'next',\n json: 'JSON',\n empty: '{ }',\n});\n\n/** The milestone kinds a standalone view walks — the library's own tag vocabulary. */\nexport const MILESTONE_AXIS: readonly string[] = Object.freeze([\n 'milestone:iteration',\n 'milestone:slot',\n 'milestone:llm-turn',\n 'milestone:tool-call',\n 'milestone:decision',\n]);\n\nexport interface ContextViewProps {\n /** The recording or a runner with `getLastSnapshot()` — the same input the Served tab takes. */\n readonly runner: unknown;\n /** THE cursor, when a host holds it. Absent: the view walks its own milestone axis. */\n readonly cursor?: LensCursor;\n /**\n * The previous stop on the HOST's axis, when it hands `cursor` (0.53.3) —\n * what `since` (entered / changed / unchanged) and `left` are measured\n * against. A standalone view knows its own previous stop; a slotted one\n * cannot, and without this it claims no direction.\n */\n readonly previous?: ServedCursor;\n /** The recording's event stream, for the `why` band (a replay's `getEntries()`). */\n readonly events?: readonly EventLogEntry[];\n /** Show the fold as JSON instead of the key table. */\n readonly initialMode?: 'keys' | 'json';\n}\n\nfunction positionsOf(snapshot: unknown): readonly CursorPosition[] {\n return tagAxisPositions(snapshot, MILESTONE_AXIS, []) ?? [];\n}\n\nfunction servedCursorOf(cursor: LensCursor): ServedCursor {\n return {\n runtimeStageId: cursor.at.runtimeStageId,\n commitIdx: cursor.at.commitIdx,\n };\n}\n\nfunction previousOf(\n cursor: LensCursor,\n positions: readonly CursorPosition[] | undefined,\n): ServedCursor | undefined {\n if (cursor.at.step <= 0) return undefined;\n const p = positions?.[cursor.at.step - 1];\n return p !== undefined ? { runtimeStageId: p.runtimeStageId, commitIdx: p.commitIdx } : undefined;\n}\n\nexport function ContextView(props: ContextViewProps): React.ReactElement {\n const { runner, events } = props;\n const fresh = snapshotOfRunner(runner);\n const logKey = snapshotLogKey(fresh);\n const snapshot = useMemo(() => fresh, [runner, logKey]);\n const ownPositions = useMemo(\n () => (props.cursor === undefined ? positionsOf(snapshot) : undefined),\n [snapshot, props.cursor],\n );\n const [ownStep, setOwnStep] = useState(0);\n const cursor: LensCursor =\n props.cursor ??\n lensCursorFrom(\n ownPositions ?? [],\n Math.min(ownStep, Math.max(0, (ownPositions?.length ?? 1) - 1)),\n setOwnStep,\n );\n const [mode, setMode] = useState<'keys' | 'json'>(props.initialMode ?? 'keys');\n\n const context = useMemo(\n () =>\n contextAt(snapshot, servedCursorOf(cursor), {\n previous: props.previous ?? previousOf(cursor, ownPositions),\n events,\n }),\n [snapshot, cursor.at.runtimeStageId, cursor.at.commitIdx, cursor.at.step, ownPositions, events],\n );\n\n return (\n <div\n style={panel}\n data-testid=\"context-view\"\n data-step={cursor.at.step}\n data-commit={cursor.at.commitIdx}\n >\n <div style={header}>\n <span style={title}>{LABELS.view}</span>\n <span style={dim}>\n {cursor.at.label} · {cursor.at.step + 1}/{cursor.total}\n </span>\n <span style={{ marginLeft: 'auto', display: 'flex', gap: 6 }}>\n {props.cursor === undefined && (\n <>\n <button\n type=\"button\"\n style={btn}\n disabled={cursor.at.step <= 0}\n onClick={() => cursor.moveTo(cursor.at.step - 1)}\n data-testid=\"context-prev\"\n >\n {LABELS.previous}\n </button>\n <button\n type=\"button\"\n style={btn}\n disabled={cursor.at.step >= cursor.total - 1}\n onClick={() => cursor.moveTo(cursor.at.step + 1)}\n data-testid=\"context-next\"\n >\n {LABELS.next}\n </button>\n </>\n )}\n <button\n type=\"button\"\n style={btn}\n aria-pressed={mode === 'keys'}\n onClick={() => setMode('keys')}\n data-testid=\"context-mode-keys\"\n >\n {LABELS.keys}\n </button>\n <button\n type=\"button\"\n style={btn}\n aria-pressed={mode === 'json'}\n onClick={() => setMode('json')}\n data-testid=\"context-mode-json\"\n >\n {LABELS.json}\n </button>\n </span>\n </div>\n <Facts context={context} />\n {mode === 'json' ? <JsonPane context={context} /> : <KeyTable context={context} />}\n <ServedBand context={context} />\n <WhyBand context={context} />\n </div>\n );\n}\n\nfunction Facts({ context }: { readonly context: ContextAt }): React.ReactElement | null {\n const facts: string[] = [];\n if (context.redacted) facts.push(LABELS.redacted);\n if (context.skipped !== undefined) facts.push(`${LABELS.skipped} ${context.skipped.join(',')}`);\n if (context.foldError !== undefined) facts.push(`${LABELS.foldError}: ${context.foldError}`);\n if (context.servedError !== undefined) facts.push(`${LABELS.servedError}: ${context.servedError}`);\n if (facts.length === 0) return null;\n return (\n <div style={dim} data-testid=\"context-facts\">\n {facts.join(' · ')}\n </div>\n );\n}\n\nfunction KeyTable({ context }: { readonly context: ContextAt }): React.ReactElement {\n if (context.keys.length === 0 && context.left.length === 0) {\n return (\n <div style={mono} data-testid=\"context-empty\">\n {LABELS.empty}\n </div>\n );\n }\n return (\n <table style={table} data-testid=\"context-keys\">\n <tbody>\n {context.keys.map((k) => (\n <KeyRow key={k.path} k={k} />\n ))}\n {context.left.map((path) => (\n <tr key={`left:${path}`} data-testid=\"context-key\" data-since=\"left\" style={{ opacity: 0.6 }}>\n <td style={cell}>\n <code>{path}</code>\n </td>\n <td style={cell}>{LABELS.left}</td>\n <td style={cell} />\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\nfunction KeyRow({ k }: { readonly k: ContextKey }): React.ReactElement {\n const since = k.since === undefined ? undefined : LABELS[k.since];\n return (\n <tr\n data-testid=\"context-key\"\n data-path={k.path}\n data-since={k.since ?? ''}\n style={k.since === 'unchanged' ? { opacity: 0.6 } : undefined}\n >\n <td style={cell}>\n <code>{k.path}</code>\n {since !== undefined && <span style={pill}>{since}</span>}\n </td>\n <td style={cell} data-testid=\"context-wrote-by\">\n {k.wroteBy !== undefined ? (\n <>\n <span style={dim}>{LABELS.wroteBy} </span>\n <code>{k.wroteBy}</code>\n <span style={dim}>\n {' '}\n {LABELS.at} #{k.wroteAt} · {k.verb}\n </span>\n </>\n ) : (\n <span style={dim}>{LABELS.unattributed}</span>\n )}\n </td>\n <td style={{ ...cell, ...mono }}>\n <ValueCell value={k.value} />\n </td>\n </tr>\n );\n}\n\nfunction ValueCell({ value }: { readonly value: unknown }): React.ReactElement {\n const text = JSON.stringify(value);\n const short = text === undefined ? '' : text.length > 160 ? `${text.slice(0, 157)}…` : text;\n return <span title={text}>{short}</span>;\n}\n\nfunction JsonPane({ context }: { readonly context: ContextAt }): React.ReactElement {\n const object: Record<string, unknown> = {};\n for (const k of context.keys) object[k.path] = k.value;\n return (\n <pre style={{ ...mono, ...pre }} data-testid=\"context-json\">\n {JSON.stringify(object, null, 2)}\n </pre>\n );\n}\n\nfunction ServedBand({ context }: { readonly context: ContextAt }): React.ReactElement | null {\n const served = context.served;\n if (served === undefined) return null;\n const { row, checks } = served;\n return (\n <div style={band} data-testid=\"context-served\" data-epoch={row.view.epoch}>\n <span style={dim}>\n {LABELS.served} · {LABELS.epoch} {row.view.epoch} · {LABELS.system}\n </span>{' '}\n <Badge check={checks.system} /> <span style={dim}>{LABELS.tools}</span>{' '}\n <Badge check={checks.toolNames} />\n </div>\n );\n}\n\nfunction WhyBand({ context }: { readonly context: ContextAt }): React.ReactElement | null {\n if (context.why.length === 0) return null;\n return (\n <div style={band} data-testid=\"context-why\">\n <span style={dim}>{LABELS.why}</span>\n <ul style={list}>\n {context.why.map((w) => (\n <li key={w.seq} style={mono}>\n <code>{w.name}</code> <span style={dim}>#{w.seq}</span>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\nconst panel: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n padding: 10,\n fontSize: 13,\n};\nconst header: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n};\nconst title: React.CSSProperties = { fontWeight: 600 };\nconst dim: React.CSSProperties = { opacity: 0.7 };\nconst mono: React.CSSProperties = {\n fontFamily: 'monospace',\n fontSize: 12,\n};\nconst pre: React.CSSProperties = {\n margin: 0,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n};\nconst table: React.CSSProperties = {\n borderCollapse: 'collapse',\n width: '100%',\n};\nconst cell: React.CSSProperties = {\n padding: '4px 6px',\n verticalAlign: 'top',\n borderTop: '1px solid',\n borderTopColor: 'currentColor',\n};\nconst pill: React.CSSProperties = {\n marginLeft: 6,\n padding: '0 6px',\n borderRadius: 8,\n fontSize: 11,\n border: '1px solid',\n borderColor: 'currentColor',\n};\nconst band: React.CSSProperties = {\n paddingTop: 6,\n borderTop: '1px solid',\n borderTopColor: 'currentColor',\n};\nconst list: React.CSSProperties = { margin: '4px 0 0', paddingLeft: 18 };\nconst btn: React.CSSProperties = { fontSize: 12, padding: '2px 8px' };\n"],"mappings":"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","names":[]}
package/dist/context.cjs CHANGED
@@ -1110,7 +1110,7 @@ function ContextView(props) {
1110
1110
  const [mode, setMode] = (0, import_react.useState)(props.initialMode ?? "keys");
1111
1111
  const context = (0, import_react.useMemo)(
1112
1112
  () => contextAt(snapshot, servedCursorOf(cursor), {
1113
- previous: previousOf(cursor, ownPositions),
1113
+ previous: props.previous ?? previousOf(cursor, ownPositions),
1114
1114
  events
1115
1115
  }),
1116
1116
  [snapshot, cursor.at.runtimeStageId, cursor.at.commitIdx, cursor.at.step, ownPositions, events]