@neonwatty/limner 0.1.6 → 0.1.8

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 (81) hide show
  1. package/README.md +31 -29
  2. package/dist/commands/compare-image-reference.d.ts +1 -0
  3. package/dist/commands/compare-image-reference.js +4 -0
  4. package/dist/commands/compare-image-reference.js.map +1 -1
  5. package/dist/commands/compare-output.js +2 -1
  6. package/dist/commands/compare-output.js.map +1 -1
  7. package/dist/commands/compare.d.ts +1 -0
  8. package/dist/commands/compare.js +4 -12
  9. package/dist/commands/compare.js.map +1 -1
  10. package/dist/commands/ledger.d.ts +3 -1
  11. package/dist/commands/loop-actions.d.ts +22 -0
  12. package/dist/commands/loop-actions.js +54 -0
  13. package/dist/commands/loop-actions.js.map +1 -0
  14. package/dist/commands/loop-cli.js +121 -2
  15. package/dist/commands/loop-cli.js.map +1 -1
  16. package/dist/commands/loop-comparison-adapters.d.ts +1 -0
  17. package/dist/commands/loop-comparison-adapters.js +7 -2
  18. package/dist/commands/loop-comparison-adapters.js.map +1 -1
  19. package/dist/commands/loop-response.d.ts +31 -0
  20. package/dist/commands/loop-response.js +84 -0
  21. package/dist/commands/loop-response.js.map +1 -0
  22. package/dist/commands/loop-task.d.ts +17 -0
  23. package/dist/commands/loop-task.js +98 -0
  24. package/dist/commands/loop-task.js.map +1 -0
  25. package/dist/commands/loop.d.ts +4 -1
  26. package/dist/commands/loop.js +26 -21
  27. package/dist/commands/loop.js.map +1 -1
  28. package/dist/core/agent-comparison-pack.d.ts +17 -0
  29. package/dist/core/agent-comparison-pack.js +25 -102
  30. package/dist/core/agent-comparison-pack.js.map +1 -1
  31. package/dist/core/agent-comparison-prompts.d.ts +1 -1
  32. package/dist/core/agent-comparison-prompts.js +4 -4
  33. package/dist/core/agent-comparison-prompts.js.map +1 -1
  34. package/dist/core/agent-comparison-report.js +2 -2
  35. package/dist/core/agent-comparison-report.js.map +1 -1
  36. package/dist/core/agent-comparison-response.d.ts +1 -0
  37. package/dist/core/agent-comparison-response.js +2 -0
  38. package/dist/core/agent-comparison-response.js.map +1 -0
  39. package/dist/core/agent-comparison-submit.d.ts +35 -0
  40. package/dist/core/agent-comparison-submit.js +113 -0
  41. package/dist/core/agent-comparison-submit.js.map +1 -0
  42. package/dist/core/agent-task-brief.d.ts +30 -0
  43. package/dist/core/agent-task-brief.js +158 -0
  44. package/dist/core/agent-task-brief.js.map +1 -0
  45. package/dist/core/comparison-artifacts.js +16 -7
  46. package/dist/core/comparison-artifacts.js.map +1 -1
  47. package/dist/core/current-artifacts.d.ts +14 -0
  48. package/dist/core/current-artifacts.js +16 -0
  49. package/dist/core/current-artifacts.js.map +1 -0
  50. package/dist/core/ledger-agent-responses.d.ts +22 -0
  51. package/dist/core/ledger-agent-responses.js +13 -0
  52. package/dist/core/ledger-agent-responses.js.map +1 -0
  53. package/dist/core/ledger-db.js +20 -0
  54. package/dist/core/ledger-db.js.map +1 -1
  55. package/dist/core/ledger-events.js +21 -1
  56. package/dist/core/ledger-events.js.map +1 -1
  57. package/dist/core/ledger-markdown.d.ts +21 -6
  58. package/dist/core/ledger-markdown.js +89 -6
  59. package/dist/core/ledger-markdown.js.map +1 -1
  60. package/dist/core/ledger-queries.d.ts +4 -1
  61. package/dist/core/ledger-queries.js +12 -3
  62. package/dist/core/ledger-queries.js.map +1 -1
  63. package/dist/core/ledger-store.d.ts +8 -1
  64. package/dist/core/ledger-store.js +4 -0
  65. package/dist/core/ledger-store.js.map +1 -1
  66. package/dist/core/loop-rerun-command.d.ts +4 -0
  67. package/dist/core/loop-rerun-command.js +36 -0
  68. package/dist/core/loop-rerun-command.js.map +1 -0
  69. package/dist/core/report-writer.js +1 -1
  70. package/dist/schemas/ledger.d.ts +23 -0
  71. package/dist/schemas/ledger.js +4 -0
  72. package/dist/schemas/ledger.js.map +1 -1
  73. package/docs/agent-workflow.md +39 -11
  74. package/docs/archive/visual-spec-workflow.md +23 -0
  75. package/docs/goals/db-native-agent-responses/goal.md +91 -0
  76. package/docs/goals/db-native-agent-responses/state.yaml +240 -0
  77. package/docs/superpowers/plans/2026-06-13-agent-response-sqlite.md +70 -0
  78. package/docs/superpowers/plans/2026-06-13-loop-action-ledger.md +257 -0
  79. package/package.json +1 -1
  80. package/skills/limner/SKILL.md +22 -21
  81. package/templates/target/AGENT_GUIDE.md +4 -4
@@ -32,9 +32,9 @@ Use this JSON schema:
32
32
 
33
33
  - \`${rel(input, input.schemaPath)}\`
34
34
 
35
- Write valid JSON only to:
35
+ Submit valid JSON through Limner's local SQLite ledger:
36
36
 
37
- - \`${rel(input, input.responsePath)}\`
37
+ - \`${input.responseSubmitCommand ?? 'limner loop response submit --trajectory <trajectory-id> --from-run <run-id> --file <response.json>'}\`
38
38
 
39
39
  Rules:
40
40
 
@@ -48,14 +48,14 @@ export function buildCodexAgentComparisonPrompt(input) {
48
48
  return `${buildAgentComparisonPrompt(input)}
49
49
  ## Codex Instructions
50
50
 
