@kjerneverk/execution-openai 1.0.5-dev.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 (50) hide show
  1. package/.kodrdriv-test-cache.json +6 -0
  2. package/LICENSE +18 -0
  3. package/README.md +80 -0
  4. package/dist/index.d.ts +85 -0
  5. package/dist/index.js +103 -0
  6. package/dist/index.js.map +1 -0
  7. package/output/kodrdriv/.kodrdriv-parallel-context.json +589 -0
  8. package/output/kodrdriv/260110-1751-release-notes.md +39 -0
  9. package/output/kodrdriv/260112-2207-commit-message.md +1 -0
  10. package/output/kodrdriv/260112-2208-release-notes.md +36 -0
  11. package/output/kodrdriv/260112-2341-commit-message.md +1 -0
  12. package/output/kodrdriv/260113-0029-commit-message.md +1 -0
  13. package/output/kodrdriv/260113-0030-release-notes.md +5 -0
  14. package/output/kodrdriv/260114-0656-commit-message.md +6 -0
  15. package/output/kodrdriv/260115-0616-commit-message.md +1 -0
  16. package/output/kodrdriv/260115-0739-commit-message.md +1 -0
  17. package/output/kodrdriv/260126-0852-commit-message.md +1 -0
  18. package/output/kodrdriv/260126-0853-release-notes.md +47 -0
  19. package/output/kodrdriv/260126-0854-release-notes.md +50 -0
  20. package/output/kodrdriv/260128-0929-commit-message.md +1 -0
  21. package/output/kodrdriv/260128-0929-release-notes.md +24 -0
  22. package/output/kodrdriv/260128-0959-commit-message.md +6 -0
  23. package/output/kodrdriv/260128-1127-commit-message.md +1 -0
  24. package/output/kodrdriv/260128-1127-release-notes.md +30 -0
  25. package/output/kodrdriv/260130-1639-commit-message.md +5 -0
  26. package/output/kodrdriv/260130-1652-commit-message.md +1 -0
  27. package/output/kodrdriv/260130-1652-release-notes.md +27 -0
  28. package/output/kodrdriv/RELEASE_NOTES.md +25 -0
  29. package/output/kodrdriv/RELEASE_TITLE.md +1 -0
  30. package/output/kodrdriv/agentic-reflection-commit-2026-01-13T06-07-12-251Z.md +97 -0
  31. package/output/kodrdriv/agentic-reflection-commit-2026-01-13T07-41-08-151Z.md +97 -0
  32. package/output/kodrdriv/agentic-reflection-commit-2026-01-13T08-29-26-449Z.md +97 -0
  33. package/output/kodrdriv/agentic-reflection-commit-2026-01-14T14-56-03-314Z.md +102 -0
  34. package/output/kodrdriv/agentic-reflection-commit-2026-01-15T14-16-42-406Z.md +97 -0
  35. package/output/kodrdriv/agentic-reflection-commit-2026-01-15T15-39-56-545Z.md +114 -0
  36. package/output/kodrdriv/agentic-reflection-commit-2026-01-26T16-52-42-503Z.md +152 -0
  37. package/output/kodrdriv/agentic-reflection-commit-2026-01-28T17-59-30-913Z.md +204 -0
  38. package/output/kodrdriv/agentic-reflection-commit-2026-01-31T00-39-30-443Z.md +245 -0
  39. package/output/kodrdriv/agentic-reflection-commit-2026-01-31T00-52-07-165Z.md +152 -0
  40. package/output/kodrdriv/agentic-reflection-release-2026-01-11T01-51-19-115Z.md +277 -0
  41. package/output/kodrdriv/agentic-reflection-release-2026-01-13T06-08-15-507Z.md +289 -0
  42. package/output/kodrdriv/agentic-reflection-release-2026-01-13T08-30-05-728Z.md +312 -0
  43. package/output/kodrdriv/agentic-reflection-release-2026-01-26T16-53-34-128Z.md +417 -0
  44. package/output/kodrdriv/agentic-reflection-release-2026-01-26T16-53-55-634Z.md +391 -0
  45. package/output/kodrdriv/agentic-reflection-release-2026-01-26T16-54-13-700Z.md +456 -0
  46. package/output/kodrdriv/agentic-reflection-release-2026-01-26T16-54-22-655Z.md +496 -0
  47. package/output/kodrdriv/agentic-reflection-release-2026-01-26T16-54-32-261Z.md +490 -0
  48. package/output/kodrdriv/agentic-reflection-release-2026-01-31T00-52-29-053Z.md +334 -0
  49. package/package.json +58 -0
  50. package/package.json~ +57 -0
