@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,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt-dump helpers — the "Line 2" of the audit mechanism.
|
|
3
|
+
*
|
|
4
|
+
* When auditPersona flags something you can't explain, or the trace looks
|
|
5
|
+
* fine but the AI's behavior doesn't match expectation — dump the exact
|
|
6
|
+
* prompt the LLM would receive and read it directly. Often the bug is
|
|
7
|
+
* obvious in two minutes of eyeballing the packet.
|
|
8
|
+
*
|
|
9
|
+
* Two entry points, same artifact shape:
|
|
10
|
+
*
|
|
11
|
+
* dumpPromptForReview(config, input)
|
|
12
|
+
* One-shot. Build the prompt for a single representative input,
|
|
13
|
+
* get back a DumpedPrompt with system prompt, history, message,
|
|
14
|
+
* plus an `artifact` string formatted for pasting into an AI
|
|
15
|
+
* reviewer or attaching to a bug report.
|
|
16
|
+
*
|
|
17
|
+
* createPromptTraceRecorder({ outDir })
|
|
18
|
+
* Hook-compatible recorder for benchmark runs. Wires into
|
|
19
|
+
* runAutonomousLoop's onBeforeChat (or any code path that
|
|
20
|
+
* assembles a request). Writes one JSON file per turn. Replaces
|
|
21
|
+
* per-persona reinventions of this pattern (foundry had one,
|
|
22
|
+
* savor had three).
|
|
23
|
+
*/
|
|
24
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
25
|
+
import { createHash } from 'node:crypto';
|
|
26
|
+
import path from 'node:path';
|
|
27
|
+
import { buildChatLLMRequest, buildPromptedTurnLLMRequest, } from '../core/request-builder.js';
|
|
28
|
+
// ─── one-shot dumpPromptForReview ────────────────────────────────────────────
|
|
29
|
+
/**
|
|
30
|
+
* Assemble the exact prompt this persona would send for one input, and
|
|
31
|
+
* return it in a shape friendly for human or AI review.
|
|
32
|
+
*
|
|
33
|
+
* Use this during the debugging loop when auditPersona findings need
|
|
34
|
+
* context, or when you want a second opinion from another AI on the
|
|
35
|
+
* actual packet.
|
|
36
|
+
*/
|
|
37
|
+
export function dumpPromptForReview(config, input, options) {
|
|
38
|
+
const mode = options?.mode ?? 'chat';
|
|
39
|
+
if (mode === 'chat') {
|
|
40
|
+
const { request } = buildChatLLMRequest(config, input);
|
|
41
|
+
return {
|
|
42
|
+
systemPrompt: request.systemPrompt,
|
|
43
|
+
history: request.history,
|
|
44
|
+
message: request.message,
|
|
45
|
+
attachments: request.attachments,
|
|
46
|
+
responseSchema: request.responseSchema,
|
|
47
|
+
mode,
|
|
48
|
+
promptMode: request.promptMode,
|
|
49
|
+
promptOrigin: request.promptOrigin,
|
|
50
|
+
artifact: formatAsArtifact({
|
|
51
|
+
systemPrompt: request.systemPrompt,
|
|
52
|
+
history: request.history,
|
|
53
|
+
message: request.message,
|
|
54
|
+
mode,
|
|
55
|
+
promptMode: request.promptMode,
|
|
56
|
+
promptOrigin: request.promptOrigin,
|
|
57
|
+
attachments: request.attachments,
|
|
58
|
+
}),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// prompted-turn / retrospect share the same builder
|
|
62
|
+
const { request } = buildPromptedTurnLLMRequest(config, input);
|
|
63
|
+
return {
|
|
64
|
+
systemPrompt: request.systemPrompt,
|
|
65
|
+
history: request.history,
|
|
66
|
+
message: request.message,
|
|
67
|
+
attachments: request.attachments,
|
|
68
|
+
responseSchema: request.responseSchema,
|
|
69
|
+
mode,
|
|
70
|
+
promptMode: request.promptMode,
|
|
71
|
+
promptOrigin: request.promptOrigin,
|
|
72
|
+
artifact: formatAsArtifact({
|
|
73
|
+
systemPrompt: request.systemPrompt,
|
|
74
|
+
history: request.history,
|
|
75
|
+
message: request.message,
|
|
76
|
+
mode,
|
|
77
|
+
promptMode: request.promptMode,
|
|
78
|
+
promptOrigin: request.promptOrigin,
|
|
79
|
+
attachments: request.attachments,
|
|
80
|
+
}),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const TRACE_STRING_LIMIT = 200_000;
|
|
84
|
+
export function createPromptTraceRecorder(options) {
|
|
85
|
+
const baseDir = options.traceGroup
|
|
86
|
+
? path.join(options.outDir, options.traceGroup)
|
|
87
|
+
: options.outDir;
|
|
88
|
+
mkdirSync(baseDir, { recursive: true });
|
|
89
|
+
const format = options.format ?? 'json';
|
|
90
|
+
const writeTurn = (params) => {
|
|
91
|
+
const fileName = `turn-${String(params.turn).padStart(2, '0')}-${params.phase}-attempt-${params.attempt}`;
|
|
92
|
+
if (format === 'json' || format === 'both') {
|
|
93
|
+
const payload = {
|
|
94
|
+
turn: params.turn,
|
|
95
|
+
phase: params.phase,
|
|
96
|
+
attempt: params.attempt,
|
|
97
|
+
tag: options.tag ?? null,
|
|
98
|
+
traceGroup: options.traceGroup ?? null,
|
|
99
|
+
mode: params.mode ?? 'chat',
|
|
100
|
+
promptMode: params.promptMode ?? null,
|
|
101
|
+
systemPrompt: params.systemPrompt,
|
|
102
|
+
message: params.message,
|
|
103
|
+
history: params.history,
|
|
104
|
+
attachments: params.attachments ?? [],
|
|
105
|
+
responseSchema: params.responseSchema ?? null,
|
|
106
|
+
};
|
|
107
|
+
writeFileSync(path.join(baseDir, `${fileName}.json`), JSON.stringify(payload, null, 2));
|
|
108
|
+
}
|
|
109
|
+
if (format === 'artifact' || format === 'both') {
|
|
110
|
+
const artifact = formatAsArtifact({
|
|
111
|
+
systemPrompt: params.systemPrompt,
|
|
112
|
+
history: params.history,
|
|
113
|
+
message: params.message,
|
|
114
|
+
mode: params.mode ?? 'chat',
|
|
115
|
+
promptMode: params.promptMode,
|
|
116
|
+
attachments: params.attachments,
|
|
117
|
+
});
|
|
118
|
+
writeFileSync(path.join(baseDir, `${fileName}.txt`), artifact);
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
const resultFileName = (input) => `turn-${String(input.turn).padStart(2, '0')}-${input.phase ?? 'initial'}-attempt-${input.attempt ?? 1}.json`;
|
|
122
|
+
const appendResult = (input) => {
|
|
123
|
+
const filePath = path.join(baseDir, resultFileName(input));
|
|
124
|
+
const existing = existsSync(filePath)
|
|
125
|
+
? JSON.parse(readFileSync(filePath, 'utf8'))
|
|
126
|
+
: {
|
|
127
|
+
turn: input.turn,
|
|
128
|
+
phase: input.phase ?? 'initial',
|
|
129
|
+
attempt: input.attempt ?? 1,
|
|
130
|
+
tag: options.tag ?? null,
|
|
131
|
+
traceGroup: options.traceGroup ?? null,
|
|
132
|
+
mode: 'chat',
|
|
133
|
+
};
|
|
134
|
+
const payload = {
|
|
135
|
+
...existing,
|
|
136
|
+
result: {
|
|
137
|
+
rawResponse: compactTraceValue(input.rawResponse ?? null),
|
|
138
|
+
message: input.message,
|
|
139
|
+
trace: compactTraceValue(input.trace ?? null),
|
|
140
|
+
actions: compactTraceValue(input.actions ?? []),
|
|
141
|
+
actionResults: compactTraceValue(input.actionResults ?? []),
|
|
142
|
+
historyAfterTurn: compactTraceValue(input.historyAfterTurn ?? null),
|
|
143
|
+
nextMessage: compactTraceValue(input.nextMessage ?? null),
|
|
144
|
+
notes: input.notes ?? [],
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
writeFileSync(filePath, JSON.stringify(payload, null, 2));
|
|
148
|
+
};
|
|
149
|
+
return {
|
|
150
|
+
outDir: baseDir,
|
|
151
|
+
onBeforeChat: (info) => {
|
|
152
|
+
writeTurn({
|
|
153
|
+
turn: info.turn,
|
|
154
|
+
attempt: info.attempt,
|
|
155
|
+
phase: 'initial',
|
|
156
|
+
systemPrompt: info.request.systemPrompt,
|
|
157
|
+
message: info.request.message,
|
|
158
|
+
history: info.request.history,
|
|
159
|
+
responseSchema: info.request.responseSchema,
|
|
160
|
+
attachments: info.request.attachments,
|
|
161
|
+
promptMode: info.request.promptMode,
|
|
162
|
+
});
|
|
163
|
+
},
|
|
164
|
+
record: ({ turn, attempt = 1, phase = 'initial', dumped }) => {
|
|
165
|
+
writeTurn({
|
|
166
|
+
turn,
|
|
167
|
+
attempt,
|
|
168
|
+
phase,
|
|
169
|
+
systemPrompt: dumped.systemPrompt,
|
|
170
|
+
message: dumped.message,
|
|
171
|
+
history: dumped.history,
|
|
172
|
+
responseSchema: dumped.responseSchema,
|
|
173
|
+
attachments: dumped.attachments,
|
|
174
|
+
mode: dumped.mode,
|
|
175
|
+
promptMode: dumped.promptMode,
|
|
176
|
+
});
|
|
177
|
+
},
|
|
178
|
+
recordTurnResult: appendResult,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
function compactTraceValue(value) {
|
|
182
|
+
if (typeof value === 'string') {
|
|
183
|
+
const bytes = Buffer.byteLength(value, 'utf8');
|
|
184
|
+
if (bytes <= TRACE_STRING_LIMIT)
|
|
185
|
+
return value;
|
|
186
|
+
return {
|
|
187
|
+
omitted: true,
|
|
188
|
+
bytes,
|
|
189
|
+
sha256: createHash('sha256').update(value).digest('hex'),
|
|
190
|
+
preview: value.slice(0, 2000),
|
|
191
|
+
note: `String exceeded prompt-trace limit of ${TRACE_STRING_LIMIT} bytes; preview plus hash retained.`,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
if (Array.isArray(value))
|
|
195
|
+
return value.map(item => compactTraceValue(item));
|
|
196
|
+
if (value && typeof value === 'object') {
|
|
197
|
+
return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, compactTraceValue(child)]));
|
|
198
|
+
}
|
|
199
|
+
return value;
|
|
200
|
+
}
|
|
201
|
+
// ─── artifact formatter (shared) ─────────────────────────────────────────────
|
|
202
|
+
function formatAsArtifact(input) {
|
|
203
|
+
const bar = '═'.repeat(72);
|
|
204
|
+
const thin = '─'.repeat(72);
|
|
205
|
+
const lines = [];
|
|
206
|
+
lines.push(bar);
|
|
207
|
+
lines.push(` ARCHETYPE PROMPT DUMP — path: ${input.mode}; prompt mode: ${input.promptMode ?? 'unknown'}`);
|
|
208
|
+
lines.push(bar);
|
|
209
|
+
lines.push('');
|
|
210
|
+
lines.push(thin);
|
|
211
|
+
lines.push(' SYSTEM PROMPT');
|
|
212
|
+
lines.push(thin);
|
|
213
|
+
lines.push('');
|
|
214
|
+
lines.push(input.systemPrompt);
|
|
215
|
+
lines.push('');
|
|
216
|
+
lines.push(thin);
|
|
217
|
+
lines.push(' HISTORY');
|
|
218
|
+
lines.push(thin);
|
|
219
|
+
lines.push('');
|
|
220
|
+
lines.push('Conversation turns sent outside the system prompt. Empty means no chat transcript was sent for this request.');
|
|
221
|
+
if (input.history.length === 0) {
|
|
222
|
+
lines.push('(empty)');
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
for (const m of input.history) {
|
|
226
|
+
lines.push(`[${formatHistoryRole(m.role)}]`);
|
|
227
|
+
lines.push(m.content);
|
|
228
|
+
lines.push('');
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
lines.push(thin);
|
|
232
|
+
const currentHeader = input.promptOrigin === 'app' ? ' CURRENT APP EVENT' : ' USER MESSAGE';
|
|
233
|
+
const currentDescription = input.promptOrigin === 'app'
|
|
234
|
+
? 'App/runtime-initiated current event. This is still model-visible input; read it as live continuity, not as a new external user request.'
|
|
235
|
+
: 'Current user-visible message sent to the model for this turn.';
|
|
236
|
+
lines.push(currentHeader);
|
|
237
|
+
lines.push(thin);
|
|
238
|
+
lines.push('');
|
|
239
|
+
lines.push(currentDescription);
|
|
240
|
+
lines.push('');
|
|
241
|
+
lines.push(input.message);
|
|
242
|
+
lines.push('');
|
|
243
|
+
lines.push(thin);
|
|
244
|
+
lines.push(' ATTACHMENTS');
|
|
245
|
+
lines.push(thin);
|
|
246
|
+
lines.push('');
|
|
247
|
+
lines.push('Multimodal payloads sent with this request. Binary/base64 data is omitted from the dump; metadata is retained so reviewers can tell what the model saw.');
|
|
248
|
+
const attachments = input.attachments ?? [];
|
|
249
|
+
if (attachments.length === 0) {
|
|
250
|
+
lines.push('(none)');
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
attachments.forEach((attachment, index) => {
|
|
254
|
+
lines.push(`${index + 1}. ${formatAttachmentSummary(attachment)}`);
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
lines.push('');
|
|
258
|
+
lines.push(bar);
|
|
259
|
+
return lines.join('\n');
|
|
260
|
+
}
|
|
261
|
+
function formatHistoryRole(role) {
|
|
262
|
+
return role === 'user' ? 'USER TURN' : 'ASSISTANT TURN';
|
|
263
|
+
}
|
|
264
|
+
function formatAttachmentSummary(attachment) {
|
|
265
|
+
const bytes = Buffer.byteLength(attachment.data, 'base64');
|
|
266
|
+
return `${attachment.type}; ${attachment.mimeType}; ${bytes} byte(s) decoded`;
|
|
267
|
+
}
|
|
268
|
+
export { formatAsArtifact };
|
|
269
|
+
//# sourceMappingURL=prompt-dump.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-dump.js","sourceRoot":"","sources":["../../src/audit/prompt-dump.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* auditTraceIntegrity — the "Line 3" integrity floor.
|
|
3
|
+
*
|
|
4
|
+
* Every TurnTrace should be a complete, honest record of what happened
|
|
5
|
+
* during a turn. If the pipeline silently dropped an action, swallowed an
|
|
6
|
+
* error, or took a repair/retry path without surfacing it, this audit
|
|
7
|
+
* catches it. Silent failures in the pipeline make every upper-layer
|
|
8
|
+
* audit (auditPersona, auditPrompt, etc.) potentially look at a lie.
|
|
9
|
+
*
|
|
10
|
+
* Invariants checked:
|
|
11
|
+
*
|
|
12
|
+
* 1. parseOk=false implies errors is non-empty (parse failures named)
|
|
13
|
+
* 2. repairAttempted=true implies repairSucceeded is defined (not
|
|
14
|
+
* undefined — the outcome must be recorded)
|
|
15
|
+
* 3. Every action with status 'invalid' has a non-empty error
|
|
16
|
+
* 4. Every crudAction with status 'invalid' or 'failed' has a non-empty
|
|
17
|
+
* error
|
|
18
|
+
* 5. Every executionResult has status 'executed' or 'failed'
|
|
19
|
+
* 6. Every domainAction has status 'executed', 'failed', or 'skipped'
|
|
20
|
+
* 7. If repairSucceeded=false, errors array contains at least one
|
|
21
|
+
* entry explaining why
|
|
22
|
+
* 8. unknown_action status implies the name is not empty
|
|
23
|
+
*
|
|
24
|
+
* Returns findings in the same shape as auditPersona for unified handling.
|
|
25
|
+
*/
|
|
26
|
+
import type { TurnTrace } from '../types.js';
|
|
27
|
+
import type { AuditFinding } from './audit-persona.js';
|
|
28
|
+
export interface TraceIntegrityResult {
|
|
29
|
+
pass: boolean;
|
|
30
|
+
findings: AuditFinding[];
|
|
31
|
+
}
|
|
32
|
+
export declare function auditTraceIntegrity(trace: TurnTrace): TraceIntegrityResult;
|
|
33
|
+
//# sourceMappingURL=trace-integrity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-integrity.d.ts","sourceRoot":"","sources":["../../src/audit/trace-integrity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAA;IACb,QAAQ,EAAE,YAAY,EAAE,CAAA;CACzB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,oBAAoB,CAmH1E"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
export function auditTraceIntegrity(trace) {
|
|
2
|
+
const findings = [];
|
|
3
|
+
const traceId = trace.traceId;
|
|
4
|
+
// Invariant 1: parse failure must be explained.
|
|
5
|
+
if (!trace.parseOk && trace.errors.length === 0) {
|
|
6
|
+
findings.push({
|
|
7
|
+
severity: 'error',
|
|
8
|
+
audit: 'trace-integrity',
|
|
9
|
+
principle: 'parse-failure-silent',
|
|
10
|
+
message: `Trace ${traceId}: parseOk=false but errors array is empty. Parse failure was not explained.`,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
// Invariant 2: repair outcome must be recorded.
|
|
14
|
+
if (trace.repairAttempted && trace.repairSucceeded === undefined) {
|
|
15
|
+
findings.push({
|
|
16
|
+
severity: 'error',
|
|
17
|
+
audit: 'trace-integrity',
|
|
18
|
+
principle: 'repair-outcome-missing',
|
|
19
|
+
message: `Trace ${traceId}: repairAttempted=true but repairSucceeded is undefined. Repair took a path that didn't record its outcome.`,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
// Invariant 7: failed repair must leave an error trail.
|
|
23
|
+
if (trace.repairAttempted && trace.repairSucceeded === false) {
|
|
24
|
+
const hasRepairError = trace.errors.some(e => e.toLowerCase().includes('repair'));
|
|
25
|
+
if (!hasRepairError) {
|
|
26
|
+
findings.push({
|
|
27
|
+
severity: 'warn',
|
|
28
|
+
audit: 'trace-integrity',
|
|
29
|
+
principle: 'repair-failure-unexplained',
|
|
30
|
+
message: `Trace ${traceId}: repairSucceeded=false but no repair-related entry in errors. The reason the repair failed is not traceable.`,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Invariant 3: invalid actions must have an error.
|
|
35
|
+
for (const action of trace.actions) {
|
|
36
|
+
if (action.status === 'invalid' && (!action.error || action.error.length === 0)) {
|
|
37
|
+
findings.push({
|
|
38
|
+
severity: 'error',
|
|
39
|
+
audit: 'trace-integrity',
|
|
40
|
+
principle: 'invalid-action-no-error',
|
|
41
|
+
message: `Trace ${traceId}: action "${action.name}" has status 'invalid' but no error explanation.`,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
// Invariant 8
|
|
45
|
+
if (action.status === 'unknown_action' && (!action.name || action.name.length === 0)) {
|
|
46
|
+
findings.push({
|
|
47
|
+
severity: 'error',
|
|
48
|
+
audit: 'trace-integrity',
|
|
49
|
+
principle: 'unknown-action-no-name',
|
|
50
|
+
message: `Trace ${traceId}: action has status 'unknown_action' but name is empty.`,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Invariant 4: invalid/failed crud must have an error.
|
|
55
|
+
for (const crud of trace.crudActions) {
|
|
56
|
+
if ((crud.status === 'invalid' || crud.status === 'failed') && (!crud.error || crud.error.length === 0)) {
|
|
57
|
+
findings.push({
|
|
58
|
+
severity: 'error',
|
|
59
|
+
audit: 'trace-integrity',
|
|
60
|
+
principle: 'crud-failure-no-error',
|
|
61
|
+
message: `Trace ${traceId}: crud ${crud.operation} ${crud.entity} has status '${crud.status}' but no error explanation.`,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Invariant 5: execution results must have valid status.
|
|
66
|
+
for (const result of trace.executionResults) {
|
|
67
|
+
if (result.status !== 'executed' && result.status !== 'failed') {
|
|
68
|
+
findings.push({
|
|
69
|
+
severity: 'error',
|
|
70
|
+
audit: 'trace-integrity',
|
|
71
|
+
principle: 'bad-execution-status',
|
|
72
|
+
message: `Trace ${traceId}: executionResult for ${result.operation} ${result.entity} has unexpected status '${result.status}' (expected 'executed' or 'failed').`,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
if (result.status === 'failed' && (!result.error || result.error.length === 0)) {
|
|
76
|
+
findings.push({
|
|
77
|
+
severity: 'error',
|
|
78
|
+
audit: 'trace-integrity',
|
|
79
|
+
principle: 'crud-failure-no-error',
|
|
80
|
+
message: `Trace ${traceId}: executionResult ${result.operation} ${result.entity} failed but no error explanation.`,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Invariant 6: domain actions must have valid status.
|
|
85
|
+
const allowedDomainStatus = new Set(['executed', 'failed', 'skipped']);
|
|
86
|
+
for (const domain of trace.domainActions) {
|
|
87
|
+
if (!allowedDomainStatus.has(domain.status)) {
|
|
88
|
+
findings.push({
|
|
89
|
+
severity: 'error',
|
|
90
|
+
audit: 'trace-integrity',
|
|
91
|
+
principle: 'bad-domain-status',
|
|
92
|
+
message: `Trace ${traceId}: domainAction "${domain.name}" has unexpected status '${domain.status}'.`,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
if (domain.status === 'failed' && (!domain.error || domain.error.length === 0)) {
|
|
96
|
+
findings.push({
|
|
97
|
+
severity: 'error',
|
|
98
|
+
audit: 'trace-integrity',
|
|
99
|
+
principle: 'domain-failure-no-error',
|
|
100
|
+
message: `Trace ${traceId}: domainAction "${domain.name}" failed but no error explanation.`,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
pass: findings.every(f => f.severity !== 'error'),
|
|
106
|
+
findings,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=trace-integrity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-integrity.js","sourceRoot":"","sources":["../../src/audit/trace-integrity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { PersonaConfig, Memory, PromptMode } from '../types.js';
|
|
2
|
+
export interface PromptAuditInput {
|
|
3
|
+
/** API key for the judge LLM (Gemini). */
|
|
4
|
+
apiKey: string;
|
|
5
|
+
/** The persona config to audit. */
|
|
6
|
+
config: PersonaConfig;
|
|
7
|
+
/** Optional context to assemble the full prompt (profile, todayStatus, etc.). */
|
|
8
|
+
context?: Record<string, unknown>;
|
|
9
|
+
/** Optional memories to include in the assembled prompt. */
|
|
10
|
+
memories?: Memory[];
|
|
11
|
+
/**
|
|
12
|
+
* Which prompt mode to assemble for the audit. Defaults to 'conversation'
|
|
13
|
+
* (the chat-style assembly). Set to 'focus' or 'operational' to audit the
|
|
14
|
+
* variant that the benchmark/runtime actually sends. Without this the
|
|
15
|
+
* audit can pass while the real prompt has latent contradictions in a
|
|
16
|
+
* mode the consumer is actively using.
|
|
17
|
+
*/
|
|
18
|
+
promptMode?: PromptMode;
|
|
19
|
+
/** Optional primary Gemini model. Default: gemini-3.5-flash. */
|
|
20
|
+
model?: string;
|
|
21
|
+
/** Optional fallback model chain. When the primary is unavailable (503/overload), the audit will try these in order. Default: ['gemini-3.1-pro-preview', 'gemini-3.1-flash-lite']. */
|
|
22
|
+
fallbackModels?: string[];
|
|
23
|
+
}
|
|
24
|
+
export interface PromptAuditFailure {
|
|
25
|
+
/** Which keystone principle is violated. */
|
|
26
|
+
principle: string;
|
|
27
|
+
/** The exact problematic text from the prompt. */
|
|
28
|
+
text: string;
|
|
29
|
+
/** Why this is a problem — in terms the developer can act on. */
|
|
30
|
+
issue: string;
|
|
31
|
+
/** A scenario-first rewrite suggestion. */
|
|
32
|
+
suggestion: string;
|
|
33
|
+
}
|
|
34
|
+
export interface PromptAuditResult {
|
|
35
|
+
/** Config version hash — changes when the prompt-affecting config changes. */
|
|
36
|
+
configVersion: string;
|
|
37
|
+
/** Explicit list of keystone violations found in the prompt. */
|
|
38
|
+
failures: PromptAuditFailure[];
|
|
39
|
+
/** One-paragraph summary for the developer. */
|
|
40
|
+
summary: string;
|
|
41
|
+
}
|
|
42
|
+
export interface ConversationAuditInput {
|
|
43
|
+
/** API key for the judge LLM (Gemini). */
|
|
44
|
+
apiKey: string;
|
|
45
|
+
/** The persona config (for understanding intent). */
|
|
46
|
+
config: PersonaConfig;
|
|
47
|
+
/** Recent conversation history to audit. */
|
|
48
|
+
history: Array<{
|
|
49
|
+
role: 'user' | 'assistant';
|
|
50
|
+
content: string;
|
|
51
|
+
}>;
|
|
52
|
+
/** Optional context the persona had available. */
|
|
53
|
+
context?: Record<string, unknown>;
|
|
54
|
+
}
|
|
55
|
+
export interface ConversationAuditFailure {
|
|
56
|
+
/** Which keystone principle the behavior violates. */
|
|
57
|
+
principle: string;
|
|
58
|
+
/** Which turn (0-indexed) the failure occurs in. */
|
|
59
|
+
turn: number;
|
|
60
|
+
/** What went wrong. */
|
|
61
|
+
issue: string;
|
|
62
|
+
/** Direct quote from the conversation as evidence. */
|
|
63
|
+
evidence: string;
|
|
64
|
+
}
|
|
65
|
+
export interface ConversationAuditResult {
|
|
66
|
+
/** Config version hash — changes when the prompt-affecting config changes. */
|
|
67
|
+
configVersion: string;
|
|
68
|
+
/** Explicit list of behavioral failures. */
|
|
69
|
+
failures: ConversationAuditFailure[];
|
|
70
|
+
/** One-paragraph summary. */
|
|
71
|
+
summary: string;
|
|
72
|
+
}
|
|
73
|
+
export interface AuditInput {
|
|
74
|
+
/** API key for the judge LLM. */
|
|
75
|
+
apiKey: string;
|
|
76
|
+
/** Optional conversation history — if provided, runs conversation audit too. */
|
|
77
|
+
history?: Array<{
|
|
78
|
+
role: 'user' | 'assistant';
|
|
79
|
+
content: string;
|
|
80
|
+
}>;
|
|
81
|
+
/** Optional context for prompt assembly. */
|
|
82
|
+
context?: Record<string, unknown>;
|
|
83
|
+
/** Optional memories for prompt assembly. */
|
|
84
|
+
memories?: Memory[];
|
|
85
|
+
}
|
|
86
|
+
export interface AuditResult {
|
|
87
|
+
/** Prompt-level keystone failures. */
|
|
88
|
+
prompt: PromptAuditResult;
|
|
89
|
+
/** Conversation-level behavioral failures (null if no history provided). */
|
|
90
|
+
conversation: ConversationAuditResult | null;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/audit/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAI/E,MAAM,WAAW,gBAAgB;IAC/B,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAA;IACd,mCAAmC;IACnC,MAAM,EAAE,aAAa,CAAA;IACrB,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,sLAAsL;IACtL,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAA;IACjB,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAA;IACZ,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAA;IACb,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,8EAA8E;IAC9E,aAAa,EAAE,MAAM,CAAA;IACrB,gEAAgE;IAChE,QAAQ,EAAE,kBAAkB,EAAE,CAAA;IAC9B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAA;CAChB;AAID,MAAM,WAAW,sBAAsB;IACrC,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAA;IACd,qDAAqD;IACrD,MAAM,EAAE,aAAa,CAAA;IACrB,4CAA4C;IAC5C,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC/D,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,wBAAwB;IACvC,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAA;IACjB,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAA;IACZ,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,8EAA8E;IAC9E,aAAa,EAAE,MAAM,CAAA;IACrB,4CAA4C;IAC5C,QAAQ,EAAE,wBAAwB,EAAE,CAAA;IACpC,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAA;CAChB;AAID,MAAM,WAAW,UAAU;IACzB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,gFAAgF;IAChF,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAChE,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,sCAAsC;IACtC,MAAM,EAAE,iBAAiB,CAAA;IACzB,4EAA4E;IAC5E,YAAY,EAAE,uBAAuB,GAAG,IAAI,CAAA;CAC7C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/audit/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config versioning — deterministic hash of the persona config fields
|
|
3
|
+
* that affect the assembled prompt.
|
|
4
|
+
*
|
|
5
|
+
* Used by the audit system to tag results. When the config changes,
|
|
6
|
+
* the version changes, and previous audit results are stale.
|
|
7
|
+
*/
|
|
8
|
+
import type { PersonaConfig } from '../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Derive a version hash from the prompt-affecting parts of a PersonaConfig.
|
|
11
|
+
* Returns a truncated hex string (first 12 chars of SHA-256).
|
|
12
|
+
*/
|
|
13
|
+
export declare function configVersion(config: PersonaConfig): string;
|
|
14
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/audit/version.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAGhD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAiB3D"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config versioning — deterministic hash of the persona config fields
|
|
3
|
+
* that affect the assembled prompt.
|
|
4
|
+
*
|
|
5
|
+
* Used by the audit system to tag results. When the config changes,
|
|
6
|
+
* the version changes, and previous audit results are stale.
|
|
7
|
+
*/
|
|
8
|
+
import { createHash } from 'node:crypto';
|
|
9
|
+
import { resolvePersonaConfigBrain } from '../brain.js';
|
|
10
|
+
/**
|
|
11
|
+
* Derive a version hash from the prompt-affecting parts of a PersonaConfig.
|
|
12
|
+
* Returns a truncated hex string (first 12 chars of SHA-256).
|
|
13
|
+
*/
|
|
14
|
+
export function configVersion(config) {
|
|
15
|
+
const resolvedConfig = resolvePersonaConfigBrain(config);
|
|
16
|
+
const relevant = {
|
|
17
|
+
identity: resolvedConfig.identity,
|
|
18
|
+
voice: resolvedConfig.voice,
|
|
19
|
+
brain: resolvedConfig.brain ? serializeBrain(resolvedConfig.brain) : undefined,
|
|
20
|
+
methodology: resolvedConfig.methodology,
|
|
21
|
+
directives: resolvedConfig.directives,
|
|
22
|
+
actions: resolvedConfig.actions ? serializeActions(resolvedConfig.actions) : undefined,
|
|
23
|
+
contextInputs: resolvedConfig.contextInputs,
|
|
24
|
+
eq: resolvedConfig.eq,
|
|
25
|
+
memory: resolvedConfig.memory ? { ...resolvedConfig.memory } : undefined,
|
|
26
|
+
craftMemory: resolvedConfig.craftMemory ? { ...resolvedConfig.craftMemory } : undefined,
|
|
27
|
+
};
|
|
28
|
+
const json = JSON.stringify(sortValue(relevant));
|
|
29
|
+
return createHash('sha256').update(json).digest('hex').slice(0, 12);
|
|
30
|
+
}
|
|
31
|
+
function serializeBrain(brain) {
|
|
32
|
+
if (brain.source !== 'loaded') {
|
|
33
|
+
return { markdown: JSON.stringify(brain) };
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
metadata: brain.metadata,
|
|
37
|
+
sections: brain.sections,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Serialize action definitions to a stable representation.
|
|
42
|
+
* Zod schemas aren't JSON-serializable, so we extract the description + confidence.
|
|
43
|
+
*/
|
|
44
|
+
function serializeActions(actions) {
|
|
45
|
+
const result = {};
|
|
46
|
+
for (const [name, def] of Object.entries(actions)) {
|
|
47
|
+
result[name] = {
|
|
48
|
+
description: def.description ?? '',
|
|
49
|
+
confidence: def.confidence ?? 'medium',
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
function sortValue(value) {
|
|
55
|
+
if (Array.isArray(value)) {
|
|
56
|
+
return value.map(item => sortValue(item));
|
|
57
|
+
}
|
|
58
|
+
if (value && typeof value === 'object') {
|
|
59
|
+
return Object.fromEntries(Object.keys(value)
|
|
60
|
+
.sort()
|
|
61
|
+
.map(key => [key, sortValue(value[key])]));
|
|
62
|
+
}
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/audit/version.ts"],"names":[],"mappings":"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"}
|
package/dist/brain.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { LoadedBrainArtifact, PersonaBrain, PersonaConfig } from './types.js';
|
|
2
|
+
export declare function parseBrainMarkdown(markdown: string, sourcePath?: string): LoadedBrainArtifact;
|
|
3
|
+
export declare function loadBrainFile(path: string): LoadedBrainArtifact;
|
|
4
|
+
export declare function resolvePersonaBrain(brain?: PersonaBrain): LoadedBrainArtifact | undefined;
|
|
5
|
+
export declare function getBrainSection(brain: PersonaBrain | undefined, sectionName: string): string | undefined;
|
|
6
|
+
export declare function resolvePersonaConfigBrain(config: PersonaConfig): PersonaConfig;
|
|
7
|
+
//# sourceMappingURL=brain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../src/brain.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAyBlF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAkC7F;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAI/D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,mBAAmB,GAAG,SAAS,CAKzF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGxG;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAK9E"}
|