51
- Read the local files directly. Create or overwrite \`${rel(input, input.responsePath)}\` with JSON matching the schema.
51
+ Read the local files directly. Produce JSON matching the schema, then submit it with the Limner command above.
52
52
  `;
53
53
  }
54
54
  export function buildClaudeAgentComparisonPrompt(input) {
55
55
  return `${buildAgentComparisonPrompt(input)}
56
56
  ## Claude Instructions
57
57
 
58
- Attach the referenced images, inspect them separately, and return JSON matching the schema. Copy that JSON into \`${rel(input, input.responsePath)}\`.
58
+ Attach the referenced images, inspect them separately, and return JSON matching the schema. Submit that JSON with the Limner command above.
59
59
  `;
60
60
  }
61
61
  function formatStructureFingerprint(fingerprint) {
@@ -1 +1 @@
1
- {"version":3,"file":"agent-comparison-prompts.js","sourceRoot":"","sources":["../../src/core/agent-comparison-prompts.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,yBAAyB,EAAmC,MAAM,gCAAgC,CAAC;AAmB5G,MAAM,UAAU,0BAA0B,CAAC,KAAkB;IAC3D,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzD,OAAO;;aAEI,OAAO,CAAC,IAAI;iBACR,OAAO,CAAC,YAAY;eACtB,OAAO,CAAC,UAAU;oBACb,OAAO,CAAC,eAAe;;EAEzC,OAAO,CAAC,WAAW;;;;sBAIC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,iBAAiB,CAAC;oBACjD,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,eAAe,CAAC;;;;;;+BAMlC,KAAK,CAAC,gBAAgB,CAAC,mBAAmB;6BAC5C,KAAK,CAAC,gBAAgB,CAAC,iBAAiB;EACnE,0BAA0B,CAAC,KAAK,CAAC,gBAAgB,CAAC;;;;;EAKlD,sBAAsB,CAAC,KAAK,CAAC;;;MAGzB,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC;;;;MAI5B,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC;;;;;;;;CAQnC,CAAC;AACF,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,KAAkB;IAChE,OAAO,GAAG,0BAA0B,CAAC,KAAK,CAAC;;;uDAGU,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC;CACpF,CAAC;AACF,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,KAAkB;IACjE,OAAO,GAAG,0BAA0B,CAAC,KAAK,CAAC;;;oHAGuE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC;CACjJ,CAAC;AACF,CAAC;AAED,SAAS,0BAA0B,CAAC,WAA4C;IAC9E,IAAI,CAAC,WAAW,CAAC,uBAAuB,IAAI,CAAC,WAAW,CAAC,qBAAqB;QAAE,OAAO,EAAE,CAAC;IAC1F,OAAO,oCAAoC,WAAW,CAAC,uBAAuB;iCAC/C,WAAW,CAAC,qBAAqB,IAAI,CAAC;AACvE,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAkB;IAChD,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO;;;0BAGiB,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,eAAe,CAAC,qBAAqB,CAAC;wBACzD,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,eAAe,CAAC,mBAAmB,CAAC;sBACvD,KAAK,CAAC,eAAe,CAAC,aAAa;;;CAGxD,CAAC;AACF,CAAC;AAED,SAAS,GAAG,CAAC,KAAkB,EAAE,QAAgB;IAC/C,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AACtD,CAAC"}
1
+ {"version":3,"file":"agent-comparison-prompts.js","sourceRoot":"","sources":["../../src/core/agent-comparison-prompts.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,yBAAyB,EAAmC,MAAM,gCAAgC,CAAC;AAmB5G,MAAM,UAAU,0BAA0B,CAAC,KAAkB;IAC3D,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzD,OAAO;;aAEI,OAAO,CAAC,IAAI;iBACR,OAAO,CAAC,YAAY;eACtB,OAAO,CAAC,UAAU;oBACb,OAAO,CAAC,eAAe;;EAEzC,OAAO,CAAC,WAAW;;;;sBAIC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,iBAAiB,CAAC;oBACjD,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,eAAe,CAAC;;;;;;+BAMlC,KAAK,CAAC,gBAAgB,CAAC,mBAAmB;6BAC5C,KAAK,CAAC,gBAAgB,CAAC,iBAAiB;EACnE,0BAA0B,CAAC,KAAK,CAAC,gBAAgB,CAAC;;;;;EAKlD,sBAAsB,CAAC,KAAK,CAAC;;;MAGzB,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC;;;;MAI5B,KAAK,CAAC,qBAAqB,IAAI,qGAAqG;;;;;;;;CAQzI,CAAC;AACF,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,KAAkB;IAChE,OAAO,GAAG,0BAA0B,CAAC,KAAK,CAAC;;;;CAI5C,CAAC;AACF,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,KAAkB;IACjE,OAAO,GAAG,0BAA0B,CAAC,KAAK,CAAC;;;;CAI5C,CAAC;AACF,CAAC;AAED,SAAS,0BAA0B,CAAC,WAA4C;IAC9E,IAAI,CAAC,WAAW,CAAC,uBAAuB,IAAI,CAAC,WAAW,CAAC,qBAAqB;QAAE,OAAO,EAAE,CAAC;IAC1F,OAAO,oCAAoC,WAAW,CAAC,uBAAuB;iCAC/C,WAAW,CAAC,qBAAqB,IAAI,CAAC;AACvE,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAkB;IAChD,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO;;;0BAGiB,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,eAAe,CAAC,qBAAqB,CAAC;wBACzD,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,eAAe,CAAC,mBAAmB,CAAC;sBACvD,KAAK,CAAC,eAAe,CAAC,aAAa;;;CAGxD,CAAC;AACF,CAAC;AAED,SAAS,GAAG,CAAC,KAAkB,EAAE,QAAgB;IAC/C,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AACtD,CAAC"}
@@ -8,7 +8,7 @@ export function formatAgentComparisonArtifacts(root, agentComparison) {
8
8
  `- Codex comparison prompt: \`${relative(root, agentComparison.codexPromptPath)}\``,
9
9
  `- Claude comparison prompt: \`${relative(root, agentComparison.claudePromptPath)}\``,
10
10
  `- Agent comparison schema: \`${relative(root, agentComparison.schemaPath)}\``,
11
- `- Agent comparison response: \`${relative(root, agentComparison.responsePath)}\``,
11
+ '- Agent comparison response store: local SQLite ledger',
12
12
  ];
13
13
  if (agentComparison.imageComparisonPath) {
14
14
  lines.push(`- Image comparison: \`${relative(root, agentComparison.imageComparisonPath)}\``);
@@ -31,7 +31,7 @@ export function formatAgentComparisonStatus(agentComparison) {
31
31
  ## Agent Comparison
32
32
 
33
33
  - Status: awaiting agent response.
34
- - Next step: have an agent inspect the comparison prompt, write \`${path.basename(agentComparison.responsePath)}\`, then rerun this compare command.`;
34
+ - Next step: have an agent inspect the comparison prompt, then submit JSON with \`limner loop response submit\`.`;
35
35
  }
36
36
  if (agentComparison.status === 'invalid') {
37
37
  const errors = agentComparison.validationErrors?.map((error) => `- ${error}`).join('\n') ?? '- Unknown validation error.';
@@ -1 +1 @@
1
- {"version":3,"file":"agent-comparison-report.js","sourceRoot":"","sources":["../../src/core/agent-comparison-report.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,UAAU,8BAA8B,CAAC,IAAY,EAAE,eAA2C;IACtG,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,GAAG;QACZ,gCAAgC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,IAAI;QAC9E,gCAAgC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,eAAe,CAAC,IAAI;QACnF,iCAAiC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,gBAAgB,CAAC,IAAI;QACrF,gCAAgC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,IAAI;QAC9E,kCAAkC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,YAAY,CAAC,IAAI;KACnF,CAAC;IACF,IAAI,eAAe,CAAC,mBAAmB,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,yBAAyB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC/F,CAAC;IACD,IAAI,eAAe,CAAC,uBAAuB,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,6BAA6B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACvG,CAAC;IACD,IAAI,eAAe,CAAC,WAAW,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,2BAA2B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,eAA2C;IACrF,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,eAAe,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;QAChD,OAAO;;;;;oEAKyD,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,sCAAsC,CAAC;IACpJ,CAAC;IACD,IAAI,eAAe,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,eAAe,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,6BAA6B,CAAC;QAC1H,OAAO;;;;;;EAMT,MAAM,EAAE,CAAC;IACT,CAAC;IACD,OAAO;;;;;EAKP,eAAe,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,yCAAyC,EAAE,CAAC;AAClI,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,QAAgB;IAC9C,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"agent-comparison-report.js","sourceRoot":"","sources":["../../src/core/agent-comparison-report.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,UAAU,8BAA8B,CAAC,IAAY,EAAE,eAA2C;IACtG,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,GAAG;QACZ,gCAAgC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,IAAI;QAC9E,gCAAgC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,eAAe,CAAC,IAAI;QACnF,iCAAiC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,gBAAgB,CAAC,IAAI;QACrF,gCAAgC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,IAAI;QAC9E,wDAAwD;KACzD,CAAC;IACF,IAAI,eAAe,CAAC,mBAAmB,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,yBAAyB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC/F,CAAC;IACD,IAAI,eAAe,CAAC,uBAAuB,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,6BAA6B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACvG,CAAC;IACD,IAAI,eAAe,CAAC,WAAW,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,2BAA2B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,eAA2C;IACrF,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,eAAe,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;QAChD,OAAO;;;;;iHAKsG,CAAC;IAChH,CAAC;IACD,IAAI,eAAe,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,eAAe,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,6BAA6B,CAAC;QAC1H,OAAO;;;;;;EAMT,MAAM,EAAE,CAAC;IACT,CAAC;IACD,OAAO;;;;;EAKP,eAAe,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,yCAAyC,EAAE,CAAC;AAClI,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,QAAgB;IAC9C,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1 @@
1
+ export type AgentResponseFreshness = 'missing' | 'fresh' | 'cached' | 'stale' | 'invalid';
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-comparison-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-comparison-response.js","sourceRoot":"","sources":["../../src/core/agent-comparison-response.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import { type AgentComparisonInputFingerprint } from '../schemas/comparison.js';
2
+ import type { AgentComparisonProfileName } from './agent-comparison-profiles.js';
3
+ import type { AgentResponseFreshness } from './agent-comparison-response.js';
4
+ export type AgentComparisonContext = {
5
+ workspaceRoot: string;
6
+ captureDir: string;
7
+ profile: AgentComparisonProfileName;
8
+ inputFingerprint: AgentComparisonInputFingerprint;
9
+ imageInputs: {
10
+ expectedImagePath: string;
11
+ actualImagePath: string;
12
+ };
13
+ structureInputs?: {
14
+ expectedStructurePath: string;
15
+ actualStructurePath: string;
16
+ structureKind: 'visual-spec' | 'dom-metrics' | 'html' | 'json-description';
17
+ };
18
+ };
19
+ export type AgentComparisonSubmitResult = {
20
+ status: 'validated' | 'invalid';
21
+ freshness: AgentResponseFreshness;
22
+ responseJson: string;
23
+ responseHash: string;
24
+ validationErrors?: string[];
25
+ imageComparisonPath?: string;
26
+ structureComparisonPath?: string;
27
+ summaryPath?: string;
28
+ score?: {
29
+ imageOverall: number;
30
+ structureOverall?: number;
31
+ };
32
+ topFix?: string;
33
+ scoreHighlights?: string[];
34
+ };
35
+ export declare function submitAgentComparisonResponse(context: AgentComparisonContext, responseJson: string): Promise<AgentComparisonSubmitResult>;
@@ -0,0 +1,113 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { agentComparisonBundleSchema, } from '../schemas/comparison.js';
5
+ import { validateFixTargets } from './agent-comparison-validation.js';
6
+ export async function submitAgentComparisonResponse(context, responseJson) {
7
+ const responseHash = createHash('sha256').update(responseJson).digest('hex');
8
+ let parsedJson;
9
+ try {
10
+ parsedJson = JSON.parse(responseJson);
11
+ }
12
+ catch {
13
+ return { status: 'invalid', freshness: 'invalid', responseJson, responseHash, validationErrors: ['Agent response: Invalid JSON.'] };
14
+ }
15
+ const parsed = agentComparisonBundleSchema.safeParse(parsedJson);
16
+ if (!parsed.success) {
17
+ return {
18
+ status: 'invalid',
19
+ freshness: 'invalid',
20
+ responseJson,
21
+ responseHash,
22
+ validationErrors: parsed.error.issues.map((issue) => `${issue.path.join('.')}: ${issue.message}`),
23
+ };
24
+ }
25
+ const activeErrors = validateActiveComparison(context, parsed.data);
26
+ if (activeErrors.length > 0) {
27
+ return { status: 'invalid', freshness: 'stale', responseJson, responseHash, validationErrors: activeErrors };
28
+ }
29
+ return writeValidatedOutputs(context, parsed.data, responseJson, responseHash);
30
+ }
31
+ async function writeValidatedOutputs(context, bundle, responseJson, responseHash) {
32
+ const imageComparisonPath = path.join(context.captureDir, 'image-comparison.json');
33
+ const structureComparisonPath = bundle.structureComparison ? path.join(context.captureDir, 'structure-comparison.json') : undefined;
34
+ const summaryPath = path.join(context.captureDir, 'comparison-summary.json');
35
+ await writeJson(imageComparisonPath, bundle.imageComparison);
36
+ if (bundle.structureComparison && structureComparisonPath) {
37
+ await writeJson(structureComparisonPath, bundle.structureComparison);
38
+ }
39
+ await writeJson(summaryPath, bundle);
40
+ return {
41
+ status: 'validated',
42
+ freshness: 'fresh',
43
+ responseJson,
44
+ responseHash,
45
+ imageComparisonPath,
46
+ structureComparisonPath,
47
+ summaryPath,
48
+ score: {
49
+ imageOverall: bundle.imageComparison.score.overall,
50
+ structureOverall: bundle.structureComparison?.score.overall,
51
+ },
52
+ topFix: bundle.recommendation.topFix,
53
+ scoreHighlights: [
54
+ `Agent image score: ${bundle.imageComparison.score.overall}`,
55
+ ...(bundle.structureComparison ? [`Agent structure score: ${bundle.structureComparison.score.overall}`] : []),
56
+ ],
57
+ };
58
+ }
59
+ function validateActiveComparison(context, bundle) {
60
+ const errors = [];
61
+ if (bundle.profile !== context.profile)
62
+ errors.push(`profile: Expected ${context.profile}.`);
63
+ const expectedSurface = context.profile === 'ideal-to-mockup' ? 'mockup' : 'implementation';
64
+ if (!matchesPath(context.workspaceRoot, context.imageInputs.expectedImagePath, bundle.imageComparison.inputs.expectedImagePath)) {
65
+ errors.push('imageComparison.inputs.expectedImagePath: Does not match the active expected image.');
66
+ }
67
+ if (!matchesPath(context.workspaceRoot, context.imageInputs.actualImagePath, bundle.imageComparison.inputs.actualImagePath)) {
68
+ errors.push('imageComparison.inputs.actualImagePath: Does not match the active actual image.');
69
+ }
70
+ if (bundle.inputFingerprint.expectedImageSha256 !== context.inputFingerprint.expectedImageSha256) {
71
+ errors.push('inputFingerprint.expectedImageSha256: Does not match the active expected image.');
72
+ }
73
+ if (bundle.inputFingerprint.actualImageSha256 !== context.inputFingerprint.actualImageSha256) {
74
+ errors.push('inputFingerprint.actualImageSha256: Does not match the active actual image.');
75
+ }
76
+ validateFixTargets(errors, 'imageComparison', bundle.imageComparison.majorDiffAreas, expectedSurface);
77
+ validateStructure(context, bundle, errors, expectedSurface);
78
+ return errors;
79
+ }
80
+ function validateStructure(context, bundle, errors, expectedSurface) {
81
+ if (!context.structureInputs && bundle.structureComparison)
82
+ errors.push('structureComparison: Not expected for this comparison.');
83
+ if (!context.structureInputs && (bundle.inputFingerprint.expectedStructureSha256 || bundle.inputFingerprint.actualStructureSha256)) {
84
+ errors.push('inputFingerprint: Structure hashes are not expected for this comparison.');
85
+ }
86
+ if (context.structureInputs && !bundle.structureComparison)
87
+ errors.push('structureComparison: Required for this comparison.');
88
+ if (!context.structureInputs || !bundle.structureComparison)
89
+ return;
90
+ validateFixTargets(errors, 'structureComparison', bundle.structureComparison.majorDiffAreas, expectedSurface);
91
+ if (bundle.inputFingerprint.expectedStructureSha256 !== context.inputFingerprint.expectedStructureSha256) {
92
+ errors.push('inputFingerprint.expectedStructureSha256: Does not match the active expected structure.');
93
+ }
94
+ if (bundle.inputFingerprint.actualStructureSha256 !== context.inputFingerprint.actualStructureSha256) {
95
+ errors.push('inputFingerprint.actualStructureSha256: Does not match the active actual structure.');
96
+ }
97
+ if (!matchesPath(context.workspaceRoot, context.structureInputs.expectedStructurePath, bundle.structureComparison.inputs.expectedStructurePath)) {
98
+ errors.push('structureComparison.inputs.expectedStructurePath: Does not match the active expected structure.');
99
+ }
100
+ if (!matchesPath(context.workspaceRoot, context.structureInputs.actualStructurePath, bundle.structureComparison.inputs.actualStructurePath)) {
101
+ errors.push('structureComparison.inputs.actualStructurePath: Does not match the active actual structure.');
102
+ }
103
+ if (bundle.structureComparison.inputs.structureKind !== context.structureInputs.structureKind) {
104
+ errors.push(`structureComparison.inputs.structureKind: Expected ${context.structureInputs.structureKind}.`);
105
+ }
106
+ }
107
+ function matchesPath(root, expectedAbsolute, actual) {
108
+ return actual === expectedAbsolute || actual === path.relative(root, expectedAbsolute);
109
+ }
110
+ async function writeJson(filePath, value) {
111
+ await writeFile(filePath, `${JSON.stringify(value, null, 2)}\n`);
112
+ }
113
+ //# sourceMappingURL=agent-comparison-submit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-comparison-submit.js","sourceRoot":"","sources":["../../src/core/agent-comparison-submit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { type AgentComparisonBundle } from '../schemas/comparison.js';
2
+ import type { LedgerActionExecutor, LedgerMode } from '../schemas/ledger.js';
3
+ export type AgentTaskBriefInput = {
4
+ trajectoryId: string;
5
+ target: string;
6
+ mode: LedgerMode;
7
+ workspaceRoot: string;
8
+ comparisonSummaryPath: string;
9
+ sourceRunId: string;
10
+ desiredExecutor: LedgerActionExecutor;
11
+ rerunCommand: string;
12
+ };
13
+ export type AgentTaskBrief = {
14
+ json: {
15
+ trajectoryId: string;
16
+ target: string;
17
+ mode: LedgerMode;
18
+ profile: AgentComparisonBundle['profile'];
19
+ topFix?: string;
20
+ editableFiles: string[];
21
+ selectors: string[];
22
+ sourceRunId: string;
23
+ desiredExecutor: LedgerActionExecutor;
24
+ actionStartCommand: string;
25
+ actionCompleteCommandExample: string;
26
+ rerunCommand: string;
27
+ };
28
+ markdown: string;
29
+ };
30
+ export declare function buildAgentTaskBrief(input: AgentTaskBriefInput): Promise<AgentTaskBrief>;
@@ -0,0 +1,158 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { agentComparisonBundleSchema } from '../schemas/comparison.js';
4
+ export async function buildAgentTaskBrief(input) {
5
+ const raw = await readFile(input.comparisonSummaryPath, 'utf8');
6
+ const bundle = agentComparisonBundleSchema.parse(JSON.parse(raw));
7
+ const diffs = [
8
+ ...bundle.imageComparison.majorDiffAreas,
9
+ ...(bundle.structureComparison?.majorDiffAreas ?? []),
10
+ ].sort((left, right) => left.priority - right.priority);
11
+ const topFix = bundle.recommendation.topFix ?? diffs[0]?.recommendedChange;
12
+ const editableFiles = unique(diffs.flatMap((diff) => diff.fixTarget?.likelyFiles ?? []));
13
+ const selectors = unique(diffs.flatMap((diff) => diff.fixTarget?.selectors ?? []));
14
+ const actionStartCommand = buildActionStartCommand(input, topFix);
15
+ const actionCompleteCommandExample = buildActionCompleteCommand(input, editableFiles);
16
+ const json = {
17
+ trajectoryId: input.trajectoryId,
18
+ target: input.target,
19
+ mode: input.mode,
20
+ profile: bundle.profile,
21
+ topFix,
22
+ editableFiles,
23
+ selectors,
24
+ sourceRunId: input.sourceRunId,
25
+ desiredExecutor: input.desiredExecutor,
26
+ actionStartCommand,
27
+ actionCompleteCommandExample,
28
+ rerunCommand: input.rerunCommand,
29
+ };
30
+ return { json, markdown: formatMarkdown(input, bundle, diffs, topFix, editableFiles, selectors, actionStartCommand, actionCompleteCommandExample) };
31
+ }
32
+ function formatMarkdown(input, bundle, diffs, topFix, editableFiles, selectors, actionStartCommand, actionCompleteCommandExample) {
33
+ const actionSkipCommand = buildActionSkipCommand(input);
34
+ const lines = [
35
+ '# Limner Agent Task',
36
+ '',
37
+ `Trajectory: \`${input.trajectoryId}\``,
38
+ `Target: \`${input.target}\``,
39
+ `Mode: \`${input.mode}\``,
40
+ `Profile: \`${bundle.profile}\``,
41
+ `Overall score: \`${bundle.imageComparison.score.overall}\``,
42
+ `Comparison summary: \`${relative(input.workspaceRoot, input.comparisonSummaryPath)}\``,
43
+ '',
44
+ '## Recommended Fix',
45
+ '',
46
+ topFix ? `Top fix: ${topFix}` : 'Top fix: none provided.',
47
+ ...recommendationLines(bundle),
48
+ '',
49
+ '## Editable Files',
50
+ '',
51
+ ...listOrNone(editableFiles),
52
+ '',
53
+ '## Selectors',
54
+ '',
55
+ ...listOrNone(selectors),
56
+ '',
57
+ '## Priority Diffs',
58
+ '',
59
+ ...diffLines(diffs),
60
+ '',
61
+ '## Next Iteration',
62
+ '',
63
+ `Focus: ${bundle.imageComparison.nextIteration.focus}`,
64
+ ...bundle.imageComparison.nextIteration.steps.map((step) => `- ${step}`),
65
+ '',
66
+ '## Action Logging',
67
+ '',
68
+ `Start: \`${actionStartCommand}\``,
69
+ `Complete: \`${actionCompleteCommandExample}\``,
70
+ `Skip: \`${actionSkipCommand}\``,
71
+ '',
72
+ '## Verify',
73
+ '',
74
+ `Run: \`${input.rerunCommand}\``,
75
+ ];
76
+ return `${lines.join('\n')}\n`;
77
+ }
78
+ function recommendationLines(bundle) {
79
+ const lines = [];
80
+ if (bundle.recommendation.why)
81
+ lines.push(`Why: ${bundle.recommendation.why}`);
82
+ if (bundle.recommendation.expectedScoreLift !== undefined) {
83
+ lines.push(`Expected lift: \`${bundle.recommendation.expectedScoreLift}\``);
84
+ }
85
+ return lines;
86
+ }
87
+ function diffLines(diffs) {
88
+ if (diffs.length === 0)
89
+ return ['- None reported.'];
90
+ return diffs.flatMap((diff) => [
91
+ `- P${diff.priority} ${diff.title}`,
92
+ ` - Severity: \`${diff.severity}\``,
93
+ ` - Category: \`${diff.category}\``,
94
+ ` - Expected: ${diff.expected}`,
95
+ ` - Actual: ${diff.actual}`,
96
+ ` - Recommended change: ${diff.recommendedChange}`,
97
+ ]);
98
+ }
99
+ function listOrNone(values) {
100
+ return values.length > 0 ? values.map((value) => `- \`${value}\``) : ['- None provided.'];
101
+ }
102
+ function unique(values) {
103
+ return [...new Set(values)];
104
+ }
105
+ function buildActionStartCommand(input, topFix) {
106
+ return [
107
+ 'limner loop action start',
108
+ '--trajectory',
109
+ input.trajectoryId,
110
+ '--from-run',
111
+ input.sourceRunId,
112
+ '--kind polish',
113
+ '--executor',
114
+ input.desiredExecutor,
115
+ '--summary',
116
+ shellQuote(summaryText(topFix)),
117
+ ].join(' ');
118
+ }
119
+ function buildActionCompleteCommand(input, editableFiles) {
120
+ const files = editableFiles.length > 0 ? editableFiles.join(',') : '<edited-files>';
121
+ return [
122
+ 'limner loop action complete',
123
+ '--trajectory',
124
+ input.trajectoryId,
125
+ '--action <action-id>',
126
+ '--executor',
127
+ input.desiredExecutor,
128
+ '--summary',
129
+ shellQuote('Describe completed changes'),
130
+ '--files',
131
+ shellQuote(files),
132
+ ].join(' ');
133
+ }
134
+ function buildActionSkipCommand(input) {
135
+ return [
136
+ 'limner loop action skip',
137
+ '--trajectory',
138
+ input.trajectoryId,
139
+ '--from-run',
140
+ input.sourceRunId,
141
+ '--executor',
142
+ input.desiredExecutor,
143
+ '--summary',
144
+ shellQuote('No edits needed after review'),
145
+ ].join(' ');
146
+ }
147
+ function summaryText(topFix) {
148
+ const summary = topFix ?? 'Polish visual fidelity from validated comparison';
149
+ return summary.length <= 255 ? summary : summary.slice(0, 252).trimEnd() + '...';
150
+ }
151
+ function shellQuote(value) {
152
+ return `'${value.replaceAll("'", "'\\''")}'`;
153
+ }
154
+ function relative(root, filePath) {
155
+ const relativePath = path.relative(root, filePath);
156
+ return relativePath.startsWith('..') ? filePath : relativePath;
157
+ }
158
+ //# sourceMappingURL=agent-task-brief.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-task-brief.js","sourceRoot":"","sources":["../../src/core/agent-task-brief.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,7 @@
1
+ import path from 'node:path';
1
2
  export function artifact(path, kind) {
2
3
  return path ? [{ path, kind, role: 'artifact' }] : [];
3
4
  }
4
- function expectedOutput(path, kind, exists = false) {
5
- return path ? [{ path, kind, role: 'expected-output', exists }] : [];
6
- }
7
5
  export function agentComparisonArtifacts(agentComparison) {
8
6
  if (!agentComparison)
9
7
  return [];
@@ -13,10 +11,21 @@ export function agentComparisonArtifacts(agentComparison) {
13
11
  ...artifact(agentComparison.claudePromptPath, 'agent-comparison-prompt-claude'),
14
12
  ...artifact(agentComparison.schemaPath, 'agent-comparison-schema'),
15
13
  ...artifact(agentComparison.examplePath, 'agent-comparison-example'),
16
- ...expectedOutput(agentComparison.responsePath, 'agent-response-target', agentComparison.status !== 'awaiting-agent'),
17
- ...artifact(agentComparison.imageComparisonPath, 'image-comparison'),
18
- ...artifact(agentComparison.structureComparisonPath, 'structure-comparison'),
19
- ...artifact(agentComparison.summaryPath, 'comparison-summary'),
14
+ ...agentComparisonOutputArtifacts(agentComparison),
15
+ ];
16
+ }
17
+ function agentComparisonOutputArtifacts(agentComparison) {
18
+ if (agentComparison.status === 'validated') {
19
+ return [
20
+ ...artifact(agentComparison.imageComparisonPath, 'image-comparison'),
21
+ ...artifact(agentComparison.structureComparisonPath, 'structure-comparison'),
22
+ ...artifact(agentComparison.summaryPath, 'comparison-summary'),
23
+ ];
24
+ }
25
+ return [
26
+ { path: path.join(agentComparison.captureDir, 'image-comparison.json'), kind: 'image-comparison', role: 'artifact', exists: false },
27
+ { path: path.join(agentComparison.captureDir, 'structure-comparison.json'), kind: 'structure-comparison', role: 'artifact', exists: false },
28
+ { path: path.join(agentComparison.captureDir, 'comparison-summary.json'), kind: 'comparison-summary', role: 'artifact', exists: false },
20
29
  ];
21
30
  }
22
31
  export function referenceImplementationArtifacts(input) {
@@ -1 +1 @@
1
- {"version":3,"file":"comparison-artifacts.js","sourceRoot":"","sources":["../../src/core/comparison-artifacts.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,QAAQ,CAAC,IAAwB,EAAE,IAAY;IAC7D,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,cAAc,CAAC,IAAwB,EAAE,IAAY,EAAE,MAAM,GAAG,KAAK;IAC5E,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,eAAsD;IAC7F,IAAI,CAAC,eAAe;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO;QACL,GAAG,QAAQ,CAAC,eAAe,CAAC,UAAU,EAAE,yBAAyB,CAAC;QAClE,GAAG,QAAQ,CAAC,eAAe,CAAC,eAAe,EAAE,+BAA+B,CAAC;QAC7E,GAAG,QAAQ,CAAC,eAAe,CAAC,gBAAgB,EAAE,gCAAgC,CAAC;QAC/E,GAAG,QAAQ,CAAC,eAAe,CAAC,UAAU,EAAE,yBAAyB,CAAC;QAClE,GAAG,QAAQ,CAAC,eAAe,CAAC,WAAW,EAAE,0BAA0B,CAAC;QACpE,GAAG,cAAc,CAAC,eAAe,CAAC,YAAY,EAAE,uBAAuB,EAAE,eAAe,CAAC,MAAM,KAAK,gBAAgB,CAAC;QACrH,GAAG,QAAQ,CAAC,eAAe,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;QACpE,GAAG,QAAQ,CAAC,eAAe,CAAC,uBAAuB,EAAE,sBAAsB,CAAC;QAC5E,GAAG,QAAQ,CAAC,eAAe,CAAC,WAAW,EAAE,oBAAoB,CAAC;KAC/D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,KAOhD;IACC,OAAO;QACL,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,EAAE,sBAAsB,CAAC;QACxD,GAAG,QAAQ,CAAC,GAAG,KAAK,CAAC,aAAa,eAAe,EAAE,uBAAuB,CAAC;QAC3E,GAAG,QAAQ,CAAC,GAAG,KAAK,CAAC,aAAa,eAAe,EAAE,uBAAuB,CAAC;QAC3E,GAAG,QAAQ,CAAC,KAAK,CAAC,kBAAkB,EAAE,2BAA2B,CAAC;QAClE,GAAG,QAAQ,CAAC,GAAG,KAAK,CAAC,kBAAkB,eAAe,EAAE,4BAA4B,CAAC;QACrF,GAAG,QAAQ,CAAC,GAAG,KAAK,CAAC,kBAAkB,eAAe,EAAE,4BAA4B,CAAC;QACrF,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,EAAE,cAAc,CAAC;QACjD,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC;QAC7C,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC;QACvC,GAAG,wBAAwB,CAAC,KAAK,CAAC,eAAe,CAAC;KACnD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"comparison-artifacts.js","sourceRoot":"","sources":["../../src/core/comparison-artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAK7B,MAAM,UAAU,QAAQ,CAAC,IAAwB,EAAE,IAAY;IAC7D,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,eAAsD;IAC7F,IAAI,CAAC,eAAe;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO;QACL,GAAG,QAAQ,CAAC,eAAe,CAAC,UAAU,EAAE,yBAAyB,CAAC;QAClE,GAAG,QAAQ,CAAC,eAAe,CAAC,eAAe,EAAE,+BAA+B,CAAC;QAC7E,GAAG,QAAQ,CAAC,eAAe,CAAC,gBAAgB,EAAE,gCAAgC,CAAC;QAC/E,GAAG,QAAQ,CAAC,eAAe,CAAC,UAAU,EAAE,yBAAyB,CAAC;QAClE,GAAG,QAAQ,CAAC,eAAe,CAAC,WAAW,EAAE,0BAA0B,CAAC;QACpE,GAAG,8BAA8B,CAAC,eAAe,CAAC;KACnD,CAAC;AACJ,CAAC;AAED,SAAS,8BAA8B,CAAC,eAA0C;IAChF,IAAI,eAAe,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAC3C,OAAO;YACL,GAAG,QAAQ,CAAC,eAAe,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;YACpE,GAAG,QAAQ,CAAC,eAAe,CAAC,uBAAuB,EAAE,sBAAsB,CAAC;YAC5E,GAAG,QAAQ,CAAC,eAAe,CAAC,WAAW,EAAE,oBAAoB,CAAC;SAC/D,CAAC;IACJ,CAAC;IACD,OAAO;QACL,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,uBAAuB,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE;QACnI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,2BAA2B,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE;QAC3I,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,yBAAyB,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE;KACxI,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,KAOhD;IACC,OAAO;QACL,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,EAAE,sBAAsB,CAAC;QACxD,GAAG,QAAQ,CAAC,GAAG,KAAK,CAAC,aAAa,eAAe,EAAE,uBAAuB,CAAC;QAC3E,GAAG,QAAQ,CAAC,GAAG,KAAK,CAAC,aAAa,eAAe,EAAE,uBAAuB,CAAC;QAC3E,GAAG,QAAQ,CAAC,KAAK,CAAC,kBAAkB,EAAE,2BAA2B,CAAC;QAClE,GAAG,QAAQ,CAAC,GAAG,KAAK,CAAC,kBAAkB,eAAe,EAAE,4BAA4B,CAAC;QACrF,GAAG,QAAQ,CAAC,GAAG,KAAK,CAAC,kBAAkB,eAAe,EAAE,4BAA4B,CAAC;QACrF,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,EAAE,cAAc,CAAC;QACjD,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC;QAC7C,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC;QACvC,GAAG,wBAAwB,CAAC,KAAK,CAAC,eAAe,CAAC;KACnD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ export type LedgerArtifactRow = {
2
+ artifactId?: string;
3
+ kind: string;
4
+ path: string;
5
+ role?: string | null;
6
+ existsOnDisk?: number | null;
7
+ snapshotPath?: string | null;
8
+ };
9
+ export type CurrentArtifacts = {
10
+ all: LedgerArtifactRow[];
11
+ writtenArtifacts: LedgerArtifactRow[];
12
+ expectedOutputs: LedgerArtifactRow[];
13
+ };
14
+ export declare function getCurrentArtifacts(artifacts: LedgerArtifactRow[]): CurrentArtifacts;
@@ -0,0 +1,16 @@
1
+ export function getCurrentArtifacts(artifacts) {
2
+ const byKey = new Map();
3
+ for (const artifact of artifacts) {
4
+ byKey.set(artifactKey(artifact), artifact);
5
+ }
6
+ const all = [...byKey.values()];
7
+ return {
8
+ all,
9
+ writtenArtifacts: all.filter((artifact) => artifact.role !== 'expected-output'),
10
+ expectedOutputs: all.filter((artifact) => artifact.role === 'expected-output'),
11
+ };
12
+ }
13
+ function artifactKey(artifact) {
14
+ return [artifact.role ?? 'artifact', artifact.kind, artifact.path].join('\0');
15
+ }
16
+ //# sourceMappingURL=current-artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current-artifacts.js","sourceRoot":"","sources":["../../src/core/current-artifacts.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,mBAAmB,CAAC,SAA8B;IAChE,MAAM,KAAK,GAAG,IAAI,GAAG,EAA6B,CAAC;IACnD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAChC,OAAO;QACL,GAAG;QACH,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,iBAAiB,CAAC;QAC/E,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,iBAAiB,CAAC;KAC/E,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,QAA2B;IAC9C,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChF,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { AgentResponseFreshness } from './agent-comparison-response.js';
2
+ import type { LedgerDatabase } from './ledger-db.js';
3
+ import type { LedgerMode } from '../schemas/ledger.js';
4
+ export type RecordAgentResponseInput = {
5
+ trajectoryId: string;
6
+ iterationId?: string;
7
+ runId?: string;
8
+ mode: LedgerMode;
9
+ profile?: string;
10
+ responsePath: string;
11
+ responseHash?: string;
12
+ freshness: AgentResponseFreshness;
13
+ validationStatus: string;
14
+ inputFingerprint?: unknown;
15
+ comparisonContext?: unknown;
16
+ responseJson?: string;
17
+ score?: unknown;
18
+ topFix?: string;
19
+ };
20
+ export declare function insertAgentResponse(db: LedgerDatabase, input: RecordAgentResponseInput, now: string): {
21
+ responseId: string;
22
+ };
@@ -0,0 +1,13 @@
1
+ import { createLedgerId } from './ledger-ids.js';
2
+ export function insertAgentResponse(db, input, now) {
3
+ const responseId = createLedgerId('resp');
4
+ db.prepare(`
5
+ insert into agent_responses (
6
+ response_id, trajectory_id, iteration_id, run_id, mode, profile, response_path,
7
+ response_hash, freshness, validation_status, input_fingerprint_json,
8
+ comparison_context_json, response_json, score_json, top_fix, created_at
9
+ ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
10
+ `).run(responseId, input.trajectoryId, input.iterationId ?? null, input.runId ?? null, input.mode, input.profile ?? null, input.responsePath, input.responseHash ?? null, input.freshness, input.validationStatus, input.inputFingerprint === undefined ? null : JSON.stringify(input.inputFingerprint), input.comparisonContext === undefined ? null : JSON.stringify(input.comparisonContext), input.responseJson ?? null, input.score === undefined ? null : JSON.stringify(input.score), input.topFix ?? null, now);
11
+ return { responseId };
12
+ }
13
+ //# sourceMappingURL=ledger-agent-responses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-agent-responses.js","sourceRoot":"","sources":["../../src/core/ledger-agent-responses.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAoBjD,MAAM,UAAU,mBAAmB,CAAC,EAAkB,EAAE,KAA+B,EAAE,GAAW;IAClG,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAC1C,EAAE,CAAC,OAAO,CAAC;;;;;;GAMV,CAAC,CAAC,GAAG,CACJ,UAAU,EACV,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,WAAW,IAAI,IAAI,EACzB,KAAK,CAAC,KAAK,IAAI,IAAI,EACnB,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,OAAO,IAAI,IAAI,EACrB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,YAAY,IAAI,IAAI,EAC1B,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,gBAAgB,EACtB,KAAK,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,gBAAgB,CAAC,EACpF,KAAK,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,iBAAiB,CAAC,EACtF,KAAK,CAAC,YAAY,IAAI,IAAI,EAC1B,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAC9D,KAAK,CAAC,MAAM,IAAI,IAAI,EACpB,GAAG,CACJ,CAAC;IACF,OAAO,EAAE,UAAU,EAAE,CAAC;AACxB,CAAC"}
@@ -100,12 +100,32 @@ function migrate(db) {
100
100
  created_at text not null
101
101
  );
102
102
 
103
+ create table if not exists agent_responses (
104
+ response_id text primary key,
105
+ trajectory_id text not null references trajectories(trajectory_id) on delete cascade,
106
+ iteration_id text,
107
+ run_id text,
108
+ mode text not null,
109
+ profile text,
110
+ response_path text not null,
111
+ response_hash text,
112
+ freshness text not null,
113
+ validation_status text not null,
114
+ input_fingerprint_json text,
115
+ comparison_context_json text,
116
+ response_json text,
117
+ score_json text,
118
+ top_fix text,
119
+ created_at text not null
120
+ );
121
+
103
122
  insert into schema_meta (key, value)
104
123
  values ('schemaVersion', '${schemaVersion}')
105
124
  on conflict(key) do update set value = excluded.value;
106
125
  `);
107
126
  ensureColumn(db, 'artifacts', 'role', "text not null default 'artifact'");
108
127
  ensureColumn(db, 'artifacts', 'exists_on_disk', 'integer');
128
+ ensureColumn(db, 'agent_responses', 'comparison_context_json', 'text');
109
129
  }
110
130
  function ensureColumn(db, tableName, columnName, definition) {
111
131
  const columns = db.prepare(`pragma table_info(${tableName})`).all();
@@ -1 +1 @@
1
- {"version":3,"file":"ledger-db.js","sourceRoot":"","sources":["../../src/core/ledger-db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,aAAa,GAAG,CAAC,CAAC;AAQxB,MAAM,UAAU,kBAAkB,CAAC,KAA0B;IAC3D,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC5C,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,OAAO,CAAC,EAAkB;IACjC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCA2FsB,aAAa;;GAE1C,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,kCAAkC,CAAC,CAAC;IAC1E,YAAY,CAAC,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,YAAY,CAAC,EAAkB,EAAE,SAAiB,EAAE,UAAkB,EAAE,UAAkB;IACjG,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,qBAAqB,SAAS,GAAG,CAAC,CAAC,GAAG,EAAwB,CAAC;IAC1F,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE,CAAC;QAC1D,EAAE,CAAC,IAAI,CAAC,eAAe,SAAS,eAAe,UAAU,IAAI,UAAU,EAAE,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"ledger-db.js","sourceRoot":"","sources":["../../src/core/ledger-db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,aAAa,GAAG,CAAC,CAAC;AAQxB,MAAM,UAAU,kBAAkB,CAAC,KAA0B;IAC3D,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC5C,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,OAAO,CAAC,EAAkB;IACjC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCA8GsB,aAAa;;GAE1C,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,kCAAkC,CAAC,CAAC;IAC1E,YAAY,CAAC,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;IAC3D,YAAY,CAAC,EAAE,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,YAAY,CAAC,EAAkB,EAAE,SAAiB,EAAE,UAAkB,EAAE,UAAkB;IACjG,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,qBAAqB,SAAS,GAAG,CAAC,CAAC,GAAG,EAAwB,CAAC;IAC1F,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE,CAAC;QAC1D,EAAE,CAAC,IAAI,CAAC,eAAe,SAAS,eAAe,UAAU,IAAI,UAAU,EAAE,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC"}