@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,260 @@
|
|
|
1
|
+
import { allowedOperations } from '../core/entity-helpers.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validate raw CRUD actions against registered entity schemas.
|
|
4
|
+
* Returns valid + invalid lists.
|
|
5
|
+
*/
|
|
6
|
+
export function validateCrudActions(raw, entities) {
|
|
7
|
+
const valid = [];
|
|
8
|
+
const invalid = [];
|
|
9
|
+
for (const rawAction of raw) {
|
|
10
|
+
// Parse stringified params (Gemini returns JSON string since the schema uses STRING type)
|
|
11
|
+
let action = rawAction;
|
|
12
|
+
if (typeof rawAction.params === 'string') {
|
|
13
|
+
try {
|
|
14
|
+
action = { ...rawAction, params: JSON.parse(rawAction.params) };
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
invalid.push({ action: rawAction, error: `Invalid JSON in params: ${String(rawAction.params).slice(0, 100)}` });
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// Check entity exists
|
|
22
|
+
const entityConfig = entities[action.entity];
|
|
23
|
+
if (!entityConfig) {
|
|
24
|
+
invalid.push({ action, error: `Unknown entity "${action.entity}"` });
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
// Check the host app implements this operation for this entity
|
|
28
|
+
const allowed = allowedOperations(entityConfig);
|
|
29
|
+
if (!allowed.includes(action.operation)) {
|
|
30
|
+
invalid.push({ action, error: `Entity "${action.entity}" does not support ${action.operation} — supported: ${allowed.join(', ')}` });
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
// Check id for update/delete
|
|
34
|
+
if ((action.operation === 'update' || action.operation === 'delete') && !action.id) {
|
|
35
|
+
invalid.push({ action, error: `${action.operation} requires an id` });
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
// Validate params for create (full schema) and update (partial)
|
|
39
|
+
if (action.operation === 'create') {
|
|
40
|
+
const result = entityConfig.schema.safeParse(action.params ?? {});
|
|
41
|
+
if (!result.success) {
|
|
42
|
+
invalid.push({ action, error: result.error.message });
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
// Ensure every create has an ID (AI-generated temp or SDK fallback)
|
|
46
|
+
const id = action.id || crypto.randomUUID();
|
|
47
|
+
valid.push({ ...action, id, params: result.data });
|
|
48
|
+
}
|
|
49
|
+
else if (action.operation === 'update') {
|
|
50
|
+
// Partial validation — use .partial() if available
|
|
51
|
+
const schema = entityConfig.schema;
|
|
52
|
+
const partial = 'partial' in schema && typeof schema.partial === 'function'
|
|
53
|
+
? schema.partial()
|
|
54
|
+
: schema;
|
|
55
|
+
const result = partial.safeParse(action.params ?? {});
|
|
56
|
+
if (!result.success) {
|
|
57
|
+
invalid.push({ action, error: result.error.message });
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
valid.push({ ...action, params: result.data });
|
|
61
|
+
}
|
|
62
|
+
else if (action.operation === 'delete') {
|
|
63
|
+
// delete — no params needed
|
|
64
|
+
valid.push(action);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// Unknown operation — don't silently treat as delete.
|
|
68
|
+
invalid.push({
|
|
69
|
+
action,
|
|
70
|
+
error: `Unknown CRUD operation "${String(action.operation)}" — expected "create", "update", or "delete"`,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return { valid, invalid };
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Generate an action annotation string for a CRUD action.
|
|
78
|
+
* Uses the entity's displayField to create human-readable annotations like:
|
|
79
|
+
* created thread: "Roadmap prioritization"
|
|
80
|
+
*/
|
|
81
|
+
export function crudActionToAnnotation(action, entities) {
|
|
82
|
+
const config = entities[action.entity];
|
|
83
|
+
const label = config?.label ?? capitalize(action.entity);
|
|
84
|
+
const displayField = config?.displayField;
|
|
85
|
+
const displayValue = displayField && action.params?.[displayField]
|
|
86
|
+
? String(action.params[displayField])
|
|
87
|
+
: null;
|
|
88
|
+
const title = displayValue ? `: "${displayValue}"` : '';
|
|
89
|
+
switch (action.operation) {
|
|
90
|
+
case 'create': return `created ${label.toLowerCase()}${title}`;
|
|
91
|
+
case 'update': return `updated ${label.toLowerCase()} ${action.id ?? ''}${title}`.trim();
|
|
92
|
+
case 'delete': return `deleted ${label.toLowerCase()} ${action.id ?? ''}`.trim();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function capitalize(s) {
|
|
96
|
+
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Separate CRUD actions from regular actions in a validated action list.
|
|
100
|
+
* Handles stringified params (Gemini quirk) and legacy top-level crudActions.
|
|
101
|
+
*/
|
|
102
|
+
export function separateCrudActions(actions, legacyCrud) {
|
|
103
|
+
const crudActions = [];
|
|
104
|
+
const nonCrudActions = [];
|
|
105
|
+
for (const action of actions) {
|
|
106
|
+
if (action.name === 'crud') {
|
|
107
|
+
const p = action.params;
|
|
108
|
+
const innerParams = typeof p.params === 'string' ? p.params : (p.params ? JSON.stringify(p.params) : undefined);
|
|
109
|
+
crudActions.push({
|
|
110
|
+
operation: p.operation,
|
|
111
|
+
entity: p.entity,
|
|
112
|
+
id: p.id,
|
|
113
|
+
params: innerParams,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
nonCrudActions.push(action);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (legacyCrud?.length) {
|
|
121
|
+
crudActions.push(...legacyCrud);
|
|
122
|
+
}
|
|
123
|
+
return { crudActions, nonCrudActions };
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Validate CRUD actions against entity schemas and populate the trace.
|
|
127
|
+
* Returns the valid subset; invalid actions are logged to trace.errors.
|
|
128
|
+
*/
|
|
129
|
+
export function validateAndTraceCrud(crudActions, entities, trace) {
|
|
130
|
+
if (crudActions.length === 0)
|
|
131
|
+
return undefined;
|
|
132
|
+
// If crud actions were emitted but no entities are declared, that's a
|
|
133
|
+
// config bug the AI can't recover from. Surface loudly — don't silently
|
|
134
|
+
// drop the actions (previous behavior was returning undefined, which
|
|
135
|
+
// hid the whole set from the trace).
|
|
136
|
+
if (!entities || Object.keys(entities).length === 0) {
|
|
137
|
+
for (const action of crudActions) {
|
|
138
|
+
const error = `No entities declared in persona config — cannot route ${action.operation} ${action.entity}`;
|
|
139
|
+
trace.crudActions.push({
|
|
140
|
+
operation: action.operation,
|
|
141
|
+
entity: action.entity,
|
|
142
|
+
id: action.id,
|
|
143
|
+
params: (action.params ?? {}),
|
|
144
|
+
status: 'invalid',
|
|
145
|
+
error,
|
|
146
|
+
});
|
|
147
|
+
trace.errors.push(`CRUD validation failed: ${error}`);
|
|
148
|
+
}
|
|
149
|
+
console.warn(`[archetype] ${crudActions.length} CRUD action(s) rejected — no entities declared in persona config`);
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
const validation = validateCrudActions(crudActions, entities);
|
|
153
|
+
for (const valid of validation.valid) {
|
|
154
|
+
trace.crudActions.push({ operation: valid.operation, entity: valid.entity, id: valid.id, params: valid.params ?? {}, status: 'valid' });
|
|
155
|
+
}
|
|
156
|
+
for (const inv of validation.invalid) {
|
|
157
|
+
trace.crudActions.push({ operation: inv.action.operation, entity: inv.action.entity, id: inv.action.id, params: inv.action.params ?? {}, status: 'invalid', error: inv.error });
|
|
158
|
+
trace.errors.push(`CRUD validation failed: ${inv.action.operation} ${inv.action.entity} — ${inv.error}`);
|
|
159
|
+
}
|
|
160
|
+
if (validation.invalid.length > 0) {
|
|
161
|
+
console.warn(`[archetype] ${validation.invalid.length} CRUD action(s) failed validation:`, validation.invalid.map(i => `${i.action.operation} ${i.action.entity}: ${i.error}`).join(' | '));
|
|
162
|
+
}
|
|
163
|
+
return validation.valid.length > 0 ? validation.valid : undefined;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Resolve temp IDs (prefixed with `_`) to real UUIDs.
|
|
167
|
+
* The AI generates `_w1`, `_ex1` etc. as cross-reference handles within a single response.
|
|
168
|
+
* This replaces them with permanent UUIDs before handlers see them.
|
|
169
|
+
*
|
|
170
|
+
* Resolves both `action.id` on creates and any string param values that match a temp ID.
|
|
171
|
+
*/
|
|
172
|
+
export function resolveTempIds(actions) {
|
|
173
|
+
const map = new Map();
|
|
174
|
+
// First pass: generate real IDs for all creates with _ prefix
|
|
175
|
+
for (const action of actions) {
|
|
176
|
+
if (action.operation === 'create' && action.id?.startsWith('_')) {
|
|
177
|
+
map.set(action.id, crypto.randomUUID());
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (map.size === 0)
|
|
181
|
+
return actions;
|
|
182
|
+
// Second pass: resolve all references (action.id + param values)
|
|
183
|
+
return actions.map(action => {
|
|
184
|
+
const id = action.id && map.has(action.id) ? map.get(action.id) : action.id;
|
|
185
|
+
const params = action.params ? resolveParamRefs(action.params, map) : action.params;
|
|
186
|
+
return { ...action, id, params };
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
function resolveParamRefs(params, map) {
|
|
190
|
+
const resolved = {};
|
|
191
|
+
for (const [key, value] of Object.entries(params)) {
|
|
192
|
+
if (typeof value === 'string' && map.has(value)) {
|
|
193
|
+
resolved[key] = map.get(value);
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
resolved[key] = value;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return resolved;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Execute validated CRUD actions through entity-keyed handlers.
|
|
203
|
+
* This is the commit gate — the app calls this when ready to persist.
|
|
204
|
+
*
|
|
205
|
+
* Actions should be pre-validated (validateCrudActions) and temp-ID-resolved
|
|
206
|
+
* (resolveTempIds) before calling commitCrud.
|
|
207
|
+
*
|
|
208
|
+
* If a trace is provided, populates trace.domainActions with timing and status.
|
|
209
|
+
*/
|
|
210
|
+
export async function commitCrud(actions, handlers, options) {
|
|
211
|
+
const results = [];
|
|
212
|
+
for (const action of actions) {
|
|
213
|
+
const start = Date.now();
|
|
214
|
+
const label = `${action.operation}_${action.entity}`;
|
|
215
|
+
const entityHandler = handlers[action.entity];
|
|
216
|
+
if (!entityHandler) {
|
|
217
|
+
const result = { success: false, error: `No handler for entity: ${action.entity}` };
|
|
218
|
+
results.push(result);
|
|
219
|
+
if (options?.trace) {
|
|
220
|
+
options.trace.domainActions.push({ name: label, params: action.params ?? {}, status: 'failed', error: result.error, durationMs: Date.now() - start });
|
|
221
|
+
}
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
const opHandler = entityHandler[action.operation];
|
|
225
|
+
if (!opHandler) {
|
|
226
|
+
const result = { success: false, error: `No ${action.operation} handler for entity: ${action.entity}` };
|
|
227
|
+
results.push(result);
|
|
228
|
+
if (options?.trace) {
|
|
229
|
+
options.trace.domainActions.push({ name: label, params: action.params ?? {}, status: 'failed', error: result.error, durationMs: Date.now() - start });
|
|
230
|
+
}
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
try {
|
|
234
|
+
let result;
|
|
235
|
+
if (action.operation === 'delete') {
|
|
236
|
+
result = await opHandler(action.id);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
result = await opHandler(action.id, action.params ?? {});
|
|
240
|
+
}
|
|
241
|
+
results.push(result);
|
|
242
|
+
if (options?.trace) {
|
|
243
|
+
options.trace.domainActions.push({
|
|
244
|
+
name: label, params: action.params ?? {},
|
|
245
|
+
status: result.success ? 'executed' : 'failed',
|
|
246
|
+
error: result.error, durationMs: Date.now() - start,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
252
|
+
results.push({ success: false, error });
|
|
253
|
+
if (options?.trace) {
|
|
254
|
+
options.trace.domainActions.push({ name: label, params: action.params ?? {}, status: 'failed', error, durationMs: Date.now() - start });
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return results;
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=crud.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crud.js","sourceRoot":"","sources":["../../src/engine/crud.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { ParsedAction, ActionDefinition, ApprovalConfig } from '../types.js';
|
|
2
|
+
export interface SideEffectHandlerResult {
|
|
3
|
+
success: boolean;
|
|
4
|
+
/** Did the handler actually mutate state? Defaults to `success` when omitted. */
|
|
5
|
+
changed?: boolean;
|
|
6
|
+
error?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface SideEffectHandler {
|
|
9
|
+
(params: Record<string, unknown>): Promise<SideEffectHandlerResult>;
|
|
10
|
+
}
|
|
11
|
+
export interface SideEffectResult {
|
|
12
|
+
action: ParsedAction;
|
|
13
|
+
status: 'executed' | 'proposed' | 'failed' | 'no_op';
|
|
14
|
+
success: boolean;
|
|
15
|
+
/** Whether the handler actually mutated state (only set when status is 'executed' or 'no_op'). */
|
|
16
|
+
changed?: boolean;
|
|
17
|
+
error?: string;
|
|
18
|
+
annotation?: string;
|
|
19
|
+
}
|
|
20
|
+
/** A proposed action that passed validation but wasn't executed (propose mode). */
|
|
21
|
+
export interface ProposedAction {
|
|
22
|
+
action: ParsedAction;
|
|
23
|
+
validatedParams: Record<string, unknown>;
|
|
24
|
+
annotation: string;
|
|
25
|
+
}
|
|
26
|
+
export interface ExecuteSideEffectsOptions {
|
|
27
|
+
/** Approval configuration. Defaults to yolo (execute immediately). */
|
|
28
|
+
approval?: ApprovalConfig;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Execute side effects for parsed actions.
|
|
32
|
+
* Validates action names, calls handlers, builds annotations.
|
|
33
|
+
*
|
|
34
|
+
* In 'yolo' mode (default): validates + executes immediately.
|
|
35
|
+
* In 'propose' mode: validates + returns proposals without executing.
|
|
36
|
+
*
|
|
37
|
+
* ActionConfidence interacts with mode:
|
|
38
|
+
* - 'low' always auto-executes (even in propose mode)
|
|
39
|
+
* - 'medium' follows the mode setting
|
|
40
|
+
* - 'high' always proposes (even in yolo mode)
|
|
41
|
+
*/
|
|
42
|
+
export declare function executeSideEffects(actions: ParsedAction[], handlers: Record<string, SideEffectHandler>, actionDefs: Record<string, ActionDefinition>, options?: ExecuteSideEffectsOptions): Promise<SideEffectResult[]>;
|
|
43
|
+
/** Extended result type when propose mode generates proposals. */
|
|
44
|
+
export interface SideEffectResultWithProposals extends Array<SideEffectResult> {
|
|
45
|
+
__proposed?: ProposedAction[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Extract proposed actions from a side-effects result.
|
|
49
|
+
*/
|
|
50
|
+
export declare function getProposedActions(results: SideEffectResult[]): ProposedAction[];
|
|
51
|
+
/**
|
|
52
|
+
* Return annotations for actions that actually executed successfully.
|
|
53
|
+
* Proposed or failed actions are intentionally excluded from stored history.
|
|
54
|
+
*/
|
|
55
|
+
export declare function getExecutedAnnotations(results: SideEffectResult[]): string[];
|
|
56
|
+
/**
|
|
57
|
+
* Build the assistant message that should be stored in history.
|
|
58
|
+
* Uses the shared continuity builder so future turns see factual outcomes,
|
|
59
|
+
* while raw action annotations remain debug/display-only and are stripped
|
|
60
|
+
* before the model sees history.
|
|
61
|
+
*/
|
|
62
|
+
export declare function buildAssistantHistoryMessage(message: string, results: SideEffectResult[]): string;
|
|
63
|
+
/**
|
|
64
|
+
* Execute previously proposed actions after user confirmation.
|
|
65
|
+
* Takes the ProposedAction[] from `getProposedActions()` and runs the handlers.
|
|
66
|
+
*/
|
|
67
|
+
export declare function confirmActions(proposed: ProposedAction[], handlers: Record<string, SideEffectHandler>): Promise<SideEffectResult[]>;
|
|
68
|
+
export type SideEffectOutcomeStatus = 'none' | 'succeeded' | 'partial' | 'failed' | 'no_op';
|
|
69
|
+
export interface SideEffectOutcome {
|
|
70
|
+
/** Aggregate status across all executed actions */
|
|
71
|
+
status: SideEffectOutcomeStatus;
|
|
72
|
+
/** Human-readable summary of what happened */
|
|
73
|
+
summary: string;
|
|
74
|
+
/** Action names that were attempted */
|
|
75
|
+
attemptedActions: string[];
|
|
76
|
+
/** Action names that actually mutated state */
|
|
77
|
+
appliedActions: string[];
|
|
78
|
+
/** Error messages from failed or partial actions */
|
|
79
|
+
errors: string[];
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Summarize side-effect execution results into an aggregate outcome.
|
|
83
|
+
* Useful for communicating "what actually happened" to the user.
|
|
84
|
+
*
|
|
85
|
+
* Status logic:
|
|
86
|
+
* - 'none': no actions attempted (empty input or all proposed)
|
|
87
|
+
* - 'succeeded': all executed actions changed state
|
|
88
|
+
* - 'partial': some changed, some failed or didn't change
|
|
89
|
+
* - 'failed': nothing changed and there were errors
|
|
90
|
+
* - 'no_op': handlers ran successfully but nothing changed
|
|
91
|
+
*/
|
|
92
|
+
export declare function summarizeSideEffects(results: SideEffectResult[]): SideEffectOutcome;
|
|
93
|
+
//# sourceMappingURL=side-effects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"side-effects.d.ts","sourceRoot":"","sources":["../../src/engine/side-effects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAIjF,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAA;IAChB,iFAAiF;IACjF,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;CACpE;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,CAAA;IACpB,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAA;IACpD,OAAO,EAAE,OAAO,CAAA;IAChB,kGAAkG;IAClG,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,mFAAmF;AACnF,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,YAAY,CAAA;IACpB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACxC,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,sEAAsE;IACtE,QAAQ,CAAC,EAAE,cAAc,CAAA;CAC1B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,YAAY,EAAE,EACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAC3C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAC5C,OAAO,CAAC,EAAE,yBAAyB,GAClC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAuG7B;AAED,kEAAkE;AAClE,MAAM,WAAW,6BAA8B,SAAQ,KAAK,CAAC,gBAAgB,CAAC;IAC5E,UAAU,CAAC,EAAE,cAAc,EAAE,CAAA;CAC9B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,cAAc,EAAE,CAEhF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,EAAE,CAI5E;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,gBAAgB,EAAE,GAC1B,MAAM,CAaR;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,cAAc,EAAE,EAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAC1C,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAmD7B;AAkBD,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAA;AAE3F,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,MAAM,EAAE,uBAAuB,CAAA;IAC/B,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAA;IACf,uCAAuC;IACvC,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,+CAA+C;IAC/C,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,oDAAoD;IACpD,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,iBAAiB,CAyCnF"}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { buildAnnotations } from '../core/actions.js';
|
|
2
|
+
import { buildAssistantContinuityMessage } from './continuity.js';
|
|
3
|
+
/**
|
|
4
|
+
* Execute side effects for parsed actions.
|
|
5
|
+
* Validates action names, calls handlers, builds annotations.
|
|
6
|
+
*
|
|
7
|
+
* In 'yolo' mode (default): validates + executes immediately.
|
|
8
|
+
* In 'propose' mode: validates + returns proposals without executing.
|
|
9
|
+
*
|
|
10
|
+
* ActionConfidence interacts with mode:
|
|
11
|
+
* - 'low' always auto-executes (even in propose mode)
|
|
12
|
+
* - 'medium' follows the mode setting
|
|
13
|
+
* - 'high' always proposes (even in yolo mode)
|
|
14
|
+
*/
|
|
15
|
+
export async function executeSideEffects(actions, handlers, actionDefs, options) {
|
|
16
|
+
const mode = options?.approval?.mode ?? 'yolo';
|
|
17
|
+
const results = [];
|
|
18
|
+
const proposed = [];
|
|
19
|
+
for (const action of actions) {
|
|
20
|
+
// Validate action exists
|
|
21
|
+
if (!(action.name in actionDefs)) {
|
|
22
|
+
results.push({
|
|
23
|
+
action,
|
|
24
|
+
status: 'failed',
|
|
25
|
+
success: false,
|
|
26
|
+
error: `Unknown action: ${action.name}`,
|
|
27
|
+
});
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
// Validate handler exists
|
|
31
|
+
const handler = handlers[action.name];
|
|
32
|
+
if (!handler) {
|
|
33
|
+
results.push({
|
|
34
|
+
action,
|
|
35
|
+
status: 'failed',
|
|
36
|
+
success: false,
|
|
37
|
+
error: `No handler registered for action: ${action.name}`,
|
|
38
|
+
});
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
// Validate params against Zod schema
|
|
42
|
+
const schema = actionDefs[action.name].schema;
|
|
43
|
+
const parseResult = schema.safeParse(action.params);
|
|
44
|
+
if (!parseResult.success) {
|
|
45
|
+
results.push({
|
|
46
|
+
action,
|
|
47
|
+
status: 'failed',
|
|
48
|
+
success: false,
|
|
49
|
+
error: `Invalid params for ${action.name}: ${parseResult.error.message}`,
|
|
50
|
+
});
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
// Determine whether to execute or propose
|
|
54
|
+
const shouldExecute = shouldAutoExecute(action.confidence, mode);
|
|
55
|
+
if (shouldExecute) {
|
|
56
|
+
// Execute handler immediately
|
|
57
|
+
try {
|
|
58
|
+
const result = await handler(parseResult.data);
|
|
59
|
+
const changed = result.changed ?? result.success;
|
|
60
|
+
const annotations = buildAnnotations([{ name: action.name, params: action.params }]);
|
|
61
|
+
if (result.success && !changed) {
|
|
62
|
+
results.push({
|
|
63
|
+
action,
|
|
64
|
+
status: 'no_op',
|
|
65
|
+
success: true,
|
|
66
|
+
changed: false,
|
|
67
|
+
error: result.error,
|
|
68
|
+
annotation: annotations[0],
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
results.push({
|
|
73
|
+
action,
|
|
74
|
+
status: result.success ? 'executed' : 'failed',
|
|
75
|
+
success: result.success,
|
|
76
|
+
changed,
|
|
77
|
+
error: result.error,
|
|
78
|
+
annotation: annotations[0],
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
results.push({
|
|
84
|
+
action,
|
|
85
|
+
status: 'failed',
|
|
86
|
+
success: false,
|
|
87
|
+
changed: false,
|
|
88
|
+
error: `Handler error for ${action.name}: ${err instanceof Error ? err.message : String(err)}`,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// Propose without executing
|
|
94
|
+
const annotations = buildAnnotations([{ name: action.name, params: action.params }]);
|
|
95
|
+
proposed.push({
|
|
96
|
+
action,
|
|
97
|
+
validatedParams: parseResult.data,
|
|
98
|
+
annotation: annotations[0],
|
|
99
|
+
});
|
|
100
|
+
results.push({
|
|
101
|
+
action,
|
|
102
|
+
status: 'proposed',
|
|
103
|
+
success: true, // validation passed, just not executed yet
|
|
104
|
+
annotation: annotations[0],
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Attach proposed actions to the result for the app to render
|
|
109
|
+
if (proposed.length > 0) {
|
|
110
|
+
;
|
|
111
|
+
results.__proposed = proposed;
|
|
112
|
+
}
|
|
113
|
+
return results;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Extract proposed actions from a side-effects result.
|
|
117
|
+
*/
|
|
118
|
+
export function getProposedActions(results) {
|
|
119
|
+
return results.__proposed ?? [];
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Return annotations for actions that actually executed successfully.
|
|
123
|
+
* Proposed or failed actions are intentionally excluded from stored history.
|
|
124
|
+
*/
|
|
125
|
+
export function getExecutedAnnotations(results) {
|
|
126
|
+
return results
|
|
127
|
+
.filter(result => result.status === 'executed' && result.success && result.annotation)
|
|
128
|
+
.map(result => result.annotation);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Build the assistant message that should be stored in history.
|
|
132
|
+
* Uses the shared continuity builder so future turns see factual outcomes,
|
|
133
|
+
* while raw action annotations remain debug/display-only and are stripped
|
|
134
|
+
* before the model sees history.
|
|
135
|
+
*/
|
|
136
|
+
export function buildAssistantHistoryMessage(message, results) {
|
|
137
|
+
const annotations = getExecutedAnnotations(results);
|
|
138
|
+
return buildAssistantContinuityMessage({
|
|
139
|
+
message,
|
|
140
|
+
actionAnnotations: annotations,
|
|
141
|
+
actionOutcomes: results.map(result => ({
|
|
142
|
+
action: result.action,
|
|
143
|
+
status: result.status,
|
|
144
|
+
success: result.success,
|
|
145
|
+
error: result.error,
|
|
146
|
+
annotation: result.annotation,
|
|
147
|
+
})),
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Execute previously proposed actions after user confirmation.
|
|
152
|
+
* Takes the ProposedAction[] from `getProposedActions()` and runs the handlers.
|
|
153
|
+
*/
|
|
154
|
+
export async function confirmActions(proposed, handlers) {
|
|
155
|
+
const results = [];
|
|
156
|
+
for (const { action, validatedParams } of proposed) {
|
|
157
|
+
const handler = handlers[action.name];
|
|
158
|
+
if (!handler) {
|
|
159
|
+
results.push({
|
|
160
|
+
action,
|
|
161
|
+
status: 'failed',
|
|
162
|
+
success: false,
|
|
163
|
+
error: `No handler registered for action: ${action.name}`,
|
|
164
|
+
});
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
try {
|
|
168
|
+
const result = await handler(validatedParams);
|
|
169
|
+
const changed = result.changed ?? result.success;
|
|
170
|
+
const annotations = buildAnnotations([{ name: action.name, params: action.params }]);
|
|
171
|
+
if (result.success && !changed) {
|
|
172
|
+
results.push({
|
|
173
|
+
action,
|
|
174
|
+
status: 'no_op',
|
|
175
|
+
success: true,
|
|
176
|
+
changed: false,
|
|
177
|
+
error: result.error,
|
|
178
|
+
annotation: annotations[0],
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
results.push({
|
|
183
|
+
action,
|
|
184
|
+
status: result.success ? 'executed' : 'failed',
|
|
185
|
+
success: result.success,
|
|
186
|
+
changed,
|
|
187
|
+
error: result.error,
|
|
188
|
+
annotation: annotations[0],
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
results.push({
|
|
194
|
+
action,
|
|
195
|
+
status: 'failed',
|
|
196
|
+
success: false,
|
|
197
|
+
changed: false,
|
|
198
|
+
error: `Handler error for ${action.name}: ${err instanceof Error ? err.message : String(err)}`,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return results;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Determine if an action should auto-execute based on confidence + approval mode.
|
|
206
|
+
*
|
|
207
|
+
* - 'low' always executes (memory saves, logging)
|
|
208
|
+
* - 'medium' follows mode ('yolo' = execute, 'propose' = propose)
|
|
209
|
+
* - 'high' always proposes (destructive operations)
|
|
210
|
+
*/
|
|
211
|
+
function shouldAutoExecute(confidence, mode) {
|
|
212
|
+
if (confidence === 'low')
|
|
213
|
+
return true;
|
|
214
|
+
if (confidence === 'high')
|
|
215
|
+
return false;
|
|
216
|
+
// medium: follows mode
|
|
217
|
+
return mode === 'yolo';
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Summarize side-effect execution results into an aggregate outcome.
|
|
221
|
+
* Useful for communicating "what actually happened" to the user.
|
|
222
|
+
*
|
|
223
|
+
* Status logic:
|
|
224
|
+
* - 'none': no actions attempted (empty input or all proposed)
|
|
225
|
+
* - 'succeeded': all executed actions changed state
|
|
226
|
+
* - 'partial': some changed, some failed or didn't change
|
|
227
|
+
* - 'failed': nothing changed and there were errors
|
|
228
|
+
* - 'no_op': handlers ran successfully but nothing changed
|
|
229
|
+
*/
|
|
230
|
+
export function summarizeSideEffects(results) {
|
|
231
|
+
const executed = results.filter(r => r.status !== 'proposed');
|
|
232
|
+
if (executed.length === 0) {
|
|
233
|
+
return {
|
|
234
|
+
status: 'none',
|
|
235
|
+
summary: 'No actions executed.',
|
|
236
|
+
attemptedActions: [],
|
|
237
|
+
appliedActions: [],
|
|
238
|
+
errors: [],
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
const attemptedActions = executed.map(r => r.action.name);
|
|
242
|
+
const appliedActions = executed.filter(r => r.changed === true).map(r => r.action.name);
|
|
243
|
+
const errors = executed.filter(r => r.error).map(r => r.error);
|
|
244
|
+
const anyChanged = appliedActions.length > 0;
|
|
245
|
+
const anyFailed = executed.some(r => r.status === 'failed');
|
|
246
|
+
const anyNoOp = executed.some(r => r.status === 'no_op');
|
|
247
|
+
let status;
|
|
248
|
+
if (anyChanged && (anyFailed || anyNoOp)) {
|
|
249
|
+
status = 'partial';
|
|
250
|
+
}
|
|
251
|
+
else if (anyChanged) {
|
|
252
|
+
status = 'succeeded';
|
|
253
|
+
}
|
|
254
|
+
else if (anyFailed) {
|
|
255
|
+
status = 'failed';
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
status = 'no_op';
|
|
259
|
+
}
|
|
260
|
+
const summary = status === 'succeeded'
|
|
261
|
+
? `${appliedActions.length} action${appliedActions.length === 1 ? '' : 's'} applied.`
|
|
262
|
+
: status === 'partial'
|
|
263
|
+
? `${appliedActions.length} of ${attemptedActions.length} actions applied.${errors.length > 0 ? ` Errors: ${errors.join('; ')}` : ''}`
|
|
264
|
+
: status === 'failed'
|
|
265
|
+
? `No actions applied.${errors.length > 0 ? ` ${errors.join('; ')}` : ''}`
|
|
266
|
+
: status === 'no_op'
|
|
267
|
+
? 'Actions ran but nothing changed.'
|
|
268
|
+
: 'No actions executed.';
|
|
269
|
+
return { status, summary, attemptedActions, appliedActions, errors };
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=side-effects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"side-effects.js","sourceRoot":"","sources":["../../src/engine/side-effects.ts"],"names":[],"mappings":"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"}
|