@ariaflowagents/config 0.5.3 → 0.8.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.
Files changed (56) hide show
  1. package/README.md +93 -5
  2. package/dist/agent-architect/index.d.ts +10 -0
  3. package/dist/agent-architect/index.d.ts.map +1 -0
  4. package/dist/agent-architect/index.js +131 -0
  5. package/dist/agent-architect/index.js.map +1 -0
  6. package/dist/agent-architect/prompt-generator.d.ts +9 -0
  7. package/dist/agent-architect/prompt-generator.d.ts.map +1 -0
  8. package/dist/agent-architect/prompt-generator.js +155 -0
  9. package/dist/agent-architect/prompt-generator.js.map +1 -0
  10. package/dist/agent-architect/rfc-emitter.d.ts +18 -0
  11. package/dist/agent-architect/rfc-emitter.d.ts.map +1 -0
  12. package/dist/agent-architect/rfc-emitter.js +350 -0
  13. package/dist/agent-architect/rfc-emitter.js.map +1 -0
  14. package/dist/agent-architect/tool-recommender.d.ts +8 -0
  15. package/dist/agent-architect/tool-recommender.d.ts.map +1 -0
  16. package/dist/agent-architect/tool-recommender.js +87 -0
  17. package/dist/agent-architect/tool-recommender.js.map +1 -0
  18. package/dist/agent-architect/types.d.ts +904 -0
  19. package/dist/agent-architect/types.d.ts.map +1 -0
  20. package/dist/agent-architect/types.js +89 -0
  21. package/dist/agent-architect/types.js.map +1 -0
  22. package/dist/agent-architect/use-case-analyzer.d.ts +8 -0
  23. package/dist/agent-architect/use-case-analyzer.d.ts.map +1 -0
  24. package/dist/agent-architect/use-case-analyzer.js +76 -0
  25. package/dist/agent-architect/use-case-analyzer.js.map +1 -0
  26. package/dist/cli.d.ts +3 -0
  27. package/dist/cli.d.ts.map +1 -1
  28. package/dist/cli.js +1226 -3
  29. package/dist/cli.js.map +1 -1
  30. package/dist/flow-codegen.d.ts +6 -0
  31. package/dist/flow-codegen.d.ts.map +1 -0
  32. package/dist/flow-codegen.js +31 -0
  33. package/dist/flow-codegen.js.map +1 -0
  34. package/dist/flow-generator.d.ts +17 -0
  35. package/dist/flow-generator.d.ts.map +1 -0
  36. package/dist/flow-generator.js +202 -0
  37. package/dist/flow-generator.js.map +1 -0
  38. package/dist/index.d.ts +9 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +4 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/llm-flow-generator.d.ts +10 -0
  43. package/dist/llm-flow-generator.d.ts.map +1 -0
  44. package/dist/llm-flow-generator.js +244 -0
  45. package/dist/llm-flow-generator.js.map +1 -0
  46. package/dist/loader.d.ts +1 -1
  47. package/dist/loader.d.ts.map +1 -1
  48. package/dist/loader.js +175 -45
  49. package/dist/loader.js.map +1 -1
  50. package/dist/prompt-lint.d.ts +18 -0
  51. package/dist/prompt-lint.d.ts.map +1 -0
  52. package/dist/prompt-lint.js +180 -0
  53. package/dist/prompt-lint.js.map +1 -0
  54. package/dist/types.d.ts +19 -3
  55. package/dist/types.d.ts.map +1 -1
  56. package/package.json +12 -11
