@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,451 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autonomous loop — Layer 2 primitive for multi-turn, tool-using flows.
|
|
3
|
+
*
|
|
4
|
+
* Parallel to `withStorage()` (Layer 2 for conversation-oriented personas),
|
|
5
|
+
* `runAutonomousLoop()` is the Layer 2 wrapper for personas that drive a
|
|
6
|
+
* workflow across many turns by emitting typed actions and consuming tool
|
|
7
|
+
* results.
|
|
8
|
+
*
|
|
9
|
+
* What this primitive owns — consumers do NOT re-implement these:
|
|
10
|
+
* - Turn-by-turn history (literal transcript by default; no rebuilt briefs)
|
|
11
|
+
* - History storage policy (assistant entries store compact outcome-aware
|
|
12
|
+
* continuity, never the raw JSON response — raw JSON blows up context by
|
|
13
|
+
* turn ~4 when an action carries a large file body)
|
|
14
|
+
* - Completion detection (explicit completion actions only; "empty actions"
|
|
15
|
+
* is treated as a stall, not a success)
|
|
16
|
+
* - Max-turn budget + per-turn timeout + model retry
|
|
17
|
+
* - ChatInput assembly (`message`, `history`, pass-through persona options)
|
|
18
|
+
*
|
|
19
|
+
* What consumers own — the hooks:
|
|
20
|
+
* - `initialMessage` → the first turn's user prompt
|
|
21
|
+
* - `formatToolResult` → how the prior turn's tool result becomes the next
|
|
22
|
+
* turn's user prompt. THIS IS THE DIFFERENTIATOR
|
|
23
|
+
* between autonomous-loop integrations. It's where
|
|
24
|
+
* you decide how much workspace context the model
|
|
25
|
+
* sees, and in what shape.
|
|
26
|
+
* - `executeAction` → run the action, produce a structured result
|
|
27
|
+
* - `completionActionNames` → which action names (e.g. `returnToSession`)
|
|
28
|
+
* should terminate the loop; defaults to empty, and
|
|
29
|
+
* consumers can also return an explicit `finish`
|
|
30
|
+
* from `executeAction`.
|
|
31
|
+
* - `onBeforeChat` → observer hook invoked with the assembled chat
|
|
32
|
+
* request before calling the provider. Use for
|
|
33
|
+
* prompt tracing.
|
|
34
|
+
* - `onTurn` → observer hook invoked after each turn's result is
|
|
35
|
+
* recorded. Use for logging/evidence gathering.
|
|
36
|
+
*
|
|
37
|
+
* Design note: the primitive deliberately does NOT expose a knob for
|
|
38
|
+
* "synthetic history" or "rebuilt task-frame every turn." Those anti-patterns
|
|
39
|
+
* are the problem this primitive solves — they force the model to re-enter a
|
|
40
|
+
* reconstructed situation on every turn instead of extending its own trace,
|
|
41
|
+
* and the race post-mortem (`foundry/docs/PI_VS_FOUNDRY_WHAT_ARE_WE_MISSING.md`)
|
|
42
|
+
* showed that's a material loss of momentum. If the hypothesis changes,
|
|
43
|
+
* change this primitive; don't patch around it at the consumer layer.
|
|
44
|
+
*/
|
|
45
|
+
import { buildChatLLMRequest } from '../core/request-builder.js';
|
|
46
|
+
import { buildAssistantContinuityMessage } from '../engine/continuity.js';
|
|
47
|
+
const DEFAULT_TURN_TIMEOUT_MS = 90_000;
|
|
48
|
+
const DEFAULT_MODEL_RETRIES = 2;
|
|
49
|
+
const DEFAULT_RETRY_DELAY_MS = 2_000;
|
|
50
|
+
const MAX_CONSECUTIVE_STALLS = 3;
|
|
51
|
+
export async function runAutonomousLoop(input) {
|
|
52
|
+
validateHooks(input.hooks);
|
|
53
|
+
const state = {
|
|
54
|
+
history: [],
|
|
55
|
+
records: [],
|
|
56
|
+
finish: null,
|
|
57
|
+
turnsUsed: 0,
|
|
58
|
+
consecutiveStalls: 0,
|
|
59
|
+
};
|
|
60
|
+
const turnTimeoutMs = input.turnTimeoutMs ?? DEFAULT_TURN_TIMEOUT_MS;
|
|
61
|
+
const modelRetries = input.modelRetries ?? DEFAULT_MODEL_RETRIES;
|
|
62
|
+
const retryDelayMs = input.modelRetryDelayMs ?? DEFAULT_RETRY_DELAY_MS;
|
|
63
|
+
const completionNames = new Set(input.hooks.completionActionNames ?? []);
|
|
64
|
+
for (let turn = 1; turn <= input.maxTurns; turn += 1) {
|
|
65
|
+
const ctx = {
|
|
66
|
+
turn,
|
|
67
|
+
maxTurns: input.maxTurns,
|
|
68
|
+
run: input.run,
|
|
69
|
+
};
|
|
70
|
+
const message = buildTurnMessage(state, input.hooks, ctx);
|
|
71
|
+
// Collect any multimodal attachments the previous turn's tool result
|
|
72
|
+
// set. Attachments are delivered once (this turn) and intentionally not
|
|
73
|
+
// persisted in history — future turns see only the text outcome, not
|
|
74
|
+
// the bytes. A browserScreenshot returning a PNG is the canonical case.
|
|
75
|
+
const priorAttachments = collectPriorToolAttachments(state);
|
|
76
|
+
const chatOptions = await resolveLoopChatOptions(input.hooks.chatOptions, ctx, state);
|
|
77
|
+
const chatInput = {
|
|
78
|
+
...chatOptions,
|
|
79
|
+
message,
|
|
80
|
+
history: [...state.history],
|
|
81
|
+
...(priorAttachments.length > 0 ? { attachments: priorAttachments } : {}),
|
|
82
|
+
};
|
|
83
|
+
const turnPersona = typeof input.persona === 'function'
|
|
84
|
+
? await input.persona(ctx)
|
|
85
|
+
: input.persona;
|
|
86
|
+
let result;
|
|
87
|
+
try {
|
|
88
|
+
result = await callPersonaWithRetry({
|
|
89
|
+
persona: turnPersona,
|
|
90
|
+
chatInput,
|
|
91
|
+
turn,
|
|
92
|
+
turnTimeoutMs,
|
|
93
|
+
modelRetries,
|
|
94
|
+
retryDelayMs,
|
|
95
|
+
onBeforeChat: input.hooks.onBeforeChat,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
// Provider-level error (MALFORMED_FUNCTION_CALL, empty response, timeout,
|
|
100
|
+
// etc.). Surface only factual continuity to the next turn. Do not turn
|
|
101
|
+
// infrastructure load/timeouts into strategy advice for the agent.
|
|
102
|
+
const summary = error instanceof Error ? error.message : String(error);
|
|
103
|
+
const infrastructureLoad = isInfrastructureLoadError(summary);
|
|
104
|
+
if (infrastructureLoad) {
|
|
105
|
+
console.error(`\x1b[33m[archetype PROVIDER LOAD]\x1b[0m Turn ${turn}: ${summary}. `
|
|
106
|
+
+ `No actions ran. The next turn will retry the same active work after recording the timeout.`);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
console.error(`\x1b[31m[archetype PROVIDER ERROR]\x1b[0m Turn ${turn}: ${summary}. `
|
|
110
|
+
+ `No actions ran. If this repeats, inspect the prompt dump and provider payload.`);
|
|
111
|
+
}
|
|
112
|
+
state.records.push({
|
|
113
|
+
turn,
|
|
114
|
+
message,
|
|
115
|
+
assistantMessage: '',
|
|
116
|
+
action: null,
|
|
117
|
+
toolResult: null,
|
|
118
|
+
rawAssistantResponse: null,
|
|
119
|
+
providerError: summary,
|
|
120
|
+
});
|
|
121
|
+
state.turnsUsed = turn;
|
|
122
|
+
state.consecutiveStalls += 1;
|
|
123
|
+
if (state.consecutiveStalls >= MAX_CONSECUTIVE_STALLS) {
|
|
124
|
+
state.finish = {
|
|
125
|
+
outcome: 'blocked',
|
|
126
|
+
summary: `Autonomous loop: ${MAX_CONSECUTIVE_STALLS} consecutive provider failures. Last: ${summary}`,
|
|
127
|
+
};
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
const actions = Array.isArray(result.actions) ? result.actions : [];
|
|
133
|
+
// Execute all emitted actions sequentially. Gemini's native function-
|
|
134
|
+
// calling API natively returns multiple `functionCall` parts per turn,
|
|
135
|
+
// and pi's coding agent supports this; rejecting multi-action turns was a
|
|
136
|
+
// holdover from the focus-mode assumption of one-action-per-turn. Each
|
|
137
|
+
// action executes in emission order, its tool result feeds into the
|
|
138
|
+
// aggregate. Early-exit if any action's result sets `finish`.
|
|
139
|
+
const actionResults = input.hooks.executeActions
|
|
140
|
+
? await input.hooks.executeActions(actions, ctx)
|
|
141
|
+
: [];
|
|
142
|
+
if (!input.hooks.executeActions) {
|
|
143
|
+
for (const a of actions) {
|
|
144
|
+
const r = await input.hooks.executeAction(a, ctx);
|
|
145
|
+
actionResults.push({ action: a, result: r });
|
|
146
|
+
if (r.finish)
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const action = actions[0] ?? null;
|
|
151
|
+
const toolResult = actionResults[0]?.result ?? null;
|
|
152
|
+
// Validation errors: the model emitted actions the contract rejected
|
|
153
|
+
// (unknown_action, invalid). Archetype's chat.ts puts these on
|
|
154
|
+
// ChatResult.trace.actions but by default they disappear into the void —
|
|
155
|
+
// the model sees no tool result and no explanation. Log strongly AND
|
|
156
|
+
// attach to the record so the next turn can surface the error to the
|
|
157
|
+
// model.
|
|
158
|
+
const validationErrors = (result.trace?.actions ?? [])
|
|
159
|
+
.filter(a => a.status === 'invalid' || a.status === 'unknown_action')
|
|
160
|
+
.map(a => ({ name: a.name, status: a.status, error: a.error }));
|
|
161
|
+
if (validationErrors.length > 0) {
|
|
162
|
+
console.error(`\x1b[31m[archetype CONFUSED PROMPT]\x1b[0m Turn ${turn}: model emitted ${validationErrors.length} action(s) the contract rejected. `
|
|
163
|
+
+ `This means the prompt / tool schema we gave the model was ambiguous or misleading — the model made a reasonable try and we said no. `
|
|
164
|
+
+ `Surfacing to the model as feedback.\n`
|
|
165
|
+
+ validationErrors.map(e => ` - ${e.status} "${e.name}": ${e.error ?? '(no detail)'}`).join('\n'));
|
|
166
|
+
}
|
|
167
|
+
// Update history: user message, then a compact assistant-history entry.
|
|
168
|
+
// Future turns should see outcome continuity, not raw assistant JSON.
|
|
169
|
+
// Providers that reconstruct native function-call history opt into a
|
|
170
|
+
// compact JSON transport that preserves action references while dropping
|
|
171
|
+
// large payload bodies.
|
|
172
|
+
state.history.push({ role: 'user', content: message });
|
|
173
|
+
state.history.push({
|
|
174
|
+
role: 'assistant',
|
|
175
|
+
content: buildAssistantContinuityMessage({
|
|
176
|
+
message: result.message,
|
|
177
|
+
modelOutcomeNotes: result.outcomeNotes,
|
|
178
|
+
actionOutcomes: actionResults.map(({ action, result: toolResult }) => ({
|
|
179
|
+
action,
|
|
180
|
+
outcomeNote: toolResult.outcomeNote,
|
|
181
|
+
text: toolResult.text,
|
|
182
|
+
status: toolResult.finish ? `finish:${toolResult.finish.outcome}` : undefined,
|
|
183
|
+
success: toolResult.finish ? toolResult.finish.outcome === 'success' : undefined,
|
|
184
|
+
})),
|
|
185
|
+
actionsForHistory: actionResults.map(({ action }) => action),
|
|
186
|
+
historyTransport: turnPersona.config.provider.historyTransport,
|
|
187
|
+
}),
|
|
188
|
+
});
|
|
189
|
+
const record = {
|
|
190
|
+
turn,
|
|
191
|
+
message,
|
|
192
|
+
assistantMessage: result.message,
|
|
193
|
+
action,
|
|
194
|
+
toolResult,
|
|
195
|
+
rawAssistantResponse: result.raw ?? null,
|
|
196
|
+
trace: result.trace,
|
|
197
|
+
validationErrors: validationErrors.length > 0 ? validationErrors : undefined,
|
|
198
|
+
extraActionResults: actionResults.length > 1
|
|
199
|
+
? actionResults.slice(1)
|
|
200
|
+
: undefined,
|
|
201
|
+
};
|
|
202
|
+
state.records.push(record);
|
|
203
|
+
state.turnsUsed = turn;
|
|
204
|
+
// Don't count validation-rejected as a stall: the model DID emit an
|
|
205
|
+
// action, we just rejected it. Reset the stall counter so the model has
|
|
206
|
+
// full budget to adapt.
|
|
207
|
+
state.consecutiveStalls = (action || validationErrors.length > 0) ? 0 : state.consecutiveStalls + 1;
|
|
208
|
+
if (input.hooks.onTurn) {
|
|
209
|
+
await input.hooks.onTurn(record, state);
|
|
210
|
+
}
|
|
211
|
+
// Completion checks, in priority order. Scan ALL action results for a
|
|
212
|
+
// finish signal or a completion-action-name match — any of the multi-
|
|
213
|
+
// action emissions can signal done.
|
|
214
|
+
const finishFromResults = actionResults.find(r => r.result.finish)?.result.finish;
|
|
215
|
+
if (finishFromResults) {
|
|
216
|
+
state.finish = finishFromResults;
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
const completionAction = actionResults.find(r => r.result.executed !== false && completionNames.has(r.action.name));
|
|
220
|
+
if (completionAction) {
|
|
221
|
+
state.finish = finishFromCompletionAction(completionAction.action);
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
if (state.consecutiveStalls >= MAX_CONSECUTIVE_STALLS) {
|
|
225
|
+
state.finish = {
|
|
226
|
+
outcome: 'blocked',
|
|
227
|
+
summary: `Autonomous loop: model stalled (returned no action for ${MAX_CONSECUTIVE_STALLS} consecutive turns).`,
|
|
228
|
+
};
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
const finish = state.finish ?? {
|
|
233
|
+
outcome: 'blocked',
|
|
234
|
+
summary: `Reached max turns (${input.maxTurns}) without completion.`,
|
|
235
|
+
};
|
|
236
|
+
return { state, finish };
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Translate a validation rejection into plain English. Zod's raw JSON
|
|
240
|
+
* (`[{code:"too_small",minimum:1,path:["edits",0,"oldText"],message:"String
|
|
241
|
+
* must contain at least 1 character(s)"}]`) is technically correct but
|
|
242
|
+
* reads like stack trace — the model repeated the same empty-oldText
|
|
243
|
+
* mistake four turns in a row on 2026-04-21 despite seeing that JSON each
|
|
244
|
+
* turn. Format each error to say what the field represents and why the
|
|
245
|
+
* value was invalid, without prescribing the next move.
|
|
246
|
+
*/
|
|
247
|
+
function formatValidationError(e) {
|
|
248
|
+
if (e.status === 'unknown_action') {
|
|
249
|
+
return (` - Unknown action "${e.name}": not in the AVAILABLE ACTIONS list. `
|
|
250
|
+
+ `The valid set is fixed by the contract above — no other names exist.`);
|
|
251
|
+
}
|
|
252
|
+
let parsed = [];
|
|
253
|
+
if (e.error) {
|
|
254
|
+
try {
|
|
255
|
+
const maybe = JSON.parse(e.error);
|
|
256
|
+
if (Array.isArray(maybe))
|
|
257
|
+
parsed = maybe;
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
// raw string — keep as-is
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if (parsed.length === 0) {
|
|
264
|
+
return ` - Invalid action "${e.name}": ${e.error ?? '(no detail)'}`;
|
|
265
|
+
}
|
|
266
|
+
const details = parsed.map((issue) => {
|
|
267
|
+
const fieldPath = (issue.path ?? []).map(String).join('.');
|
|
268
|
+
const fieldRef = fieldPath || '(root)';
|
|
269
|
+
switch (issue.code) {
|
|
270
|
+
case 'too_small':
|
|
271
|
+
if (issue.expected === 'array') {
|
|
272
|
+
return `${fieldRef} was empty — the schema requires at least ${issue.minimum ?? 1} entr${(issue.minimum ?? 1) === 1 ? 'y' : 'ies'}.`;
|
|
273
|
+
}
|
|
274
|
+
return `${fieldRef} was empty or too short — the schema requires at least ${issue.minimum ?? 1} character${(issue.minimum ?? 1) === 1 ? '' : 's'}.`;
|
|
275
|
+
case 'invalid_type':
|
|
276
|
+
return `${fieldRef} had the wrong type — expected ${issue.expected ?? '?'}, got ${issue.received ?? '?'}.`;
|
|
277
|
+
case 'unrecognized_keys':
|
|
278
|
+
return `${fieldRef} contained unrecognized keys — only the declared param names are accepted.`;
|
|
279
|
+
case 'invalid_enum_value':
|
|
280
|
+
return `${fieldRef} was not one of the allowed values — see the action's schema above.`;
|
|
281
|
+
default:
|
|
282
|
+
return `${fieldRef}: ${issue.message ?? issue.code ?? 'invalid'}.`;
|
|
283
|
+
}
|
|
284
|
+
}).join(' ');
|
|
285
|
+
return ` - "${e.name}" was rejected: ${details}`;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Gather attachments from the most recent turn's tool results. Only the
|
|
289
|
+
* "prior turn" contributes. We deliver only the latest attachment once,
|
|
290
|
+
* on the turn after it was produced; screenshot-heavy tool batches should
|
|
291
|
+
* carry the final visual state without bloating the next model request.
|
|
292
|
+
*/
|
|
293
|
+
function collectPriorToolAttachments(state) {
|
|
294
|
+
if (state.records.length === 0)
|
|
295
|
+
return [];
|
|
296
|
+
const prior = state.records[state.records.length - 1];
|
|
297
|
+
const attachments = [];
|
|
298
|
+
if (prior.toolResult?.attachments && prior.toolResult.attachments.length > 0) {
|
|
299
|
+
attachments.push(...prior.toolResult.attachments);
|
|
300
|
+
}
|
|
301
|
+
if (prior.extraActionResults) {
|
|
302
|
+
for (const extra of prior.extraActionResults) {
|
|
303
|
+
if (extra.result.attachments && extra.result.attachments.length > 0) {
|
|
304
|
+
attachments.push(...extra.result.attachments);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
const latest = attachments.at(-1);
|
|
309
|
+
return latest ? [latest] : [];
|
|
310
|
+
}
|
|
311
|
+
function validateHooks(hooks) {
|
|
312
|
+
if (typeof hooks.initialMessage !== 'function') {
|
|
313
|
+
throw new Error('runAutonomousLoop: hooks.initialMessage must be a function');
|
|
314
|
+
}
|
|
315
|
+
if (typeof hooks.formatToolResult !== 'function') {
|
|
316
|
+
throw new Error('runAutonomousLoop: hooks.formatToolResult must be a function');
|
|
317
|
+
}
|
|
318
|
+
if (typeof hooks.executeAction !== 'function') {
|
|
319
|
+
throw new Error('runAutonomousLoop: hooks.executeAction must be a function');
|
|
320
|
+
}
|
|
321
|
+
if (hooks.chatOptions) {
|
|
322
|
+
if (typeof hooks.chatOptions === 'function')
|
|
323
|
+
return;
|
|
324
|
+
const options = hooks.chatOptions;
|
|
325
|
+
if ('message' in options || 'history' in options) {
|
|
326
|
+
throw new Error('runAutonomousLoop: hooks.chatOptions may not include `message` or `history` — those are primitive-owned.');
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
async function resolveLoopChatOptions(chatOptions, ctx, state) {
|
|
331
|
+
const resolved = typeof chatOptions === 'function'
|
|
332
|
+
? await chatOptions(ctx, state)
|
|
333
|
+
: (chatOptions ?? {});
|
|
334
|
+
if ('message' in resolved || 'history' in resolved) {
|
|
335
|
+
throw new Error('runAutonomousLoop: hooks.chatOptions may not include `message` or `history` — those are primitive-owned.');
|
|
336
|
+
}
|
|
337
|
+
return resolved;
|
|
338
|
+
}
|
|
339
|
+
function buildTurnMessage(state, hooks, ctx) {
|
|
340
|
+
// Turn 1 — initial message.
|
|
341
|
+
if (state.records.length === 0) {
|
|
342
|
+
return hooks.initialMessage(ctx);
|
|
343
|
+
}
|
|
344
|
+
const prior = state.records[state.records.length - 1];
|
|
345
|
+
// Provider error: preserve the active work and add neutral continuity.
|
|
346
|
+
// Timeouts/load are infrastructure facts, not evidence that the agent chose
|
|
347
|
+
// a bad strategy or needs to make the artifact smaller.
|
|
348
|
+
if (prior.providerError) {
|
|
349
|
+
return (`${prior.message}\n\n`
|
|
350
|
+
+ `The LLM request timed out or the provider was under heavy load. No actions ran.\n`
|
|
351
|
+
+ `${prior.providerError}\n\n`
|
|
352
|
+
+ `Please try again from the same active work.`);
|
|
353
|
+
}
|
|
354
|
+
// Validation errors: the model emitted actions that the contract rejected.
|
|
355
|
+
// Translate each rejection into plain language so the model can see WHY
|
|
356
|
+
// the call was invalid and what the field is. Echoing the raw Zod JSON
|
|
357
|
+
// is not enough — we saw the same model emit the same empty-oldText
|
|
358
|
+
// editFile four turns in a row, because the tail "pick closest available
|
|
359
|
+
// shape" read as guess-advice, not as "your oldText field was empty."
|
|
360
|
+
if (prior.validationErrors && prior.validationErrors.length > 0 && !prior.action) {
|
|
361
|
+
const lines = prior.validationErrors.map((e) => formatValidationError(e)).join('\n');
|
|
362
|
+
return `Previous action(s) rejected by the tool contract:\n${lines}`;
|
|
363
|
+
}
|
|
364
|
+
// Normal tool result — single or multi-action. For multi-action turns,
|
|
365
|
+
// format each result and join; the model then sees all its tool calls'
|
|
366
|
+
// outputs in emission order.
|
|
367
|
+
if (prior.action && prior.toolResult) {
|
|
368
|
+
const head = hooks.formatToolResult(prior.action, prior.toolResult, ctx);
|
|
369
|
+
if (!prior.extraActionResults || prior.extraActionResults.length === 0) {
|
|
370
|
+
return head;
|
|
371
|
+
}
|
|
372
|
+
const tail = prior.extraActionResults
|
|
373
|
+
.map(({ action, result }) => hooks.formatToolResult(action, result, ctx))
|
|
374
|
+
.join('\n\n');
|
|
375
|
+
return `${head}\n\n${tail}`;
|
|
376
|
+
}
|
|
377
|
+
// Fallback — no action, no error, no tool result (shouldn't happen but keep
|
|
378
|
+
// a factual nudge).
|
|
379
|
+
return '(your previous turn produced no action — continue with a concrete next step or call the completion action if you are done)';
|
|
380
|
+
}
|
|
381
|
+
async function callPersonaWithRetry(args) {
|
|
382
|
+
let lastError = null;
|
|
383
|
+
for (let attempt = 1; attempt <= args.modelRetries + 1; attempt += 1) {
|
|
384
|
+
try {
|
|
385
|
+
if (args.onBeforeChat) {
|
|
386
|
+
const { request } = buildChatLLMRequest(args.persona.config, args.chatInput);
|
|
387
|
+
await args.onBeforeChat({
|
|
388
|
+
request: {
|
|
389
|
+
systemPrompt: request.systemPrompt,
|
|
390
|
+
message: request.message,
|
|
391
|
+
history: request.history,
|
|
392
|
+
attachments: request.attachments,
|
|
393
|
+
responseSchema: request.responseSchema,
|
|
394
|
+
promptMode: request.promptMode,
|
|
395
|
+
},
|
|
396
|
+
turn: args.turn,
|
|
397
|
+
attempt,
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
return await withTimeout(args.persona.chat(args.chatInput), args.turnTimeoutMs, `Autonomous loop turn ${args.turn} timed out after ${args.turnTimeoutMs}ms`);
|
|
401
|
+
}
|
|
402
|
+
catch (error) {
|
|
403
|
+
lastError = error;
|
|
404
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
405
|
+
if (attempt > args.modelRetries || !shouldRetry(message)) {
|
|
406
|
+
throw error;
|
|
407
|
+
}
|
|
408
|
+
await sleep(args.retryDelayMs * attempt);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
throw lastError ?? new Error(`Autonomous loop turn ${args.turn} failed`);
|
|
412
|
+
}
|
|
413
|
+
function withTimeout(promise, ms, message) {
|
|
414
|
+
return new Promise((resolve, reject) => {
|
|
415
|
+
const timer = setTimeout(() => reject(new Error(message)), ms);
|
|
416
|
+
promise.then(value => {
|
|
417
|
+
clearTimeout(timer);
|
|
418
|
+
resolve(value);
|
|
419
|
+
}, error => {
|
|
420
|
+
clearTimeout(timer);
|
|
421
|
+
reject(error);
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
function shouldRetry(message) {
|
|
426
|
+
return /timed out|timeout|ECONNRESET|ETIMEDOUT|socket hang up|fetch failed|503|504|429/i.test(message);
|
|
427
|
+
}
|
|
428
|
+
function isInfrastructureLoadError(message) {
|
|
429
|
+
return /timed out|timeout|ECONNRESET|ETIMEDOUT|socket hang up|fetch failed|503|504|429|overloaded|unavailable|resource exhausted/i.test(message);
|
|
430
|
+
}
|
|
431
|
+
function sleep(ms) {
|
|
432
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
433
|
+
}
|
|
434
|
+
function normalizeOutcome(value) {
|
|
435
|
+
if (value === 'success' || value === 'blocked' || value === 'failed')
|
|
436
|
+
return value;
|
|
437
|
+
return 'blocked';
|
|
438
|
+
}
|
|
439
|
+
function finishFromCompletionAction(action) {
|
|
440
|
+
const params = action.params;
|
|
441
|
+
return {
|
|
442
|
+
outcome: normalizeCompletionState(params.outcome ?? params.state),
|
|
443
|
+
summary: params.summary ?? params.message ?? `Completion action ${action.name} called.`,
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
function normalizeCompletionState(value) {
|
|
447
|
+
if (value === 'ready')
|
|
448
|
+
return 'success';
|
|
449
|
+
return normalizeOutcome(value);
|
|
450
|
+
}
|
|
451
|
+
//# sourceMappingURL=autonomous-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autonomous-loop.js","sourceRoot":"","sources":["../../src/managed/autonomous-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { StorageAdapter } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve or create a conversation.
|
|
4
|
+
* Returns the conversation ID (existing or newly created).
|
|
5
|
+
*/
|
|
6
|
+
export declare function resolveConversation(adapter: StorageAdapter, conversationId?: string | null, trigger?: string, metadata?: Record<string, unknown>): Promise<string>;
|
|
7
|
+
/**
|
|
8
|
+
* Load conversation history for LLM input.
|
|
9
|
+
* Returns non-note messages in chronological order, up to limit.
|
|
10
|
+
*/
|
|
11
|
+
export declare function loadHistory(adapter: StorageAdapter, conversationId: string, limit: number): Promise<Array<{
|
|
12
|
+
role: 'user' | 'assistant';
|
|
13
|
+
content: string;
|
|
14
|
+
}>>;
|
|
15
|
+
export declare function loadAttachmentCarryForwardSections(adapter: StorageAdapter, conversationId: string, limit: number): Promise<string[]>;
|
|
16
|
+
/**
|
|
17
|
+
* End a conversation by setting its endedAt timestamp.
|
|
18
|
+
*/
|
|
19
|
+
export declare function endConversation(adapter: StorageAdapter, conversationId: string): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=conversation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/managed/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAyB,MAAM,aAAa,CAAA;AAMxE;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,cAAc,EACvB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,EAC9B,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC,CASjB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,cAAc,EACvB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAKjE;AAED,wBAAsB,kCAAkC,CACtD,OAAO,EAAE,cAAc,EACvB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAOnB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { buildAttachmentCarryForwardSection, collectAttachmentCarryForwardNotes, } from '../core/attachment-notes.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve or create a conversation.
|
|
4
|
+
* Returns the conversation ID (existing or newly created).
|
|
5
|
+
*/
|
|
6
|
+
export async function resolveConversation(adapter, conversationId, trigger, metadata) {
|
|
7
|
+
if (conversationId)
|
|
8
|
+
return conversationId;
|
|
9
|
+
// Try to find an active conversation
|
|
10
|
+
const active = await adapter.getActiveConversation();
|
|
11
|
+
if (active)
|
|
12
|
+
return active.id;
|
|
13
|
+
// Create a new one
|
|
14
|
+
return adapter.createConversation(trigger ?? 'manual', metadata);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Load conversation history for LLM input.
|
|
18
|
+
* Returns non-note messages in chronological order, up to limit.
|
|
19
|
+
*/
|
|
20
|
+
export async function loadHistory(adapter, conversationId, limit) {
|
|
21
|
+
const messages = await adapter.getMessages(conversationId, limit);
|
|
22
|
+
return messages
|
|
23
|
+
.filter(m => !m.isNote && (m.role === 'user' || m.role === 'assistant'))
|
|
24
|
+
.map(m => ({ role: m.role, content: m.content }));
|
|
25
|
+
}
|
|
26
|
+
export async function loadAttachmentCarryForwardSections(adapter, conversationId, limit) {
|
|
27
|
+
const messages = await adapter.getMessages(conversationId, limit);
|
|
28
|
+
const notes = collectAttachmentCarryForwardNotes(messages);
|
|
29
|
+
if (notes.length === 0)
|
|
30
|
+
return [];
|
|
31
|
+
const section = buildAttachmentCarryForwardSection(notes);
|
|
32
|
+
return section ? [section] : [];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* End a conversation by setting its endedAt timestamp.
|
|
36
|
+
*/
|
|
37
|
+
export async function endConversation(adapter, conversationId) {
|
|
38
|
+
await adapter.endConversation(conversationId);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=conversation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../src/managed/conversation.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kCAAkC,EAClC,kCAAkC,GACnC,MAAM,6BAA6B,CAAA;AAEpC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAuB,EACvB,cAA8B,EAC9B,OAAgB,EAChB,QAAkC;IAElC,IAAI,cAAc;QAAE,OAAO,cAAc,CAAA;IAEzC,qCAAqC;IACrC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,qBAAqB,EAAE,CAAA;IACpD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,EAAE,CAAA;IAE5B,mBAAmB;IACnB,OAAO,OAAO,CAAC,kBAAkB,CAAC,OAAO,IAAI,QAAQ,EAAE,QAAQ,CAAC,CAAA;AAClE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAuB,EACvB,cAAsB,EACtB,KAAa;IAEb,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;IACjE,OAAO,QAAQ;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;SACvE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAA4B,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;AAC7E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,OAAuB,EACvB,cAAsB,EACtB,KAAa;IAEb,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;IACjE,MAAM,KAAK,GAAG,kCAAkC,CAAC,QAAQ,CAAC,CAAA;IAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAEjC,MAAM,OAAO,GAAG,kCAAkC,CAAC,KAAK,CAAC,CAAA;IACzD,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAuB,EACvB,cAAsB;IAEtB,MAAM,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC,CAAA;AAC/C,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { KnowledgeAdapter } from '../types.js';
|
|
2
|
+
export interface MarkdownKnowledgeAdapterOptions {
|
|
3
|
+
rootDir: string;
|
|
4
|
+
includeDrafts?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function createMarkdownKnowledgeAdapter(options: MarkdownKnowledgeAdapterOptions): KnowledgeAdapter;
|
|
7
|
+
//# sourceMappingURL=knowledge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../src/managed/knowledge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAA2C,MAAM,aAAa,CAAA;AAE5F,MAAM,WAAW,+BAA+B;IAC9C,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAUD,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,+BAA+B,GACvC,gBAAgB,CAiClB"}
|