@itaila/archetype 0.3.30
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/LICENSE +21 -0
- package/README.md +475 -0
- package/dist/audit/audit-persona.d.ts +163 -0
- package/dist/audit/audit-persona.d.ts.map +1 -0
- package/dist/audit/audit-persona.js +415 -0
- package/dist/audit/audit-persona.js.map +1 -0
- package/dist/audit/brain-reflection.d.ts +33 -0
- package/dist/audit/brain-reflection.d.ts.map +1 -0
- package/dist/audit/brain-reflection.js +148 -0
- package/dist/audit/brain-reflection.js.map +1 -0
- package/dist/audit/conversation-audit.d.ts +12 -0
- package/dist/audit/conversation-audit.d.ts.map +1 -0
- package/dist/audit/conversation-audit.js +76 -0
- package/dist/audit/conversation-audit.js.map +1 -0
- package/dist/audit/prompt-audit.d.ts +10 -0
- package/dist/audit/prompt-audit.d.ts.map +1 -0
- package/dist/audit/prompt-audit.js +153 -0
- package/dist/audit/prompt-audit.js.map +1 -0
- package/dist/audit/prompt-dump.d.ts +137 -0
- package/dist/audit/prompt-dump.d.ts.map +1 -0
- package/dist/audit/prompt-dump.js +269 -0
- package/dist/audit/prompt-dump.js.map +1 -0
- package/dist/audit/trace-integrity.d.ts +33 -0
- package/dist/audit/trace-integrity.d.ts.map +1 -0
- package/dist/audit/trace-integrity.js +109 -0
- package/dist/audit/trace-integrity.js.map +1 -0
- package/dist/audit/types.d.ts +92 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/audit/types.js +2 -0
- package/dist/audit/types.js.map +1 -0
- package/dist/audit/version.d.ts +14 -0
- package/dist/audit/version.d.ts.map +1 -0
- package/dist/audit/version.js +65 -0
- package/dist/audit/version.js.map +1 -0
- package/dist/brain.d.ts +7 -0
- package/dist/brain.d.ts.map +1 -0
- package/dist/brain.js +83 -0
- package/dist/brain.js.map +1 -0
- package/dist/builder/actions.d.ts +60 -0
- package/dist/builder/actions.d.ts.map +1 -0
- package/dist/builder/actions.js +257 -0
- package/dist/builder/actions.js.map +1 -0
- package/dist/builder/browser.d.ts +140 -0
- package/dist/builder/browser.d.ts.map +1 -0
- package/dist/builder/browser.js +232 -0
- package/dist/builder/browser.js.map +1 -0
- package/dist/builder/executor.d.ts +228 -0
- package/dist/builder/executor.d.ts.map +1 -0
- package/dist/builder/executor.js +1548 -0
- package/dist/builder/executor.js.map +1 -0
- package/dist/builder/index.d.ts +24 -0
- package/dist/builder/index.d.ts.map +1 -0
- package/dist/builder/index.js +24 -0
- package/dist/builder/index.js.map +1 -0
- package/dist/builder/node-test-discovery.d.ts +13 -0
- package/dist/builder/node-test-discovery.d.ts.map +1 -0
- package/dist/builder/node-test-discovery.js +45 -0
- package/dist/builder/node-test-discovery.js.map +1 -0
- package/dist/builder/sandbox.d.ts +172 -0
- package/dist/builder/sandbox.d.ts.map +1 -0
- package/dist/builder/sandbox.js +294 -0
- package/dist/builder/sandbox.js.map +1 -0
- package/dist/builder/workspace-files.d.ts +63 -0
- package/dist/builder/workspace-files.d.ts.map +1 -0
- package/dist/builder/workspace-files.js +190 -0
- package/dist/builder/workspace-files.js.map +1 -0
- package/dist/core/actions.d.ts +55 -0
- package/dist/core/actions.d.ts.map +1 -0
- package/dist/core/actions.js +311 -0
- package/dist/core/actions.js.map +1 -0
- package/dist/core/attachment-notes.d.ts +7 -0
- package/dist/core/attachment-notes.d.ts.map +1 -0
- package/dist/core/attachment-notes.js +38 -0
- package/dist/core/attachment-notes.js.map +1 -0
- package/dist/core/context.d.ts +10 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +108 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/crud-prompt.d.ts +16 -0
- package/dist/core/crud-prompt.d.ts.map +1 -0
- package/dist/core/crud-prompt.js +268 -0
- package/dist/core/crud-prompt.js.map +1 -0
- package/dist/core/crud-schema.d.ts +12 -0
- package/dist/core/crud-schema.d.ts.map +1 -0
- package/dist/core/crud-schema.js +42 -0
- package/dist/core/crud-schema.js.map +1 -0
- package/dist/core/effective-config.d.ts +13 -0
- package/dist/core/effective-config.d.ts.map +1 -0
- package/dist/core/effective-config.js +33 -0
- package/dist/core/effective-config.js.map +1 -0
- package/dist/core/entities.d.ts +82 -0
- package/dist/core/entities.d.ts.map +1 -0
- package/dist/core/entities.js +116 -0
- package/dist/core/entities.js.map +1 -0
- package/dist/core/entity-helpers.d.ts +47 -0
- package/dist/core/entity-helpers.d.ts.map +1 -0
- package/dist/core/entity-helpers.js +122 -0
- package/dist/core/entity-helpers.js.map +1 -0
- package/dist/core/entity-registry.d.ts +47 -0
- package/dist/core/entity-registry.d.ts.map +1 -0
- package/dist/core/entity-registry.js +54 -0
- package/dist/core/entity-registry.js.map +1 -0
- package/dist/core/eq.d.ts +13 -0
- package/dist/core/eq.d.ts.map +1 -0
- package/dist/core/eq.js +41 -0
- package/dist/core/eq.js.map +1 -0
- package/dist/core/focus-context.d.ts +19 -0
- package/dist/core/focus-context.d.ts.map +1 -0
- package/dist/core/focus-context.js +46 -0
- package/dist/core/focus-context.js.map +1 -0
- package/dist/core/focus-mode-actions.d.ts +23 -0
- package/dist/core/focus-mode-actions.d.ts.map +1 -0
- package/dist/core/focus-mode-actions.js +74 -0
- package/dist/core/focus-mode-actions.js.map +1 -0
- package/dist/core/greeting.d.ts +10 -0
- package/dist/core/greeting.d.ts.map +1 -0
- package/dist/core/greeting.js +41 -0
- package/dist/core/greeting.js.map +1 -0
- package/dist/core/identity.d.ts +13 -0
- package/dist/core/identity.d.ts.map +1 -0
- package/dist/core/identity.js +54 -0
- package/dist/core/identity.js.map +1 -0
- package/dist/core/knowledge.d.ts +10 -0
- package/dist/core/knowledge.d.ts.map +1 -0
- package/dist/core/knowledge.js +40 -0
- package/dist/core/knowledge.js.map +1 -0
- package/dist/core/memory-actions.d.ts +38 -0
- package/dist/core/memory-actions.d.ts.map +1 -0
- package/dist/core/memory-actions.js +181 -0
- package/dist/core/memory-actions.js.map +1 -0
- package/dist/core/memory.d.ts +35 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +168 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/peer-actions.d.ts +15 -0
- package/dist/core/peer-actions.d.ts.map +1 -0
- package/dist/core/peer-actions.js +33 -0
- package/dist/core/peer-actions.js.map +1 -0
- package/dist/core/prompt-builder.d.ts +46 -0
- package/dist/core/prompt-builder.d.ts.map +1 -0
- package/dist/core/prompt-builder.js +543 -0
- package/dist/core/prompt-builder.js.map +1 -0
- package/dist/core/prompt-mode.d.ts +3 -0
- package/dist/core/prompt-mode.d.ts.map +1 -0
- package/dist/core/prompt-mode.js +6 -0
- package/dist/core/prompt-mode.js.map +1 -0
- package/dist/core/prompted-turn.d.ts +6 -0
- package/dist/core/prompted-turn.d.ts.map +1 -0
- package/dist/core/prompted-turn.js +48 -0
- package/dist/core/prompted-turn.js.map +1 -0
- package/dist/core/request-builder.d.ts +14 -0
- package/dist/core/request-builder.d.ts.map +1 -0
- package/dist/core/request-builder.js +64 -0
- package/dist/core/request-builder.js.map +1 -0
- package/dist/core/session-routing.d.ts +23 -0
- package/dist/core/session-routing.d.ts.map +1 -0
- package/dist/core/session-routing.js +59 -0
- package/dist/core/session-routing.js.map +1 -0
- package/dist/core/voice.d.ts +6 -0
- package/dist/core/voice.d.ts.map +1 -0
- package/dist/core/voice.js +30 -0
- package/dist/core/voice.js.map +1 -0
- package/dist/engine/chat.d.ts +45 -0
- package/dist/engine/chat.d.ts.map +1 -0
- package/dist/engine/chat.js +308 -0
- package/dist/engine/chat.js.map +1 -0
- package/dist/engine/continuity.d.ts +107 -0
- package/dist/engine/continuity.d.ts.map +1 -0
- package/dist/engine/continuity.js +320 -0
- package/dist/engine/continuity.js.map +1 -0
- package/dist/engine/crud.d.ts +62 -0
- package/dist/engine/crud.d.ts.map +1 -0
- package/dist/engine/crud.js +260 -0
- package/dist/engine/crud.js.map +1 -0
- package/dist/engine/side-effects.d.ts +93 -0
- package/dist/engine/side-effects.d.ts.map +1 -0
- package/dist/engine/side-effects.js +271 -0
- package/dist/engine/side-effects.js.map +1 -0
- package/dist/engine/staging.d.ts +29 -0
- package/dist/engine/staging.d.ts.map +1 -0
- package/dist/engine/staging.js +159 -0
- package/dist/engine/staging.js.map +1 -0
- package/dist/engine/working-set.d.ts +18 -0
- package/dist/engine/working-set.d.ts.map +1 -0
- package/dist/engine/working-set.js +246 -0
- package/dist/engine/working-set.js.map +1 -0
- package/dist/evals/action-contracts.d.ts +40 -0
- package/dist/evals/action-contracts.d.ts.map +1 -0
- package/dist/evals/action-contracts.js +208 -0
- package/dist/evals/action-contracts.js.map +1 -0
- package/dist/evals/brain-bloat.d.ts +39 -0
- package/dist/evals/brain-bloat.d.ts.map +1 -0
- package/dist/evals/brain-bloat.js +167 -0
- package/dist/evals/brain-bloat.js.map +1 -0
- package/dist/evals/brain-prescriptions.d.ts +30 -0
- package/dist/evals/brain-prescriptions.d.ts.map +1 -0
- package/dist/evals/brain-prescriptions.js +148 -0
- package/dist/evals/brain-prescriptions.js.map +1 -0
- package/dist/evals/cross-layer-duplicates.d.ts +49 -0
- package/dist/evals/cross-layer-duplicates.d.ts.map +1 -0
- package/dist/evals/cross-layer-duplicates.js +289 -0
- package/dist/evals/cross-layer-duplicates.js.map +1 -0
- package/dist/evals/entity-visibility.d.ts +28 -0
- package/dist/evals/entity-visibility.d.ts.map +1 -0
- package/dist/evals/entity-visibility.js +216 -0
- package/dist/evals/entity-visibility.js.map +1 -0
- package/dist/evals/index.d.ts +19 -0
- package/dist/evals/index.d.ts.map +1 -0
- package/dist/evals/index.js +11 -0
- package/dist/evals/index.js.map +1 -0
- package/dist/evals/judge.d.ts +22 -0
- package/dist/evals/judge.d.ts.map +1 -0
- package/dist/evals/judge.js +337 -0
- package/dist/evals/judge.js.map +1 -0
- package/dist/evals/operational-contract.d.ts +40 -0
- package/dist/evals/operational-contract.d.ts.map +1 -0
- package/dist/evals/operational-contract.js +115 -0
- package/dist/evals/operational-contract.js.map +1 -0
- package/dist/evals/prompt-content.d.ts +14 -0
- package/dist/evals/prompt-content.d.ts.map +1 -0
- package/dist/evals/prompt-content.js +104 -0
- package/dist/evals/prompt-content.js.map +1 -0
- package/dist/evals/runtime.d.ts +4 -0
- package/dist/evals/runtime.d.ts.map +1 -0
- package/dist/evals/runtime.js +197 -0
- package/dist/evals/runtime.js.map +1 -0
- package/dist/evals/sample-projects.d.ts +143 -0
- package/dist/evals/sample-projects.d.ts.map +1 -0
- package/dist/evals/sample-projects.js +644 -0
- package/dist/evals/sample-projects.js.map +1 -0
- package/dist/evals/types.d.ts +88 -0
- package/dist/evals/types.d.ts.map +1 -0
- package/dist/evals/types.js +2 -0
- package/dist/evals/types.js.map +1 -0
- package/dist/foundation/index.d.ts +158 -0
- package/dist/foundation/index.d.ts.map +1 -0
- package/dist/foundation/index.js +256 -0
- package/dist/foundation/index.js.map +1 -0
- package/dist/index.d.ts +223 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +998 -0
- package/dist/index.js.map +1 -0
- package/dist/managed/autonomous-loop.d.ts +199 -0
- package/dist/managed/autonomous-loop.d.ts.map +1 -0
- package/dist/managed/autonomous-loop.js +451 -0
- package/dist/managed/autonomous-loop.js.map +1 -0
- package/dist/managed/conversation.d.ts +20 -0
- package/dist/managed/conversation.d.ts.map +1 -0
- package/dist/managed/conversation.js +40 -0
- package/dist/managed/conversation.js.map +1 -0
- package/dist/managed/knowledge.d.ts +7 -0
- package/dist/managed/knowledge.d.ts.map +1 -0
- package/dist/managed/knowledge.js +174 -0
- package/dist/managed/knowledge.js.map +1 -0
- package/dist/managed/memory-manager.d.ts +7 -0
- package/dist/managed/memory-manager.d.ts.map +1 -0
- package/dist/managed/memory-manager.js +18 -0
- package/dist/managed/memory-manager.js.map +1 -0
- package/dist/managed/memory-review.d.ts +45 -0
- package/dist/managed/memory-review.d.ts.map +1 -0
- package/dist/managed/memory-review.js +130 -0
- package/dist/managed/memory-review.js.map +1 -0
- package/dist/managed/storage.d.ts +2 -0
- package/dist/managed/storage.d.ts.map +1 -0
- package/dist/managed/storage.js +2 -0
- package/dist/managed/storage.js.map +1 -0
- package/dist/managed/work-history.d.ts +23 -0
- package/dist/managed/work-history.d.ts.map +1 -0
- package/dist/managed/work-history.js +31 -0
- package/dist/managed/work-history.js.map +1 -0
- package/dist/observability/index.d.ts +15 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +15 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/render-run-markdown.d.ts +90 -0
- package/dist/observability/render-run-markdown.d.ts.map +1 -0
- package/dist/observability/render-run-markdown.js +231 -0
- package/dist/observability/render-run-markdown.js.map +1 -0
- package/dist/observability/turn-reporter.d.ts +20 -0
- package/dist/observability/turn-reporter.d.ts.map +1 -0
- package/dist/observability/turn-reporter.js +106 -0
- package/dist/observability/turn-reporter.js.map +1 -0
- package/dist/persona.d.ts +49 -0
- package/dist/persona.d.ts.map +1 -0
- package/dist/persona.js +287 -0
- package/dist/persona.js.map +1 -0
- package/dist/playbook/defaults.d.ts +25 -0
- package/dist/playbook/defaults.d.ts.map +1 -0
- package/dist/playbook/defaults.js +108 -0
- package/dist/playbook/defaults.js.map +1 -0
- package/dist/playbook/invariants.d.ts +244 -0
- package/dist/playbook/invariants.d.ts.map +1 -0
- package/dist/playbook/invariants.js +259 -0
- package/dist/playbook/invariants.js.map +1 -0
- package/dist/playbook/templates.d.ts +7 -0
- package/dist/playbook/templates.d.ts.map +1 -0
- package/dist/playbook/templates.js +437 -0
- package/dist/playbook/templates.js.map +1 -0
- package/dist/providers/gemini.d.ts +73 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +536 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/types.d.ts +2 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/providers/zod-to-gemini.d.ts +8 -0
- package/dist/providers/zod-to-gemini.d.ts.map +1 -0
- package/dist/providers/zod-to-gemini.js +148 -0
- package/dist/providers/zod-to-gemini.js.map +1 -0
- package/dist/samples/pm-spec-agent.d.ts +22 -0
- package/dist/samples/pm-spec-agent.d.ts.map +1 -0
- package/dist/samples/pm-spec-agent.js +53 -0
- package/dist/samples/pm-spec-agent.js.map +1 -0
- package/dist/types.d.ts +920 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render a benchmark run as a single turn-by-turn TURNS.md-style report.
|
|
3
|
+
*
|
|
4
|
+
* Purpose: the bug is almost always in the prompt the model received.
|
|
5
|
+
* Reading turn-by-turn should take ≤30 seconds and surface:
|
|
6
|
+
* - the system prompt (deduped — appears once if constant across turns)
|
|
7
|
+
* - per-turn input (as the model saw it)
|
|
8
|
+
* - per-turn assistant emission (message verbatim + action summary)
|
|
9
|
+
* - any errors (unknown action, schema fail) flagged inline
|
|
10
|
+
* - a fingerprint header (turn count, action mix, errors)
|
|
11
|
+
*
|
|
12
|
+
* This module is pure: it takes structured data and returns a string.
|
|
13
|
+
* Path discovery (where traces live, where errors.jsonl sits, how to
|
|
14
|
+
* read a score) belongs to the host CLI — archetype/observability ships
|
|
15
|
+
* a renderer, not a file-system reader. See `parseTracePacket` if you
|
|
16
|
+
* want a quick way to hydrate traces from JSON files.
|
|
17
|
+
*
|
|
18
|
+
* Works in browsers and Node (no fs use here).
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Render the final markdown. Returns the full TURNS.md body as a string.
|
|
22
|
+
* Host writes it wherever it wants.
|
|
23
|
+
*/
|
|
24
|
+
export function renderRunMarkdown(input) {
|
|
25
|
+
const traces = input.traces;
|
|
26
|
+
if (traces.length === 0) {
|
|
27
|
+
return `# Turn review — ${input.runId}\n\n(no turn traces)\n`;
|
|
28
|
+
}
|
|
29
|
+
const inputCharBudget = input.inputCharBudget ?? 1200;
|
|
30
|
+
const errors = input.errors ?? [];
|
|
31
|
+
const score = input.score ?? null;
|
|
32
|
+
// System prompt dedup — if identical across all turns, show once.
|
|
33
|
+
const systemPrompts = new Set(traces.map((t) => t.systemPrompt ?? ''));
|
|
34
|
+
const systemPromptConstant = systemPrompts.size === 1;
|
|
35
|
+
// Action fingerprint from the last trace's history (has the most data).
|
|
36
|
+
const lastHistory = traces[traces.length - 1].history ?? [];
|
|
37
|
+
const fingerprint = computeFingerprint(lastHistory);
|
|
38
|
+
const out = [];
|
|
39
|
+
out.push(`# Turn review — ${input.runId}`);
|
|
40
|
+
out.push('');
|
|
41
|
+
out.push(`- benchmark: ${input.metadata?.benchmarkId ?? '?'}`);
|
|
42
|
+
out.push(`- artifactName: ${input.metadata?.artifactName ?? '?'}`);
|
|
43
|
+
out.push(`- status: ${input.metadata?.status ?? '?'}`);
|
|
44
|
+
out.push(`- turn traces: ${traces.length}`);
|
|
45
|
+
out.push(`- assistant turns (from history): ${fingerprint.assistantTurns}`);
|
|
46
|
+
out.push(`- single-action turns: ${fingerprint.singleActionTurns}`);
|
|
47
|
+
out.push(`- multi-action turns: ${fingerprint.multiActionTurns}`);
|
|
48
|
+
out.push(`- zero-action turns: ${fingerprint.zeroActionTurns}`);
|
|
49
|
+
out.push(`- editFile shape: single=${fingerprint.singleEditCalls}, multi=${fingerprint.multiEditCalls}`);
|
|
50
|
+
out.push(`- action mix: ${JSON.stringify(fingerprint.actionCounts)}`);
|
|
51
|
+
if (score) {
|
|
52
|
+
out.push(`- customer score: **${score.score ?? '?'}** (${score.verdict ?? '?'}, ${score.ship ?? '?'})`);
|
|
53
|
+
}
|
|
54
|
+
const errorNotes = errors
|
|
55
|
+
.filter((e) => !!e)
|
|
56
|
+
.map((e) => `turn ${e.turn ?? '?'}: ${e.reason ?? ''}`);
|
|
57
|
+
if (errorNotes.length > 0) {
|
|
58
|
+
out.push('');
|
|
59
|
+
out.push(`## ⚠️ Errors (${errorNotes.length})`);
|
|
60
|
+
for (const n of errorNotes)
|
|
61
|
+
out.push(`- ${n}`);
|
|
62
|
+
}
|
|
63
|
+
out.push('');
|
|
64
|
+
if (systemPromptConstant) {
|
|
65
|
+
out.push('## System prompt (constant across turns)');
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
out.push(`## System prompt — changed ${systemPrompts.size} times across turns (first shown below; see prompt-traces/ for each variant)`);
|
|
69
|
+
}
|
|
70
|
+
out.push('');
|
|
71
|
+
out.push('```');
|
|
72
|
+
out.push(traces[0].systemPrompt ?? '(empty)');
|
|
73
|
+
out.push('```');
|
|
74
|
+
out.push('');
|
|
75
|
+
// Per-turn — walk the latest trace's history (contains the full run).
|
|
76
|
+
out.push('## Turn-by-turn');
|
|
77
|
+
out.push('');
|
|
78
|
+
let turnNum = 0;
|
|
79
|
+
for (const h of lastHistory) {
|
|
80
|
+
const content = typeof h.content === 'string' ? h.content : JSON.stringify(h.content);
|
|
81
|
+
if (h.role === 'user') {
|
|
82
|
+
turnNum += 1;
|
|
83
|
+
out.push(`### Turn ${turnNum} input`);
|
|
84
|
+
out.push('');
|
|
85
|
+
out.push('```');
|
|
86
|
+
out.push(clip(content, inputCharBudget));
|
|
87
|
+
out.push('```');
|
|
88
|
+
out.push('');
|
|
89
|
+
}
|
|
90
|
+
else if (h.role === 'assistant') {
|
|
91
|
+
renderAssistantTurn(out, turnNum, content);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Capture the latest trace's `message` as the next turn's input (not
|
|
95
|
+
// yet in history) — gives visibility into whatever the loop is about
|
|
96
|
+
// to send when it stopped.
|
|
97
|
+
const latestInput = traces[traces.length - 1].message;
|
|
98
|
+
if (latestInput) {
|
|
99
|
+
turnNum += 1;
|
|
100
|
+
out.push(`### Turn ${turnNum} input (latest — model may have responded after this was captured)`);
|
|
101
|
+
out.push('');
|
|
102
|
+
out.push('```');
|
|
103
|
+
out.push(clip(latestInput, inputCharBudget));
|
|
104
|
+
out.push('```');
|
|
105
|
+
out.push('');
|
|
106
|
+
}
|
|
107
|
+
return out.join('\n');
|
|
108
|
+
}
|
|
109
|
+
function computeFingerprint(history) {
|
|
110
|
+
const actionCounts = {};
|
|
111
|
+
let assistantTurns = 0;
|
|
112
|
+
let multiActionTurns = 0;
|
|
113
|
+
let zeroActionTurns = 0;
|
|
114
|
+
let multiEditCalls = 0;
|
|
115
|
+
let singleEditCalls = 0;
|
|
116
|
+
for (const h of history) {
|
|
117
|
+
if (h.role !== 'assistant')
|
|
118
|
+
continue;
|
|
119
|
+
const payload = tryParseAssistantPayload(typeof h.content === 'string' ? h.content : '');
|
|
120
|
+
if (!payload)
|
|
121
|
+
continue;
|
|
122
|
+
assistantTurns += 1;
|
|
123
|
+
const actions = payload.actions ?? [];
|
|
124
|
+
if (actions.length === 0)
|
|
125
|
+
zeroActionTurns += 1;
|
|
126
|
+
else if (actions.length > 1)
|
|
127
|
+
multiActionTurns += 1;
|
|
128
|
+
for (const a of actions) {
|
|
129
|
+
const nm = a.name ?? '?';
|
|
130
|
+
actionCounts[nm] = (actionCounts[nm] ?? 0) + 1;
|
|
131
|
+
if (nm === 'editFile') {
|
|
132
|
+
const edits = (a.params ?? {}).edits;
|
|
133
|
+
if (Array.isArray(edits)) {
|
|
134
|
+
if (edits.length > 1)
|
|
135
|
+
multiEditCalls += 1;
|
|
136
|
+
else
|
|
137
|
+
singleEditCalls += 1;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const singleActionTurns = assistantTurns - multiActionTurns - zeroActionTurns;
|
|
143
|
+
return {
|
|
144
|
+
assistantTurns,
|
|
145
|
+
singleActionTurns,
|
|
146
|
+
multiActionTurns,
|
|
147
|
+
zeroActionTurns,
|
|
148
|
+
multiEditCalls,
|
|
149
|
+
singleEditCalls,
|
|
150
|
+
actionCounts,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
function renderAssistantTurn(out, turnNum, content) {
|
|
154
|
+
const payload = tryParseAssistantPayload(content);
|
|
155
|
+
if (payload) {
|
|
156
|
+
out.push(`**Turn ${turnNum} assistant** — ${(payload.actions ?? []).length} action(s)`);
|
|
157
|
+
if (payload.message && payload.message.trim()) {
|
|
158
|
+
out.push('');
|
|
159
|
+
out.push('> ' + payload.message.replace(/\n/g, '\n> '));
|
|
160
|
+
}
|
|
161
|
+
if (payload.actions && payload.actions.length > 0) {
|
|
162
|
+
out.push('');
|
|
163
|
+
for (const a of payload.actions) {
|
|
164
|
+
out.push(`- \`${summarizeAction(a)}\``);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (payload.diagnostics && payload.diagnostics.length > 0) {
|
|
168
|
+
out.push('');
|
|
169
|
+
out.push('_diagnostics:_');
|
|
170
|
+
for (const d of payload.diagnostics)
|
|
171
|
+
out.push(`- ⚠️ ${d}`);
|
|
172
|
+
}
|
|
173
|
+
out.push('');
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
out.push(`**Turn ${turnNum} assistant** — (unparseable)`);
|
|
177
|
+
out.push('```');
|
|
178
|
+
out.push(content.slice(0, 600));
|
|
179
|
+
out.push('```');
|
|
180
|
+
out.push('');
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Extract an AssistantPayload from a raw assistant-message string.
|
|
185
|
+
* Handles the common case of prose before a JSON object — everything
|
|
186
|
+
* before the first `{` is ignored.
|
|
187
|
+
*/
|
|
188
|
+
export function tryParseAssistantPayload(content) {
|
|
189
|
+
if (typeof content !== 'string')
|
|
190
|
+
return null;
|
|
191
|
+
const i = content.indexOf('{');
|
|
192
|
+
if (i < 0)
|
|
193
|
+
return null;
|
|
194
|
+
try {
|
|
195
|
+
return JSON.parse(content.slice(i));
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Compact one-line summary of an action: keeps reference keys (path,
|
|
203
|
+
* pattern, id, name, outcome, …) visible, drops bodies (content, stdout,
|
|
204
|
+
* image payloads). Used in the per-turn action list for fast scanning.
|
|
205
|
+
*/
|
|
206
|
+
export function summarizeAction(a) {
|
|
207
|
+
const name = a.name ?? '?';
|
|
208
|
+
const params = a.params ?? {};
|
|
209
|
+
const keep = {};
|
|
210
|
+
for (const refKey of ['path', 'pattern', 'pathGlob', 'id', 'entity', 'name', 'outcome', 'summary', 'label']) {
|
|
211
|
+
if (refKey in params && params[refKey] !== undefined)
|
|
212
|
+
keep[refKey] = params[refKey];
|
|
213
|
+
}
|
|
214
|
+
if (name === 'editFile') {
|
|
215
|
+
const edits = params.edits;
|
|
216
|
+
keep.editCount = Array.isArray(edits) ? edits.length : (params.oldText !== undefined ? 1 : 0);
|
|
217
|
+
}
|
|
218
|
+
if (name === 'writeFile') {
|
|
219
|
+
const content = params.content;
|
|
220
|
+
if (typeof content === 'string')
|
|
221
|
+
keep.bytes = Buffer.byteLength(content, 'utf8');
|
|
222
|
+
}
|
|
223
|
+
const kvs = Object.entries(keep)
|
|
224
|
+
.map(([k, v]) => `${k}=${JSON.stringify(v).slice(0, 80)}`)
|
|
225
|
+
.join(', ');
|
|
226
|
+
return kvs ? `${name} {${kvs}}` : name;
|
|
227
|
+
}
|
|
228
|
+
function clip(s, limit) {
|
|
229
|
+
return s.length > limit ? s.slice(0, limit) + `\n… [+${s.length - limit} chars]` : s;
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=render-run-markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-run-markdown.js","sourceRoot":"","sources":["../../src/observability/render-run-markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { LoopTurnRecord } from '../managed/autonomous-loop.js';
|
|
2
|
+
export interface TurnReporterOptions {
|
|
3
|
+
/** Directory to write errors.jsonl + diagnostics.md into. */
|
|
4
|
+
runRoot: string;
|
|
5
|
+
/**
|
|
6
|
+
* Whether to print stderr callouts alongside file writes. Default true.
|
|
7
|
+
* Set false for batch jobs where stderr is not human-watched.
|
|
8
|
+
*/
|
|
9
|
+
emitStderr?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface TurnReporterHook {
|
|
12
|
+
/** Wire this into `runAutonomousLoop({ hooks: { onTurn } })`. */
|
|
13
|
+
onTurn: (record: LoopTurnRecord) => void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Build an onTurn reporter hook. One instance per benchmark run; safe
|
|
17
|
+
* to share across peers/delegates (writes append).
|
|
18
|
+
*/
|
|
19
|
+
export declare function createTurnReporter(options: TurnReporterOptions): TurnReporterHook;
|
|
20
|
+
//# sourceMappingURL=turn-reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-reporter.d.ts","sourceRoot":"","sources":["../../src/observability/turn-reporter.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAEnE,MAAM,WAAW,mBAAmB;IAClC,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,iEAAiE;IACjE,MAAM,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAA;CACzC;AASD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,gBAAgB,CAejF"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turn reporter — persists per-turn errors + builder diagnostics so
|
|
3
|
+
* every autonomous-loop consumer gets the same observability pattern
|
|
4
|
+
* without inlining the hook logic.
|
|
5
|
+
*
|
|
6
|
+
* What it writes (per turn, when there's something to report):
|
|
7
|
+
* runRoot/errors.jsonl one JSON-per-line entry for each
|
|
8
|
+
* validation error or provider error
|
|
9
|
+
* runRoot/diagnostics.md one markdown line per diagnostic the
|
|
10
|
+
* builder emitted through its
|
|
11
|
+
* `diagnostics[]` response field
|
|
12
|
+
*
|
|
13
|
+
* What it prints (stderr, one line per event, with ANSI prefix):
|
|
14
|
+
* [ARCHETYPE ERROR] turn N: unknown_action "doesNotExist" — ...
|
|
15
|
+
* [BUILDER DIAGNOSTIC] turn N: <diagnostic>
|
|
16
|
+
*
|
|
17
|
+
* The "fail loudly" policy lives here: silent failures mask broken
|
|
18
|
+
* prompt/contract/context bugs. Every call-site error surfaces in both
|
|
19
|
+
* the durable jsonl + a visible stderr callout. Retries continue
|
|
20
|
+
* regardless — this module is telemetry, not flow control.
|
|
21
|
+
*
|
|
22
|
+
* Node-only (writes to local filesystem).
|
|
23
|
+
*/
|
|
24
|
+
import fs from 'node:fs';
|
|
25
|
+
import path from 'node:path';
|
|
26
|
+
/**
|
|
27
|
+
* Build an onTurn reporter hook. One instance per benchmark run; safe
|
|
28
|
+
* to share across peers/delegates (writes append).
|
|
29
|
+
*/
|
|
30
|
+
export function createTurnReporter(options) {
|
|
31
|
+
const { runRoot } = options;
|
|
32
|
+
const emitStderr = options.emitStderr ?? true;
|
|
33
|
+
const errFile = path.join(runRoot, 'errors.jsonl');
|
|
34
|
+
const diagFile = path.join(runRoot, 'diagnostics.md');
|
|
35
|
+
fs.mkdirSync(runRoot, { recursive: true });
|
|
36
|
+
return {
|
|
37
|
+
onTurn: (record) => {
|
|
38
|
+
persistErrors(record, errFile, emitStderr);
|
|
39
|
+
persistDiagnostics(record, diagFile, emitStderr);
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function persistErrors(record, errFile, emitStderr) {
|
|
44
|
+
const lines = [];
|
|
45
|
+
for (const ve of record.validationErrors ?? []) {
|
|
46
|
+
lines.push({
|
|
47
|
+
turn: record.turn,
|
|
48
|
+
kind: ve.status,
|
|
49
|
+
action: ve.name,
|
|
50
|
+
reason: ve.error ?? `action "${ve.name}" rejected by contract (${ve.status})`,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
if (record.providerError) {
|
|
54
|
+
lines.push({
|
|
55
|
+
turn: record.turn,
|
|
56
|
+
kind: 'provider_error',
|
|
57
|
+
action: null,
|
|
58
|
+
reason: record.providerError,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (lines.length === 0)
|
|
62
|
+
return;
|
|
63
|
+
try {
|
|
64
|
+
fs.appendFileSync(errFile, lines.map(l => JSON.stringify(l)).join('\n') + '\n');
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
console.error(`[errors.jsonl] write failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
68
|
+
}
|
|
69
|
+
if (emitStderr) {
|
|
70
|
+
for (const rec of lines) {
|
|
71
|
+
const actionSuffix = rec.action ? ` "${rec.action}"` : '';
|
|
72
|
+
console.error(`\x1b[31m[ARCHETYPE ERROR]\x1b[0m turn ${rec.turn}: ${rec.kind}${actionSuffix} — ${rec.reason}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function persistDiagnostics(record, diagFile, emitStderr) {
|
|
77
|
+
if (!record.rawAssistantResponse)
|
|
78
|
+
return;
|
|
79
|
+
const i = record.rawAssistantResponse.indexOf('{');
|
|
80
|
+
if (i < 0)
|
|
81
|
+
return;
|
|
82
|
+
let parsed = null;
|
|
83
|
+
try {
|
|
84
|
+
parsed = JSON.parse(record.rawAssistantResponse.slice(i));
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return; // diagnostics are optional — parse failures are not errors
|
|
88
|
+
}
|
|
89
|
+
const raw = Array.isArray(parsed?.diagnostics) ? parsed.diagnostics : [];
|
|
90
|
+
const diags = raw.filter((d) => typeof d === 'string' && d.trim().length > 0);
|
|
91
|
+
if (diags.length === 0)
|
|
92
|
+
return;
|
|
93
|
+
try {
|
|
94
|
+
const entries = diags.map((d) => `- turn ${record.turn}: ${d}`).join('\n') + '\n';
|
|
95
|
+
fs.appendFileSync(diagFile, entries);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
console.error(`[diagnostics.md] write failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
99
|
+
}
|
|
100
|
+
if (emitStderr) {
|
|
101
|
+
for (const d of diags) {
|
|
102
|
+
console.error(`\x1b[33m[BUILDER DIAGNOSTIC]\x1b[0m turn ${record.turn}: ${d}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=turn-reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-reporter.js","sourceRoot":"","sources":["../../src/observability/turn-reporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { PersonaConfig, ChatInput, ChatResult, GreetingInput, PromptedTurnInput, RetrospectInput, RetrospectResult } from './types.js';
|
|
2
|
+
import type { AuditInput, AuditResult } from './audit/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* PersonaEngine — the main SDK entry point.
|
|
5
|
+
* Wraps a PersonaConfig and provides the chat interface.
|
|
6
|
+
*/
|
|
7
|
+
export declare class PersonaEngine {
|
|
8
|
+
readonly config: PersonaConfig;
|
|
9
|
+
constructor(config: PersonaConfig);
|
|
10
|
+
/**
|
|
11
|
+
* Stateless chat — app manages history + persistence.
|
|
12
|
+
* Build prompt → call LLM → parse response.
|
|
13
|
+
*/
|
|
14
|
+
chat(input: ChatInput): Promise<ChatResult>;
|
|
15
|
+
/**
|
|
16
|
+
* Stateless app-initiated turn — delegates to chat() with the intent
|
|
17
|
+
* framed as a system section, not a user message.
|
|
18
|
+
* The message slot gets a neutral directive so the AI understands
|
|
19
|
+
* this is system-initiated, not user-initiated.
|
|
20
|
+
*/
|
|
21
|
+
promptedTurn(input: PromptedTurnInput): Promise<ChatResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Stateless retrospective memory pass — infer durable memory updates silently.
|
|
24
|
+
* Returns memory CRUD actions only; no user-facing message.
|
|
25
|
+
*/
|
|
26
|
+
retrospect(input: RetrospectInput): Promise<RetrospectResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Stateless greeting — build greeting prompt, call LLM, return plain text.
|
|
29
|
+
* No response schema, no actions — just a warm check-in message.
|
|
30
|
+
*/
|
|
31
|
+
greet(input: GreetingInput): Promise<{
|
|
32
|
+
greeting: string;
|
|
33
|
+
}>;
|
|
34
|
+
/**
|
|
35
|
+
* Check if a greeting is appropriate given the last message time.
|
|
36
|
+
*/
|
|
37
|
+
shouldGreet(lastMessageAt: Date | null | undefined, timezone?: string): boolean;
|
|
38
|
+
/** The persona's display name */
|
|
39
|
+
get name(): string;
|
|
40
|
+
/** The LLM provider name */
|
|
41
|
+
get providerName(): string;
|
|
42
|
+
/**
|
|
43
|
+
* Audit the persona for keystone principle violations.
|
|
44
|
+
* Reviews the assembled prompt and optionally the conversation history.
|
|
45
|
+
* Returns explicit, actionable failure lists for developers/coding agents.
|
|
46
|
+
*/
|
|
47
|
+
audit(input: AuditInput): Promise<AuditResult>;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=persona.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persona.d.ts","sourceRoot":"","sources":["../src/persona.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAc,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAgB,MAAM,YAAY,CAAA;AAUrK,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAoJ/D;;;GAGG;AACH,qBAAa,aAAa;IACxB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;gBAElB,MAAM,EAAE,aAAa;IAIjC;;;OAGG;IACG,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IAIjD;;;;;OAKG;IACG,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;IAyCjE;;;OAGG;IACG,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAqCnE;;;OAGG;IACG,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAoBhE;;OAEG;IACH,WAAW,CAAC,aAAa,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAI/E,iCAAiC;IACjC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,4BAA4B;IAC5B,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED;;;;OAIG;IACG,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;CAsBrD"}
|