@ddse/acm-examples 0.5.0
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 +113 -0
- package/bin/acm-demo.ts +495 -0
- package/data/coaching/agents.json +16 -0
- package/data/coaching/transcripts.json +37 -0
- package/data/documents.json +72 -0
- package/data/entitlement/customers.json +38 -0
- package/data/entitlement/policies.json +38 -0
- package/data/incidents/incidents.json +30 -0
- package/data/incidents/routing_rules.json +36 -0
- package/data/invoices/invoices.json +38 -0
- package/data/invoices/purchase-orders.json +38 -0
- package/data/issues.json +99 -0
- package/data/knowledge/docs/kb-001.md +7 -0
- package/data/knowledge/docs/kb-002.md +7 -0
- package/data/knowledge/docs/kb-003.md +9 -0
- package/data/knowledge/index.json +25 -0
- package/data/orders.json +106 -0
- package/dist/bin/acm-demo.d.ts +3 -0
- package/dist/bin/acm-demo.d.ts.map +1 -0
- package/dist/bin/acm-demo.js +392 -0
- package/dist/bin/acm-demo.js.map +1 -0
- package/dist/src/context/directives.d.ts +3 -0
- package/dist/src/context/directives.d.ts.map +1 -0
- package/dist/src/context/directives.js +325 -0
- package/dist/src/context/directives.js.map +1 -0
- package/dist/src/context/index.d.ts +2 -0
- package/dist/src/context/index.d.ts.map +1 -0
- package/dist/src/context/index.js +2 -0
- package/dist/src/context/index.js.map +1 -0
- package/dist/src/data/coaching.d.ts +19 -0
- package/dist/src/data/coaching.d.ts.map +1 -0
- package/dist/src/data/coaching.js +22 -0
- package/dist/src/data/coaching.js.map +1 -0
- package/dist/src/data/entitlement.d.ts +25 -0
- package/dist/src/data/entitlement.d.ts.map +1 -0
- package/dist/src/data/entitlement.js +26 -0
- package/dist/src/data/entitlement.js.map +1 -0
- package/dist/src/data/incidents.d.ts +23 -0
- package/dist/src/data/incidents.d.ts.map +1 -0
- package/dist/src/data/incidents.js +37 -0
- package/dist/src/data/incidents.js.map +1 -0
- package/dist/src/data/invoices.d.ts +34 -0
- package/dist/src/data/invoices.d.ts.map +1 -0
- package/dist/src/data/invoices.js +49 -0
- package/dist/src/data/invoices.js.map +1 -0
- package/dist/src/data/knowledge.d.ts +11 -0
- package/dist/src/data/knowledge.d.ts.map +1 -0
- package/dist/src/data/knowledge.js +57 -0
- package/dist/src/data/knowledge.js.map +1 -0
- package/dist/src/data/loader.d.ts +4 -0
- package/dist/src/data/loader.d.ts.map +1 -0
- package/dist/src/data/loader.js +69 -0
- package/dist/src/data/loader.js.map +1 -0
- package/dist/src/examples/scenarios.d.ts +23 -0
- package/dist/src/examples/scenarios.d.ts.map +1 -0
- package/dist/src/examples/scenarios.js +609 -0
- package/dist/src/examples/scenarios.js.map +1 -0
- package/dist/src/goals/index.d.ts +8 -0
- package/dist/src/goals/index.d.ts.map +1 -0
- package/dist/src/goals/index.js +12 -0
- package/dist/src/goals/index.js.map +1 -0
- package/dist/src/policy.d.ts +5 -0
- package/dist/src/policy.d.ts.map +1 -0
- package/dist/src/policy.js +24 -0
- package/dist/src/policy.js.map +1 -0
- package/dist/src/registries.d.ts +18 -0
- package/dist/src/registries.d.ts.map +1 -0
- package/dist/src/registries.js +38 -0
- package/dist/src/registries.js.map +1 -0
- package/dist/src/renderer.d.ts +9 -0
- package/dist/src/renderer.d.ts.map +1 -0
- package/dist/src/renderer.js +76 -0
- package/dist/src/renderer.js.map +1 -0
- package/dist/src/search/bm25.d.ts +68 -0
- package/dist/src/search/bm25.d.ts.map +1 -0
- package/dist/src/search/bm25.js +131 -0
- package/dist/src/search/bm25.js.map +1 -0
- package/dist/src/search/index.d.ts +2 -0
- package/dist/src/search/index.d.ts.map +1 -0
- package/dist/src/search/index.js +3 -0
- package/dist/src/search/index.js.map +1 -0
- package/dist/src/tasks/coaching.d.ts +30 -0
- package/dist/src/tasks/coaching.d.ts.map +1 -0
- package/dist/src/tasks/coaching.js +143 -0
- package/dist/src/tasks/coaching.js.map +1 -0
- package/dist/src/tasks/entitlement.d.ts +29 -0
- package/dist/src/tasks/entitlement.d.ts.map +1 -0
- package/dist/src/tasks/entitlement.js +135 -0
- package/dist/src/tasks/entitlement.js.map +1 -0
- package/dist/src/tasks/incidents.d.ts +42 -0
- package/dist/src/tasks/incidents.d.ts.map +1 -0
- package/dist/src/tasks/incidents.js +189 -0
- package/dist/src/tasks/incidents.js.map +1 -0
- package/dist/src/tasks/index.d.ts +7 -0
- package/dist/src/tasks/index.d.ts.map +1 -0
- package/dist/src/tasks/index.js +7 -0
- package/dist/src/tasks/index.js.map +1 -0
- package/dist/src/tasks/invoices.d.ts +40 -0
- package/dist/src/tasks/invoices.d.ts.map +1 -0
- package/dist/src/tasks/invoices.js +180 -0
- package/dist/src/tasks/invoices.js.map +1 -0
- package/dist/src/tasks/knowledge.d.ts +23 -0
- package/dist/src/tasks/knowledge.d.ts.map +1 -0
- package/dist/src/tasks/knowledge.js +115 -0
- package/dist/src/tasks/knowledge.js.map +1 -0
- package/dist/src/tasks/legacy.d.ts +50 -0
- package/dist/src/tasks/legacy.d.ts.map +1 -0
- package/dist/src/tasks/legacy.js +85 -0
- package/dist/src/tasks/legacy.js.map +1 -0
- package/dist/src/tools/coaching/index.d.ts +49 -0
- package/dist/src/tools/coaching/index.d.ts.map +1 -0
- package/dist/src/tools/coaching/index.js +119 -0
- package/dist/src/tools/coaching/index.js.map +1 -0
- package/dist/src/tools/entitlement/index.d.ts +52 -0
- package/dist/src/tools/entitlement/index.d.ts.map +1 -0
- package/dist/src/tools/entitlement/index.js +120 -0
- package/dist/src/tools/entitlement/index.js.map +1 -0
- package/dist/src/tools/incidents/index.d.ts +55 -0
- package/dist/src/tools/incidents/index.d.ts.map +1 -0
- package/dist/src/tools/incidents/index.js +109 -0
- package/dist/src/tools/incidents/index.js.map +1 -0
- package/dist/src/tools/index.d.ts +90 -0
- package/dist/src/tools/index.d.ts.map +1 -0
- package/dist/src/tools/index.js +109 -0
- package/dist/src/tools/index.js.map +1 -0
- package/dist/src/tools/invoices/index.d.ts +56 -0
- package/dist/src/tools/invoices/index.d.ts.map +1 -0
- package/dist/src/tools/invoices/index.js +85 -0
- package/dist/src/tools/invoices/index.js.map +1 -0
- package/dist/src/tools/knowledge/index.d.ts +52 -0
- package/dist/src/tools/knowledge/index.d.ts.map +1 -0
- package/dist/src/tools/knowledge/index.js +120 -0
- package/dist/src/tools/knowledge/index.js.map +1 -0
- package/dist/tests/bm25.test.d.ts +2 -0
- package/dist/tests/bm25.test.d.ts.map +1 -0
- package/dist/tests/bm25.test.js +98 -0
- package/dist/tests/bm25.test.js.map +1 -0
- package/dist/tests/integration.test.d.ts +2 -0
- package/dist/tests/integration.test.d.ts.map +1 -0
- package/dist/tests/integration.test.js +126 -0
- package/dist/tests/integration.test.js.map +1 -0
- package/dist/tests/plan-hydration.test.d.ts +2 -0
- package/dist/tests/plan-hydration.test.d.ts.map +1 -0
- package/dist/tests/plan-hydration.test.js +28 -0
- package/dist/tests/plan-hydration.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/docs/examples-architecture.md +144 -0
- package/docs/successrun.md +1022 -0
- package/package.json +33 -0
- package/src/context/directives.ts +366 -0
- package/src/context/index.ts +1 -0
- package/src/data/coaching.ts +50 -0
- package/src/data/entitlement.ts +60 -0
- package/src/data/incidents.ts +78 -0
- package/src/data/invoices.ts +103 -0
- package/src/data/knowledge.ts +77 -0
- package/src/data/loader.ts +80 -0
- package/src/examples/scenarios.ts +724 -0
- package/src/goals/index.ts +18 -0
- package/src/policy.ts +30 -0
- package/src/registries.ts +48 -0
- package/src/renderer.ts +82 -0
- package/src/search/bm25.ts +173 -0
- package/src/search/index.ts +2 -0
- package/src/tasks/coaching.ts +217 -0
- package/src/tasks/entitlement.ts +197 -0
- package/src/tasks/incidents.ts +277 -0
- package/src/tasks/index.ts +6 -0
- package/src/tasks/invoices.ts +269 -0
- package/src/tasks/knowledge.ts +169 -0
- package/src/tasks/legacy.ts +112 -0
- package/src/tools/coaching/index.ts +197 -0
- package/src/tools/entitlement/index.ts +199 -0
- package/src/tools/incidents/index.ts +185 -0
- package/src/tools/index.ts +192 -0
- package/src/tools/invoices/index.ts +165 -0
- package/src/tools/knowledge/index.ts +203 -0
- package/tests/bm25.test.ts +129 -0
- package/tests/integration.test.ts +163 -0
- package/tests/plan-hydration.test.ts +33 -0
- package/tsconfig.json +18 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
// Integration test for ACM framework
|
|
2
|
+
import {
|
|
3
|
+
ExternalContextProviderAdapter,
|
|
4
|
+
Nucleus,
|
|
5
|
+
type Goal,
|
|
6
|
+
type Context,
|
|
7
|
+
type Plan,
|
|
8
|
+
type NucleusFactory,
|
|
9
|
+
type NucleusConfig,
|
|
10
|
+
type PreflightResult,
|
|
11
|
+
type PostcheckResult,
|
|
12
|
+
type NucleusInvokeResult,
|
|
13
|
+
type InternalContextScope,
|
|
14
|
+
type LedgerEntry,
|
|
15
|
+
type LLMCallFn,
|
|
16
|
+
} from '@ddse/acm-sdk';
|
|
17
|
+
import { MemoryLedger } from '@ddse/acm-runtime';
|
|
18
|
+
import { ACMFramework } from '@ddse/acm-framework';
|
|
19
|
+
import { SimpleCapabilityRegistry, SimpleToolRegistry } from '../src/registries.js';
|
|
20
|
+
import { registerExampleContextProviders } from '../src/context/index.js';
|
|
21
|
+
import { listScenarioKeys, scenarios, type ScenarioDefinition } from '../src/examples/scenarios.js';
|
|
22
|
+
|
|
23
|
+
type TestResult = {
|
|
24
|
+
scenario: ScenarioDefinition;
|
|
25
|
+
success: boolean;
|
|
26
|
+
error?: unknown;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const stubLLMCall: LLMCallFn = async () => ({
|
|
30
|
+
reasoning: '',
|
|
31
|
+
toolCalls: [],
|
|
32
|
+
raw: {},
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
function createVerifyFn() {
|
|
36
|
+
return async (taskId: string, output: any, expressions: string[]): Promise<boolean> => {
|
|
37
|
+
for (const expr of expressions) {
|
|
38
|
+
try {
|
|
39
|
+
const fn = new Function('output', `return ${expr};`);
|
|
40
|
+
const result = fn(output);
|
|
41
|
+
if (!result) {
|
|
42
|
+
console.error(`Verification failed for ${taskId}: ${expr}`);
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
} catch (error) {
|
|
46
|
+
console.error(`Verification error for ${taskId}: ${expr}`, error);
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async function runScenario(definition: ScenarioDefinition): Promise<void> {
|
|
55
|
+
console.log(`\n▶️ Scenario: ${definition.name} (${definition.key})`);
|
|
56
|
+
|
|
57
|
+
const toolRegistry = new SimpleToolRegistry();
|
|
58
|
+
const capabilityRegistry = new SimpleCapabilityRegistry();
|
|
59
|
+
definition.registerTools(toolRegistry);
|
|
60
|
+
definition.registerCapabilities(capabilityRegistry);
|
|
61
|
+
|
|
62
|
+
const adapter = new ExternalContextProviderAdapter();
|
|
63
|
+
registerExampleContextProviders(adapter);
|
|
64
|
+
|
|
65
|
+
const framework = ACMFramework.create({
|
|
66
|
+
capabilityRegistry,
|
|
67
|
+
toolRegistry,
|
|
68
|
+
nucleus: {
|
|
69
|
+
call: stubLLMCall,
|
|
70
|
+
llmConfig: {
|
|
71
|
+
provider: 'test',
|
|
72
|
+
model: 'stub',
|
|
73
|
+
temperature: 0,
|
|
74
|
+
maxTokens: 0,
|
|
75
|
+
},
|
|
76
|
+
hooks: {
|
|
77
|
+
preflight: false,
|
|
78
|
+
postcheck: false,
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
verify: createVerifyFn(),
|
|
82
|
+
contextProvider: adapter,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
const reference = await definition.buildReferencePlan();
|
|
86
|
+
const plan = reference.plan;
|
|
87
|
+
const ledger = new MemoryLedger();
|
|
88
|
+
|
|
89
|
+
const executeResult = await framework.execute({
|
|
90
|
+
goal: definition.goal,
|
|
91
|
+
context: definition.context,
|
|
92
|
+
ledger,
|
|
93
|
+
existingPlan: {
|
|
94
|
+
plan,
|
|
95
|
+
plannerResult: {
|
|
96
|
+
plans: [plan],
|
|
97
|
+
contextRef: plan.contextRef,
|
|
98
|
+
rationale: `${definition.name} reference plan`,
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
definition.assertExecution(executeResult.execution);
|
|
104
|
+
|
|
105
|
+
console.log(' ✅ Execution succeeded');
|
|
106
|
+
|
|
107
|
+
for (const task of plan.tasks) {
|
|
108
|
+
const record = executeResult.execution.outputsByTask?.[task.id];
|
|
109
|
+
if (!record?.output) {
|
|
110
|
+
throw new Error(`Task ${task.id} did not produce an output`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (executeResult.execution.ledger.length === 0) {
|
|
115
|
+
throw new Error('Ledger is empty after execution');
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async function runIntegrationSuite(): Promise<boolean> {
|
|
120
|
+
console.log('Running ACM Scenario Integration Suite');
|
|
121
|
+
console.log('='.repeat(50));
|
|
122
|
+
|
|
123
|
+
const keys = listScenarioKeys();
|
|
124
|
+
const results: TestResult[] = [];
|
|
125
|
+
|
|
126
|
+
for (const key of keys) {
|
|
127
|
+
const scenario = scenarios[key];
|
|
128
|
+
try {
|
|
129
|
+
await runScenario(scenario);
|
|
130
|
+
results.push({ scenario, success: true });
|
|
131
|
+
} catch (error) {
|
|
132
|
+
console.error(` ❌ Scenario failed: ${scenario.name}`);
|
|
133
|
+
console.error(error);
|
|
134
|
+
results.push({ scenario, success: false, error });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const passed = results.filter(r => r.success).length;
|
|
139
|
+
const failed = results.length - passed;
|
|
140
|
+
|
|
141
|
+
console.log('\n' + '='.repeat(50));
|
|
142
|
+
console.log(`Summary: ${passed} passed, ${failed} failed`);
|
|
143
|
+
|
|
144
|
+
if (failed > 0) {
|
|
145
|
+
console.log('\nFailed scenarios:');
|
|
146
|
+
for (const result of results.filter(r => !r.success)) {
|
|
147
|
+
console.log(` - ${result.scenario.name} (${result.scenario.key})`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return failed === 0;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
155
|
+
runIntegrationSuite()
|
|
156
|
+
.then(success => {
|
|
157
|
+
process.exit(success ? 0 : 1);
|
|
158
|
+
})
|
|
159
|
+
.catch(error => {
|
|
160
|
+
console.error('Test runner error:', error);
|
|
161
|
+
process.exit(1);
|
|
162
|
+
});
|
|
163
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { describe, it } from 'node:test';
|
|
3
|
+
|
|
4
|
+
import { listScenarioKeys, scenarios } from '../src/examples/scenarios.js';
|
|
5
|
+
|
|
6
|
+
describe('scenario reference plans', () => {
|
|
7
|
+
for (const key of listScenarioKeys()) {
|
|
8
|
+
const scenario = scenarios[key];
|
|
9
|
+
|
|
10
|
+
it(`produces deterministic reference plan for ${scenario.name}`, async () => {
|
|
11
|
+
const reference = await scenario.buildReferencePlan();
|
|
12
|
+
const plan = reference.plan;
|
|
13
|
+
|
|
14
|
+
assert.ok(plan, 'Expected a plan to be returned');
|
|
15
|
+
assert.ok(Array.isArray(plan.tasks) && plan.tasks.length > 0, 'Plan must include at least one task');
|
|
16
|
+
|
|
17
|
+
for (const task of plan.tasks ?? []) {
|
|
18
|
+
assert.ok(task.id, 'Task must include a stable id');
|
|
19
|
+
assert.ok(task.capability ?? task.capabilityRef, 'Task must include a capability reference');
|
|
20
|
+
assert.ok(task.input && Object.keys(task.input).length > 0, 'Task must include deterministic input');
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (Array.isArray(plan.edges)) {
|
|
24
|
+
for (const edge of plan.edges) {
|
|
25
|
+
const fromExists = plan.tasks?.some(task => task.id === edge.from);
|
|
26
|
+
const toExists = plan.tasks?.some(task => task.id === edge.to);
|
|
27
|
+
assert.ok(fromExists, `Edge from ${edge.from} must reference an existing task`);
|
|
28
|
+
assert.ok(toExists, `Edge to ${edge.to} must reference an existing task`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
});
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"rootDir": ".",
|
|
5
|
+
"outDir": "./dist"
|
|
6
|
+
},
|
|
7
|
+
"include": ["bin/**/*", "src/**/*", "tests/**/*"],
|
|
8
|
+
"references": [
|
|
9
|
+
{ "path": "../acm-sdk" },
|
|
10
|
+
{ "path": "../acm-runtime" },
|
|
11
|
+
{ "path": "../acm-llm" },
|
|
12
|
+
{ "path": "../acm-planner" },
|
|
13
|
+
{ "path": "../acm-mcp" },
|
|
14
|
+
{ "path": "../acm-adapters" },
|
|
15
|
+
{ "path": "../acm-replay" },
|
|
16
|
+
{ "path": "../acm-framework" }
|
|
17
|
+
]
|
|
18
|
+
}
|