@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,48 @@
|
|
|
1
|
+
import { resolvePromptedTurnMode } from './prompt-mode.js';
|
|
2
|
+
export function buildPromptedTurnFrame(input) {
|
|
3
|
+
return [
|
|
4
|
+
input.label ? `${input.label.toUpperCase()}:` : null,
|
|
5
|
+
input.intent ? `Intent: ${input.intent}` : null,
|
|
6
|
+
].filter(Boolean).join('\n');
|
|
7
|
+
}
|
|
8
|
+
export function buildPromptedTurnTransportMessage() {
|
|
9
|
+
return 'Use the turn instructions and structured context as the live input. ' +
|
|
10
|
+
'Return the raw JSON object described in the system prompt.';
|
|
11
|
+
}
|
|
12
|
+
export function buildPromptedTurnTailSections(input) {
|
|
13
|
+
return [
|
|
14
|
+
buildPromptedTurnFrame(input) || null,
|
|
15
|
+
...(input.guidelines ? [input.guidelines] : []),
|
|
16
|
+
...(input.extraSystemSections ?? []),
|
|
17
|
+
...(input.tailSystemSections ?? []),
|
|
18
|
+
].filter((value) => Boolean(value));
|
|
19
|
+
}
|
|
20
|
+
export function toPromptedTurnChatInput(input) {
|
|
21
|
+
const promptNow = input.promptNow
|
|
22
|
+
? input.promptNow instanceof Date
|
|
23
|
+
? input.promptNow
|
|
24
|
+
: new Date(input.promptNow)
|
|
25
|
+
: new Date();
|
|
26
|
+
return {
|
|
27
|
+
message: buildPromptedTurnTransportMessage(),
|
|
28
|
+
promptMode: resolvePromptedTurnMode(input.promptMode, input.turnKind),
|
|
29
|
+
history: input.history,
|
|
30
|
+
memories: input.memories,
|
|
31
|
+
knowledgeDocuments: input.knowledgeDocuments,
|
|
32
|
+
craftMemories: input.craftMemories,
|
|
33
|
+
context: input.context,
|
|
34
|
+
timezone: input.timezone,
|
|
35
|
+
promptNow,
|
|
36
|
+
userIdentity: input.userIdentity,
|
|
37
|
+
locale: input.locale,
|
|
38
|
+
directives: input.directives,
|
|
39
|
+
promptOrigin: 'app',
|
|
40
|
+
promptScaffold: input.promptScaffold,
|
|
41
|
+
contractStyle: input.contractStyle,
|
|
42
|
+
extraSystemSections: undefined,
|
|
43
|
+
tailSystemSections: buildPromptedTurnTailSections(input),
|
|
44
|
+
workingSet: input.workingSet,
|
|
45
|
+
lastMessageAt: promptNow,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=prompted-turn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompted-turn.js","sourceRoot":"","sources":["../../src/core/prompted-turn.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAE1D,MAAM,UAAU,sBAAsB,CAAC,KAAkD;IACvF,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI;QACpD,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI;KAChD,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC9B,CAAC;AAED,MAAM,UAAU,iCAAiC;IAC/C,OAAO,sEAAsE;QAC3E,4DAA4D,CAAA;AAChE,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,KAAgH;IAEhH,OAAO;QACL,sBAAsB,CAAC,KAAK,CAAC,IAAI,IAAI;QACrC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC;QACpC,GAAG,CAAC,KAAK,CAAC,kBAAkB,IAAI,EAAE,CAAC;KACpC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;AACtD,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAwB;IAC9D,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS;QAC/B,CAAC,CAAC,KAAK,CAAC,SAAS,YAAY,IAAI;YAC/B,CAAC,CAAC,KAAK,CAAC,SAAS;YACjB,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QAC7B,CAAC,CAAC,IAAI,IAAI,EAAE,CAAA;IAEd,OAAO;QACL,OAAO,EAAE,iCAAiC,EAAE;QAC5C,UAAU,EAAE,uBAAuB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC;QACrE,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,SAAS;QACT,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,YAAY,EAAE,KAAK;QACnB,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,mBAAmB,EAAE,SAAS;QAC9B,kBAAkB,EAAE,6BAA6B,CAAC,KAAK,CAAC;QACxD,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,aAAa,EAAE,SAAS;KACzB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ChatInput, LLMProviderRequest, PersonaConfig, PromptMode, PromptOrigin, PromptedTurnInput } from '../types.js';
|
|
2
|
+
export interface BuiltLLMRequest extends LLMProviderRequest {
|
|
3
|
+
promptMode: PromptMode;
|
|
4
|
+
promptOrigin: PromptOrigin;
|
|
5
|
+
}
|
|
6
|
+
export interface PreparedChatRequest {
|
|
7
|
+
effectiveConfig: PersonaConfig;
|
|
8
|
+
request: BuiltLLMRequest;
|
|
9
|
+
}
|
|
10
|
+
export declare function buildChatLLMRequest(config: PersonaConfig, input: ChatInput): PreparedChatRequest;
|
|
11
|
+
export declare function buildPromptedTurnLLMRequest(config: PersonaConfig, input: PromptedTurnInput): PreparedChatRequest & {
|
|
12
|
+
chatInput: ChatInput;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=request-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-builder.d.ts","sourceRoot":"","sources":["../../src/core/request-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAS5H,MAAM,WAAW,eAAgB,SAAQ,kBAAkB;IACzD,UAAU,EAAE,UAAU,CAAA;IACtB,YAAY,EAAE,YAAY,CAAA;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,aAAa,CAAA;IAC9B,OAAO,EAAE,eAAe,CAAA;CACzB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,SAAS,GACf,mBAAmB,CAyCrB;AAUD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,iBAAiB,GACvB,mBAAmB,GAAG;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,CAOhD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { stripActionAnnotations } from './actions.js';
|
|
2
|
+
import { buildSystemPrompt } from './prompt-builder.js';
|
|
3
|
+
import { buildGeminiResponseSchema } from '../providers/gemini.js';
|
|
4
|
+
import { resolveEffectiveConfig } from './effective-config.js';
|
|
5
|
+
import { toPromptedTurnChatInput } from './prompted-turn.js';
|
|
6
|
+
import { resolvePersonaConfigBrain } from '../brain.js';
|
|
7
|
+
import { renderTurnLedgerForModel } from '../engine/continuity.js';
|
|
8
|
+
export function buildChatLLMRequest(config, input) {
|
|
9
|
+
const resolvedConfig = resolvePersonaConfigBrain(config);
|
|
10
|
+
const effectiveConfig = resolveEffectiveConfig(resolvedConfig);
|
|
11
|
+
const systemPrompt = buildSystemPrompt({ config: effectiveConfig, input });
|
|
12
|
+
const turnLedgerActorId = input.turnLedgerActorId ?? input.personaId;
|
|
13
|
+
const focusWithPrivateWorkHistory = (input.promptMode ?? 'conversation') === 'focus' && hasPrivateWorkHistory(input);
|
|
14
|
+
const modelTurnLedger = focusWithPrivateWorkHistory
|
|
15
|
+
? turnLedgerActorId
|
|
16
|
+
? input.turnLedger?.filter(entry => entry.actorId === turnLedgerActorId)
|
|
17
|
+
: []
|
|
18
|
+
: input.turnLedger;
|
|
19
|
+
const history = modelTurnLedger
|
|
20
|
+
? stripActionAnnotations(renderTurnLedgerForModel(modelTurnLedger, {
|
|
21
|
+
perspectiveActorId: turnLedgerActorId,
|
|
22
|
+
participants: input.session?.participants,
|
|
23
|
+
historyTransport: effectiveConfig.provider.historyTransport,
|
|
24
|
+
omitActionOutcomesForActorId: hasPrivateWorkHistory(input) ? turnLedgerActorId : undefined,
|
|
25
|
+
currentTurn: input.turnLedgerCurrentTurn,
|
|
26
|
+
}))
|
|
27
|
+
: stripActionAnnotations(input.history ?? []);
|
|
28
|
+
const responseSchema = buildGeminiResponseSchema(effectiveConfig.actions, {
|
|
29
|
+
followUpsDescription: resolvedConfig.followUpsDescription,
|
|
30
|
+
entities: effectiveConfig.entities,
|
|
31
|
+
promptMode: input.promptMode ?? 'conversation',
|
|
32
|
+
});
|
|
33
|
+
return {
|
|
34
|
+
effectiveConfig,
|
|
35
|
+
request: {
|
|
36
|
+
systemPrompt,
|
|
37
|
+
history,
|
|
38
|
+
message: input.message,
|
|
39
|
+
responseSchema,
|
|
40
|
+
attachments: input.attachments,
|
|
41
|
+
promptMode: input.promptMode ?? 'conversation',
|
|
42
|
+
promptOrigin: input.promptOrigin ?? 'user',
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function hasPrivateWorkHistory(input) {
|
|
47
|
+
if (!input.context || !Object.hasOwn(input.context, 'workHistory'))
|
|
48
|
+
return false;
|
|
49
|
+
const value = input.context.workHistory;
|
|
50
|
+
if (Array.isArray(value))
|
|
51
|
+
return value.length > 0;
|
|
52
|
+
if (typeof value === 'string')
|
|
53
|
+
return value.trim().length > 0;
|
|
54
|
+
return Boolean(value);
|
|
55
|
+
}
|
|
56
|
+
export function buildPromptedTurnLLMRequest(config, input) {
|
|
57
|
+
const chatInput = toPromptedTurnChatInput(input);
|
|
58
|
+
const prepared = buildChatLLMRequest(config, chatInput);
|
|
59
|
+
return {
|
|
60
|
+
...prepared,
|
|
61
|
+
chatInput,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=request-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-builder.js","sourceRoot":"","sources":["../../src/core/request-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ChatParticipant } from '../types.js';
|
|
2
|
+
export interface AddressedParticipantInput {
|
|
3
|
+
message: string;
|
|
4
|
+
participants?: readonly ChatParticipant[];
|
|
5
|
+
actorId?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface SessionRecipientInput extends AddressedParticipantInput {
|
|
8
|
+
/**
|
|
9
|
+
* Recipient for an unaddressed opening/session message. This is factual
|
|
10
|
+
* session setup, not a hidden scheduler: explicit conversational addresses
|
|
11
|
+
* still win.
|
|
12
|
+
*/
|
|
13
|
+
defaultRecipientId?: string | null;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Resolve whether a visible session message is addressed to another
|
|
17
|
+
* participant. This is turn-taking, not judgment: the runtime honors the
|
|
18
|
+
* conversational addressee instead of requiring hidden control actions for
|
|
19
|
+
* ordinary teammate handoffs.
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveAddressedParticipantId(input: AddressedParticipantInput): string | null;
|
|
22
|
+
export declare function resolveSessionRecipientId(input: SessionRecipientInput): string | null;
|
|
23
|
+
//# sourceMappingURL=session-routing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-routing.d.ts","sourceRoot":"","sources":["../../src/core/session-routing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,SAAS,eAAe,EAAE,CAAA;IACzC,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,qBAAsB,SAAQ,yBAAyB;IACtE;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACnC;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,yBAAyB,GAAG,MAAM,GAAG,IAAI,CAgB7F;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,GAAG,IAAI,CAOrF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve whether a visible session message is addressed to another
|
|
3
|
+
* participant. This is turn-taking, not judgment: the runtime honors the
|
|
4
|
+
* conversational addressee instead of requiring hidden control actions for
|
|
5
|
+
* ordinary teammate handoffs.
|
|
6
|
+
*/
|
|
7
|
+
export function resolveAddressedParticipantId(input) {
|
|
8
|
+
const message = input.message.trim();
|
|
9
|
+
if (!message)
|
|
10
|
+
return null;
|
|
11
|
+
const peers = (input.participants ?? [])
|
|
12
|
+
.filter(participant => participant.id && participant.id !== input.actorId);
|
|
13
|
+
if (peers.length === 0)
|
|
14
|
+
return null;
|
|
15
|
+
const explicit = peers
|
|
16
|
+
.map(participant => ({ participant, index: participantNameMatchIndex(message, participant) }))
|
|
17
|
+
.filter(item => item.index !== null)
|
|
18
|
+
.sort((a, b) => (a.index ?? 0) - (b.index ?? 0))[0];
|
|
19
|
+
if (explicit)
|
|
20
|
+
return explicit.participant.id;
|
|
21
|
+
if (peers.length === 1 && addressesSinglePeer(message))
|
|
22
|
+
return peers[0].id;
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
export function resolveSessionRecipientId(input) {
|
|
26
|
+
const addressed = resolveAddressedParticipantId(input);
|
|
27
|
+
if (addressed)
|
|
28
|
+
return addressed;
|
|
29
|
+
const fallback = input.defaultRecipientId?.trim();
|
|
30
|
+
if (!fallback)
|
|
31
|
+
return null;
|
|
32
|
+
return participantExists(input.participants, fallback) ? fallback : null;
|
|
33
|
+
}
|
|
34
|
+
function participantNameMatchIndex(message, participant) {
|
|
35
|
+
const names = [participant.id, participant.label]
|
|
36
|
+
.map(name => name.trim())
|
|
37
|
+
.filter(Boolean)
|
|
38
|
+
.map(escapeRegExp);
|
|
39
|
+
let earliest = null;
|
|
40
|
+
for (const name of names) {
|
|
41
|
+
const match = new RegExp(`(^|[\\s(])@?${name}(?=[\\s,:;.!?)]|$)`, 'iu').exec(message);
|
|
42
|
+
if (!match)
|
|
43
|
+
continue;
|
|
44
|
+
const index = match.index + (match[1]?.length ?? 0);
|
|
45
|
+
earliest = earliest === null ? index : Math.min(earliest, index);
|
|
46
|
+
}
|
|
47
|
+
return earliest;
|
|
48
|
+
}
|
|
49
|
+
function participantExists(participants, id) {
|
|
50
|
+
return (participants ?? []).some(participant => participant.id === id);
|
|
51
|
+
}
|
|
52
|
+
function addressesSinglePeer(message) {
|
|
53
|
+
return /\b(could you|can you|please|over to you|your turn|let me know when|feel free to)\b/iu.test(message)
|
|
54
|
+
|| /(^|[.!?]\s+)take a look\b/iu.test(message);
|
|
55
|
+
}
|
|
56
|
+
function escapeRegExp(value) {
|
|
57
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=session-routing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-routing.js","sourceRoot":"","sources":["../../src/core/session-routing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice.d.ts","sourceRoot":"","sources":["../../src/core/voice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAsC,MAAM,aAAa,CAAA;AAqBlF;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAe1D"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const TONE_INSTRUCTIONS = {
|
|
2
|
+
direct: 'Concise, straightforward, no-nonsense.',
|
|
3
|
+
warm: 'Warm and genuine.',
|
|
4
|
+
balanced: 'Friendly and clear.',
|
|
5
|
+
};
|
|
6
|
+
const STYLE_INSTRUCTIONS = {
|
|
7
|
+
educator: "You're teaching, not just advising.",
|
|
8
|
+
quick: "Concise, direct advice.",
|
|
9
|
+
};
|
|
10
|
+
const MEDIUM_FRAMING = {
|
|
11
|
+
'mobile-chat': 'This is a mobile chat interface.',
|
|
12
|
+
'desktop-panel': 'This is a desktop side panel.',
|
|
13
|
+
'email-async': 'This is async communication — like a thoughtful note.',
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Build voice instructions from tone × style × medium config.
|
|
17
|
+
*/
|
|
18
|
+
export function buildVoiceBlock(voice) {
|
|
19
|
+
const lines = [];
|
|
20
|
+
lines.push(TONE_INSTRUCTIONS[voice.tone]);
|
|
21
|
+
lines.push(STYLE_INSTRUCTIONS[voice.style]);
|
|
22
|
+
if (voice.medium) {
|
|
23
|
+
lines.push(MEDIUM_FRAMING[voice.medium]);
|
|
24
|
+
}
|
|
25
|
+
if (voice.formatting) {
|
|
26
|
+
lines.push(voice.formatting);
|
|
27
|
+
}
|
|
28
|
+
return lines.join('\n');
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=voice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice.js","sourceRoot":"","sources":["../../src/core/voice.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB,GAA8B;IACnD,MAAM,EAAE,wCAAwC;IAChD,IAAI,EAAE,mBAAmB;IACzB,QAAQ,EAAE,qBAAqB;CAChC,CAAA;AAED,MAAM,kBAAkB,GAA+B;IACrD,QAAQ,EACN,qCAAqC;IACvC,KAAK,EACH,yBAAyB;CAC5B,CAAA;AAED,MAAM,cAAc,GAAgC;IAClD,aAAa,EAAE,kCAAkC;IACjD,eAAe,EAAE,+BAA+B;IAChD,aAAa,EAAE,uDAAuD;CACvE,CAAA;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAkB;IAChD,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IACzC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;IAE3C,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1C,CAAC;IAED,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IAC9B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { PersonaConfig, ChatInput, ChatResult, ParsedAction, CrudAction, TurnTrace, TracedAction } from '../types.js';
|
|
2
|
+
export declare function createTrace(options?: {
|
|
3
|
+
personaId?: string;
|
|
4
|
+
correlationId?: string;
|
|
5
|
+
}): TurnTrace;
|
|
6
|
+
export interface RawLLMResponse {
|
|
7
|
+
message: string;
|
|
8
|
+
actions?: Array<{
|
|
9
|
+
name: string;
|
|
10
|
+
params: Record<string, unknown>;
|
|
11
|
+
}>;
|
|
12
|
+
crudActions?: CrudAction[];
|
|
13
|
+
attachmentNotes?: string[];
|
|
14
|
+
followUps?: string[];
|
|
15
|
+
diagnostics?: string[];
|
|
16
|
+
outcomeNotes?: string[];
|
|
17
|
+
changes?: Array<{
|
|
18
|
+
action: string;
|
|
19
|
+
[key: string]: unknown;
|
|
20
|
+
}>;
|
|
21
|
+
}
|
|
22
|
+
export interface ParsedResponsePayload {
|
|
23
|
+
parsed: RawLLMResponse;
|
|
24
|
+
text: string;
|
|
25
|
+
}
|
|
26
|
+
export interface InvalidActionIssue {
|
|
27
|
+
name: string;
|
|
28
|
+
error: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Stateless chat — build prompt, call LLM, parse response.
|
|
32
|
+
* This is the Layer 1 core: no persistence, no side effects.
|
|
33
|
+
*/
|
|
34
|
+
export declare function chat(config: PersonaConfig, input: ChatInput): Promise<ChatResult>;
|
|
35
|
+
export declare function normalizePlainTextResponse(text: string): string;
|
|
36
|
+
/**
|
|
37
|
+
* Parse LLM response text into a ChatResult.
|
|
38
|
+
*/
|
|
39
|
+
export declare function parseRawResponse(text: string): ParsedResponsePayload | null;
|
|
40
|
+
export declare function validateActions(parsed: RawLLMResponse, config: PersonaConfig): {
|
|
41
|
+
actions: ParsedAction[];
|
|
42
|
+
invalid: InvalidActionIssue[];
|
|
43
|
+
traced: TracedAction[];
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/engine/chat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAgB,SAAS,EAAE,YAAY,EAA0D,MAAM,aAAa,CAAA;AAKhM,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAe/F;AA2BD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAA;IAClE,WAAW,CAAC,EAAE,UAAU,EAAE,CAAA;IAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IAEvB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAA;CAC5D;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,cAAc,CAAA;IACtB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAYD;;;GAGG;AACH,wBAAsB,IAAI,CACxB,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,UAAU,CAAC,CAsIrB;AAQD,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkB/D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAS3E;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,aAAa,GACpB;IAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAAC,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAAC,MAAM,EAAE,YAAY,EAAE,CAAA;CAAE,CAqDpF"}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { applyActionsToWorkingSet, summarizeWorkingSet, usesWorkingSet } from './working-set.js';
|
|
3
|
+
import { separateCrudActions, validateAndTraceCrud } from './crud.js';
|
|
4
|
+
import { buildChatLLMRequest } from '../core/request-builder.js';
|
|
5
|
+
export function createTrace(options) {
|
|
6
|
+
return {
|
|
7
|
+
traceId: typeof crypto !== 'undefined' && crypto.randomUUID ? crypto.randomUUID() : `trace-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
|
|
8
|
+
personaId: options?.personaId,
|
|
9
|
+
correlationId: options?.correlationId,
|
|
10
|
+
startedAt: Date.now(),
|
|
11
|
+
parseOk: false,
|
|
12
|
+
repairAttempted: false,
|
|
13
|
+
actions: [],
|
|
14
|
+
crudActions: [],
|
|
15
|
+
executionResults: [],
|
|
16
|
+
domainActions: [],
|
|
17
|
+
outcomeNotes: [],
|
|
18
|
+
errors: [],
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function sha256(value) {
|
|
22
|
+
return createHash('sha256').update(value).digest('hex');
|
|
23
|
+
}
|
|
24
|
+
function traceLLMRequest(request) {
|
|
25
|
+
return {
|
|
26
|
+
systemPrompt: request.systemPrompt,
|
|
27
|
+
history: request.history,
|
|
28
|
+
message: request.message,
|
|
29
|
+
...(request.responseSchema ? { responseSchema: request.responseSchema } : {}),
|
|
30
|
+
...(request.attachments?.length
|
|
31
|
+
? {
|
|
32
|
+
attachments: request.attachments.map(att => ({
|
|
33
|
+
type: att.type,
|
|
34
|
+
mimeType: att.mimeType,
|
|
35
|
+
dataSha256: sha256(att.data),
|
|
36
|
+
dataLength: att.data.length,
|
|
37
|
+
})),
|
|
38
|
+
}
|
|
39
|
+
: {}),
|
|
40
|
+
...(typeof request.promptMode === 'string' ? { promptMode: request.promptMode } : {}),
|
|
41
|
+
...(typeof request.promptOrigin === 'string' ? { promptOrigin: request.promptOrigin } : {}),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const MAX_ACTION_REPAIR_ATTEMPTS = 1;
|
|
45
|
+
function collectRawContractDrift(parsed) {
|
|
46
|
+
const issues = [];
|
|
47
|
+
if (parsed.crudActions?.length) {
|
|
48
|
+
issues.push('Raw response used legacy top-level "crudActions" key; use actions[{ "name": "crud", ... }] instead.');
|
|
49
|
+
}
|
|
50
|
+
return issues;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Stateless chat — build prompt, call LLM, parse response.
|
|
54
|
+
* This is the Layer 1 core: no persistence, no side effects.
|
|
55
|
+
*/
|
|
56
|
+
export async function chat(config, input) {
|
|
57
|
+
const { effectiveConfig, request } = buildChatLLMRequest(config, input);
|
|
58
|
+
const trace = createTrace({ personaId: input.personaId, correlationId: input.correlationId });
|
|
59
|
+
trace.llmRequest = traceLLMRequest(request);
|
|
60
|
+
const response = await effectiveConfig.provider.chat(request);
|
|
61
|
+
trace.provider = {
|
|
62
|
+
name: effectiveConfig.provider.name,
|
|
63
|
+
...(response.requestedModel ? { requestedModel: response.requestedModel } : {}),
|
|
64
|
+
...(response.model ? { model: response.model } : {}),
|
|
65
|
+
...(response.requestFingerprint ? { requestFingerprint: response.requestFingerprint } : {}),
|
|
66
|
+
...(response.attempts ? { attempts: response.attempts } : {}),
|
|
67
|
+
};
|
|
68
|
+
// 4. Parse response
|
|
69
|
+
const initial = parseRawResponse(response.text);
|
|
70
|
+
if (!initial) {
|
|
71
|
+
trace.parseOk = false;
|
|
72
|
+
trace.errors.push('Failed to parse LLM response as JSON');
|
|
73
|
+
console.warn('[archetype] Failed to parse LLM response as JSON, using as plain message');
|
|
74
|
+
return {
|
|
75
|
+
message: normalizePlainTextResponse(response.text),
|
|
76
|
+
actions: [],
|
|
77
|
+
raw: response.text,
|
|
78
|
+
trace,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
trace.parseOk = true;
|
|
82
|
+
let finalPayload = initial;
|
|
83
|
+
let validation = validateActions(initial.parsed, effectiveConfig);
|
|
84
|
+
trace.actions = validation.traced;
|
|
85
|
+
if (validation.invalid.length > 0 && MAX_ACTION_REPAIR_ATTEMPTS > 0) {
|
|
86
|
+
trace.repairAttempted = true;
|
|
87
|
+
const repaired = await retryInvalidActions({
|
|
88
|
+
config: effectiveConfig,
|
|
89
|
+
input,
|
|
90
|
+
history: request.history,
|
|
91
|
+
systemPrompt: request.systemPrompt,
|
|
92
|
+
responseSchema: request.responseSchema ?? {},
|
|
93
|
+
initialText: response.text,
|
|
94
|
+
invalid: validation.invalid,
|
|
95
|
+
});
|
|
96
|
+
if (repaired) {
|
|
97
|
+
finalPayload = repaired;
|
|
98
|
+
validation = validateActions(repaired.parsed, effectiveConfig);
|
|
99
|
+
trace.actions = validation.traced.map(a => a.status === 'valid' && validation.invalid.every(inv => inv.name !== a.name) ? a
|
|
100
|
+
: a.status === 'valid' ? { ...a, status: 'repaired' } : a);
|
|
101
|
+
trace.repairSucceeded = validation.invalid.length === 0;
|
|
102
|
+
// If repair still produced invalid actions, surface them on trace.errors
|
|
103
|
+
// so auditTraceIntegrity can see the failure — not just console.warn.
|
|
104
|
+
if (!trace.repairSucceeded) {
|
|
105
|
+
for (const inv of validation.invalid) {
|
|
106
|
+
trace.errors.push(`Repair attempt did not fix action "${inv.name}": ${inv.error}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
trace.repairSucceeded = false;
|
|
112
|
+
trace.errors.push('Repair attempt failed to produce a parsable response');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
trace.errors.push(...collectRawContractDrift(finalPayload.parsed));
|
|
116
|
+
// Normalize message — LLM occasionally returns an array instead of a string
|
|
117
|
+
const rawMsg = finalPayload.parsed.message;
|
|
118
|
+
const message = Array.isArray(rawMsg) ? rawMsg.join('\n') : (rawMsg ?? '');
|
|
119
|
+
// Extract diagnostics (only when enabled)
|
|
120
|
+
const diagnostics = config.diagnostics?.enabled
|
|
121
|
+
? normalizeStringArray(finalPayload.parsed.diagnostics)
|
|
122
|
+
: undefined;
|
|
123
|
+
const outcomeNotes = normalizeStringArray(finalPayload.parsed.outcomeNotes);
|
|
124
|
+
const { crudActions: rawCrud, nonCrudActions } = separateCrudActions(validation.actions, finalPayload.parsed.crudActions);
|
|
125
|
+
const crudActions = effectiveConfig.entities ? validateAndTraceCrud(rawCrud, effectiveConfig.entities, trace) : undefined;
|
|
126
|
+
// Only include outcome notes on the public ChatResult when at least one
|
|
127
|
+
// action or CRUD passed validation — callers filtering on "executed
|
|
128
|
+
// actions happened" shouldn't see phantom outcomes.
|
|
129
|
+
// BUT: the raw AI-written outcome notes still go on the trace so
|
|
130
|
+
// debugging and auditTraceIntegrity can see what the model claimed.
|
|
131
|
+
const hasValidActions = nonCrudActions.length > 0 || (crudActions && crudActions.length > 0);
|
|
132
|
+
const effectiveOutcomeNotes = hasValidActions ? outcomeNotes : undefined;
|
|
133
|
+
if (outcomeNotes)
|
|
134
|
+
trace.outcomeNotes = outcomeNotes;
|
|
135
|
+
// CRUD validation gate: if provided, validate proposals and retry on failure
|
|
136
|
+
if (input.crudValidation && crudActions && crudActions.length > 0) {
|
|
137
|
+
const validationErrors = input.crudValidation(crudActions);
|
|
138
|
+
if (validationErrors && validationErrors.length > 0) {
|
|
139
|
+
trace.errors.push(...validationErrors.map(e => `CRUD validation rejected: ${e}`));
|
|
140
|
+
const maxRetries = input.crudValidationRetries ?? 1;
|
|
141
|
+
if (maxRetries > 0) {
|
|
142
|
+
const retryMessage = `Your response had CRUD validation errors:\n${validationErrors.map(e => `- ${e}`).join('\n')}\n\nPlease correct and resubmit.`;
|
|
143
|
+
const retryResult = await chat(config, {
|
|
144
|
+
...input,
|
|
145
|
+
message: retryMessage,
|
|
146
|
+
history: [
|
|
147
|
+
...(input.history ?? []),
|
|
148
|
+
{ role: 'user', content: input.message },
|
|
149
|
+
{ role: 'assistant', content: message },
|
|
150
|
+
],
|
|
151
|
+
crudValidationRetries: maxRetries - 1,
|
|
152
|
+
});
|
|
153
|
+
return retryResult;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
message,
|
|
159
|
+
actions: nonCrudActions,
|
|
160
|
+
crudActions,
|
|
161
|
+
attachmentNotes: normalizeStringArray(finalPayload.parsed.attachmentNotes),
|
|
162
|
+
followUps: finalPayload.parsed.followUps,
|
|
163
|
+
...(usesWorkingSet(effectiveConfig)
|
|
164
|
+
? (() => {
|
|
165
|
+
const workingSet = applyActionsToWorkingSet(input.workingSet, validation.actions, effectiveConfig.actions);
|
|
166
|
+
return {
|
|
167
|
+
workingSet,
|
|
168
|
+
workingSetSummary: summarizeWorkingSet(workingSet),
|
|
169
|
+
};
|
|
170
|
+
})()
|
|
171
|
+
: {}),
|
|
172
|
+
diagnostics,
|
|
173
|
+
outcomeNotes: effectiveOutcomeNotes,
|
|
174
|
+
raw: finalPayload.text,
|
|
175
|
+
trace,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
function normalizeStringArray(values) {
|
|
179
|
+
if (!values)
|
|
180
|
+
return undefined;
|
|
181
|
+
const normalized = [...new Set(values.map(value => value.trim()).filter(Boolean))];
|
|
182
|
+
return normalized.length > 0 ? normalized : undefined;
|
|
183
|
+
}
|
|
184
|
+
export function normalizePlainTextResponse(text) {
|
|
185
|
+
const trimmed = text.trim();
|
|
186
|
+
try {
|
|
187
|
+
const parsed = JSON.parse(trimmed);
|
|
188
|
+
if (typeof parsed === 'string')
|
|
189
|
+
return parsed;
|
|
190
|
+
if (Array.isArray(parsed))
|
|
191
|
+
return parsed.map(item => String(item)).join('\n');
|
|
192
|
+
if (parsed && typeof parsed === 'object') {
|
|
193
|
+
if ('greeting' in parsed)
|
|
194
|
+
return normalizePlainTextResponse(String(parsed.greeting ?? ''));
|
|
195
|
+
if ('message' in parsed)
|
|
196
|
+
return normalizePlainTextResponse(String(parsed.message ?? ''));
|
|
197
|
+
if ('text' in parsed)
|
|
198
|
+
return normalizePlainTextResponse(String(parsed.text ?? ''));
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
// Plain text is the happy path.
|
|
203
|
+
}
|
|
204
|
+
return trimmed;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Parse LLM response text into a ChatResult.
|
|
208
|
+
*/
|
|
209
|
+
export function parseRawResponse(text) {
|
|
210
|
+
try {
|
|
211
|
+
return {
|
|
212
|
+
parsed: JSON.parse(text),
|
|
213
|
+
text,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
export function validateActions(parsed, config) {
|
|
221
|
+
const definedActions = config.actions ?? {};
|
|
222
|
+
const rawActions = parsed.actions ?? [];
|
|
223
|
+
const actions = [];
|
|
224
|
+
const invalid = [];
|
|
225
|
+
const traced = [];
|
|
226
|
+
for (const action of rawActions) {
|
|
227
|
+
// Pass through crud actions — they're extracted and validated separately
|
|
228
|
+
if (action.name === 'crud') {
|
|
229
|
+
let params = action.params ?? {};
|
|
230
|
+
if (typeof params === 'string') {
|
|
231
|
+
try {
|
|
232
|
+
params = JSON.parse(params);
|
|
233
|
+
}
|
|
234
|
+
catch { /* leave as-is */ }
|
|
235
|
+
}
|
|
236
|
+
actions.push({
|
|
237
|
+
name: 'crud',
|
|
238
|
+
params: params,
|
|
239
|
+
confidence: 'low',
|
|
240
|
+
});
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
if (!(action.name in definedActions)) {
|
|
244
|
+
traced.push({ name: action.name, params: action.params, status: 'unknown_action' });
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
// Gemini sometimes returns params as a JSON string instead of an object
|
|
248
|
+
let params = action.params ?? {};
|
|
249
|
+
if (typeof params === 'string') {
|
|
250
|
+
try {
|
|
251
|
+
params = JSON.parse(params);
|
|
252
|
+
}
|
|
253
|
+
catch { /* leave as-is — Zod will reject */ }
|
|
254
|
+
}
|
|
255
|
+
const parseResult = definedActions[action.name].schema.safeParse(params);
|
|
256
|
+
if (!parseResult.success) {
|
|
257
|
+
invalid.push({
|
|
258
|
+
name: action.name,
|
|
259
|
+
error: parseResult.error.message,
|
|
260
|
+
});
|
|
261
|
+
traced.push({ name: action.name, params: action.params, status: 'invalid', error: parseResult.error.message });
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
actions.push({
|
|
265
|
+
name: action.name,
|
|
266
|
+
params: parseResult.data,
|
|
267
|
+
confidence: definedActions[action.name].confidence,
|
|
268
|
+
});
|
|
269
|
+
traced.push({ name: action.name, params: parseResult.data, status: 'valid' });
|
|
270
|
+
}
|
|
271
|
+
return { actions, invalid, traced };
|
|
272
|
+
}
|
|
273
|
+
async function retryInvalidActions(args) {
|
|
274
|
+
const { config, input, history, systemPrompt, responseSchema, initialText, invalid } = args;
|
|
275
|
+
console.warn(`[archetype] Retrying response because ${invalid.length} action(s) had invalid params: ${invalid.map(item => item.name).join(', ')}`);
|
|
276
|
+
const repairMessage = [
|
|
277
|
+
'Your previous response included invalid action params.',
|
|
278
|
+
'Return the FULL response again as valid JSON.',
|
|
279
|
+
'Keep the same user intent and overall meaning.',
|
|
280
|
+
'If an action is not actually warranted, remove it instead of guessing missing fields.',
|
|
281
|
+
'',
|
|
282
|
+
`Original user message: ${input.message}`,
|
|
283
|
+
'',
|
|
284
|
+
'Previous response JSON:',
|
|
285
|
+
initialText,
|
|
286
|
+
'',
|
|
287
|
+
'Invalid actions:',
|
|
288
|
+
...invalid.map(item => `- ${item.name}: ${item.error}`),
|
|
289
|
+
].join('\n');
|
|
290
|
+
const retry = await config.provider.chat({
|
|
291
|
+
systemPrompt,
|
|
292
|
+
history,
|
|
293
|
+
message: repairMessage,
|
|
294
|
+
responseSchema,
|
|
295
|
+
attachments: input.attachments,
|
|
296
|
+
});
|
|
297
|
+
const repaired = parseRawResponse(retry.text);
|
|
298
|
+
if (!repaired) {
|
|
299
|
+
console.warn('[archetype] Failed to parse repair response as JSON; keeping original valid subset');
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
const repairedValidation = validateActions(repaired.parsed, config);
|
|
303
|
+
if (repairedValidation.invalid.length > 0) {
|
|
304
|
+
console.warn(`[archetype] Repair response still had invalid action params: ${repairedValidation.invalid.map(item => item.name).join(', ')}`);
|
|
305
|
+
}
|
|
306
|
+
return repaired;
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=chat.js.map
|