package/README.md CHANGED
@@ -311,14 +311,49 @@ Define reusable workflow patterns:
311
311
  {
312
312
  "flows": {
313
313
  "booking-flow": {
314
- "steps": [
314
+ "entry": "start",
315
+ "defaultRolePrompt": "You are a booking assistant.",
316
+ "nodes": [
315
317
  {
316
- "id": "collect-info",
317
- "tool": "collect_info"
318
+ "id": "start",
319
+ "nodeType": "start",
320
+ "addGlobalPrompt": true,
321
+ "prompt": "Welcome. What date would you like to book?"
318
322
  },
319
323
  {
320
- "id": "confirm",
321
- "tool": "confirm_booking"
324
+ "id": "collect_time",
325
+ "nodeType": "agent",
326
+ "prompt": "What time works for you?"
327
+ },
328
+ {
329
+ "id": "end_call",
330
+ "nodeType": "end",
331
+ "addGlobalPrompt": false,
332
+ "prompt": "Thanks, your booking is complete."
333
+ }
334
+ ],
335
+ "transitions": [
336
+ {
337
+ "from": "start",
338
+ "to": "collect_time",
339
+ "on": "to_collect_time",
340
+ "contract": {
341
+ "label": "Move to collect time",
342
+ "conditionText": "After user provides a valid date.",
343
+ "toolOnly": true,
344
+ "requiresUserTurn": true
345
+ }
346
+ },
347
+ {
348
+ "from": "collect_time",
349
+ "to": "end_call",
350
+ "on": "to_end_call",
351
+ "contract": {
352
+ "label": "Finish booking",
353
+ "conditionText": "After user confirms final booking details.",
354
+ "toolOnly": true,
355
+ "requiresUserTurn": true
356
+ }
322
357
  }
323
358
  ]
324
359
  }
@@ -326,6 +361,44 @@ Define reusable workflow patterns:
326
361
  }
327
362
  ```
328
363
 
364
+ Flow validation is enforced at load time:
365
+ - `nodes` must exist and have unique ids
366
+ - node prompts must be non-empty
367
+ - transition `from`/`to` must reference existing nodes
368
+ - transition must define `on` or `condition`
369
+ - at most one `nodeType: "start"` and one `nodeType: "global"`
370
+
371
+ ### Generate a Flow Scaffold (CLI)
372
+
373
+ ```bash
374
+ ariaflow flow generate --use-case "medical appointment scheduling" --out ./.ariaflow/flow/appointments.json
375
+ ```
376
+
377
+ Useful options:
378
+ - `--id <flow-id>`
379
+ - `--direction inbound|outbound`
380
+ - `--agent-name <name>`
381
+ - `--llm` (enable model-authored prompts)
382
+ - `--model <id>` (default: `gpt-5-mini`; OpenAI models such as `gpt-5-mini`, `gpt-4.1`, or `openai:gpt-4.1`)
383
+ - `--llm-mode hybrid|full` (default: `hybrid`)
384
+ - `--context-file <path>` (YAML/MD/TXT domain context)
385
+ - `--timeout-ms <n>`
386
+ - `--out-ts <path>` (emit typed TypeScript flow module for code-first agents)
387
+ - `--ts-const <name>` (const name in emitted TS module)
388
+ - `--force`
389
+
390
+ Hybrid mode behavior:
391
+ - Static sections remain fixed (structure, critical rules, transitions).
392
+ - Only domain-specific blocks vary (overall use-case details and main-agenda tasks/questions).
393
+ - This keeps outputs closer to production templates while still adapting per use case.
394
+
395
+ Code-first usage:
396
+ - Use `--out-ts` to generate a typed `FlowConfig` module you can import directly in TypeScript agents.
397
+ - This keeps generator output use-case agnostic and reusable across config-first and code-first paths.
398
+
399
+ LLM provider env var:
400
+ - OpenAI models require `OPENAI_API_KEY`
401
+
329
402
  ## Providers
330
403
 
331
404
  Configure API providers:
@@ -481,6 +554,7 @@ my-agent/
481
554
  | `runtime` | object | Yes | Runtime configuration |
482
555
  | `models` | object | Yes | Model registry |
483
556
  | `agents` | object | Yes | Agent definitions |
557
+ | `flows` | object | No | Reusable flow definitions (`nodes` + `transitions`) |
484
558
  | `tools` | object | No | Tool definitions |
485
559
  | `providers` | object | No | Provider configurations |
486
560
  | `permissions` | object | No | Permission settings |
@@ -505,6 +579,20 @@ my-agent/
505
579
  | `flowRef` | string | Flow reference (flow only) |
506
580
  | `mode` | string | Flow mode: `guided`, `hybrid` (flow only) |
507
581
 
582
+ ### Flow Properties
583
+
584
+ | Property | Type | Description |
585
+ |----------|------|-------------|
586
+ | `entry` / `initialNode` | string | Initial node id |
587
+ | `defaultRolePrompt` | string | Global flow prompt applied to nodes by default |
588
+ | `nodes` | array | Flow nodes (`id`, `prompt`, optional `nodeType`, `addGlobalPrompt`) |
589
+ | `transitions` | array | Edges (`from`, `to`, `on`/`condition`, optional `contract`) |
590
+ | `contextStrategy` | string | `append`, `reset`, `reset_with_summary` |
591
+ | `summaryPrompt` | string | Prompt used when summarizing context |
592
+ | `summaryMaxTokens` | number | Max tokens for summary generation |
593
+ | `summaryTimeoutMs` | number | Summary timeout guardrail |
594
+ | `maxSteps` | number | Default max tool-call steps in stream loop |
595
+
508
596
  ### Prompt Properties
509
597
 
510
598
  | Property | Type | Description |
@@ -0,0 +1,10 @@
1
+ import { type ArchitectOptions, type ArchitectResult, type AgentMode, type DomainAnalysis, type ToolRecommendation, type SixLayerPrompt, type DetailLevel } from './types.js';
2
+ export interface RunArchitectOptions extends ArchitectOptions {
3
+ model?: string;
4
+ timeoutMs?: number;
5
+ mode?: AgentMode;
6
+ detailLevel?: DetailLevel;
7
+ }
8
+ export declare function runArchitect(options: RunArchitectOptions): Promise<ArchitectResult>;
9
+ export { type DomainAnalysis, type ToolRecommendation, type SixLayerPrompt };
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent-architect/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,WAAW,EAEjB,MAAM,YAAY,CAAC;AA4BpB,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,eAAe,CAAC,CA+H1B;AAED,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,kBAAkB,EAAE,KAAK,cAAc,EAAE,CAAC"}
@@ -0,0 +1,131 @@
1
+ import { analyzeUseCase } from './use-case-analyzer.js';
2
+ import { recommendTools, getToolPolicy } from './tool-recommender.js';
3
+ import { generateSixLayerPrompt, renderSixLayerPromptAsMarkdown, renderSixLayerPromptAsTypeScript } from './prompt-generator.js';
4
+ import { generateRfcMarkdown } from './rfc-emitter.js';
5
+ import { generateFlowTemplateWithLLM } from '../llm-flow-generator.js';
6
+ import { emitFlowTypeScriptModule } from '../flow-codegen.js';
7
+ import { AgentBlueprintSchema, } from './types.js';
8
+ function toSlug(value) {
9
+ return value
10
+ .toLowerCase()
11
+ .replace(/[^a-z0-9]+/g, '-')
12
+ .replace(/^-+|-+$/g, '')
13
+ .slice(0, 64) || 'generated-agent';
14
+ }
15
+ function toTitleCase(value) {
16
+ return value
17
+ .replace(/[_-]+/g, ' ')
18
+ .replace(/\s+/g, ' ')
19
+ .trim()
20
+ .split(' ')
21
+ .map(word => (word ? word[0].toUpperCase() + word.slice(1) : ''))
22
+ .join(' ');
23
+ }
24
+ function toTsConstCase(value) {
25
+ const clean = value.replace(/[^a-zA-Z0-9]+/g, ' ').trim();
26
+ const words = clean.split(/\s+/).filter(Boolean);
27
+ if (words.length === 0)
28
+ return 'generatedAgent';
29
+ const [head, ...tail] = words;
30
+ return `${head.toLowerCase()}${tail.map(word => word[0].toUpperCase() + word.slice(1).toLowerCase()).join('')}`;
31
+ }
32
+ export async function runArchitect(options) {
33
+ const { useCase, mode = 'hybrid', target = 'both', name, model, contextText, timeoutMs = 120000, detailLevel = 'detailed', } = options;
34
+ console.log('\n🔍 Analyzing use case with LLM...');
35
+ const domainAnalysis = await analyzeUseCase(useCase, {
36
+ model,
37
+ contextText,
38
+ timeoutMs,
39
+ });
40
+ console.log(' Domain:', domainAnalysis.domain);
41
+ console.log(' Entities:', domainAnalysis.entities.join(', '));
42
+ console.log(' Workflows:', domainAnalysis.workflows.join(', '));
43
+ console.log('\n🛠️ Recommending tools with LLM...');
44
+ const toolRecommendations = await recommendTools(useCase, domainAnalysis, {
45
+ model,
46
+ timeoutMs,
47
+ });
48
+ console.log(' Recommended tools:');
49
+ for (const tool of toolRecommendations) {
50
+ console.log(` - ${tool.toolName} (${tool.priority})`);
51
+ }
52
+ const blueprintId = toSlug(name ?? useCase);
53
+ const displayName = name ? toTitleCase(name) : toTitleCase(blueprintId);
54
+ console.log('\n📝 Generating 6-layer prompt with LLM...');
55
+ const promptLayers = await generateSixLayerPrompt(displayName, useCase, domainAnalysis, toolRecommendations, mode, { model, timeoutMs });
56
+ let flowJson;
57
+ let flowTs;
58
+ if (mode !== 'llm') {
59
+ console.log('\n🔀 Generating flow for ' + mode + ' mode...');
60
+ try {
61
+ flowJson = await generateFlowTemplateWithLLM({
62
+ useCase,
63
+ direction: 'inbound',
64
+ agentName: displayName,
65
+ model: model ?? 'gpt-5-mini',
66
+ llmMode: mode === 'flow' ? 'full' : 'hybrid',
67
+ contextText,
68
+ timeoutMs,
69
+ });
70
+ console.log(' Flow nodes:', flowJson?.nodes?.length ?? 0);
71
+ if (target === 'code' || target === 'both') {
72
+ flowTs = emitFlowTypeScriptModule(flowJson, { constName: `${toTsConstCase(blueprintId)}Flow` });
73
+ }
74
+ }
75
+ catch (error) {
76
+ console.warn(' Flow generation failed, continuing without flow:', error);
77
+ }
78
+ }
79
+ const blueprint = {
80
+ id: blueprintId,
81
+ name: displayName,
82
+ useCase,
83
+ mode,
84
+ target,
85
+ domainAnalysis: {
86
+ ...domainAnalysis,
87
+ constraints: domainAnalysis.constraints ?? [],
88
+ },
89
+ selectedTools: toolRecommendations.map(t => t.toolName),
90
+ toolRecommendations,
91
+ toolPolicy: getToolPolicy(toolRecommendations),
92
+ promptLayers,
93
+ evalPlan: {
94
+ scenarios: [
95
+ 'happy_path_conversation',
96
+ 'tool_failure_recovery',
97
+ 'invalid_user_input',
98
+ 'policy_refusal',
99
+ 'edge_case_handling',
100
+ ],
101
+ },
102
+ generationMeta: {
103
+ generatedAt: new Date().toISOString(),
104
+ model: model ?? 'gpt-5-mini',
105
+ llmRequired: true,
106
+ llmEnabled: true,
107
+ llmMode: mode,
108
+ interactive: options.interactive ?? false,
109
+ clarificationCount: 0,
110
+ clarifications: [],
111
+ },
112
+ };
113
+ const promptMarkdown = renderSixLayerPromptAsMarkdown(displayName, promptLayers);
114
+ const promptConstName = toTsConstCase(blueprintId);
115
+ const promptTypeScript = renderSixLayerPromptAsTypeScript(promptConstName, promptLayers);
116
+ const artifacts = {
117
+ prompt: promptMarkdown,
118
+ flow: flowJson,
119
+ code: {
120
+ prompt: promptTypeScript,
121
+ flow: flowTs,
122
+ },
123
+ };
124
+ const rfcMarkdown = generateRfcMarkdown(blueprint, artifacts, detailLevel);
125
+ artifacts.rfc = rfcMarkdown;
126
+ return {
127
+ blueprint: AgentBlueprintSchema.parse(blueprint),
128
+ artifacts,
129
+ };
130
+ }
131
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent-architect/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA+B,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,aAAa,EAA+B,MAAM,uBAAuB,CAAC;AACnG,OAAO,EAAE,sBAAsB,EAAE,8BAA8B,EAAE,gCAAgC,EAA+B,MAAM,uBAAuB,CAAC;AAC9J,OAAO,EAAE,mBAAmB,EAA8B,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EASL,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC;AACvC,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK;SACT,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE;SACN,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACjE,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,gBAAgB,CAAC;IAChD,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;IAC9B,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AACnH,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAA4B;IAE5B,MAAM,EACJ,OAAO,EACP,IAAI,GAAG,QAAQ,EACf,MAAM,GAAG,MAAM,EACf,IAAI,EACJ,KAAK,EACL,WAAW,EACX,SAAS,GAAG,MAAM,EAClB,WAAW,GAAG,UAAU,GACzB,GAAG,OAAO,CAAC;IAEZ,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE;QACnD,KAAK;QACL,WAAW;QACX,SAAS;KACV,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAElE,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACrD,MAAM,mBAAmB,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE;QACxE,KAAK;QACL,SAAS;KACV,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,mBAAmB,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAExE,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,MAAM,sBAAsB,CAC/C,WAAW,EACX,OAAO,EACP,cAAc,EACd,mBAAmB,EACnB,IAAI,EACJ,EAAE,KAAK,EAAE,SAAS,EAAE,CACrB,CAAC;IAEF,IAAI,QAA4B,CAAC;IACjC,IAAI,MAA0B,CAAC;IAE/B,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,2BAA2B,GAAG,IAAI,GAAG,UAAU,CAAC,CAAC;QAC7D,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,2BAA2B,CAAC;gBAC3C,OAAO;gBACP,SAAS,EAAE,SAAS;gBACpB,SAAS,EAAE,WAAW;gBACtB,KAAK,EAAE,KAAK,IAAI,YAAY;gBAC5B,OAAO,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;gBAC5C,WAAW;gBACX,SAAS;aACV,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAG,QAAgB,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;YAErE,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC3C,MAAM,GAAG,wBAAwB,CAAC,QAAe,EAAE,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;YACzG,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,qDAAqD,EAAE,KAAK,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG;QAChB,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,WAAW;QACjB,OAAO;QACP,IAAI;QACJ,MAAM;QACN,cAAc,EAAE;YACd,GAAG,cAAc;YACjB,WAAW,EAAE,cAAc,CAAC,WAAW,IAAI,EAAE;SACvC;QACR,aAAa,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;QACvD,mBAAmB;QACnB,UAAU,EAAE,aAAa,CAAC,mBAAmB,CAAC;QAC9C,YAAY;QACZ,QAAQ,EAAE;YACR,SAAS,EAAE;gBACT,yBAAyB;gBACzB,uBAAuB;gBACvB,oBAAoB;gBACpB,gBAAgB;gBAChB,oBAAoB;aACrB;SACF;QACD,cAAc,EAAE;YACd,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,KAAK,EAAE,KAAK,IAAI,YAAY;YAC5B,WAAW,EAAE,IAAI;YACjB,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK;YACzC,kBAAkB,EAAE,CAAC;YACrB,cAAc,EAAE,EAAE;SACnB;KACF,CAAC;IAEF,MAAM,cAAc,GAAG,8BAA8B,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACjF,MAAM,eAAe,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,gBAAgB,GAAG,gCAAgC,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IAEzF,MAAM,SAAS,GAAiC;QAC9C,MAAM,EAAE,cAAc;QACtB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE;YACJ,MAAM,EAAE,gBAAgB;YACxB,IAAI,EAAE,MAAM;SACb;KACF,CAAC;IAEF,MAAM,WAAW,GAAG,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAC3E,SAAS,CAAC,GAAG,GAAG,WAAW,CAAC;IAE5B,OAAO;QACL,SAAS,EAAE,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC;QAChD,SAAS;KACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type DomainAnalysis, type ToolRecommendation, type SixLayerPrompt } from './types.js';
2
+ export interface PromptGeneratorOptions {
3
+ model?: string;
4
+ timeoutMs?: number;
5
+ }
6
+ export declare function generateSixLayerPrompt(agentName: string, useCase: string, domainAnalysis: DomainAnalysis, toolRecommendations: ToolRecommendation[], mode: 'llm' | 'flow' | 'hybrid', options?: PromptGeneratorOptions): Promise<SixLayerPrompt>;
7
+ export declare function renderSixLayerPromptAsMarkdown(agentName: string, prompt: SixLayerPrompt): string;
8
+ export declare function renderSixLayerPromptAsTypeScript(constName: string, prompt: SixLayerPrompt): string;
9
+ //# sourceMappingURL=prompt-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-generator.d.ts","sourceRoot":"","sources":["../../src/agent-architect/prompt-generator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,kBAAkB,EAAE,KAAK,cAAc,EAAwB,MAAM,YAAY,CAAC;AAqGrH,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,cAAc,EAC9B,mBAAmB,EAAE,kBAAkB,EAAE,EACzC,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,EAC/B,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,cAAc,CAAC,CA8BzB;AAED,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,cAAc,GACrB,MAAM,CA6BR;AAED,wBAAgB,gCAAgC,CAC9C,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,cAAc,GACrB,MAAM,CAMR"}
@@ -0,0 +1,155 @@
1
+ import { generateObject } from 'ai';
2
+ import { openai } from '@ai-sdk/openai';
3
+ import { z } from 'zod';
4
+ import { SixLayerPromptSchema } from './types.js';
5
+ const SixLayerPromptLLMSchema = z.object({
6
+ identityAndRole: z.object({
7
+ name: z.string().describe('Layer identifier'),
8
+ content: z.string().describe('The actual prompt text for this layer'),
9
+ purpose: z.string().describe('Why this layer exists'),
10
+ }),
11
+ safetyAndGuardrails: z.object({
12
+ name: z.string().describe('Layer identifier'),
13
+ content: z.string().describe('The actual prompt text for this layer'),
14
+ purpose: z.string().describe('Why this layer exists'),
15
+ }),
16
+ toolContract: z.object({
17
+ name: z.string().describe('Layer identifier'),
18
+ content: z.string().describe('The actual prompt text for this layer'),
19
+ purpose: z.string().describe('Why this layer exists'),
20
+ }),
21
+ reasoningWorkflow: z.object({
22
+ name: z.string().describe('Layer identifier'),
23
+ content: z.string().describe('The actual prompt text for this layer'),
24
+ purpose: z.string().describe('Why this layer exists'),
25
+ }),
26
+ executionPolicy: z.object({
27
+ name: z.string().describe('Layer identifier'),
28
+ content: z.string().describe('The actual prompt text for this layer'),
29
+ purpose: z.string().describe('Why this layer exists'),
30
+ }),
31
+ outputConstraints: z.object({
32
+ name: z.string().describe('Layer identifier'),
33
+ content: z.string().describe('The actual prompt text for this layer'),
34
+ purpose: z.string().describe('Why this layer exists'),
35
+ }),
36
+ });
37
+ function resolveModel(modelInput) {
38
+ const requested = modelInput?.trim() || 'gpt-5-mini';
39
+ const modelId = requested.startsWith('openai:') ? requested.slice('openai:'.length).trim() : requested;
40
+ return openai(modelId || 'gpt-5-mini');
41
+ }
42
+ function buildPromptGenerationPrompt(agentName, useCase, domainAnalysis, toolRecommendations, mode) {
43
+ const toolsList = toolRecommendations.map(t => `- ${t.toolName}: ${t.description} (${t.priority})`).join('\n');
44
+ return `Generate a 6-layer system prompt for a conversational AI agent.
45
+
46
+ ## Agent Identity
47
+ - Name: ${agentName}
48
+ - Use Case: ${useCase}
49
+
50
+ ## Domain Analysis
51
+ - Domain: ${domainAnalysis.domain}
52
+ ${domainAnalysis.subDomain ? `- Sub-domain: ${domainAnalysis.subDomain}` : ''}
53
+ - Entities: ${domainAnalysis.entities.join(', ')}
54
+ - Workflows: ${domainAnalysis.workflows.join(', ')}
55
+ - User Intents: ${domainAnalysis.userIntents.join(', ')}
56
+ - Key Outcomes: ${domainAnalysis.keyOutcomes.join(', ')}
57
+
58
+ ## Recommended Tools
59
+ ${toolsList}
60
+
61
+ ## Agent Mode
62
+ ${mode === 'llm' ? 'Pure LLM agent - uses tools but no structured flow' : mode === 'flow' ? 'Flow-based agent - follows structured conversation flow' : 'Hybrid agent - flow with LLM detours'}
63
+
64
+ ## Your Task
65
+ Generate each of the 6 prompt layers:
66
+
67
+ ### Layer 1: Identity and Role
68
+ Who is the agent? What is its purpose? What tone should it use?
69
+
70
+ ### Layer 2: Safety and Guardrails
71
+ What should the agent NEVER do? What are the safety constraints? When should it escalate?
72
+
73
+ ### Layer 3: Tool Contract
74
+ What tools are available? When should each be used? What happens on tool failure?
75
+
76
+ ### Layer 4: Reasoning Workflow
77
+ How should the agent think through conversations? What questions to ask? In what order?
78
+
79
+ ### Layer 5: Execution Policy
80
+ How does the agent behave in ${mode} mode? What are the rules for tool calls vs user messages?
81
+
82
+ ### Layer 6: Output Constraints
83
+ How should responses be formatted? What verification steps before final actions?
84
+
85
+ For each layer, provide:
86
+ - name: Layer identifier
87
+ - content: The actual prompt text
88
+ - purpose: Why this layer exists
89
+
90
+ Make the prompts specific to this use case, not generic templates.`;
91
+ }
92
+ export async function generateSixLayerPrompt(agentName, useCase, domainAnalysis, toolRecommendations, mode, options = {}) {
93
+ const model = resolveModel(options.model);
94
+ const timeoutMs = options.timeoutMs ?? 60000;
95
+ if (!process.env.OPENAI_API_KEY) {
96
+ throw new Error('OPENAI_API_KEY is required for LLM prompt generation');
97
+ }
98
+ const result = await Promise.race([
99
+ generateObject({
100
+ model,
101
+ schema: SixLayerPromptLLMSchema,
102
+ system: `You are an expert prompt engineer for conversational AI agents.
103
+ Generate 6-layer system prompts based on the OpenAI-inspired context model:
104
+ 1. Identity and Role
105
+ 2. Safety and Guardrails
106
+ 3. Tool Contract
107
+ 4. Reasoning Workflow
108
+ 5. Execution Policy
109
+ 6. Output Constraints
110
+
111
+ Each layer should be specific to the use case, not generic.`,
112
+ prompt: buildPromptGenerationPrompt(agentName, useCase, domainAnalysis, toolRecommendations, mode),
113
+ }),
114
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Prompt generation timed out after ${timeoutMs}ms`)), timeoutMs)),
115
+ ]);
116
+ return SixLayerPromptSchema.parse(result.object);
117
+ }
118
+ export function renderSixLayerPromptAsMarkdown(agentName, prompt) {
119
+ return [
120
+ `# ${agentName} System Prompt`,
121
+ '',
122
+ `## 1. Identity and Role`,
123
+ '',
124
+ prompt.identityAndRole.content,
125
+ '',
126
+ `## 2. Safety and Guardrails`,
127
+ '',
128
+ prompt.safetyAndGuardrails.content,
129
+ '',
130
+ `## 3. Tool Contract`,
131
+ '',
132
+ prompt.toolContract.content,
133
+ '',
134
+ `## 4. Reasoning Workflow`,
135
+ '',
136
+ prompt.reasoningWorkflow.content,
137
+ '',
138
+ `## 5. Execution Policy`,
139
+ '',
140
+ prompt.executionPolicy.content,
141
+ '',
142
+ `## 6. Output Constraints`,
143
+ '',
144
+ prompt.outputConstraints.content,
145
+ '',
146
+ ].join('\n');
147
+ }
148
+ export function renderSixLayerPromptAsTypeScript(constName, prompt) {
149
+ const serialized = JSON.stringify(prompt, null, 2);
150
+ return `export const ${constName}SystemPrompt = ${serialized} as const;
151
+
152
+ export default ${constName}SystemPrompt;
153
+ `;
154
+ }
155
+ //# sourceMappingURL=prompt-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-generator.js","sourceRoot":"","sources":["../../src/agent-architect/prompt-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type AgentBlueprint, type DetailLevel } from './types.js';
2
+ export declare function generateRfcMarkdown(blueprint: AgentBlueprint, artifacts: {
3
+ prompt?: string;
4
+ flow?: object;
5
+ }, detailLevel?: DetailLevel): string;
6
+ export declare function generateToolSpecifications(recommendations: {
7
+ toolName: string;
8
+ description: string;
9
+ whenToUse: string;
10
+ onError?: string;
11
+ }[]): Array<{
12
+ name: string;
13
+ description: string;
14
+ inputSchema: Record<string, unknown>;
15
+ outputSchema: Record<string, unknown>;
16
+ integrationSteps: string[];
17
+ }>;
18
+ //# sourceMappingURL=rfc-emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rfc-emitter.d.ts","sourceRoot":"","sources":["../../src/agent-architect/rfc-emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAgHnE,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAC7C,WAAW,GAAE,WAAwB,GACpC,MAAM,CAmIR;AAED,wBAAgB,0BAA0B,CACxC,eAAe,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAChG,KAAK,CAAC;IACP,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B,CAAC,CAQD"}