@neonwatty/limner 0.1.6 → 0.1.7
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/README.md +27 -1
- package/dist/commands/compare-output.js +1 -0
- package/dist/commands/compare-output.js.map +1 -1
- package/dist/commands/ledger.d.ts +3 -1
- package/dist/commands/loop-actions.d.ts +22 -0
- package/dist/commands/loop-actions.js +54 -0
- package/dist/commands/loop-actions.js.map +1 -0
- package/dist/commands/loop-cli.js +96 -2
- package/dist/commands/loop-cli.js.map +1 -1
- package/dist/commands/loop-task.d.ts +17 -0
- package/dist/commands/loop-task.js +95 -0
- package/dist/commands/loop-task.js.map +1 -0
- package/dist/commands/loop.d.ts +3 -1
- package/dist/commands/loop.js +23 -21
- package/dist/commands/loop.js.map +1 -1
- package/dist/core/agent-comparison-pack.d.ts +13 -0
- package/dist/core/agent-comparison-pack.js +27 -21
- package/dist/core/agent-comparison-pack.js.map +1 -1
- package/dist/core/agent-comparison-response.d.ts +19 -0
- package/dist/core/agent-comparison-response.js +34 -0
- package/dist/core/agent-comparison-response.js.map +1 -0
- package/dist/core/agent-task-brief.d.ts +30 -0
- package/dist/core/agent-task-brief.js +158 -0
- package/dist/core/agent-task-brief.js.map +1 -0
- package/dist/core/comparison-artifacts.js +17 -3
- package/dist/core/comparison-artifacts.js.map +1 -1
- package/dist/core/current-artifacts.d.ts +14 -0
- package/dist/core/current-artifacts.js +16 -0
- package/dist/core/current-artifacts.js.map +1 -0
- package/dist/core/ledger-agent-responses.d.ts +21 -0
- package/dist/core/ledger-agent-responses.js +13 -0
- package/dist/core/ledger-agent-responses.js.map +1 -0
- package/dist/core/ledger-db.js +18 -0
- package/dist/core/ledger-db.js.map +1 -1
- package/dist/core/ledger-events.js +21 -1
- package/dist/core/ledger-events.js.map +1 -1
- package/dist/core/ledger-markdown.d.ts +21 -6
- package/dist/core/ledger-markdown.js +89 -6
- package/dist/core/ledger-markdown.js.map +1 -1
- package/dist/core/ledger-queries.d.ts +4 -1
- package/dist/core/ledger-queries.js +11 -3
- package/dist/core/ledger-queries.js.map +1 -1
- package/dist/core/ledger-store.d.ts +8 -1
- package/dist/core/ledger-store.js +4 -0
- package/dist/core/ledger-store.js.map +1 -1
- package/dist/core/loop-rerun-command.d.ts +4 -0
- package/dist/core/loop-rerun-command.js +36 -0
- package/dist/core/loop-rerun-command.js.map +1 -0
- package/dist/schemas/ledger.d.ts +23 -0
- package/dist/schemas/ledger.js +4 -0
- package/dist/schemas/ledger.js.map +1 -1
- package/docs/agent-workflow.md +31 -1
- package/docs/superpowers/plans/2026-06-13-agent-response-sqlite.md +70 -0
- package/docs/superpowers/plans/2026-06-13-loop-action-ledger.md +257 -0
- package/package.json +1 -1
- package/skills/limner/SKILL.md +15 -4
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export function formatLedgerMarkdown(exported) {
|
|
2
|
+
const currentWrittenArtifacts = exported.currentArtifacts?.writtenArtifacts ?? exported.artifacts.filter((artifact) => artifact.role !== 'expected-output');
|
|
3
|
+
const currentExpectedOutputs = exported.currentArtifacts?.expectedOutputs ?? exported.artifacts.filter((artifact) => artifact.role === 'expected-output');
|
|
2
4
|
const lines = [
|
|
3
5
|
'# Limner Trajectory',
|
|
4
6
|
'',
|
|
@@ -14,29 +16,106 @@ export function formatLedgerMarkdown(exported) {
|
|
|
14
16
|
'## Timeline',
|
|
15
17
|
'',
|
|
16
18
|
...exported.events.flatMap(formatEvent),
|
|
17
|
-
'##
|
|
19
|
+
'## Agent Responses',
|
|
18
20
|
'',
|
|
19
|
-
...
|
|
20
|
-
'##
|
|
21
|
+
...formatAgentResponses(exported.agentResponses ?? []),
|
|
22
|
+
'## Action History',
|
|
21
23
|
'',
|
|
22
|
-
...
|
|
24
|
+
...formatActions(exported.events),
|
|
25
|
+
'## Current Written Artifacts',
|
|
26
|
+
'',
|
|
27
|
+
...formatArtifacts(currentWrittenArtifacts),
|
|
28
|
+
'## Current Expected Outputs',
|
|
29
|
+
'',
|
|
30
|
+
...formatArtifacts(currentExpectedOutputs),
|
|
31
|
+
'## Artifact History',
|
|
32
|
+
'',
|
|
33
|
+
...formatArtifacts(exported.artifacts),
|
|
23
34
|
'',
|
|
24
35
|
];
|
|
25
36
|
return lines.join('\n');
|
|
26
37
|
}
|
|
38
|
+
function formatAgentResponses(responses) {
|
|
39
|
+
if (responses.length === 0)
|
|
40
|
+
return ['- None recorded'];
|
|
41
|
+
return responses.flatMap((response) => [
|
|
42
|
+
`- ${response.responseId}`,
|
|
43
|
+
...(response.runId ? [` - run: ${response.runId}`] : []),
|
|
44
|
+
` - status: ${response.validationStatus}`,
|
|
45
|
+
` - freshness: ${response.freshness}`,
|
|
46
|
+
...(response.responseHash ? [` - hash: ${response.responseHash}`] : []),
|
|
47
|
+
...formatScore(response.scoreJson),
|
|
48
|
+
...(response.topFix ? [` - top fix: ${response.topFix}`] : []),
|
|
49
|
+
` - response: ${response.responsePath}`,
|
|
50
|
+
]);
|
|
51
|
+
}
|
|
52
|
+
function formatScore(raw) {
|
|
53
|
+
if (!raw)
|
|
54
|
+
return [];
|
|
55
|
+
try {
|
|
56
|
+
const parsed = JSON.parse(raw);
|
|
57
|
+
return [
|
|
58
|
+
typeof parsed.imageOverall === 'number' ? ` - image score: ${parsed.imageOverall}` : undefined,
|
|
59
|
+
typeof parsed.structureOverall === 'number' ? ` - structure score: ${parsed.structureOverall}` : undefined,
|
|
60
|
+
].filter((line) => Boolean(line));
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
27
66
|
function formatEvent(event) {
|
|
28
67
|
const refs = parseRefs(event.artifactRefsJson);
|
|
68
|
+
const context = event.eventType.startsWith('loop.action.') ? [] : formatContext(event.inputsSummary);
|
|
29
69
|
return [
|
|
30
70
|
`- ${event.createdAt ?? 'unknown'} ${event.eventType} (${event.resultStatus ?? 'unknown'})`,
|
|
31
71
|
` - actor: ${event.actor ?? 'unknown'}`,
|
|
32
72
|
` - command: ${event.command ?? 'unknown'}`,
|
|
33
73
|
...(event.runId ? [` - run: ${event.runId}`] : []),
|
|
34
74
|
...(event.agentFeedback ? [` - feedback: ${event.agentFeedback}`] : []),
|
|
35
|
-
...
|
|
75
|
+
...context,
|
|
36
76
|
...(event.notes ? [` - notes: ${event.notes}`] : []),
|
|
37
77
|
...refs.map((ref) => ` - ${ref.role === 'expected-output' ? 'expected output' : 'artifact'}: ${ref.kind}: ${ref.path}`),
|
|
38
78
|
];
|
|
39
79
|
}
|
|
80
|
+
function formatActions(events) {
|
|
81
|
+
const actions = events.filter((event) => event.eventType.startsWith('loop.action.'));
|
|
82
|
+
if (actions.length === 0)
|
|
83
|
+
return ['- None recorded'];
|
|
84
|
+
return actions.flatMap(formatAction);
|
|
85
|
+
}
|
|
86
|
+
function formatAction(event) {
|
|
87
|
+
const summary = parseActionSummary(event.inputsSummary);
|
|
88
|
+
const refs = parseRefs(event.artifactRefsJson);
|
|
89
|
+
const files = getStringArray(summary, 'files');
|
|
90
|
+
const fallbackStatus = event.eventType.replace('loop.action.', '') || undefined;
|
|
91
|
+
const actionId = getString(summary, 'actionId') ?? event.runId ?? event.eventType;
|
|
92
|
+
return [
|
|
93
|
+
`- ${actionId}`,
|
|
94
|
+
` - status: ${getString(summary, 'status') ?? fallbackStatus ?? event.resultStatus ?? 'unknown'}`,
|
|
95
|
+
...optionalLine('executor', getString(summary, 'executor') ?? event.actor),
|
|
96
|
+
...optionalLine('from run', getString(summary, 'fromRunId')),
|
|
97
|
+
...optionalLine('summary', getString(summary, 'summary') ?? event.notes),
|
|
98
|
+
...formatActionFiles(files.length > 0 ? files : refs.map((ref) => ref.path)),
|
|
99
|
+
...optionalLine('commit', getString(summary, 'commit')),
|
|
100
|
+
];
|
|
101
|
+
}
|
|
102
|
+
function parseActionSummary(raw) {
|
|
103
|
+
if (!raw)
|
|
104
|
+
return {};
|
|
105
|
+
try {
|
|
106
|
+
const parsed = JSON.parse(raw);
|
|
107
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {};
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return {};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function optionalLine(label, value) {
|
|
114
|
+
return value ? [` - ${label}: ${value}`] : [];
|
|
115
|
+
}
|
|
116
|
+
function formatActionFiles(files) {
|
|
117
|
+
return files.length > 0 ? [` - files: ${files.join(', ')}`] : [];
|
|
118
|
+
}
|
|
40
119
|
function formatContext(raw) {
|
|
41
120
|
if (!raw)
|
|
42
121
|
return [];
|
|
@@ -45,7 +124,7 @@ function formatContext(raw) {
|
|
|
45
124
|
const parts = [
|
|
46
125
|
`cli ${stringValue(parsed.cliVersion)}`,
|
|
47
126
|
parsed.headless === true ? 'headless' : parsed.headed === true ? 'headed' : undefined,
|
|
48
|
-
parsed.fullPage === true ? 'full-page' : 'viewport',
|
|
127
|
+
parsed.fullPage === true ? 'full-page' : parsed.fullPage === false ? 'viewport' : undefined,
|
|
49
128
|
stringValue(parsed.cwd),
|
|
50
129
|
].filter(Boolean);
|
|
51
130
|
return parts.length > 0 ? [` - context: ${parts.join(', ')}`] : [];
|
|
@@ -86,6 +165,10 @@ function getString(value, key) {
|
|
|
86
165
|
const record = value;
|
|
87
166
|
return typeof record[key] === 'string' ? record[key] : undefined;
|
|
88
167
|
}
|
|
168
|
+
function getStringArray(value, key) {
|
|
169
|
+
const record = value;
|
|
170
|
+
return Array.isArray(record[key]) ? record[key].filter((item) => typeof item === 'string') : [];
|
|
171
|
+
}
|
|
89
172
|
function stringValue(value) {
|
|
90
173
|
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
91
174
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledger-markdown.js","sourceRoot":"","sources":["../../src/core/ledger-markdown.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ledger-markdown.js","sourceRoot":"","sources":["../../src/core/ledger-markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { LedgerArtifactRow } from './current-artifacts.js';
|
|
1
2
|
import type { LedgerDatabase } from './ledger-db.js';
|
|
2
3
|
import type { ResolveTrajectoryInput, TrajectorySummary } from './ledger-store.js';
|
|
3
4
|
export declare function queryTrajectories(db: LedgerDatabase, input: ResolveTrajectoryInput): TrajectorySummary[];
|
|
@@ -10,5 +11,7 @@ export declare function exportTrajectoryRows(db: LedgerDatabase, trajectory: Tra
|
|
|
10
11
|
runs: unknown[];
|
|
11
12
|
instructionVersions: unknown[];
|
|
12
13
|
notes: unknown[];
|
|
13
|
-
|
|
14
|
+
agentResponses: unknown[];
|
|
15
|
+
artifacts: LedgerArtifactRow[];
|
|
16
|
+
currentArtifacts: import("./current-artifacts.js").CurrentArtifacts;
|
|
14
17
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getCurrentArtifacts } from './current-artifacts.js';
|
|
1
2
|
export function queryTrajectories(db, input) {
|
|
2
3
|
const conditions = [];
|
|
3
4
|
const params = [];
|
|
@@ -24,6 +25,8 @@ export function getIterations(db, trajectoryId) {
|
|
|
24
25
|
}
|
|
25
26
|
export function exportTrajectoryRows(db, trajectory) {
|
|
26
27
|
const trajectoryId = trajectory.trajectoryId;
|
|
28
|
+
const artifacts = db.prepare(`select artifact_id as artifactId, kind, path, role, exists_on_disk as existsOnDisk,
|
|
29
|
+
hash, snapshot_path as snapshotPath from artifacts where trajectory_id = ? order by rowid`).all(trajectoryId);
|
|
27
30
|
return {
|
|
28
31
|
trajectory,
|
|
29
32
|
iterations: getIterations(db, trajectoryId),
|
|
@@ -33,8 +36,12 @@ export function exportTrajectoryRows(db, trajectory) {
|
|
|
33
36
|
runs: db.prepare('select run_id as runId, iteration_id as iterationId, command, status from runs where trajectory_id = ? order by rowid').all(trajectoryId),
|
|
34
37
|
instructionVersions: db.prepare('select version_id as versionId, instructions_json as instructionsJson from instruction_versions where trajectory_id = ? order by rowid').all(trajectoryId),
|
|
35
38
|
notes: db.prepare('select note_id as noteId, body from notes where trajectory_id = ? order by rowid').all(trajectoryId),
|
|
36
|
-
|
|
37
|
-
|
|
39
|
+
agentResponses: db.prepare(`select response_id as responseId, iteration_id as iterationId, run_id as runId, mode, profile,
|
|
40
|
+
response_path as responsePath, response_hash as responseHash, freshness, validation_status as validationStatus,
|
|
41
|
+
input_fingerprint_json as inputFingerprintJson, response_json as responseJson, score_json as scoreJson,
|
|
42
|
+
top_fix as topFix, created_at as createdAt from agent_responses where trajectory_id = ? order by rowid`).all(trajectoryId),
|
|
43
|
+
artifacts,
|
|
44
|
+
currentArtifacts: getCurrentArtifacts(artifacts),
|
|
38
45
|
};
|
|
39
46
|
}
|
|
40
47
|
const trajectoryColumns = `
|
|
@@ -44,6 +51,7 @@ const trajectoryColumns = `
|
|
|
44
51
|
target,
|
|
45
52
|
status,
|
|
46
53
|
active_iteration_id as activeIterationId,
|
|
47
|
-
max_iterations as maxIterations
|
|
54
|
+
max_iterations as maxIterations,
|
|
55
|
+
context_json as contextJson
|
|
48
56
|
`;
|
|
49
57
|
//# sourceMappingURL=ledger-queries.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledger-queries.js","sourceRoot":"","sources":["../../src/core/ledger-queries.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ledger-queries.js","sourceRoot":"","sources":["../../src/core/ledger-queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAK7D,MAAM,UAAU,iBAAiB,CAAC,EAAkB,EAAE,KAA6B;IACjF,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI;QAC5B,CAAC,eAAe,EAAE,KAAK,CAAC,YAAY,CAAC;QACrC,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;QACxB,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC;QACpB,CAAC,cAAc,EAAE,KAAK,CAAC,WAAW,CAAC;QACnC,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;KAC/D,EAAE,CAAC;QACX,IAAI,KAAK,EAAE,CAAC;YACV,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,OAAO,EAAE,CAAC,OAAO,CAAC,UAAU,iBAAiB,sBAAsB,KAAK,gCAAgC,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAwB,CAAC;AAClJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAkB,EAAE,YAAoB;IACpE,OAAO,EAAE,CAAC,OAAO,CAAC,UAAU,iBAAiB,4CAA4C,CAAC,CAAC,GAAG,CAAC,YAAY,CAAkC,CAAC;AAChJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAkB,EAAE,YAAoB;IACpE,OAAO,EAAE,CAAC,OAAO,CAAC,gHAAgH,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AACxJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAkB,EAAE,UAA6B;IACpF,MAAM,YAAY,GAAG,UAAU,CAAC,YAAY,CAAC;IAC7C,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC;8FAC+D,CAAC,CAAC,GAAG,CAAC,YAAY,CAAwB,CAAC;IACvI,OAAO;QACL,UAAU;QACV,UAAU,EAAE,aAAa,CAAC,EAAE,EAAE,YAAY,CAAC;QAC3C,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC;;gEAEyC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;QAC/E,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,uHAAuH,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;QAC3J,mBAAmB,EAAE,EAAE,CAAC,OAAO,CAAC,wIAAwI,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;QAC3L,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,kFAAkF,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;QACvH,cAAc,EAAE,EAAE,CAAC,OAAO,CAAC;;;6GAG8E,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;QAC5H,SAAS;QACT,gBAAgB,EAAE,mBAAmB,CAAC,SAAS,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,MAAM,iBAAiB,GAAG;;;;;;;;;CASzB,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type LedgerArtifactRef, type LedgerEventActor, type LedgerMode } from '../schemas/ledger.js';
|
|
2
2
|
import type { LedgerDatabase } from './ledger-db.js';
|
|
3
|
+
import { type RecordAgentResponseInput } from './ledger-agent-responses.js';
|
|
3
4
|
export type StartTrajectoryInput = {
|
|
4
5
|
mode: LedgerMode;
|
|
5
6
|
target: string;
|
|
@@ -18,6 +19,7 @@ export type TrajectorySummary = {
|
|
|
18
19
|
status: 'active' | 'closed';
|
|
19
20
|
activeIterationId: string | null;
|
|
20
21
|
maxIterations: number | null;
|
|
22
|
+
contextJson: string;
|
|
21
23
|
};
|
|
22
24
|
export type AppendEventInput = {
|
|
23
25
|
trajectoryId?: string;
|
|
@@ -48,6 +50,9 @@ export declare function createLedgerStore(db: LedgerDatabase): {
|
|
|
48
50
|
appendEvent(input: AppendEventInput): {
|
|
49
51
|
eventId: unknown;
|
|
50
52
|
};
|
|
53
|
+
recordAgentResponse(input: RecordAgentResponseInput): {
|
|
54
|
+
responseId: string;
|
|
55
|
+
};
|
|
51
56
|
resolveTrajectory(input: ResolveTrajectoryInput): TrajectorySummary;
|
|
52
57
|
advanceIteration(trajectoryId: string): {
|
|
53
58
|
iterationId: string;
|
|
@@ -60,6 +65,8 @@ export declare function createLedgerStore(db: LedgerDatabase): {
|
|
|
60
65
|
runs: unknown[];
|
|
61
66
|
instructionVersions: unknown[];
|
|
62
67
|
notes: unknown[];
|
|
63
|
-
|
|
68
|
+
agentResponses: unknown[];
|
|
69
|
+
artifacts: import("./current-artifacts.js").LedgerArtifactRow[];
|
|
70
|
+
currentArtifacts: import("./current-artifacts.js").CurrentArtifacts;
|
|
64
71
|
};
|
|
65
72
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ledgerModeSchema } from '../schemas/ledger.js';
|
|
2
|
+
import { insertAgentResponse } from './ledger-agent-responses.js';
|
|
2
3
|
import { insertLedgerEvent } from './ledger-events.js';
|
|
3
4
|
import { createLedgerId, createTrajectoryId } from './ledger-ids.js';
|
|
4
5
|
import { exportTrajectoryRows, getIterations, getTrajectory, queryTrajectories } from './ledger-queries.js';
|
|
@@ -56,6 +57,9 @@ export function createLedgerStore(db) {
|
|
|
56
57
|
insertLedgerEvent(db, input, now);
|
|
57
58
|
return { eventId: db.prepare('select event_id as eventId from ledger_events order by rowid desc limit 1').get() };
|
|
58
59
|
},
|
|
60
|
+
recordAgentResponse(input) {
|
|
61
|
+
return insertAgentResponse(db, input, new Date().toISOString());
|
|
62
|
+
},
|
|
59
63
|
resolveTrajectory(input) {
|
|
60
64
|
const candidates = queryTrajectories(db, input);
|
|
61
65
|
if (candidates.length === 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledger-store.js","sourceRoot":"","sources":["../../src/core/ledger-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAkE,MAAM,sBAAsB,CAAC;AAExH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"ledger-store.js","sourceRoot":"","sources":["../../src/core/ledger-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function buildLoopCompareRerunCommand(trajectory, preferredContextJson) {
|
|
2
|
+
const context = {
|
|
3
|
+
...parseLoopContext(trajectory.contextJson),
|
|
4
|
+
...parseLoopContext(preferredContextJson),
|
|
5
|
+
};
|
|
6
|
+
const parts = ['limner', 'loop', 'compare', '--trajectory', trajectory.trajectoryId];
|
|
7
|
+
if (context.url)
|
|
8
|
+
parts.push('--url', shellQuote(context.url));
|
|
9
|
+
if (context.storageState)
|
|
10
|
+
parts.push('--storage-state', shellQuote(context.storageState));
|
|
11
|
+
if (context.fullPage)
|
|
12
|
+
parts.push('--full-page');
|
|
13
|
+
return parts.join(' ');
|
|
14
|
+
}
|
|
15
|
+
function parseLoopContext(raw) {
|
|
16
|
+
if (!raw)
|
|
17
|
+
return {};
|
|
18
|
+
try {
|
|
19
|
+
const parsed = JSON.parse(raw);
|
|
20
|
+
const context = {};
|
|
21
|
+
if (typeof parsed.url === 'string')
|
|
22
|
+
context.url = parsed.url;
|
|
23
|
+
if (typeof parsed.storageState === 'string')
|
|
24
|
+
context.storageState = parsed.storageState;
|
|
25
|
+
if (typeof parsed.fullPage === 'boolean')
|
|
26
|
+
context.fullPage = parsed.fullPage;
|
|
27
|
+
return context;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return {};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function shellQuote(value) {
|
|
34
|
+
return `'${value.replaceAll("'", "'\\''")}'`;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=loop-rerun-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-rerun-command.js","sourceRoot":"","sources":["../../src/core/loop-rerun-command.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,4BAA4B,CAAC,UAAiE,EAAE,oBAAoC;IAClJ,MAAM,OAAO,GAAG;QACd,GAAG,gBAAgB,CAAC,UAAU,CAAC,WAAW,CAAC;QAC3C,GAAG,gBAAgB,CAAC,oBAAoB,CAAC;KAC1C,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;IACrF,IAAI,OAAO,CAAC,GAAG;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,YAAY;QAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAC1F,IAAI,OAAO,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,gBAAgB,CAAC,GAA8B;IACtD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QAC1D,MAAM,OAAO,GAAgE,EAAE,CAAC;QAChF,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ;YAAE,OAAO,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QAC7D,IAAI,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ;YAAE,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACxF,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,SAAS;YAAE,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC7E,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;AAC/C,CAAC"}
|
package/dist/schemas/ledger.d.ts
CHANGED
|
@@ -18,6 +18,26 @@ export declare const ledgerEventActorSchema: z.ZodEnum<{
|
|
|
18
18
|
cli: "cli";
|
|
19
19
|
}>;
|
|
20
20
|
export declare const agentFeedbackSchema: z.ZodOptional<z.ZodString>;
|
|
21
|
+
export declare const ledgerActionKindSchema: z.ZodEnum<{
|
|
22
|
+
polish: "polish";
|
|
23
|
+
handoff: "handoff";
|
|
24
|
+
"manual-edit": "manual-edit";
|
|
25
|
+
verification: "verification";
|
|
26
|
+
"no-op": "no-op";
|
|
27
|
+
}>;
|
|
28
|
+
export declare const ledgerActionStatusSchema: z.ZodEnum<{
|
|
29
|
+
skipped: "skipped";
|
|
30
|
+
failed: "failed";
|
|
31
|
+
started: "started";
|
|
32
|
+
completed: "completed";
|
|
33
|
+
}>;
|
|
34
|
+
export declare const ledgerActionExecutorSchema: z.ZodEnum<{
|
|
35
|
+
agent: "agent";
|
|
36
|
+
user: "user";
|
|
37
|
+
cli: "cli";
|
|
38
|
+
subagent: "subagent";
|
|
39
|
+
}>;
|
|
40
|
+
export declare const ledgerActionSummarySchema: z.ZodString;
|
|
21
41
|
export declare const ledgerArtifactRefSchema: z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
|
|
22
42
|
path: z.ZodString;
|
|
23
43
|
kind: z.ZodString;
|
|
@@ -32,4 +52,7 @@ export type TrajectoryStatus = z.infer<typeof trajectoryStatusSchema>;
|
|
|
32
52
|
export type IterationStatus = z.infer<typeof iterationStatusSchema>;
|
|
33
53
|
export type LedgerEventActor = z.infer<typeof ledgerEventActorSchema>;
|
|
34
54
|
export type AgentFeedback = z.infer<typeof agentFeedbackSchema>;
|
|
55
|
+
export type LedgerActionKind = z.infer<typeof ledgerActionKindSchema>;
|
|
56
|
+
export type LedgerActionStatus = z.infer<typeof ledgerActionStatusSchema>;
|
|
57
|
+
export type LedgerActionExecutor = z.infer<typeof ledgerActionExecutorSchema>;
|
|
35
58
|
export type LedgerArtifactRef = z.infer<typeof ledgerArtifactRefSchema>;
|
package/dist/schemas/ledger.js
CHANGED
|
@@ -4,6 +4,10 @@ export const trajectoryStatusSchema = z.enum(['active', 'closed']);
|
|
|
4
4
|
export const iterationStatusSchema = z.enum(['active', 'closed']);
|
|
5
5
|
export const ledgerEventActorSchema = z.enum(['user', 'agent', 'cli']);
|
|
6
6
|
export const agentFeedbackSchema = z.string().max(255).optional();
|
|
7
|
+
export const ledgerActionKindSchema = z.enum(['polish', 'handoff', 'manual-edit', 'verification', 'no-op']);
|
|
8
|
+
export const ledgerActionStatusSchema = z.enum(['started', 'completed', 'skipped', 'failed']);
|
|
9
|
+
export const ledgerActionExecutorSchema = z.enum(['subagent', 'agent', 'user', 'cli']);
|
|
10
|
+
export const ledgerActionSummarySchema = z.string().min(1).max(255);
|
|
7
11
|
export const ledgerArtifactRefSchema = z.union([
|
|
8
12
|
z.string(),
|
|
9
13
|
z.object({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../src/schemas/ledger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,uBAAuB,EAAE,sBAAsB,CAAC,CAAC,CAAC;AAC1G,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AACvE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;AAClE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC;IAC7C,CAAC,CAAC,MAAM,EAAE;IACV,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;QACjE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;KAC/B,CAAC;CACH,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../src/schemas/ledger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,uBAAuB,EAAE,sBAAsB,CAAC,CAAC,CAAC;AAC1G,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AACvE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;AAClE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;AAC5G,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC9F,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AACvF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACpE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC;IAC7C,CAAC,CAAC,MAAM,EAAE;IACV,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;QACjE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;KAC/B,CAAC;CACH,CAAC,CAAC"}
|
package/docs/agent-workflow.md
CHANGED
|
@@ -18,10 +18,40 @@ Use `limner loop` when a screen will need Ralph Loop-style iteration. Limner sto
|
|
|
18
18
|
6. Use `limner loop next --trajectory <trajectory-id>` to begin the next scoped fix.
|
|
19
19
|
7. Use `limner loop close --trajectory <trajectory-id>` when the trajectory is done.
|
|
20
20
|
|
|
21
|
-
Every meaningful loop interaction writes a ledger event. Use `--feedback "<short note>"` on loop status for a 255-character `agentFeedback` note about improving the current process.
|
|
21
|
+
Every meaningful loop interaction writes a ledger event. Agent responses are stored in the local SQLite DB with the full JSON body, hash, validation status, and freshness, so cached reuse is visible in exports. Use `--feedback "<short note>"` on loop status for a 255-character `agentFeedback` note about improving the current process.
|
|
22
22
|
|
|
23
23
|
Use `limner ledger export <trajectory-id> --format markdown` when an agent needs a compact case file for a trajectory.
|
|
24
24
|
|
|
25
|
+
## Action Logging
|
|
26
|
+
|
|
27
|
+
After validation, the expected edit loop is:
|
|
28
|
+
|
|
29
|
+
```text
|
|
30
|
+
loop compare -> loop task --executor subagent -> loop action start -> edit -> loop action complete -> loop compare
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Prefer `limner loop task --trajectory <trajectory-id> --executor subagent` so the task brief records subagent intent. Before editing, record the source comparison run with `limner loop action start --trajectory <trajectory-id> --from-run <run-id> --kind polish --executor subagent --summary "<short edit intent>"`. After editing, record `limner loop action complete --trajectory <trajectory-id> --action <action-id> --executor subagent --summary "<what changed>" --files "<paths>"`, then rerun `limner loop compare --trajectory <trajectory-id>`.
|
|
34
|
+
|
|
35
|
+
Use `limner loop action skip --trajectory <trajectory-id> --from-run <run-id> --summary "Comparison smoke only; no edit intended"` for comparison-only smoke runs. Keep every `--summary` under 255 characters. Limner records executor intent and action claims; it cannot itself prove that an external orchestrator actually used a subagent.
|
|
36
|
+
|
|
37
|
+
## Agent Handoff After Validation
|
|
38
|
+
|
|
39
|
+
After an agent writes `agent-response.json` and `limner loop compare` reports `Agent comparison status: validated`, use:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
limner loop task --trajectory <trajectory-id> --executor subagent
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
The task brief is generated from the latest validated `comparison-summary.json`. It includes the trajectory, target, mode, overall score, top fix, likely editable files, selectors, prioritized diffs, next-iteration steps, and the compare command to rerun after edits.
|
|
46
|
+
|
|
47
|
+
For machine-readable output:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
limner loop task --trajectory <trajectory-id> --executor subagent --format json
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Ledger exports remain append-only for audit history, but the top artifact sections show de-duped current artifacts so agents can quickly find the latest written files and expected outputs.
|
|
54
|
+
|
|
25
55
|
## Phase 1: Image To Reference
|
|
26
56
|
|
|
27
57
|
1. Run `limner init <image> --target <name>`.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Agent Response SQLite Evidence Implementation Plan
|
|
2
|
+
|
|
3
|
+
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
|
4
|
+
|
|
5
|
+
**Goal:** Store every loop comparison's full `agent-response.json` evidence in SQLite so freshness, validation, and recommendations are centralized.
|
|
6
|
+
|
|
7
|
+
**Architecture:** Add an `agent_responses` table beside `ledger_events`, not inside the event log. `writeAgentComparisonPack` reports response JSON/hash/freshness; `loop compare` records that evidence with trajectory, iteration, and run IDs. Ledger exports summarize DB rows and mark cached reuse plainly.
|
|
8
|
+
|
|
9
|
+
**Tech Stack:** TypeScript, better-sqlite3, Zod comparison schema, Vitest, GitHub Actions, npm release workflow.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Files
|
|
14
|
+
|
|
15
|
+
- Modify `src/core/ledger-db.ts`: create `agent_responses`.
|
|
16
|
+
- Modify `src/core/agent-comparison-pack.ts`: expose response JSON, hash, and freshness.
|
|
17
|
+
- Modify `src/core/ledger-store.ts`: add `recordAgentResponse`.
|
|
18
|
+
- Modify `src/core/ledger-queries.ts`: export agent response rows.
|
|
19
|
+
- Modify `src/core/ledger-markdown.ts`: render `## Agent Responses`.
|
|
20
|
+
- Modify `src/commands/loop.ts`: record response evidence after compare.
|
|
21
|
+
- Tests: `src/core/ledger-db.test.ts`, `src/core/agent-comparison-pack.test.ts`, `src/core/ledger-store.test.ts`, `src/commands/loop.test.ts`, `src/commands/ledger.test.ts`.
|
|
22
|
+
- Docs: update `README.md`, `docs/agent-workflow.md`, and `skills/limner/SKILL.md` only if CLI/user behavior changes.
|
|
23
|
+
|
|
24
|
+
## Data Contract
|
|
25
|
+
|
|
26
|
+
Create table:
|
|
27
|
+
|
|
28
|
+
```sql
|
|
29
|
+
agent_responses (
|
|
30
|
+
response_id text primary key,
|
|
31
|
+
trajectory_id text not null references trajectories(trajectory_id) on delete cascade,
|
|
32
|
+
iteration_id text,
|
|
33
|
+
run_id text,
|
|
34
|
+
mode text not null,
|
|
35
|
+
profile text,
|
|
36
|
+
response_path text not null,
|
|
37
|
+
response_hash text,
|
|
38
|
+
freshness text not null,
|
|
39
|
+
validation_status text not null,
|
|
40
|
+
input_fingerprint_json text,
|
|
41
|
+
response_json text,
|
|
42
|
+
score_json text,
|
|
43
|
+
top_fix text,
|
|
44
|
+
created_at text not null
|
|
45
|
+
)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Freshness values: `missing`, `cached`, `stale`, `invalid`. `fresh` is reserved for future run-scoped response creation.
|
|
49
|
+
|
|
50
|
+
## Tasks
|
|
51
|
+
|
|
52
|
+
- [ ] **Task 1: DB schema and store API**
|
|
53
|
+
|
|
54
|
+
Add `agent_responses` to `ledger-db.ts` and assert it exists in `ledger-db.test.ts`. Add `recordAgentResponse` to `ledger-store.ts`; it inserts one row with `response_id = createLedgerId('resp')`. Add a store test that starts a trajectory, records a validated cached response with `response_json`, then exports the row.
|
|
55
|
+
|
|
56
|
+
- [ ] **Task 2: Pack response evidence**
|
|
57
|
+
|
|
58
|
+
In `agent-comparison-pack.ts`, compute whether `agent-response.json` existed before the pack was written, read the raw response text when present, hash it, and expose fields on `AgentComparisonPackResult`: `responseJson`, `responseHash`, `freshness`, `profile`, `inputFingerprint`, `topFix`, `score`. Map missing to `missing`, invalid JSON/schema to `invalid`, active comparison mismatch to `stale`, and validated pre-existing response to `cached`.
|
|
59
|
+
|
|
60
|
+
- [ ] **Task 3: Record from loop compare**
|
|
61
|
+
|
|
62
|
+
In `compareLoop`, after a compare returns and before/after the event append, call `store.recordAgentResponse` when `result.agentComparison` exists. Include trajectory ID, active iteration ID, run ID, trajectory mode, pack profile, response path/hash/json, freshness, validation status, input fingerprint, score, and top fix. Add loop tests for validated cached and missing/awaiting rows.
|
|
63
|
+
|
|
64
|
+
- [ ] **Task 4: Export and docs**
|
|
65
|
+
|
|
66
|
+
Export `agentResponses` from `ledger-queries.ts` and render `## Agent Responses` in `ledger-markdown.ts`, including run, status, freshness, response hash, score, top fix, and path. Add ledger markdown tests showing `freshness: cached`. Update docs/skill if needed to say full agent responses are stored in local SQLite.
|
|
67
|
+
|
|
68
|
+
- [ ] **Task 5: Verify and release path**
|
|
69
|
+
|
|
70
|
+
Run `npm run check`, smoke Seatify with a fresh trajectory, confirm the DB row says `freshness: cached` for the reused response, then make a commit, push, open PR, monitor CI, merge when green, trigger npm release workflow, reinstall, and rerun Seatify expecting the installed CLI to expose the same evidence.
|