@@ -0,0 +1,312 @@
1
+ # Agentic Workflow - Self-Reflection Report
2
+
3
+ Generated: 2026-01-13T08:30:05.728Z
4
+
5
+ ## Execution Summary
6
+
7
+ - **Iterations**: 5
8
+ - **Tool Calls**: 14
9
+ - **Unique Tools**: 10
10
+
11
+ ## Tool Effectiveness Analysis
12
+
13
+ | Tool | Calls | Success | Failures | Success Rate | Avg Duration |
14
+ |------|-------|---------|----------|--------------|--------------|
15
+ | get_file_content | 5 | 5 | 0 | 100.0% | 0ms |
16
+ | get_release_stats | 1 | 1 | 0 | 100.0% | 39ms |
17
+ | analyze_commit_patterns | 1 | 1 | 0 | 100.0% | 10ms |
18
+ | get_breaking_changes | 1 | 1 | 0 | 100.0% | 21ms |
19
+ | get_tag_history | 1 | 1 | 0 | 100.0% | 49ms |
20
+ | search_codebase | 1 | 1 | 0 | 100.0% | 11ms |
21
+ | get_file_dependencies | 1 | 1 | 0 | 100.0% | 50ms |
22
+ | get_related_tests | 1 | 1 | 0 | 100.0% | 1ms |
23
+ | get_file_history | 1 | 1 | 0 | 100.0% | 11ms |
24
+ | compare_previous_release | 1 | 1 | 0 | 100.0% | 34ms |
25
+
26
+ ### Tool Performance Insights
27
+
28
+ **Most Frequently Used:**
29
+ - get_release_stats: 1 calls
30
+ - analyze_commit_patterns: 1 calls
31
+ - get_breaking_changes: 1 calls
32
+
33
+ ## Recommendations for Improvement
34
+
35
+ - **Underutilized Tools**: Many tools were called only once. Consider whether all tools are necessary or if the agent needs better guidance on when to use them.
36
+
37
+ ## Detailed Execution Timeline
38
+
39
+ | Time | Iteration | Tool | Result | Duration |
40
+ |------|-----------|------|--------|----------|
41
+ | 12:29:33 AM | 1 | get_release_stats | ✅ Success | 39ms |
42
+ | 12:29:33 AM | 1 | analyze_commit_patterns | ✅ Success | 10ms |
43
+ | 12:29:33 AM | 1 | get_breaking_changes | ✅ Success | 21ms |
44
+ | 12:29:33 AM | 1 | get_tag_history | ✅ Success | 49ms |
45
+ | 12:29:35 AM | 2 | get_file_content | ✅ Success | 1ms |
46
+ | 12:29:35 AM | 2 | get_file_content | ✅ Success | 0ms |
47
+ | 12:29:35 AM | 2 | get_file_content | ✅ Success | 0ms |
48
+ | 12:29:35 AM | 2 | search_codebase | ✅ Success | 11ms |
49
+ | 12:29:35 AM | 2 | get_file_dependencies | ✅ Success | 50ms |
50
+ | 12:29:37 AM | 3 | get_file_content | ✅ Success | 0ms |
51
+ | 12:29:37 AM | 3 | get_file_content | ✅ Success | 0ms |
52
+ | 12:29:37 AM | 3 | get_related_tests | ✅ Success | 1ms |
53
+ | 12:29:37 AM | 3 | get_file_history | ✅ Success | 11ms |
54
+ | 12:29:48 AM | 4 | compare_previous_release | ✅ Success | 34ms |
55
+
56
+ ## Conversation History
57
+
58
+ <details>
59
+ <summary>Click to expand full agentic interaction</summary>
60
+
61
+ ```json
62
+ [
63
+ {
64
+ "role": "system",
65
+ "content": "You are a professional software engineer writing release notes for your team and users.\n\n## Available Tools\n\n### General\n\n**get_file_history**\nGet git commit history for one or more files to understand their evolution and past changes\n\nParameters:\n- `filePaths` (required): Array of file paths to get history for\n- `limit`: Maximum number of commits to return (default: 10)\n- `format`: Output format: \"summary\" for brief or \"detailed\" for full messages\n\n**When to use:** Get git commit history for one or more files to understand their evolution and past changes\n\n---\n\n**get_file_content**\nGet the complete current content of a file to understand context around changes. Returns a message if the file does not exist (e.g., if it was deleted).\n\nParameters:\n- `filePath` (required): Path to the file\n- `includeLineNumbers`: Include line numbers in output (default: false)\n\n**When to use:** Get the complete current content of a file to understand context around changes. Returns a message if the file does not exist (e.g., if it was deleted).\n\n---\n\n**search_codebase**\nSearch for code patterns, function names, or text across the codebase using git grep\n\nParameters:\n- `query` (required): Search pattern (can be plain text or regex)\n- `fileTypes`: Limit search to specific file extensions (e.g., [\"ts\", \"js\"])\n- `contextLines`: Number of context lines to show around matches (default: 2)\n\n**When to use:** Search for code patterns, function names, or text across the codebase using git grep\n\n---\n\n**get_related_tests**\nFind test files related to production files to understand what the code is supposed to do\n\nParameters:\n- `filePaths` (required): Production file paths\n\n**When to use:** Find test files related to production files to understand what the code is supposed to do\n\n---\n\n**get_file_dependencies**\nFind which files import or depend on the changed files to assess change impact\n\nParameters:\n- `filePaths` (required): Files to analyze dependencies for\n\n**When to use:** Find which files import or depend on the changed files to assess change impact\n\n---\n\n**analyze_diff_section**\nGet expanded context around specific lines in a file to better understand changes\n\nParameters:\n- `filePath` (required): File containing the section to analyze\n- `startLine` (required): Starting line number\n- `endLine` (required): Ending line number\n- `contextLines`: Number of additional context lines to show before and after (default: 10)\n\n**When to use:** Get expanded context around specific lines in a file to better understand changes\n\n---\n\n**get_recent_commits**\nGet recent commits that modified the same files to understand recent work in this area\n\nParameters:\n- `filePaths` (required): Files to check for recent commits\n- `since`: Time period to look back (e.g., \"1 week ago\", \"2 days ago\")\n- `limit`: Maximum number of commits to return (default: 5)\n\n**When to use:** Get recent commits that modified the same files to understand recent work in this area\n\n---\n\n**group_files_by_concern**\nAnalyze changed files and suggest logical groupings that might represent separate concerns\n\nParameters:\n- `filePaths` (required): All changed files to analyze\n\n**When to use:** Analyze changed files and suggest logical groupings that might represent separate concerns\n\n---\n\n### Release Analysis\n\n**get_tag_history** _(cheap)_\nGet the history of previous release tags to understand release patterns and versioning\n\nParameters:\n- `limit`: Number of recent tags to retrieve (default: 10)\n- `pattern`: Filter tags by pattern (e.g., \"v*\" for version tags)\n\n**When to use:** Get the history of previous release tags to understand release patterns and versioning\n\n**Examples:**\n- Check recent version tags: `get_tag_history({\"limit\":5,\"pattern\":\"v*\"})`\n\n---\n\n**compare_previous_release** _(moderate)_\nCompare this release with a previous release to understand what changed between versions\n\nParameters:\n- `previousTag` (required): Previous release tag to compare against\n- `currentRef`: Current reference (default: HEAD)\n- `statsOnly`: Return only statistics, not full diff (default: true)\n\n**When to use:** Compare this release with a previous release to understand what changed between versions\n\n**Examples:**\n- Compare with last release: `compare_previous_release({\"previousTag\":\"v1.0.0\",\"currentRef\":\"HEAD\"})`\n\n---\n\n**get_release_stats** _(moderate)_\nGet comprehensive statistics about the release including contributors, file changes, and commit patterns\n\nParameters:\n- `fromRef` (required): Starting reference for the release range\n- `toRef`: Ending reference for the release range (default: HEAD)\n\n**When to use:** Get comprehensive statistics about the release including contributors, file changes, and commit patterns\n\n**Examples:**\n- Get release overview: `get_release_stats({\"fromRef\":\"v1.0.0\",\"toRef\":\"HEAD\"})`\n\n---\n\n**get_breaking_changes** _(expensive)_\nSearch for potential breaking changes by looking for specific patterns in commits and diffs\n\nParameters:\n- `fromRef` (required): Starting reference for the release range\n- `toRef`: Ending reference for the release range (default: HEAD)\n\n**When to use:** Search for potential breaking changes by looking for specific patterns in commits and diffs\n\n**Examples:**\n- Check for breaking changes: `get_breaking_changes({\"fromRef\":\"v1.0.0\",\"toRef\":\"HEAD\"})`\n\n---\n\n**analyze_commit_patterns** _(cheap)_\nAnalyze commit messages to identify patterns and themes in the release\n\nParameters:\n- `fromRef` (required): Starting reference for the release range\n- `toRef`: Ending reference for the release range (default: HEAD)\n\n**When to use:** Analyze commit messages to identify patterns and themes in the release\n\n**Examples:**\n- Find commit themes: `analyze_commit_patterns({\"fromRef\":\"v1.0.0\",\"toRef\":\"HEAD\"})`\n\n---\n\n\n\n## Your Task\n\nWrite release notes that clearly explain what's in this release and why it matters. Your notes should help users and developers understand what changed without needing to read every commit.\n\nFocus on:\n- What problems does this release solve?\n- What new capabilities does it add?\n- What's the impact on users and developers?\n- Are there breaking changes or important considerations?\n\nUse the available tools to investigate the changes. The more you understand, the better your notes will be.\n\n**Important**: If additional context is provided (from context files or other sources), use your judgment:\n- If the context is relevant to this specific package/release, incorporate it appropriately\n- If the context describes changes in other packages or unrelated work, ignore it\n- Don't fabricate connections between this package and unrelated context\n- Be honest about what changed - only mention what actually happened in this release\n- Context is supplemental information, not a requirement to include\n\n## Investigation Approach\n\nUse tools based on what you need to know:\n\n**Context:**\n- get_tag_history - understand release patterns\n- get_release_stats - quantify scope\n- compare_previous_release - see how this compares\n\n**Understanding:**\n- group_files_by_concern - identify themes\n- analyze_commit_patterns - detect patterns\n- get_file_content - see full context\n- analyze_diff_section - expand unclear changes\n- get_file_history - understand evolution\n\n**Impact:**\n- get_file_dependencies - assess reach\n- search_codebase - find usage patterns\n- get_related_tests - understand behavior changes\n- get_breaking_changes - identify breaking changes (always use)\n\n## Writing Style\n\nWrite naturally and directly:\n- Use plain language that users can understand\n- Be specific about what changed and why\n- Avoid marketing speak and buzzwords\n- No emojis or excessive punctuation\n- No phrases like \"we're excited to announce\"\n- No meta-commentary about the release itself\n- Focus on facts and implications, not enthusiasm\n\nStructure your notes logically:\n- Start with the most important changes\n- Group related changes together\n- Explain breaking changes clearly\n- Include practical examples when helpful\n\n## Output Format\n\nWhen ready, format your response as JSON:\n\nRELEASE_NOTES:\n{\n \"title\": \"Clear, factual title describing the main changes\",\n \"body\": \"Detailed release notes in Markdown format\"\n}\n\nOutput only the JSON. No conversational remarks or follow-up offers."
66
+ },
67
+ {
68
+ "role": "user",
69
+ "content": "I need comprehensive release notes for changes from main to HEAD.\n\n## Commit Log\ncommit 74b2d617bf5f22b3731e7e90dd557c5c9a01b49b\nAuthor: Tim O'Brien <tobrien@discursive.com>\nDate: Tue Jan 13 00:29:26 2026 -0800\n\n chore(release): bump @riotprompt/execution-openai to 0.0.4\n\ncommit e65fb8cd33f3779fcd130833735c290c59d07f8c\nAuthor: Tim O'Brien <tobrien@discursive.com>\nDate: Mon Jan 12 23:41:08 2026 -0800\n\n chore(build): switch to ESM-only output, require Node 24, and target ES2024\n\ncommit 3d4aa2f5468b4a79dd498c0ba88fd93397b53160\nAuthor: Tim O'Brien <tobrien@discursive.com>\nDate: Mon Jan 12 22:10:33 2026 -0800\n\n chore: bump to v0.0.4-dev.0\n\n\n## Diff Summary\ndiff --git a/package.json b/package.json\nindex fb11a9c..e93791f 100644\n--- a/package.json\n+++ b/package.json\n@@ -1,18 +1,19 @@\n {\n \"name\": \"@riotprompt/execution-openai\",\n- \"version\": \"0.0.3\",\n+ \"version\": \"0.0.4\",\n \"description\": \"OpenAI provider for execution - implements Provider interface\",\n \"type\": \"module\",\n- \"main\": \"./dist/index.cjs\",\n- \"module\": \"./dist/index.js\",\n+ \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n- \"import\": \"./dist/index.js\",\n- \"require\": \"./dist/index.cjs\"\n+ \"import\": \"./dist/index.js\"\n }\n },\n+ \"engines\": {\n+ \"node\": \">=24.0.0\"\n+ },\n \"scripts\": {\n \"clean\": \"rm -rf dist\",\n \"build\": \"vite build\",\ndiff --git a/tsconfig.json b/tsconfig.json\nindex 50dd1ef..85ef4cf 100644\n--- a/tsconfig.json\n+++ b/tsconfig.json\n@@ -1,7 +1,7 @@\n {\n \"compilerOptions\": {\n- \"target\": \"ES2022\",\n- \"lib\": [\"ES2022\"],\n+ \"target\": \"ES2024\",\n+ \"lib\": [\"ES2024\"],\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n@@ -18,4 +18,3 @@\n \"include\": [\"src/**/*\"],\n \"exclude\": [\"node_modules\", \"dist\", \"tests\"]\n }\n-\ndiff --git a/vite.config.ts b/vite.config.ts\nindex 92587c6..4928eab 100644\n--- a/vite.config.ts\n+++ b/vite.config.ts\n@@ -1,14 +1,13 @@\n import { defineConfig } from \"vite\";\n import dts from \"vite-plugin-dts\";\n-import { resolve } from \"path\";\n \n export default defineConfig({\n build: {\n lib: {\n- entry: resolve(__dirname, \"src/index.ts\"),\n+ entry: \"src/index.ts\",\n name: \"execution-openai\",\n- fileName: (format) => (format === \"es\" ? \"index.js\" : \"index.cjs\"),\n- formats: [\"es\", \"cjs\"],\n+ fileName: () => \"index.js\",\n+ formats: [\"es\"],\n },\n rollupOptions: {\n external: [\"openai\", \"tiktoken\", \"execution\"],\n@@ -18,4 +17,3 @@ export default defineConfig({\n },\n plugins: [dts({ rollupTypes: true })],\n });\n-\n\n\nAnalyze these changes and write clear release notes. Consider:\n- What's the main story of this release?\n- What problems does it solve?\n- What's the impact on users and developers?\n- Are there breaking changes?\n\nIf context information is provided, use it only if relevant to this specific package.\nDon't force connections that don't exist - if context describes changes in other packages\nor unrelated features, simply ignore it and focus on what actually changed in this release.\n\nInvestigate as needed to write accurate, helpful release notes."
70
+ },
71
+ {
72
+ "role": "assistant",
73
+ "content": null,
74
+ "tool_calls": [
75
+ {
76
+ "id": "call_K8L3ApYe4ravGSozeCNYd7TZ",
77
+ "type": "function",
78
+ "function": {
79
+ "name": "get_release_stats",
80
+ "arguments": "{\"fromRef\": \"main\", \"toRef\": \"HEAD\"}"
81
+ }
82
+ },
83
+ {
84
+ "id": "call_wNRmMvBmIMMXKMH2DI0wL7rM",
85
+ "type": "function",
86
+ "function": {
87
+ "name": "analyze_commit_patterns",
88
+ "arguments": "{\"fromRef\": \"main\", \"toRef\": \"HEAD\"}"
89
+ }
90
+ },
91
+ {
92
+ "id": "call_6k6YexcLLkdeWrWXTbxeWFa0",
93
+ "type": "function",
94
+ "function": {
95
+ "name": "get_breaking_changes",
96
+ "arguments": "{\"fromRef\": \"main\", \"toRef\": \"HEAD\"}"
97
+ }
98
+ },
99
+ {
100
+ "id": "call_4PbigDxJ7XGBH2rrvxc0rtoR",
101
+ "type": "function",
102
+ "function": {
103
+ "name": "get_tag_history",
104
+ "arguments": "{\"limit\": 10, \"pattern\": \"v*\"}"
105
+ }
106
+ }
107
+ ]
108
+ },
109
+ {
110
+ "role": "tool",
111
+ "tool_call_id": "call_K8L3ApYe4ravGSozeCNYd7TZ",
112
+ "content": "Total commits: 3\n\nContributors:\n 3\tTim O'Brien\n\n\nFile changes: 3 files changed, 11 insertions(+), 13 deletions(-)\n\nTop 10 most changed files:\n vite.config.ts | 8 +++-----\n tsconfig.json | 5 ++---\n package.json | 11 ++++++-----\n 3 files changed, 11 insertions(+), 13 deletions(-)\n",
113
+ "name": "get_release_stats"
114
+ },
115
+ {
116
+ "role": "tool",
117
+ "tool_call_id": "call_wNRmMvBmIMMXKMH2DI0wL7rM",
118
+ "content": "Commit types:\n chore: 3\n\nTop keywords in commits:\n chore: 3\n release: 1\n riotprompt: 1\n execution: 1\n openai: 1\n build: 1\n switch: 1\n output: 1\n require: 1\n target: 1\n es2024: 1",
119
+ "name": "analyze_commit_patterns"
120
+ },
121
+ {
122
+ "role": "tool",
123
+ "tool_call_id": "call_6k6YexcLLkdeWrWXTbxeWFa0",
124
+ "content": "No obvious breaking changes detected. Manual review recommended for API changes.",
125
+ "name": "get_breaking_changes"
126
+ },
127
+ {
128
+ "role": "tool",
129
+ "tool_call_id": "call_4PbigDxJ7XGBH2rrvxc0rtoR",
130
+ "content": "Recent release tags:\nv0.0.3: 2026-01-12 22:09:39 -0800 - chore(release): bump @riotprompt/execution-openai to 0.0.3 (#6)\nv0.0.3-dev.0: tag v0.0.3-dev.0\nTagger: Tim O'Brien <tobrien@discursive.com>\n\n0.0.3-dev.0\n2026-01-10 17:54:34 -0800 - 0.0.3-dev.0\nv0.0.2: 2026-01-10 17:51:23 -0800 - Updated and separated tests (#5)\nv0.0.2-dev.0: tag v0.0.2-dev.0\nTagger: Tim O'Brien <tobrien@discursive.com>\n\n0.0.2-dev.0\n2026-01-10 11:22:13 -0800 - 0.0.2-dev.0",
131
+ "name": "get_tag_history"
132
+ },
133
+ {
134
+ "role": "assistant",
135
+ "content": null,
136
+ "tool_calls": [
137
+ {
138
+ "id": "call_b8SjuWgO1ozWfmRQNeaM3dv8",
139
+ "type": "function",
140
+ "function": {
141
+ "name": "get_file_content",
142
+ "arguments": "{\"filePath\": \"package.json\", \"includeLineNumbers\": true}"
143
+ }
144
+ },
145
+ {
146
+ "id": "call_BqA2ZnAVnan0aboTw8qftKXA",
147
+ "type": "function",
148
+ "function": {
149
+ "name": "get_file_content",
150
+ "arguments": "{\"filePath\": \"vite.config.ts\", \"includeLineNumbers\": true}"
151
+ }
152
+ },
153
+ {
154
+ "id": "call_FTisVZlhbak4NqyszwvxtZjF",
155
+ "type": "function",
156
+ "function": {
157
+ "name": "get_file_content",
158
+ "arguments": "{\"filePath\": \"tsconfig.json\", \"includeLineNumbers\": true}"
159
+ }
160
+ },
161
+ {
162
+ "id": "call_KnlNz7DR07wxxfGCTTPr59Ea",
163
+ "type": "function",
164
+ "function": {
165
+ "name": "search_codebase",
166
+ "arguments": "{\"query\": \"exports\", \"contextLines\": 3}"
167
+ }
168
+ },
169
+ {
170
+ "id": "call_xgksy3YnkLTFARywxLHzAmCh",
171
+ "type": "function",
172
+ "function": {
173
+ "name": "get_file_dependencies",
174
+ "arguments": "{\"filePaths\": [\"src/index.ts\", \"package.json\", \"vite.config.ts\", \"tsconfig.json\"]}"
175
+ }
176
+ }
177
+ ]
178
+ },
179
+ {
180
+ "role": "tool",
181
+ "tool_call_id": "call_b8SjuWgO1ozWfmRQNeaM3dv8",
182
+ "content": "1: {\n2: \"name\": \"@riotprompt/execution-openai\",\n3: \"version\": \"0.0.4\",\n4: \"description\": \"OpenAI provider for execution - implements Provider interface\",\n5: \"type\": \"module\",\n6: \"main\": \"./dist/index.js\",\n7: \"types\": \"./dist/index.d.ts\",\n8: \"exports\": {\n9: \".\": {\n10: \"types\": \"./dist/index.d.ts\",\n11: \"import\": \"./dist/index.js\"\n12: }\n13: },\n14: \"engines\": {\n15: \"node\": \">=24.0.0\"\n16: },\n17: \"scripts\": {\n18: \"clean\": \"rm -rf dist\",\n19: \"build\": \"vite build\",\n20: \"test\": \"vitest run --coverage\",\n21: \"test:coverage\": \"vitest run --coverage\",\n22: \"lint\": \"eslint src\",\n23: \"precommit\": \"npm run lint && npm run test\",\n24: \"prepublishOnly\": \"npm run clean && npm run build\"\n25: },\n26: \"keywords\": [\n27: \"llm\",\n28: \"openai\",\n29: \"gpt\",\n30: \"execution\",\n31: \"provider\"\n32: ],\n33: \"author\": \"Tim O'Brien <tobrien@discursive.com>\",\n34: \"license\": \"Apache-2.0\",\n35: \"repository\": {\n36: \"type\": \"git\",\n37: \"url\": \"https://github.com/kjerneverk/execution-openai\"\n38: },\n39: \"dependencies\": {\n40: \"openai\": \"^4.103.0\",\n41: \"tiktoken\": \"^1.0.21\"\n42: },\n43: \"devDependencies\": {\n44: \"@types/node\": \"^25.0.6\",\n45: \"@typescript-eslint/eslint-plugin\": \"^8.33.1\",\n46: \"@typescript-eslint/parser\": \"^8.33.1\",\n47: \"@vitest/coverage-v8\": \"^3.2.4\",\n48: \"eslint\": \"^9.28.0\",\n49: \"globals\": \"^16.2.0\",\n50: \"typescript\": \"^5.8.3\",\n51: \"vite\": \"^7.0.4\",\n52: \"vite-plugin-dts\": \"^4.5.4\",\n53: \"vitest\": \"^3.2.4\"\n54: }\n55: }\n56: ",
183
+ "name": "get_file_content"
184
+ },
185
+ {
186
+ "role": "tool",
187
+ "tool_call_id": "call_BqA2ZnAVnan0aboTw8qftKXA",
188
+ "content": "1: import { defineConfig } from \"vite\";\n2: import dts from \"vite-plugin-dts\";\n3: \n4: export default defineConfig({\n5: build: {\n6: lib: {\n7: entry: \"src/index.ts\",\n8: name: \"execution-openai\",\n9: fileName: () => \"index.js\",\n10: formats: [\"es\"],\n11: },\n12: rollupOptions: {\n13: external: [\"openai\", \"tiktoken\", \"execution\"],\n14: },\n15: sourcemap: true,\n16: minify: false,\n17: },\n18: plugins: [dts({ rollupTypes: true })],\n19: });\n20: ",
189
+ "name": "get_file_content"
190
+ },
191
+ {
192
+ "role": "tool",
193
+ "tool_call_id": "call_FTisVZlhbak4NqyszwvxtZjF",
194
+ "content": "1: {\n2: \"compilerOptions\": {\n3: \"target\": \"ES2024\",\n4: \"lib\": [\"ES2024\"],\n5: \"module\": \"ESNext\",\n6: \"moduleResolution\": \"bundler\",\n7: \"strict\": true,\n8: \"declaration\": true,\n9: \"declarationMap\": true,\n10: \"sourceMap\": true,\n11: \"esModuleInterop\": true,\n12: \"skipLibCheck\": true,\n13: \"forceConsistentCasingInFileNames\": true,\n14: \"outDir\": \"./dist\",\n15: \"rootDir\": \"./src\",\n16: \"types\": [\"node\"]\n17: },\n18: \"include\": [\"src/**/*\"],\n19: \"exclude\": [\"node_modules\", \"dist\", \"tests\"]\n20: }\n21: ",
195
+ "name": "get_file_content"
196
+ },
197
+ {
198
+ "role": "tool",
199
+ "tool_call_id": "call_KnlNz7DR07wxxfGCTTPr59Ea",
200
+ "content": "package.json-5- \"type\": \"module\",\npackage.json-6- \"main\": \"./dist/index.js\",\npackage.json-7- \"types\": \"./dist/index.d.ts\",\npackage.json:8: \"exports\": {\npackage.json-9- \".\": {\npackage.json-10- \"types\": \"./dist/index.d.ts\",\npackage.json-11- \"import\": \"./dist/index.js\"\n--\ntests/index.test.ts-118- });\ntests/index.test.ts-119-});\ntests/index.test.ts-120-\ntests/index.test.ts:121:describe('Type exports', () => {\ntests/index.test.ts-122- it('should export Message type', () => {\ntests/index.test.ts-123- const msg: Message = {\ntests/index.test.ts-124- role: 'user',\n",
201
+ "name": "search_codebase"
202
+ },
203
+ {
204
+ "role": "tool",
205
+ "tool_call_id": "call_xgksy3YnkLTFARywxLHzAmCh",
206
+ "content": "No files found that import the specified files",
207
+ "name": "get_file_dependencies"
208
+ },
209
+ {
210
+ "role": "assistant",
211
+ "content": null,
212
+ "tool_calls": [
213
+ {
214
+ "id": "call_VDIPqUJrofCELh6bhXGg7Xcl",
215
+ "type": "function",
216
+ "function": {
217
+ "name": "get_file_content",
218
+ "arguments": "{\"filePath\": \"src/index.ts\", \"includeLineNumbers\": true}"
219
+ }
220
+ },
221
+ {
222
+ "id": "call_E14PsIXzsP3ZTBE8K6AOFgXZ",
223
+ "type": "function",
224
+ "function": {
225
+ "name": "get_file_content",
226
+ "arguments": "{\"filePath\": \"tests/index.test.ts\", \"includeLineNumbers\": true}"
227
+ }
228
+ },
229
+ {
230
+ "id": "call_EroMJsprfdHhSb2oAj6MraYK",
231
+ "type": "function",
232
+ "function": {
233
+ "name": "get_related_tests",
234
+ "arguments": "{\"filePaths\": [\"src/index.ts\"]}"
235
+ }
236
+ },
237
+ {
238
+ "id": "call_MSaxx4ilVU9AXRpgMDEO1iv5",
239
+ "type": "function",
240
+ "function": {
241
+ "name": "get_file_history",
242
+ "arguments": "{\"filePaths\": [\"package.json\", \"vite.config.ts\", \"tsconfig.json\"], \"limit\": 20, \"format\": \"detailed\"}"
243
+ }
244
+ }
245
+ ]
246
+ },
247
+ {
248
+ "role": "tool",
249
+ "tool_call_id": "call_VDIPqUJrofCELh6bhXGg7Xcl",
250
+ "content": "1: /**\n2: * Execution OpenAI Package\n3: *\n4: * OpenAI provider implementation for LLM execution.\n5: *\n6: * @packageDocumentation\n7: */\n8: \n9: import OpenAI from 'openai';\n10: \n11: // ===== INLINE TYPES (from 'execution' package) =====\n12: // These types are duplicated here for build independence.\n13: // When 'execution' is published, these can be imported from there.\n14: \n15: export type Model = string;\n16: \n17: export interface Message {\n18: role: 'user' | 'assistant' | 'system' | 'developer' | 'tool';\n19: content: string | string[] | null;\n20: name?: string;\n21: }\n22: \n23: export interface Request {\n24: messages: Message[];\n25: model: Model;\n26: responseFormat?: any;\n27: validator?: any;\n28: addMessage(message: Message): void;\n29: }\n30: \n31: export interface ProviderResponse {\n32: content: string;\n33: model: string;\n34: usage?: {\n35: inputTokens: number;\n36: outputTokens: number;\n37: };\n38: toolCalls?: Array<{\n39: id: string;\n40: type: 'function';\n41: function: {\n42: name: string;\n43: arguments: string;\n44: };\n45: }>;\n46: }\n47: \n48: export interface ExecutionOptions {\n49: apiKey?: string;\n50: model?: string;\n51: temperature?: number;\n52: maxTokens?: number;\n53: timeout?: number;\n54: retries?: number;\n55: }\n56: \n57: export interface Provider {\n58: readonly name: string;\n59: execute(request: Request, options?: ExecutionOptions): Promise<ProviderResponse>;\n60: supportsModel?(model: Model): boolean;\n61: }\n62: \n63: /**\n64: * OpenAI Provider implementation\n65: */\n66: export class OpenAIProvider implements Provider {\n67: readonly name = 'openai';\n68: \n69: /**\n70: * Check if this provider supports a given model\n71: */\n72: supportsModel(model: Model): boolean {\n73: if (!model) return true; // Default to OpenAI\n74: return (\n75: model.startsWith('gpt') ||\n76: model.startsWith('o1') ||\n77: model.startsWith('o3') ||\n78: model.startsWith('o4')\n79: );\n80: }\n81: \n82: /**\n83: * Execute a request against OpenAI\n84: */\n85: async execute(\n86: request: Request,\n87: options: ExecutionOptions = {}\n88: ): Promise<ProviderResponse> {\n89: const apiKey = options.apiKey || process.env.OPENAI_API_KEY;\n90: if (!apiKey) throw new Error('OpenAI API key is required');\n91: \n92: const client = new OpenAI({ apiKey });\n93: \n94: const model = options.model || request.model || 'gpt-4';\n95: \n96: // Convert messages to OpenAI format\n97: const messages = request.messages.map((msg) => {\n98: const role =\n99: msg.role === 'developer' ? 'system' : msg.role;\n100: \n101: return {\n102: role: role,\n103: content:\n104: typeof msg.content === 'string'\n105: ? msg.content\n106: : JSON.stringify(msg.content),\n107: name: msg.name,\n108: } as any;\n109: });\n110: \n111: const response = await client.chat.completions.create({\n112: model: model,\n113: messages: messages,\n114: temperature: options.temperature,\n115: max_tokens: options.maxTokens,\n116: response_format: request.responseFormat,\n117: });\n118: \n119: const choice = response.choices[0];\n120: \n121: return {\n122: content: choice.message.content || '',\n123: model: response.model,\n124: usage: response.usage\n125: ? {\n126: inputTokens: response.usage.prompt_tokens,\n127: outputTokens: response.usage.completion_tokens,\n128: }\n129: : undefined,\n130: toolCalls: choice.message.tool_calls?.map((tc) => ({\n131: id: tc.id,\n132: type: 'function' as const,\n133: function: {\n134: name: tc.function.name,\n135: arguments: tc.function.arguments,\n136: },\n137: })),\n138: };\n139: }\n140: }\n141: \n142: /**\n143: * Create a new OpenAI provider instance\n144: */\n145: export function createOpenAIProvider(): OpenAIProvider {\n146: return new OpenAIProvider();\n147: }\n148: \n149: /**\n150: * Package version\n151: */\n152: export const VERSION = '0.0.1';\n153: \n154: export default OpenAIProvider;\n155: ",
251
+ "name": "get_file_content"
252
+ },
253
+ {
254
+ "role": "tool",
255
+ "tool_call_id": "call_E14PsIXzsP3ZTBE8K6AOFgXZ",
256
+ "content": "1: /**\n2: * Tests for execution-openai package\n3: */\n4: \n5: import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';\n6: import {\n7: OpenAIProvider,\n8: createOpenAIProvider,\n9: VERSION,\n10: type Message,\n11: type Request,\n12: type ExecutionOptions,\n13: type ProviderResponse,\n14: type Provider,\n15: } from '../src/index.js';\n16: \n17: describe('OpenAIProvider', () => {\n18: let provider: OpenAIProvider;\n19: \n20: beforeEach(() => {\n21: provider = new OpenAIProvider();\n22: });\n23: \n24: describe('name', () => {\n25: it('should have name \"openai\"', () => {\n26: expect(provider.name).toBe('openai');\n27: });\n28: });\n29: \n30: describe('supportsModel', () => {\n31: it('should support GPT models', () => {\n32: expect(provider.supportsModel('gpt-4')).toBe(true);\n33: expect(provider.supportsModel('gpt-4o')).toBe(true);\n34: expect(provider.supportsModel('gpt-4-turbo')).toBe(true);\n35: expect(provider.supportsModel('gpt-3.5-turbo')).toBe(true);\n36: });\n37: \n38: it('should support O1/O3/O4 models', () => {\n39: expect(provider.supportsModel('o1-preview')).toBe(true);\n40: expect(provider.supportsModel('o1-mini')).toBe(true);\n41: expect(provider.supportsModel('o3-mini')).toBe(true);\n42: expect(provider.supportsModel('o4-mini')).toBe(true);\n43: });\n44: \n45: it('should not support Claude models', () => {\n46: expect(provider.supportsModel('claude-3-opus-20240229')).toBe(false);\n47: expect(provider.supportsModel('claude-3-sonnet-20240229')).toBe(false);\n48: });\n49: \n50: it('should not support Gemini models', () => {\n51: expect(provider.supportsModel('gemini-1.5-pro')).toBe(false);\n52: expect(provider.supportsModel('gemini-1.5-flash')).toBe(false);\n53: });\n54: \n55: it('should return true for empty/undefined model (default to OpenAI)', () => {\n56: expect(provider.supportsModel('')).toBe(true);\n57: });\n58: });\n59: \n60: describe('execute', () => {\n61: const originalEnv = process.env;\n62: \n63: beforeEach(() => {\n64: process.env = { ...originalEnv };\n65: delete process.env.OPENAI_API_KEY;\n66: });\n67: \n68: afterEach(() => {\n69: process.env = originalEnv;\n70: });\n71: \n72: it('should throw error when no API key is provided', async () => {\n73: const request: Request = {\n74: messages: [{ role: 'user', content: 'Hello' }],\n75: model: 'gpt-4',\n76: addMessage: vi.fn(),\n77: };\n78: \n79: await expect(provider.execute(request)).rejects.toThrow(\n80: 'OpenAI API key is required'\n81: );\n82: });\n83: \n84: it('should throw error when API key is empty string', async () => {\n85: const request: Request = {\n86: messages: [{ role: 'user', content: 'Hello' }],\n87: model: 'gpt-4',\n88: addMessage: vi.fn(),\n89: };\n90: \n91: await expect(provider.execute(request, { apiKey: '' })).rejects.toThrow(\n92: 'OpenAI API key is required'\n93: );\n94: });\n95: });\n96: \n97: describe('implements Provider interface', () => {\n98: it('should satisfy Provider interface', () => {\n99: const p: Provider = provider;\n100: expect(p.name).toBe('openai');\n101: expect(typeof p.execute).toBe('function');\n102: expect(typeof p.supportsModel).toBe('function');\n103: });\n104: });\n105: });\n106: \n107: describe('createOpenAIProvider', () => {\n108: it('should create a new OpenAIProvider instance', () => {\n109: const provider = createOpenAIProvider();\n110: expect(provider).toBeInstanceOf(OpenAIProvider);\n111: expect(provider.name).toBe('openai');\n112: });\n113: });\n114: \n115: describe('VERSION', () => {\n116: it('should export version string', () => {\n117: expect(VERSION).toBe('0.0.1');\n118: });\n119: });\n120: \n121: describe('Type exports', () => {\n122: it('should export Message type', () => {\n123: const msg: Message = {\n124: role: 'user',\n125: content: 'Hello',\n126: };\n127: expect(msg.role).toBe('user');\n128: expect(msg.content).toBe('Hello');\n129: });\n130: \n131: it('should support all message roles', () => {\n132: const roles: Message['role'][] = ['user', 'assistant', 'system', 'developer', 'tool'];\n133: roles.forEach(role => {\n134: const msg: Message = { role, content: 'test' };\n135: expect(msg.role).toBe(role);\n136: });\n137: });\n138: \n139: it('should support array content', () => {\n140: const msg: Message = {\n141: role: 'user',\n142: content: ['Hello', 'World'],\n143: };\n144: expect(Array.isArray(msg.content)).toBe(true);\n145: });\n146: \n147: it('should support null content', () => {\n148: const msg: Message = {\n149: role: 'assistant',\n150: content: null,\n151: };\n152: expect(msg.content).toBeNull();\n153: });\n154: \n155: it('should export ExecutionOptions type', () => {\n156: const opts: ExecutionOptions = {\n157: apiKey: 'test-key',\n158: model: 'gpt-4',\n159: temperature: 0.7,\n160: maxTokens: 1000,\n161: timeout: 30000,\n162: retries: 3,\n163: };\n164: expect(opts.apiKey).toBe('test-key');\n165: expect(opts.temperature).toBe(0.7);\n166: });\n167: \n168: it('should export ProviderResponse type', () => {\n169: const response: ProviderResponse = {\n170: content: 'Hello!',\n171: model: 'gpt-4',\n172: usage: {\n173: inputTokens: 10,\n174: outputTokens: 5,\n175: },\n176: };\n177: expect(response.content).toBe('Hello!');\n178: expect(response.usage?.inputTokens).toBe(10);\n179: });\n180: \n181: it('should support toolCalls in ProviderResponse', () => {\n182: const response: ProviderResponse = {\n183: content: '',\n184: model: 'gpt-4',\n185: toolCalls: [\n186: {\n187: id: 'call_123',\n188: type: 'function',\n189: function: {\n190: name: 'get_weather',\n191: arguments: '{\"location\": \"NYC\"}',\n192: },\n193: },\n194: ],\n195: };\n196: expect(response.toolCalls).toHaveLength(1);\n197: expect(response.toolCalls?.[0].function.name).toBe('get_weather');\n198: });\n199: });\n200: \n201: ",
257
+ "name": "get_file_content"
258
+ },
259
+ {
260
+ "role": "tool",
261
+ "tool_call_id": "call_EroMJsprfdHhSb2oAj6MraYK",
262
+ "content": "Found related test files:\nsrc/index.ts",
263
+ "name": "get_related_tests"
264
+ },
265
+ {
266
+ "role": "tool",
267
+ "tool_call_id": "call_MSaxx4ilVU9AXRpgMDEO1iv5",
268
+ "content": "74b2d617bf5f22b3731e7e90dd557c5c9a01b49b\nTim O'Brien (tobrien@discursive.com)\nTue Jan 13 00:29:26 2026 -0800\nchore(release): bump @riotprompt/execution-openai to 0.0.4\n\n\n---\ne65fb8cd33f3779fcd130833735c290c59d07f8c\nTim O'Brien (tobrien@discursive.com)\nMon Jan 12 23:41:08 2026 -0800\nchore(build): switch to ESM-only output, require Node 24, and target ES2024\n\n\n---\n3d4aa2f5468b4a79dd498c0ba88fd93397b53160\nTim O'Brien (tobrien@discursive.com)\nMon Jan 12 22:10:33 2026 -0800\nchore: bump to v0.0.4-dev.0\n\n\n---\n77c696fc4b15e11624eef8b36a695ec6fd5ebac1\nTim O'Brien (tobrien@discursive.com)\nMon Jan 12 22:09:39 2026 -0800\nchore(release): bump @riotprompt/execution-openai to 0.0.3 (#6)\n\n* 0.0.2-dev.0\n\n* Updated and separated tests\n\n* 0.0.3-dev.0\n\n* ci: bump GitHub Actions Node to 24 and use npm install\n\n* chore(release): bump @riotprompt/execution-openai to 0.0.3\n---\nd3ddebdaed42578185cf6a9717896e0dcc2fa2f5\nTim O'Brien (tobrien@discursive.com)\nSat Jan 10 17:51:23 2026 -0800\nUpdated and separated tests (#5)\n\n* 0.0.2-dev.0\n\n* Updated and separated tests\n---\n52ade0898ae977c0e7058b0aa15568a9ded40825\nTim O'Brien (tobrien@discursive.com)\nSat Jan 10 11:21:52 2026 -0800\nFirst commit\n\n\n---\n",
269
+ "name": "get_file_history"
270
+ },
271
+ {
272
+ "role": "assistant",
273
+ "content": null,
274
+ "tool_calls": [
275
+ {
276
+ "id": "call_JRmZH8JQtqrNFU7fnYO4RPHz",
277
+ "type": "function",
278
+ "function": {
279
+ "name": "compare_previous_release",
280
+ "arguments": "{\"previousTag\":\"v0.0.3\",\"currentRef\":\"HEAD\",\"statsOnly\":false}"
281
+ }
282
+ }
283
+ ]
284
+ },
285
+ {
286
+ "role": "tool",
287
+ "tool_call_id": "call_JRmZH8JQtqrNFU7fnYO4RPHz",
288
+ "content": "Comparison between v0.0.3 and HEAD:\n\nCommits: 3\n\nFile changes:\n package.json | 11 ++++++-----\n tsconfig.json | 5 ++---\n vite.config.ts | 8 +++-----\n 3 files changed, 11 insertions(+), 13 deletions(-)\n\n\nCommit summary:\n74b2d61 chore(release): bump @riotprompt/execution-openai to 0.0.4\ne65fb8c chore(build): switch to ESM-only output, require Node 24, and target ES2024\n3d4aa2f chore: bump to v0.0.4-dev.0\n",
289
+ "name": "compare_previous_release"
290
+ },
291
+ {
292
+ "role": "assistant",
293
+ "content": "{\n \"title\": \"@riotprompt/execution-openai v0.0.4 — ESM-only build, Node 24+, ES2024 target\",\n \"body\": \"## Overview\\nThis release is primarily a packaging/build update. The library now ships **ESM-only**, requires **Node.js 24+**, and is compiled targeting **ES2024**.\\n\\nThere are no intentional runtime/API behavior changes to `OpenAIProvider` itself in this release; the impact is on how the package is consumed and the minimum supported Node version.\\n\\n## Breaking changes\\n### ESM-only distribution (CommonJS output removed)\\n- The package no longer builds/publishes a CJS artifact (`dist/index.cjs`).\\n- `package.json` `exports` now provides only:\\n - `import: ./dist/index.js`\\n - `types: ./dist/index.d.ts`\\n- `require` consumers will no longer work via `require('@riotprompt/execution-openai')`.\\n\\n**What to do if you were using `require()`**\\n- Migrate your project/module to ESM and use `import`.\\n- Or, from CommonJS, use a dynamic import:\\n ```js\\n // CJS file\\n const { OpenAIProvider } = await import('@riotprompt/execution-openai');\\n ```\\n\\n### Node.js 24+ required\\n- `package.json` now includes `engines: { \\\"node\\\": \\\">=24.0.0\\\" }`.\\n- If you run this package on Node < 24, installs may be blocked (depending on your package manager settings) and runtime compatibility is not supported.\\n\\n## Developer-facing changes\\n- Build output is now **ESM only** via Vite (`formats: [\\\"es\\\"]`) and always emits `index.js`.\\n- TypeScript compilation target/lib updated from **ES2022 → ES2024**.\\n\\n## Changelog (from main → HEAD)\\n- **Build:** Switch to ESM-only output; remove CJS build target.\\n- **Runtime support:** Require Node.js **>= 24**.\\n- **Tooling:** Target **ES2024** in `tsconfig`.\\n- **Release:** Bump package version to **0.0.4**.\"\n}"
294
+ }
295
+ ]
296
+ ```
297
+
298
+ </details>
299
+
300
+ ## Generated Release Notes
301
+
302
+ ### Title
303
+ ```
304
+ {
305
+ ```
306
+
307
+ ### Body
308
+ ```markdown
309
+ "title": "@riotprompt/execution-openai v0.0.4 — ESM-only build, Node 24+, ES2024 target",
310
+ "body": "## Overview\nThis release is primarily a packaging/build update. The library now ships **ESM-only**, requires **Node.js 24+**, and is compiled targeting **ES2024**.\n\nThere are no intentional runtime/API behavior changes to `OpenAIProvider` itself in this release; the impact is on how the package is consumed and the minimum supported Node version.\n\n## Breaking changes\n### ESM-only distribution (CommonJS output removed)\n- The package no longer builds/publishes a CJS artifact (`dist/index.cjs`).\n- `package.json` `exports` now provides only:\n - `import: ./dist/index.js`\n - `types: ./dist/index.d.ts`\n- `require` consumers will no longer work via `require('@riotprompt/execution-openai')`.\n\n**What to do if you were using `require()`**\n- Migrate your project/module to ESM and use `import`.\n- Or, from CommonJS, use a dynamic import:\n ```js\n // CJS file\n const { OpenAIProvider } = await import('@riotprompt/execution-openai');\n ```\n\n### Node.js 24+ required\n- `package.json` now includes `engines: { \"node\": \">=24.0.0\" }`.\n- If you run this package on Node < 24, installs may be blocked (depending on your package manager settings) and runtime compatibility is not supported.\n\n## Developer-facing changes\n- Build output is now **ESM only** via Vite (`formats: [\"es\"]`) and always emits `index.js`.\n- TypeScript compilation target/lib updated from **ES2022 → ES2024**.\n\n## Changelog (from main → HEAD)\n- **Build:** Switch to ESM-only output; remove CJS build target.\n- **Runtime support:** Require Node.js **>= 24**.\n- **Tooling:** Target **ES2024** in `tsconfig`.\n- **Release:** Bump package version to **0.0.4**."
311
+ }
312
+ ```