@pencil-agent/nano-pencil 2.0.0 → 2.0.1

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 (195) hide show
  1. package/README.md +267 -267
  2. package/dist/build-meta.json +3 -3
  3. package/dist/core/export-html/AGENT.md +11 -11
  4. package/dist/core/export-html/template.css +971 -971
  5. package/dist/core/export-html/template.html +54 -54
  6. package/dist/core/mcp/mcp-client.d.ts +3 -1
  7. package/dist/core/mcp/mcp-client.js +6 -6
  8. package/dist/core/mcp/mcp-config.d.ts +3 -3
  9. package/dist/core/mcp/mcp-config.js +1 -1
  10. package/dist/core/mcp/mcp-manager.d.ts +5 -1
  11. package/dist/core/mcp/mcp-manager.js +1 -1
  12. package/dist/core/platform/config/resource-loader.d.ts +2 -0
  13. package/dist/core/platform/config/resource-loader.js +2 -2
  14. package/dist/core/runtime/agent-session.d.ts +12 -0
  15. package/dist/core/runtime/agent-session.js +8 -8
  16. package/dist/core/runtime/sdk.d.ts +8 -0
  17. package/dist/core/runtime/sdk.js +1 -1
  18. package/dist/extensions/builtin/AGENT.md +115 -115
  19. package/dist/extensions/builtin/browser/AGENT.md +17 -17
  20. package/dist/extensions/builtin/browser/agent-workspace/agent_helpers.py +12 -12
  21. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/amazon/product-search.md +198 -198
  22. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/archive-org/scraping.md +341 -341
  23. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv/scraping.md +311 -311
  24. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv-bulk/scraping.md +333 -333
  25. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/atlas/overview.md +70 -70
  26. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/booking-com/scraping.md +578 -578
  27. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/capterra/scraping.md +440 -440
  28. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/centilebrain/generate-estimates.md +110 -110
  29. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coingecko/scraping.md +325 -325
  30. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coinmarketcap/scraping.md +463 -463
  31. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coursera/scraping.md +360 -360
  32. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/craigslist/scraping.md +390 -390
  33. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/crossref/scraping.md +568 -568
  34. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/dev-to/scraping.md +323 -323
  35. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/duckduckgo/scraping.md +349 -349
  36. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/ebay/scraping.md +435 -435
  37. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/etsy/scraping.md +506 -506
  38. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/eventbrite/scraping.md +363 -363
  39. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/expedia/automation.md +168 -168
  40. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/groups.md +236 -236
  41. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/pages.md +295 -295
  42. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/framer/editor.md +108 -108
  43. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/fred/scraping.md +493 -493
  44. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/g2/scraping.md +580 -580
  45. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/genius/scraping.md +511 -511
  46. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/repo-actions.md +65 -65
  47. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/scraping.md +184 -184
  48. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/glassdoor/scraping.md +543 -543
  49. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gmail/compose.md +122 -122
  50. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/goodreads/scraping.md +461 -461
  51. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gutenberg/scraping.md +383 -383
  52. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/hackernews/scraping.md +243 -243
  53. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/howlongtobeat/scraping.md +473 -473
  54. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/imdb/scraping.md +271 -271
  55. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/itch-io/scraping.md +436 -436
  56. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/job-boards/indeed-glassdoor.md +1021 -1021
  57. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/letterboxd/scraping.md +349 -349
  58. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/linkedin/invitation-manager.md +109 -109
  59. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/loom/folder-enumeration.md +170 -170
  60. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/macrotrends/scraping.md +537 -537
  61. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/article-hydration.md +120 -120
  62. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/scraping.md +414 -414
  63. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/metacritic/scraping.md +477 -477
  64. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/musicbrainz/scraping.md +478 -478
  65. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/nasa/scraping.md +339 -339
  66. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/news-aggregation/multi-source.md +205 -205
  67. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/open-library/scraping.md +472 -472
  68. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openalex/scraping.md +470 -470
  69. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openstreetmap/scraping.md +490 -490
  70. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/package-registries/npm-pypi.md +478 -478
  71. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/polymarket/scraping.md +234 -234
  72. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/producthunt/scraping.md +307 -307
  73. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/pubmed/scraping.md +421 -421
  74. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/quora/scraping.md +364 -364
  75. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rawg/scraping.md +352 -352
  76. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/reddit/scraping.md +124 -124
  77. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rest-countries/scraping.md +233 -233
  78. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/sec-edgar/scraping.md +361 -361
  79. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/README.md +36 -36
  80. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/embedded-apps.md +72 -72
  81. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/knowledge-base.md +109 -109
  82. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/polaris-inputs.md +137 -137
  83. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/soundcloud/scraping.md +362 -362
  84. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/spotify/scraping.md +339 -339
  85. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/stackoverflow/scraping.md +435 -435
  86. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/steam/scraping.md +575 -575
  87. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/substack/scraping.md +338 -338
  88. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/thetechgeeks/pricing.md +52 -52
  89. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tiktok/upload.md +107 -107
  90. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tradingview/scraping.md +309 -309
  91. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trello/boards-and-lists.md +88 -88
  92. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trustpilot/scraping.md +375 -375
  93. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/walmart/scraping.md +444 -444
  94. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wayback-machine/scraping.md +306 -306
  95. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/weather/scraping.md +398 -398
  96. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wellfound/scraping.md +596 -596
  97. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/world-bank/scraping.md +356 -356
  98. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/xiaohongshu/scraping.md +84 -84
  99. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/youtube/scraping.md +418 -418
  100. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/zillow/scraping.md +433 -433
  101. package/dist/extensions/builtin/browser/browser.md +73 -73
  102. package/dist/extensions/builtin/browser/install.md +142 -142
  103. package/dist/extensions/builtin/browser/interaction-skills/connection.md +48 -48
  104. package/dist/extensions/builtin/browser/interaction-skills/cookies.md +3 -3
  105. package/dist/extensions/builtin/browser/interaction-skills/cross-origin-iframes.md +3 -3
  106. package/dist/extensions/builtin/browser/interaction-skills/dialogs.md +64 -64
  107. package/dist/extensions/builtin/browser/interaction-skills/downloads.md +3 -3
  108. package/dist/extensions/builtin/browser/interaction-skills/drag-and-drop.md +3 -3
  109. package/dist/extensions/builtin/browser/interaction-skills/dropdowns.md +3 -3
  110. package/dist/extensions/builtin/browser/interaction-skills/iframes.md +3 -3
  111. package/dist/extensions/builtin/browser/interaction-skills/network-requests.md +3 -3
  112. package/dist/extensions/builtin/browser/interaction-skills/print-as-pdf.md +3 -3
  113. package/dist/extensions/builtin/browser/interaction-skills/profile-sync.md +90 -90
  114. package/dist/extensions/builtin/browser/interaction-skills/screenshots.md +17 -17
  115. package/dist/extensions/builtin/browser/interaction-skills/scrolling.md +3 -3
  116. package/dist/extensions/builtin/browser/interaction-skills/shadow-dom.md +3 -3
  117. package/dist/extensions/builtin/browser/interaction-skills/tabs.md +69 -69
  118. package/dist/extensions/builtin/browser/interaction-skills/uploads.md +1 -1
  119. package/dist/extensions/builtin/browser/interaction-skills/viewport.md +3 -3
  120. package/dist/extensions/builtin/browser/src/browser_harness/AGENT.md +15 -15
  121. package/dist/extensions/builtin/browser/src/browser_harness/__init__.py +8 -8
  122. package/dist/extensions/builtin/browser/src/browser_harness/_ipc.py +90 -90
  123. package/dist/extensions/builtin/browser/src/browser_harness/admin.py +722 -722
  124. package/dist/extensions/builtin/browser/src/browser_harness/daemon.py +328 -328
  125. package/dist/extensions/builtin/browser/src/browser_harness/helpers.py +396 -396
  126. package/dist/extensions/builtin/browser/src/browser_harness/run.py +103 -103
  127. package/dist/extensions/builtin/discipline/skills/brainstorming/SKILL.md +33 -33
  128. package/dist/extensions/builtin/discipline/skills/executing-plans/SKILL.md +25 -25
  129. package/dist/extensions/builtin/discipline/skills/finishing-development-branch/SKILL.md +25 -25
  130. package/dist/extensions/builtin/discipline/skills/receiving-code-review/SKILL.md +22 -22
  131. package/dist/extensions/builtin/discipline/skills/requesting-code-review/SKILL.md +31 -31
  132. package/dist/extensions/builtin/discipline/skills/systematic-debugging/SKILL.md +28 -28
  133. package/dist/extensions/builtin/discipline/skills/test-driven-development/SKILL.md +32 -32
  134. package/dist/extensions/builtin/discipline/skills/using-git-worktrees/SKILL.md +25 -25
  135. package/dist/extensions/builtin/discipline/skills/verification-before-completion/SKILL.md +27 -27
  136. package/dist/extensions/builtin/discipline/skills/writing-plans/SKILL.md +26 -26
  137. package/dist/extensions/builtin/goal/README.md +67 -67
  138. package/dist/extensions/builtin/grub/README.md +112 -112
  139. package/dist/extensions/builtin/link-world/agent-workspace/README.md +16 -16
  140. package/dist/extensions/builtin/link-world/internet-search/internet-search.md +65 -65
  141. package/dist/extensions/builtin/link-world/link-world-agent.md +82 -82
  142. package/dist/extensions/builtin/link-world/linkworld.md +313 -313
  143. package/dist/extensions/builtin/link-world/network-routing/network-routing.md +67 -67
  144. package/dist/extensions/builtin/loop/README.md +92 -92
  145. package/dist/extensions/builtin/mcp/figma-design.md +68 -68
  146. package/dist/extensions/builtin/mcp/mcp-management.md +85 -85
  147. package/dist/extensions/builtin/recap/AGENT.md +15 -15
  148. package/dist/extensions/builtin/sal/README.md +72 -72
  149. package/dist/extensions/builtin/security-audit/README.md +289 -289
  150. package/dist/extensions/builtin/team/AGENT.md +112 -112
  151. package/dist/extensions/builtin/team/TESTING.md +299 -299
  152. package/dist/extensions/builtin/token-save/README.md +56 -56
  153. package/dist/extensions/optional/AGENT.md +10 -10
  154. package/dist/modes/interactive/interactive-mode.js +36 -36
  155. package/dist/modes/interactive/theme/dark.json +85 -85
  156. package/dist/modes/interactive/theme/light.json +84 -84
  157. package/dist/modes/interactive/theme/theme-schema.json +335 -335
  158. package/dist/modes/interactive/theme/warm.json +81 -81
  159. package/dist/node_modules/@pencil-agent/agent-core/dist/agent-loop.js +3 -2
  160. package/dist/node_modules/@pencil-agent/agent-core/dist/structured-adaptive-agent-loop.js +2 -1
  161. package/dist/node_modules/@pencil-agent/ai/dist/cli.js +0 -0
  162. package/docs/cc-agent-design.md +1297 -0
  163. package/docs/cc-tui-design.md +1333 -0
  164. package/docs/codex-goal-command-impl.md +1055 -1055
  165. package/docs/codex-goal-vs-grub.md +500 -500
  166. package/docs/custom-provider.md +27 -27
  167. package/docs/extensions.md +27 -27
  168. package/docs/keybindings.md +27 -27
  169. package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/200/273/347/273/223.md" +250 -250
  170. package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/212/245/345/221/212.md" +122 -122
  171. package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210.md" +1222 -1222
  172. package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210/345/256/236/347/216/260/346/212/245/345/221/212.md" +158 -158
  173. package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210/345/257/271/346/257/224/345/210/206/346/236/220.md" +128 -128
  174. package/docs/loop /351/207/215/346/236/204/350/256/241/345/210/222.md" +320 -320
  175. package/docs/loop-usage-examples.md +214 -214
  176. package/docs/models.md +27 -27
  177. package/docs/nanoPencil-/345/255/246/344/271/240/350/256/241/345/210/222.md +170 -0
  178. package/docs/packages.md +27 -27
  179. package/docs/pi-design-philosophy.md +457 -457
  180. package/docs/planmode.md +1987 -1987
  181. package/docs/prompt-templates.md +27 -27
  182. package/docs/providers.md +27 -27
  183. package/docs/scan-report.md +3820 -0
  184. package/docs/sdk.md +27 -27
  185. package/docs/skills.md +27 -27
  186. package/docs/themes.md +27 -27
  187. package/docs/tui.md +27 -27
  188. package/docs//345/257/271/346/240/207Claude-Code.md +1775 -0
  189. package/docs//351/230/277/351/207/214/345/267/264/345/267/264/350/264/242/346/212/245/345/210/206/346/236/220/344/271/246.md +261 -0
  190. package/package.json +190 -190
  191. package/docs/ACP/345/215/217/350/256/256/351/233/206/346/210/220/345/274/200/345/217/221/346/226/207/346/241/243.md +0 -851
  192. package/docs/SDK-TESTING.md +0 -364
  193. package/docs/mem-core/346/212/200/346/234/257/346/226/207/346/241/243.md +0 -593
  194. package/docs/startup-performance-optimization.md +0 -301
  195. package/docs//350/256/244/347/237/245/345/234/260/345/233/276.md +0 -47
@@ -1,81 +1,81 @@
1
- {
2
- "$schema": "https://raw.githubusercontent.com/O-Pencil/nanoPencil/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
3
- "name": "warm",
4
- "vars": {
5
- "warmBrown": "#c4a574",
6
- "warmLight": "#d4a574",
7
- "warmBorder": "#a08060",
8
- "blue": "#5f87ff",
9
- "green": "#b5bd68",
10
- "red": "#cc6666",
11
- "yellow": "#d4a84b",
12
- "gray": "#808080",
13
- "dimGray": "#666666",
14
- "darkGray": "#505050",
15
- "accent": "warmBrown",
16
- "selectedBg": "#3d362a",
17
- "userMsgBg": "#2e2a24",
18
- "toolPendingBg": "#2a2820",
19
- "toolSuccessBg": "#2a3024",
20
- "toolErrorBg": "#3c2828",
21
- "customMsgBg": "#2d2838"
22
- },
23
- "colors": {
24
- "accent": "accent",
25
- "border": "warmBorder",
26
- "borderAccent": "warmLight",
27
- "borderMuted": "darkGray",
28
- "success": "green",
29
- "error": "red",
30
- "warning": "yellow",
31
- "muted": "gray",
32
- "dim": "dimGray",
33
- "text": "",
34
- "thinkingText": "gray",
35
- "selectedBg": "selectedBg",
36
- "userMessageBg": "userMsgBg",
37
- "userMessageText": "warmLight",
38
- "customMessageBg": "customMsgBg",
39
- "customMessageText": "",
40
- "customMessageLabel": "#b8956b",
41
- "toolPendingBg": "toolPendingBg",
42
- "toolSuccessBg": "toolSuccessBg",
43
- "toolErrorBg": "toolErrorBg",
44
- "toolTitle": "",
45
- "toolOutput": "gray",
46
- "mdHeading": "warmLight",
47
- "mdLink": "#81a2be",
48
- "mdLinkUrl": "dimGray",
49
- "mdCode": "accent",
50
- "mdCodeBlock": "green",
51
- "mdCodeBlockBorder": "gray",
52
- "mdQuote": "gray",
53
- "mdQuoteBorder": "gray",
54
- "mdHr": "gray",
55
- "mdListBullet": "accent",
56
- "toolDiffAdded": "green",
57
- "toolDiffRemoved": "red",
58
- "toolDiffContext": "gray",
59
- "syntaxComment": "#6A9955",
60
- "syntaxKeyword": "#569CD6",
61
- "syntaxFunction": "#DCDCAA",
62
- "syntaxVariable": "#9CDCFE",
63
- "syntaxString": "#CE9178",
64
- "syntaxNumber": "#B5CEA8",
65
- "syntaxType": "#4EC9B0",
66
- "syntaxOperator": "#D4D4D4",
67
- "syntaxPunctuation": "#D4D4D4",
68
- "thinkingOff": "darkGray",
69
- "thinkingMinimal": "#6e6e6e",
70
- "thinkingLow": "#5f87af",
71
- "thinkingMedium": "warmBrown",
72
- "thinkingHigh": "#b294bb",
73
- "thinkingXhigh": "#d183e8",
74
- "bashMode": "green"
75
- },
76
- "export": {
77
- "pageBg": "#1a1814",
78
- "cardBg": "#242018",
79
- "infoBg": "#3c3728"
80
- }
81
- }
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/O-Pencil/nanoPencil/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
3
+ "name": "warm",
4
+ "vars": {
5
+ "warmBrown": "#c4a574",
6
+ "warmLight": "#d4a574",
7
+ "warmBorder": "#a08060",
8
+ "blue": "#5f87ff",
9
+ "green": "#b5bd68",
10
+ "red": "#cc6666",
11
+ "yellow": "#d4a84b",
12
+ "gray": "#808080",
13
+ "dimGray": "#666666",
14
+ "darkGray": "#505050",
15
+ "accent": "warmBrown",
16
+ "selectedBg": "#3d362a",
17
+ "userMsgBg": "#2e2a24",
18
+ "toolPendingBg": "#2a2820",
19
+ "toolSuccessBg": "#2a3024",
20
+ "toolErrorBg": "#3c2828",
21
+ "customMsgBg": "#2d2838"
22
+ },
23
+ "colors": {
24
+ "accent": "accent",
25
+ "border": "warmBorder",
26
+ "borderAccent": "warmLight",
27
+ "borderMuted": "darkGray",
28
+ "success": "green",
29
+ "error": "red",
30
+ "warning": "yellow",
31
+ "muted": "gray",
32
+ "dim": "dimGray",
33
+ "text": "",
34
+ "thinkingText": "gray",
35
+ "selectedBg": "selectedBg",
36
+ "userMessageBg": "userMsgBg",
37
+ "userMessageText": "warmLight",
38
+ "customMessageBg": "customMsgBg",
39
+ "customMessageText": "",
40
+ "customMessageLabel": "#b8956b",
41
+ "toolPendingBg": "toolPendingBg",
42
+ "toolSuccessBg": "toolSuccessBg",
43
+ "toolErrorBg": "toolErrorBg",
44
+ "toolTitle": "",
45
+ "toolOutput": "gray",
46
+ "mdHeading": "warmLight",
47
+ "mdLink": "#81a2be",
48
+ "mdLinkUrl": "dimGray",
49
+ "mdCode": "accent",
50
+ "mdCodeBlock": "green",
51
+ "mdCodeBlockBorder": "gray",
52
+ "mdQuote": "gray",
53
+ "mdQuoteBorder": "gray",
54
+ "mdHr": "gray",
55
+ "mdListBullet": "accent",
56
+ "toolDiffAdded": "green",
57
+ "toolDiffRemoved": "red",
58
+ "toolDiffContext": "gray",
59
+ "syntaxComment": "#6A9955",
60
+ "syntaxKeyword": "#569CD6",
61
+ "syntaxFunction": "#DCDCAA",
62
+ "syntaxVariable": "#9CDCFE",
63
+ "syntaxString": "#CE9178",
64
+ "syntaxNumber": "#B5CEA8",
65
+ "syntaxType": "#4EC9B0",
66
+ "syntaxOperator": "#D4D4D4",
67
+ "syntaxPunctuation": "#D4D4D4",
68
+ "thinkingOff": "darkGray",
69
+ "thinkingMinimal": "#6e6e6e",
70
+ "thinkingLow": "#5f87af",
71
+ "thinkingMedium": "warmBrown",
72
+ "thinkingHigh": "#b294bb",
73
+ "thinkingXhigh": "#d183e8",
74
+ "bashMode": "green"
75
+ },
76
+ "export": {
77
+ "pageBg": "#1a1814",
78
+ "cardBg": "#242018",
79
+ "infoBg": "#3c3728"
80
+ }
81
+ }
@@ -1,3 +1,4 @@
1
- var ee=Object.defineProperty;var g=(e,t)=>ee(e,"name",{value:t,configurable:!0});import{EventStream as te}from"@pencil-agent/ai/events";import{isContextOverflow as se}from"@pencil-agent/ai/overflow";import{validateToolArguments as oe}from"@pencil-agent/ai/schema";import{streamSimple as ae}from"@pencil-agent/ai/stream";import{ToolNotFoundError as ne,ValidationError as Y}from"./errors.js";import{computeRecoveryMaxTokens as re,createOutputTokenRecoveryMessage as le,createTokenBudgetContinuation as ue}from"./agent-loop-continuations.js";import{createInterruptedToolResults as pe,createSkippedToolCallLimitResults as ie,enforceToolResultBatchSize as me}from"./agent-loop-tool-results.js";import{flushReadyToolUseSummaries as de,startToolUseSummary as ce}from"./agent-loop-tool-summaries.js";import{buildAgentRunPolicy as he,resolveAgentRunLoopFramework as ge}from"./agent-run-result.js";import{waitForAbortableOperation as N,waitForAssistantStream as _e,waitForAssistantStreamEvent as ye}from"./agent-loop-stream-events.js";const fe=256,Re=512,Te=3,Me=1,be=1;function He(e,t,s,a,o){const p=j();return(async()=>{const _=[...e],n={...t,messages:[...t.messages,...e]};try{p.push({type:"agent_start"}),p.push({type:"turn_start"});for(const m of e)p.push({type:"message_start",message:m}),p.push({type:"message_end",message:m});await G(n,_,s,a,p,o)}catch(m){z(p,_,s,m,a)}})(),p}g(He,"agentLoop");function Ke(e,t,s,a){if(e.messages.length===0)throw new Y("Cannot continue: no messages in context");if(e.messages[e.messages.length-1].role==="assistant")throw new Y("Cannot continue from message role: assistant");const o=j();return(async()=>{const p=[],_={...e};try{o.push({type:"agent_start"}),o.push({type:"turn_start"}),await G(_,p,t,s,o,a)}catch(n){z(o,p,t,n,s)}})(),o}g(Ke,"agentLoopContinue");function j(){return new te(e=>e.type==="agent_end",e=>e.type==="agent_end"?e.messages:[])}g(j,"createAgentStream");function E(e,t){return{role:"assistant",content:[{type:"text",text:""}],api:e.model.api,provider:e.model.provider,model:e.model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"error",errorMessage:t,timestamp:Date.now()}}g(E,"createLoopLimitMessage");function z(e,t,s,a,o){const p=E(s,a instanceof Error?a.message:String(a));o?.aborted&&(p.stopReason="aborted"),t.push(p),e.push({type:"message_start",message:{...p}}),e.push({type:"message_end",message:p}),e.push({type:"turn_end",message:p,toolResults:[]}),I(e,t,{config:s,turnCount:0,toolCallCount:0,startedAt:Date.now(),usage:J(),permissionDenials:[],stopReason:p.stopReason,errorMessage:p.errorMessage,errorSubtype:o?.aborted?"aborted":"loop_error"})}g(z,"endWithLoopError");async function G(e,t,s,a,o,p){let _=!0,n=0,m=0;const b=Date.now(),M=J(),y=[],i=s.maxTurnsPerPrompt??fe,f=s.maxToolCallsPerPrompt??Re,k=s.maxStopHookContinuations??Te,R=s.maxModelErrorRecoveryAttempts??Me,x=s.maxOutputTokenRecoveryAttempts??be;let S=0,l=0,c=0,d,T={reason:"start"};const P=[],D=g(w=>(T=w,P.push(w),w),"recordTransition");let $=[],q=!1,U=0;const B=await N(s.getSteeringMessages?s.getSteeringMessages():[],a);if(B.type==="aborted"){K(o,e,t,{config:s,turnCount:n,toolCallCount:m,startedAt:b,usage:M,permissionDenials:y,transitions:P,lastTransition:T});return}let C=B.value||[];for(;;){let w=!0,L=null;for(;w||C.length>0;){if(_?_=!1:o.push({type:"turn_start"}),$=de($,e.messages,t,o),C.length>0){for(const r of C)o.push({type:"message_start",message:r}),o.push({type:"message_end",message:r}),e.messages.push(r),t.push(r);C=[]}if(n++,n>i){const r=E(s,`Stopped after ${i} assistant turns to prevent a runaway agent loop.`);e.messages.push(r),t.push(r),o.push({type:"message_start",message:{...r}}),o.push({type:"message_end",message:r}),o.push({type:"turn_end",message:r,toolResults:[]}),I(o,t,{config:s,turnCount:n,toolCallCount:m,startedAt:b,usage:M,permissionDenials:y,stopReason:r.stopReason,transitions:P,lastTransition:D({reason:"max_turns_reached",maxTurns:i,turnCount:n}),errorMessage:r.errorMessage,errorSubtype:"max_turns_reached"});return}const Z=t.length,h=await ke(e,s,a,o,p,d);if(Se(M,h.usage),d=void 0,t.push(h),h.stopReason==="error"||h.stopReason==="aborted"){const r=h.stopReason==="aborted"?"aborted":se(h,s.model.contextWindow)?"context_overflow":"model_error",A=pe(h);for(const u of A)e.messages.push(u),t.push(u),o.push({type:"message_start",message:u}),o.push({type:"message_end",message:u});if(h.stopReason==="error"&&s.recoverModelError&&S<R){const u=S+1,v=await s.recoverModelError({message:h,messages:e.messages,errorSubtype:r,attempt:u});if(v.action==="retry"){o.push({type:"turn_end",message:h,toolResults:A}),S=u,t.splice(Z),e.messages=v.messages,D(v.transition??{reason:"model_error_recovery",subtype:r,attempt:u});continue}}o.push({type:"turn_end",message:h,toolResults:A}),I(o,t,{config:s,turnCount:n,toolCallCount:m,startedAt:b,usage:M,permissionDenials:y,stopReason:h.stopReason,transitions:P,lastTransition:T,errorMessage:h.errorMessage,errorSubtype:r});return}const O=h.content.filter(r=>r.type==="toolCall");w=O.length>0;const F=[];if(w){if(m+O.length>f){const u=ie(h,`Tool call skipped because this prompt reached the ${f} tool-call limit.`);for(const W of u)e.messages.push(W),t.push(W),o.push({type:"message_start",message:W}),o.push({type:"message_end",message:W});const v=E(s,`Stopped before executing ${O.length} tool call${O.length===1?"":"s"} because this prompt reached the ${f} tool-call limit.`);e.messages.push(v),t.push(v),o.push({type:"message_start",message:{...v}}),o.push({type:"message_end",message:v}),o.push({type:"turn_end",message:v,toolResults:u}),I(o,t,{config:s,turnCount:n,toolCallCount:m,startedAt:b,usage:M,permissionDenials:y,stopReason:v.stopReason,transitions:P,lastTransition:D({reason:"tool_call_limit_reached",maxToolCalls:f,requestedToolCalls:O.length,toolCallCount:m}),errorMessage:v.errorMessage,errorSubtype:"tool_call_limit_reached"});return}m+=O.length;const r=await Ce(e.tools,h,a,o,s.getSteeringMessages,s.canUseTool);F.push(...me(r.toolResults,s.maxToolResultBatchSizeChars)),y.push(...ve(r.toolResults)),L=r.steeringMessages??null;for(const u of F)e.messages.push(u),t.push(u),o.push({type:"message_start",message:u}),o.push({type:"message_end",message:u});for(const u of r.contextMessages)e.messages.push(u),t.push(u),o.push({type:"message_start",message:u}),o.push({type:"message_end",message:u});const A=ce(s,{assistantMessage:h,toolResults:F,contextMessages:r.contextMessages,messages:e.messages});A&&$.push(A),D({reason:"tool_result",toolCallCount:O.length})}if(o.push({type:"turn_end",message:h,toolResults:F}),!w&&h.stopReason==="length"&&l<x){l+=1,d=re(s,h),C=[le(l)],D({reason:"max_output_tokens_recovery",attempt:l});continue}if(!w&&s.runStopHooks&&!q){q=!0;const r=await N(s.runStopHooks({message:h,messages:e.messages}),a);if(q=!1,r.type==="aborted"){K(o,e,t,{config:s,turnCount:n,toolCallCount:m,startedAt:b,usage:M,permissionDenials:y,transitions:P,lastTransition:T});return}const A=r.value;if(A.action==="continue"&&A.messages.length>0){if(U>=k){const u=E(s,`stop_hook_limit_reached: stopped after ${k} stop-hook continuation turns.`);e.messages.push(u),t.push(u),o.push({type:"message_start",message:{...u}}),o.push({type:"message_end",message:u}),o.push({type:"turn_end",message:u,toolResults:[]}),I(o,t,{config:s,turnCount:n,toolCallCount:m,startedAt:b,usage:M,permissionDenials:y,stopReason:u.stopReason,transitions:P,lastTransition:D({reason:"stop_hook_limit_reached",maxContinuations:k,continuationCount:U}),errorMessage:u.errorMessage,errorSubtype:"stop_hook_limit_reached"});return}U+=1,C=A.messages,D({reason:"stop_hook_blocking",continuationCount:U});continue}}if(!w){const r=ue(s,M.output,c);if(r){c+=1,C=[r.message],D({reason:"token_budget_continuation",continuationCount:c,outputTokens:r.outputTokens,targetTokens:r.targetTokens});continue}}L&&L.length>0?(C=L,L=null):C=await s.getSteeringMessages?.()||[]}const X=await N(s.getFollowUpMessages?s.getFollowUpMessages():[],a);if(X.type==="aborted"){K(o,e,t,{config:s,turnCount:n,toolCallCount:m,startedAt:b,usage:M,permissionDenials:y,transitions:P,lastTransition:T});return}const V=X.value||[];if(V.length>0){C=V,D({reason:"follow_up"});continue}break}I(o,t,{config:s,turnCount:n,toolCallCount:m,startedAt:b,usage:M,permissionDenials:y,stopReason:Q(t),transitions:P,lastTransition:T})}g(G,"runLoop");async function ke(e,t,s,a,o,p){let _=e.messages;if(t.transformContext){const l=await N(t.transformContext(_,s),s);if(l.type==="aborted")return H(e,a,t);_=l.value}const n=await N(t.convertToLlm(_),s);if(n.type==="aborted")return H(e,a,t);const m=n.value,b={systemPrompt:e.systemPrompt,messages:m,tools:e.tools},M=o||ae,y=await N(t.getApiKey?t.getApiKey(t.model.provider):void 0,s);if(y.type==="aborted")return H(e,a,t);const i=y.value||t.apiKey;a.push({type:"stream_request_start",model:t.model.id,provider:t.model.provider,api:t.model.api,messageCount:m.length,maxTokens:p??t.maxTokens});const f=await _e(M(t.model,b,{...t,maxTokens:p??t.maxTokens,apiKey:i,signal:s}),s);if(f==="aborted"){const l=E(t,"Request was aborted");return l.stopReason="aborted",e.messages.push(l),a.push({type:"message_start",message:{...l}}),a.push({type:"message_end",message:l}),l}let k=null,R=!1;const x=f[Symbol.asyncIterator]();for(;;){let l;try{l=await ye(x,s)}catch(d){const T=E(t,d instanceof Error?d.message:String(d));return R?e.messages[e.messages.length-1]=T:(e.messages.push(T),a.push({type:"message_start",message:{...T}})),a.push({type:"message_end",message:T}),T}if(l==="aborted"){x.return?.();const d=E(t,"Request was aborted");return d.stopReason="aborted",R?e.messages[e.messages.length-1]=d:(e.messages.push(d),a.push({type:"message_start",message:{...d}})),a.push({type:"message_end",message:d}),d}if(l.done)break;const c=l.value;switch(c.type){case"start":k=c.partial,e.messages.push(k),R=!0,a.push({type:"message_start",message:{...k}});break;case"text_start":case"text_delta":case"text_end":case"thinking_start":case"thinking_delta":case"thinking_end":case"toolcall_start":case"toolcall_delta":case"toolcall_end":k&&(k=c.partial,e.messages[e.messages.length-1]=k,a.push({type:"message_update",assistantMessageEvent:c,message:{...k}}));break;case"done":case"error":{const d=c.type==="done"?c.message:c.error;return R?e.messages[e.messages.length-1]=d:e.messages.push(d),R||a.push({type:"message_start",message:{...d}}),a.push({type:"message_end",message:d}),d}}}const S=f.resultIfResolved()??E(t,"Provider stream ended without a final assistant message");return R?e.messages[e.messages.length-1]=S:(e.messages.push(S),a.push({type:"message_start",message:{...S}})),a.push({type:"message_end",message:S}),S}g(ke,"streamAssistantResponse");function H(e,t,s){const a=E(s,"Request was aborted");return a.stopReason="aborted",e.messages.push(a),t.push({type:"message_start",message:{...a}}),t.push({type:"message_end",message:a}),a}g(H,"pushAbortedAssistantMessage");function K(e,t,s,a){const o=E(a.config,"Request was aborted");o.stopReason="aborted",t.messages.push(o),s.push(o),e.push({type:"message_start",message:{...o}}),e.push({type:"message_end",message:o}),e.push({type:"turn_end",message:o,toolResults:[]}),I(e,s,{...a,stopReason:"aborted",errorMessage:o.errorMessage,errorSubtype:"aborted"})}g(K,"finishStandardLoopWithAbortedTurn");function I(e,t,s){e.push({type:"agent_result",stopReason:s.stopReason??Q(t),loopFramework:ge(s.config),loopPolicy:he(s.config),turnCount:s.turnCount,toolCallCount:s.toolCallCount,durationMs:Date.now()-s.startedAt,usage:s.usage,permissionDenialCount:s.permissionDenials.length,permissionDenials:s.permissionDenials,transitions:s.transitions&&s.transitions.length>0?s.transitions:void 0,lastTransition:s.lastTransition,errorMessage:s.errorMessage,errorSubtype:s.errorSubtype}),e.push({type:"agent_end",messages:t}),e.end(t)}g(I,"finishStandardLoop");function J(){return{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}}}g(J,"emptyUsage");function Se(e,t){e.input+=t.input,e.output+=t.output,e.cacheRead+=t.cacheRead,e.cacheWrite+=t.cacheWrite,e.totalTokens+=t.totalTokens,e.cost.input+=t.cost.input,e.cost.output+=t.cost.output,e.cost.cacheRead+=t.cost.cacheRead,e.cost.cacheWrite+=t.cost.cacheWrite,e.cost.total+=t.cost.total}g(Se,"addUsage");function Q(e){for(let t=e.length-1;t>=0;t-=1){const s=e[t];if(s?.role==="assistant")return s.stopReason??"stop"}return"stop"}g(Q,"inferStopReason");function ve(e){const t=[];for(const s of e){const a=s.details;if(!a||typeof a!="object"||a.errorType!=="permission_denied")continue;const o=a.reason;t.push({toolCallId:s.toolCallId,toolName:s.toolName,reason:typeof o=="string"&&o.length>0?o:void 0})}return t}g(ve,"collectPermissionDenials");async function Ce(e,t,s,a,o,p){const _=t.content.filter(y=>y.type==="toolCall"),n=we(e),m=[],b=[];let M;for(let y=0;y<_.length;y++){const i=_[y],f=n.get(i.name),k=Date.now();a.push({type:"tool_execution_start",toolCallId:i.id,toolName:i.name,args:i.arguments});let R,x=!1;try{if(!f)throw new ne(i.name);const l=oe(f,i),c=await f.validateInput?.(l);if(typeof c=="string"&&c.trim())throw new Error(c);const d=await p?.({toolCallId:i.id,toolName:f.name,requestedToolName:i.name,input:l,rawInput:i.arguments,tool:f});if(d?.decision==="deny"){const T=d.reason?.trim();R={content:[{type:"text",text:T?`Permission denied: ${T}`:`Permission denied for ${f.name}`}],details:{errorType:"permission_denied",reason:T,toolName:f.name,toolCallId:i.id}},x=!0}else R=await f.execute(i.id,l,s,T=>{a.push({type:"tool_execution_update",toolCallId:i.id,toolName:i.name,args:i.arguments,partialResult:T})}),R=Ee(R,f.maxResultSizeChars)}catch(l){const c=l instanceof Error?l.message:String(l);R={content:[{type:"text",text:c}],details:Ae(c)?{errorType:"permission_denied",reason:c,toolName:f?.name??i.name,toolCallId:i.id}:{}},x=!0}a.push({type:"tool_execution_end",toolCallId:i.id,toolName:i.name,result:R,isError:x,durationMs:Date.now()-k});const S={role:"toolResult",toolCallId:i.id,toolName:i.name,content:R.content,details:R.details,isError:x,timestamp:Date.now()};if(m.push(S),b.push(...R.contextMessages??[]),o){const l=await o();if(l.length>0){M=l;const c=_.slice(y+1);for(const d of c)m.push(xe(d,a));break}}}return{toolResults:m,contextMessages:b,steeringMessages:M}}g(Ce,"executeToolCalls");function we(e){const t=new Map;for(const s of e??[]){t.set(s.name,s);for(const a of s.aliases??[])t.has(a)||t.set(a,s)}return t}g(we,"buildToolMap");function Ae(e){return/^Permission (denied|request was cancelled)/i.test(e.trim())}g(Ae,"isPermissionDeniedMessage");function Ee(e,t){if(!t||t<=0)return e;let s=Math.floor(t),a=!1;const o=e.content.map(n=>{if(n.type!=="text")return n;if(s<=0)return a=!0,{...n,text:""};if(n.text.length<=s)return s-=n.text.length,n;a=!0;const m=n.text.slice(0,s);return s=0,{...n,text:m}});if(!a)return e;const p=`
1
+ var se=Object.defineProperty;var h=(e,t)=>se(e,"name",{value:t,configurable:!0});import{EventStream as oe}from"@pencil-agent/ai/events";import{isContextOverflow as ae}from"@pencil-agent/ai/overflow";import{validateToolArguments as ne}from"@pencil-agent/ai/schema";import{streamSimple as re}from"@pencil-agent/ai/stream";import{ToolNotFoundError as le,ValidationError as G}from"./errors.js";import{computeRecoveryMaxTokens as ue,createOutputTokenRecoveryMessage as pe,createTokenBudgetContinuation as ie}from"./agent-loop-continuations.js";import{createInterruptedToolResults as me,createSkippedToolCallLimitResults as de,enforceToolResultBatchSize as ce}from"./agent-loop-tool-results.js";import{flushReadyToolUseSummaries as he,startToolUseSummary as ge}from"./agent-loop-tool-summaries.js";import{buildAgentRunPolicy as _e,resolveAgentRunLoopFramework as ye}from"./agent-run-result.js";import{waitForAbortableOperation as L,waitForAssistantStream as fe,waitForAssistantStreamEvent as Re}from"./agent-loop-stream-events.js";const Te=256,ke=512,Me=3,Se=1,be=1;function I(e){if(process.env.NANOPENCIL_DEBUG==="1")try{const{appendFileSync:t}=require("fs"),{join:s}=require("path"),{homedir:a}=require("os");t(s(a(),".nanopencil","agent","nanopencil-debug.log"),`[${new Date().toISOString()}] [loop] ${e}
2
+ `)}catch{}}h(I,"_tlog");function Ke(e,t,s,a,o){const i=J();return(async()=>{const p=[...e],n={...t,messages:[...t.messages,...e]};try{i.push({type:"agent_start"}),i.push({type:"turn_start"});for(const d of e)i.push({type:"message_start",message:d}),i.push({type:"message_end",message:d});await Z(n,p,s,a,i,o)}catch(d){Q(i,p,s,d,a)}})(),i}h(Ke,"agentLoop");function Xe(e,t,s,a){if(e.messages.length===0)throw new G("Cannot continue: no messages in context");if(e.messages[e.messages.length-1].role==="assistant")throw new G("Cannot continue from message role: assistant");const o=J();return(async()=>{const i=[],p={...e};try{o.push({type:"agent_start"}),o.push({type:"turn_start"}),await Z(p,i,t,s,o,a)}catch(n){Q(o,i,t,n,s)}})(),o}h(Xe,"agentLoopContinue");function J(){return new oe(e=>e.type==="agent_end",e=>e.type==="agent_end"?e.messages:[])}h(J,"createAgentStream");function x(e,t){return{role:"assistant",content:[{type:"text",text:""}],api:e.model.api,provider:e.model.provider,model:e.model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"error",errorMessage:t,timestamp:Date.now()}}h(x,"createLoopLimitMessage");function Q(e,t,s,a,o){const i=x(s,a instanceof Error?a.message:String(a));o?.aborted&&(i.stopReason="aborted"),t.push(i),e.push({type:"message_start",message:{...i}}),e.push({type:"message_end",message:i}),e.push({type:"turn_end",message:i,toolResults:[]}),O(e,t,{config:s,turnCount:0,toolCallCount:0,startedAt:Date.now(),usage:ee(),permissionDenials:[],stopReason:i.stopReason,errorMessage:i.errorMessage,errorSubtype:o?.aborted?"aborted":"loop_error"})}h(Q,"endWithLoopError");async function Z(e,t,s,a,o,i){let p=!0,n=0,d=0;const k=Date.now(),D={loopStart:performance.now(),streamStart:0,firstTokenAt:0,turnCount:0};I("run_loop start");const g=ee(),r=[],T=s.maxTurnsPerPrompt??Te,C=s.maxToolCallsPerPrompt??ke,_=s.maxStopHookContinuations??Me,M=s.maxModelErrorRecoveryAttempts??Se,P=s.maxOutputTokenRecoveryAttempts??be;let S=0,l=0,y=0,c,R={reason:"start"};const E=[],$=h(A=>(R=A,E.push(A),A),"recordTransition");let H=[],B=!1,U=0;const j=await L(s.getSteeringMessages?s.getSteeringMessages():[],a);if(j.type==="aborted"){X(o,e,t,{config:s,turnCount:n,toolCallCount:d,startedAt:k,usage:g,permissionDenials:r,transitions:E,lastTransition:R});return}let v=j.value||[];for(;;){let A=!0,F=null;for(;A||v.length>0;){if(p?p=!1:o.push({type:"turn_start"}),H=he(H,e.messages,t,o),v.length>0){for(const u of v)o.push({type:"message_start",message:u}),o.push({type:"message_end",message:u}),e.messages.push(u),t.push(u);v=[]}if(n++,n>T){const u=x(s,`Stopped after ${T} assistant turns to prevent a runaway agent loop.`);e.messages.push(u),t.push(u),o.push({type:"message_start",message:{...u}}),o.push({type:"message_end",message:u}),o.push({type:"turn_end",message:u,toolResults:[]}),O(o,t,{config:s,turnCount:n,toolCallCount:d,startedAt:k,usage:g,permissionDenials:r,stopReason:u.stopReason,transitions:E,lastTransition:$({reason:"max_turns_reached",maxTurns:T,turnCount:n}),errorMessage:u.errorMessage,errorSubtype:"max_turns_reached"});return}D.turnCount++;const te=t.length,f=await Ce(e,s,a,o,i,c,D);if(ve(g,f.usage),c=void 0,t.push(f),f.stopReason==="error"||f.stopReason==="aborted"){const u=f.stopReason==="aborted"?"aborted":ae(f,s.model.contextWindow)?"context_overflow":"model_error",w=me(f);for(const m of w)e.messages.push(m),t.push(m),o.push({type:"message_start",message:m}),o.push({type:"message_end",message:m});if(f.stopReason==="error"&&s.recoverModelError&&S<M){const m=S+1,b=await s.recoverModelError({message:f,messages:e.messages,errorSubtype:u,attempt:m});if(b.action==="retry"){o.push({type:"turn_end",message:f,toolResults:w}),S=m,t.splice(te),e.messages=b.messages,$(b.transition??{reason:"model_error_recovery",subtype:u,attempt:m});continue}}o.push({type:"turn_end",message:f,toolResults:w}),O(o,t,{config:s,turnCount:n,toolCallCount:d,startedAt:k,usage:g,permissionDenials:r,stopReason:f.stopReason,transitions:E,lastTransition:R,errorMessage:f.errorMessage,errorSubtype:u});return}const N=f.content.filter(u=>u.type==="toolCall");A=N.length>0;const q=[];if(A){if(d+N.length>C){const m=de(f,`Tool call skipped because this prompt reached the ${C} tool-call limit.`);for(const W of m)e.messages.push(W),t.push(W),o.push({type:"message_start",message:W}),o.push({type:"message_end",message:W});const b=x(s,`Stopped before executing ${N.length} tool call${N.length===1?"":"s"} because this prompt reached the ${C} tool-call limit.`);e.messages.push(b),t.push(b),o.push({type:"message_start",message:{...b}}),o.push({type:"message_end",message:b}),o.push({type:"turn_end",message:b,toolResults:m}),O(o,t,{config:s,turnCount:n,toolCallCount:d,startedAt:k,usage:g,permissionDenials:r,stopReason:b.stopReason,transitions:E,lastTransition:$({reason:"tool_call_limit_reached",maxToolCalls:C,requestedToolCalls:N.length,toolCallCount:d}),errorMessage:b.errorMessage,errorSubtype:"tool_call_limit_reached"});return}d+=N.length;const u=await we(e.tools,f,a,o,s.getSteeringMessages,s.canUseTool);q.push(...ce(u.toolResults,s.maxToolResultBatchSizeChars)),r.push(...Ae(u.toolResults)),F=u.steeringMessages??null;for(const m of q)e.messages.push(m),t.push(m),o.push({type:"message_start",message:m}),o.push({type:"message_end",message:m});for(const m of u.contextMessages)e.messages.push(m),t.push(m),o.push({type:"message_start",message:m}),o.push({type:"message_end",message:m});const w=ge(s,{assistantMessage:f,toolResults:q,contextMessages:u.contextMessages,messages:e.messages});w&&H.push(w),$({reason:"tool_result",toolCallCount:N.length})}if(o.push({type:"turn_end",message:f,toolResults:q}),!A&&f.stopReason==="length"&&l<P){l+=1,c=ue(s,f),v=[pe(l)],$({reason:"max_output_tokens_recovery",attempt:l});continue}if(!A&&s.runStopHooks&&!B){B=!0;const u=await L(s.runStopHooks({message:f,messages:e.messages}),a);if(B=!1,u.type==="aborted"){X(o,e,t,{config:s,turnCount:n,toolCallCount:d,startedAt:k,usage:g,permissionDenials:r,transitions:E,lastTransition:R});return}const w=u.value;if(w.action==="continue"&&w.messages.length>0){if(U>=_){const m=x(s,`stop_hook_limit_reached: stopped after ${_} stop-hook continuation turns.`);e.messages.push(m),t.push(m),o.push({type:"message_start",message:{...m}}),o.push({type:"message_end",message:m}),o.push({type:"turn_end",message:m,toolResults:[]}),O(o,t,{config:s,turnCount:n,toolCallCount:d,startedAt:k,usage:g,permissionDenials:r,stopReason:m.stopReason,transitions:E,lastTransition:$({reason:"stop_hook_limit_reached",maxContinuations:_,continuationCount:U}),errorMessage:m.errorMessage,errorSubtype:"stop_hook_limit_reached"});return}U+=1,v=w.messages,$({reason:"stop_hook_blocking",continuationCount:U});continue}}if(!A){const u=ie(s,g.output,y);if(u){y+=1,v=[u.message],$({reason:"token_budget_continuation",continuationCount:y,outputTokens:u.outputTokens,targetTokens:u.targetTokens});continue}}F&&F.length>0?(v=F,F=null):v=await s.getSteeringMessages?.()||[]}const Y=await L(s.getFollowUpMessages?s.getFollowUpMessages():[],a);if(Y.type==="aborted"){X(o,e,t,{config:s,turnCount:n,toolCallCount:d,startedAt:k,usage:g,permissionDenials:r,transitions:E,lastTransition:R});return}const z=Y.value||[];if(z.length>0){v=z,$({reason:"follow_up"});continue}break}O(o,t,{config:s,turnCount:n,toolCallCount:d,startedAt:k,usage:g,permissionDenials:r,stopReason:V(t),transitions:E,lastTransition:R})}h(Z,"runLoop");async function Ce(e,t,s,a,o,i,p){let n=e.messages;if(t.transformContext){const l=await L(t.transformContext(n,s),s);if(l.type==="aborted")return K(e,a,t);n=l.value}const d=await L(t.convertToLlm(n),s);if(d.type==="aborted")return K(e,a,t);const k=d.value,D={systemPrompt:e.systemPrompt,messages:k,tools:e.tools},g=o||re,r=await L(t.getApiKey?t.getApiKey(t.model.provider):void 0,s);if(r.type==="aborted")return K(e,a,t);const T=r.value||t.apiKey;p&&(p.streamStart=performance.now(),I(`stream_request_start model=${t.model.id} provider=${t.model.provider} msgCount=${k.length} maxTokens=${i??t.maxTokens} (+${(p.streamStart-p.loopStart).toFixed(0)}ms from loop_start)`)),a.push({type:"stream_request_start",model:t.model.id,provider:t.model.provider,api:t.model.api,messageCount:k.length,maxTokens:i??t.maxTokens});const C=await fe(g(t.model,D,{...t,maxTokens:i??t.maxTokens,apiKey:T,signal:s}),s);if(C==="aborted"){const l=x(t,"Request was aborted");return l.stopReason="aborted",e.messages.push(l),a.push({type:"message_start",message:{...l}}),a.push({type:"message_end",message:l}),l}let _=null,M=!1;const P=C[Symbol.asyncIterator]();for(;;){let l;try{l=await Re(P,s)}catch(c){const R=x(t,c instanceof Error?c.message:String(c));return M?e.messages[e.messages.length-1]=R:(e.messages.push(R),a.push({type:"message_start",message:{...R}})),a.push({type:"message_end",message:R}),R}if(l==="aborted"){P.return?.();const c=x(t,"Request was aborted");return c.stopReason="aborted",M?e.messages[e.messages.length-1]=c:(e.messages.push(c),a.push({type:"message_start",message:{...c}})),a.push({type:"message_end",message:c}),c}if(l.done)break;const y=l.value;switch(p&&!p.firstTokenAt&&(p.firstTokenAt=performance.now(),I(`first_token ttft=${(p.firstTokenAt-p.streamStart).toFixed(0)}ms (+${(p.firstTokenAt-p.loopStart).toFixed(0)}ms from loop_start)`)),y.type){case"start":_=y.partial,e.messages.push(_),M=!0,a.push({type:"message_start",message:{..._}});break;case"text_start":case"text_delta":case"text_end":case"thinking_start":case"thinking_delta":case"thinking_end":case"toolcall_start":case"toolcall_delta":case"toolcall_end":_&&(_=y.partial,e.messages[e.messages.length-1]=_,a.push({type:"message_update",assistantMessageEvent:y,message:{..._}}));break;case"done":case"error":{const c=y.type==="done"?y.message:y.error;return M?e.messages[e.messages.length-1]=c:e.messages.push(c),M||a.push({type:"message_start",message:{...c}}),a.push({type:"message_end",message:c}),c}}}if(p){const l=performance.now();I(`stream_end duration=${(l-p.streamStart).toFixed(0)}ms total=${(l-p.loopStart).toFixed(0)}ms`)}const S=C.resultIfResolved()??x(t,"Provider stream ended without a final assistant message");return M?e.messages[e.messages.length-1]=S:(e.messages.push(S),a.push({type:"message_start",message:{...S}})),a.push({type:"message_end",message:S}),S}h(Ce,"streamAssistantResponse");function K(e,t,s){const a=x(s,"Request was aborted");return a.stopReason="aborted",e.messages.push(a),t.push({type:"message_start",message:{...a}}),t.push({type:"message_end",message:a}),a}h(K,"pushAbortedAssistantMessage");function X(e,t,s,a){const o=x(a.config,"Request was aborted");o.stopReason="aborted",t.messages.push(o),s.push(o),e.push({type:"message_start",message:{...o}}),e.push({type:"message_end",message:o}),e.push({type:"turn_end",message:o,toolResults:[]}),O(e,s,{...a,stopReason:"aborted",errorMessage:o.errorMessage,errorSubtype:"aborted"})}h(X,"finishStandardLoopWithAbortedTurn");function O(e,t,s){e.push({type:"agent_result",stopReason:s.stopReason??V(t),loopFramework:ye(s.config),loopPolicy:_e(s.config),turnCount:s.turnCount,toolCallCount:s.toolCallCount,durationMs:Date.now()-s.startedAt,usage:s.usage,permissionDenialCount:s.permissionDenials.length,permissionDenials:s.permissionDenials,transitions:s.transitions&&s.transitions.length>0?s.transitions:void 0,lastTransition:s.lastTransition,errorMessage:s.errorMessage,errorSubtype:s.errorSubtype}),I(`loop_finished stopReason=${s.stopReason??V(t)} turns=${s.turnCount} tools=${s.toolCallCount} duration=${Date.now()-s.startedAt}ms`),e.push({type:"agent_end",messages:t}),e.end(t)}h(O,"finishStandardLoop");function ee(){return{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}}}h(ee,"emptyUsage");function ve(e,t){e.input+=t.input,e.output+=t.output,e.cacheRead+=t.cacheRead,e.cacheWrite+=t.cacheWrite,e.totalTokens+=t.totalTokens,e.cost.input+=t.cost.input,e.cost.output+=t.cost.output,e.cost.cacheRead+=t.cost.cacheRead,e.cost.cacheWrite+=t.cost.cacheWrite,e.cost.total+=t.cost.total}h(ve,"addUsage");function V(e){for(let t=e.length-1;t>=0;t-=1){const s=e[t];if(s?.role==="assistant")return s.stopReason??"stop"}return"stop"}h(V,"inferStopReason");function Ae(e){const t=[];for(const s of e){const a=s.details;if(!a||typeof a!="object"||a.errorType!=="permission_denied")continue;const o=a.reason;t.push({toolCallId:s.toolCallId,toolName:s.toolName,reason:typeof o=="string"&&o.length>0?o:void 0})}return t}h(Ae,"collectPermissionDenials");async function we(e,t,s,a,o,i){const p=t.content.filter(g=>g.type==="toolCall"),n=xe(e),d=[],k=[];let D;for(let g=0;g<p.length;g++){const r=p[g],T=n.get(r.name),C=Date.now();I(`tool_exec_start [${g}] name=${r.name}`),a.push({type:"tool_execution_start",toolCallId:r.id,toolName:r.name,args:r.arguments});let _,M=!1;try{if(!T)throw new le(r.name);const l=ne(T,r),y=await T.validateInput?.(l);if(typeof y=="string"&&y.trim())throw new Error(y);const c=await i?.({toolCallId:r.id,toolName:T.name,requestedToolName:r.name,input:l,rawInput:r.arguments,tool:T});if(c?.decision==="deny"){const R=c.reason?.trim();_={content:[{type:"text",text:R?`Permission denied: ${R}`:`Permission denied for ${T.name}`}],details:{errorType:"permission_denied",reason:R,toolName:T.name,toolCallId:r.id}},M=!0}else _=await T.execute(r.id,l,s,R=>{a.push({type:"tool_execution_update",toolCallId:r.id,toolName:r.name,args:r.arguments,partialResult:R})}),_=$e(_,T.maxResultSizeChars)}catch(l){const y=l instanceof Error?l.message:String(l);_={content:[{type:"text",text:y}],details:Ee(y)?{errorType:"permission_denied",reason:y,toolName:T?.name??r.name,toolCallId:r.id}:{}},M=!0}const P=Date.now()-C;a.push({type:"tool_execution_end",toolCallId:r.id,toolName:r.name,result:_,isError:M,durationMs:P}),I(`tool_exec_end [${g}] name=${r.name} duration=${P}ms`);const S={role:"toolResult",toolCallId:r.id,toolName:r.name,content:_.content,details:_.details,isError:M,timestamp:Date.now()};if(d.push(S),k.push(..._.contextMessages??[]),o){const l=await o();if(l.length>0){D=l;const y=p.slice(g+1);for(const c of y)d.push(De(c,a));break}}}return{toolResults:d,contextMessages:k,steeringMessages:D}}h(we,"executeToolCalls");function xe(e){const t=new Map;for(const s of e??[]){t.set(s.name,s);for(const a of s.aliases??[])t.has(a)||t.set(a,s)}return t}h(xe,"buildToolMap");function Ee(e){return/^Permission (denied|request was cancelled)/i.test(e.trim())}h(Ee,"isPermissionDeniedMessage");function $e(e,t){if(!t||t<=0)return e;let s=Math.floor(t),a=!1;const o=e.content.map(n=>{if(n.type!=="text")return n;if(s<=0)return a=!0,{...n,text:""};if(n.text.length<=s)return s-=n.text.length,n;a=!0;const d=n.text.slice(0,s);return s=0,{...n,text:d}});if(!a)return e;const i=`
2
3
 
3
- [Tool result truncated to ${Math.floor(t)} characters.]`;let _=-1;for(let n=o.length-1;n>=0;n-=1)if(o[n]?.type==="text"){_=n;break}if(_>=0){const n=o[_];o[_]={...n,text:`${n.text}${p}`}}else o.push({type:"text",text:p.trimStart()});return{...e,content:o}}g(Ee,"enforceMaxResultSize");function xe(e,t){const s={content:[{type:"text",text:"Skipped due to queued user message."}],details:{}};return t.push({type:"tool_execution_start",toolCallId:e.id,toolName:e.name,args:e.arguments}),t.push({type:"tool_execution_end",toolCallId:e.id,toolName:e.name,result:s,isError:!0}),{role:"toolResult",toolCallId:e.id,toolName:e.name,content:s.content,details:{},isError:!0,timestamp:Date.now()}}g(xe,"skipToolCall");export{He as agentLoop,Ke as agentLoopContinue};
4
+ [Tool result truncated to ${Math.floor(t)} characters.]`;let p=-1;for(let n=o.length-1;n>=0;n-=1)if(o[n]?.type==="text"){p=n;break}if(p>=0){const n=o[p];o[p]={...n,text:`${n.text}${i}`}}else o.push({type:"text",text:i.trimStart()});return{...e,content:o}}h($e,"enforceMaxResultSize");function De(e,t){const s={content:[{type:"text",text:"Skipped due to queued user message."}],details:{}};return t.push({type:"tool_execution_start",toolCallId:e.id,toolName:e.name,args:e.arguments}),t.push({type:"tool_execution_end",toolCallId:e.id,toolName:e.name,result:s,isError:!0}),{role:"toolResult",toolCallId:e.id,toolName:e.name,content:s.content,details:{},isError:!0,timestamp:Date.now()}}h(De,"skipToolCall");export{Ke as agentLoop,Xe as agentLoopContinue};
@@ -1 +1,2 @@
1
- var q=Object.defineProperty;var d=(e,s)=>q(e,"name",{value:s,configurable:!0});import{EventStream as $}from"@pencil-agent/ai/events";import{isContextOverflow as z}from"@pencil-agent/ai/overflow";import{streamSimple as N}from"@pencil-agent/ai/stream";import{resolveMaxToolConcurrency as X,runStructuredAdaptiveTools as V}from"./structured-adaptive-tool-orchestration.js";import{StructuredAdaptiveStreamingToolExecutor as Y}from"./structured-adaptive-streaming-tool-executor.js";import{ValidationError as L}from"./errors.js";import{computeRecoveryMaxTokens as Q,createOutputTokenRecoveryMessage as j,createTokenBudgetContinuation as G}from"./agent-loop-continuations.js";import{createInterruptedToolResults as J,createSkippedToolCallLimitResults as Z,enforceToolResultBatchSize as x}from"./agent-loop-tool-results.js";import{flushReadyToolUseSummaries as ee,startToolUseSummary as se}from"./agent-loop-tool-summaries.js";import{buildAgentRunPolicy as te,resolveAgentRunLoopFramework as oe}from"./agent-run-result.js";import{waitForAbortableOperation as E,waitForAssistantStream as ae,waitForAssistantStreamEvent as ne}from"./agent-loop-stream-events.js";const re=256,ue=512,pe=1,ie=3,le=1;function Me(e,s,o,r,a){const p=F();return(async()=>{const _=[...e],y={...s,messages:[...s.messages,...e]};try{p.push({type:"agent_start"}),p.push({type:"turn_start"});for(const C of e)p.push({type:"message_start",message:C}),p.push({type:"message_end",message:C});await W(y,_,o,r,p,a)}catch(C){B(p,_,o,C,r)}})(),p}d(Me,"structuredAdaptiveAgentLoop");function be(e,s,o,r){if(e.messages.length===0)throw new L("Cannot continue: no messages in context");if(e.messages[e.messages.length-1].role==="assistant")throw new L("Cannot continue from message role: assistant");const a=F();return(async()=>{const p=[],_={...e};try{a.push({type:"agent_start"}),a.push({type:"turn_start"}),await W(_,p,s,o,a,r)}catch(y){B(a,p,s,y,o)}})(),a}d(be,"structuredAdaptiveAgentLoopContinue");function F(){return new $(e=>e.type==="agent_end",e=>e.type==="agent_end"?e.messages:[])}d(F,"createAgentStream");async function W(e,s,o,r,a,p){const _=o.maxTurnsPerPrompt??re,y=o.maxToolCallsPerPrompt??ue,C=o.maxOutputTokenRecoveryAttempts??pe,b=o.maxStopHookContinuations??ie,U=o.maxModelErrorRecoveryAttempts??le,A=await E(o.getSteeringMessages?o.getSteeringMessages():[],r),t={config:o,turnCount:0,toolCallCount:0,transition:{reason:"start"},transitions:[],pendingMessages:A.type==="resolved"?A.value||[]:[],pendingToolUseSummaries:[],stopHookActive:!1,stopHookContinuationCount:0,maxOutputTokensRecoveryCount:0,modelErrorRecoveryCount:0,tokenBudgetContinuationCount:0,hasAttemptedReactiveCompact:!1,startedAt:Date.now(),usage:K(),permissionDenials:[]};if(A.type==="aborted"){H(a,e,s,t);return}let O=!0;for(;;){if(O?O=!1:a.push({type:"turn_start"}),t.pendingToolUseSummaries=ee(t.pendingToolUseSummaries,e.messages,s,a),t.pendingMessages.length>0){for(const n of t.pendingMessages)a.push({type:"message_start",message:n}),a.push({type:"message_end",message:n}),e.messages.push(n),s.push(n);t.pendingMessages=[]}if(t.turnCount+=1,t.turnCount>_){const n=T(o,`max_turns_reached: stopped after ${_} assistant turns to prevent a runaway agent loop.`);e.messages.push(n),s.push(n),a.push({type:"message_start",message:{...n}}),a.push({type:"message_end",message:n}),a.push({type:"turn_end",message:n,toolResults:[]}),v(t,{reason:"max_turns_reached",maxTurns:_,turnCount:t.turnCount}),t.finalStopReason="error",t.finalErrorMessage=n.errorMessage,t.finalErrorSubtype="max_turns_reached",M(a,s,t);return}const k=new Y(e.tools,r,a,X(o.maxToolConcurrency),o.canUseTool),g=s.length,u=await me(e,o,r,a,p,t.maxOutputTokensOverride,k);if(s.push(u),de(t.usage,u.usage),t.maxOutputTokensOverride=void 0,u.stopReason==="error"||u.stopReason==="aborted"){const n=u.stopReason==="aborted"?"aborted":z(u,o.model.contextWindow)?"context_overflow":"model_error",l=k.size>0?await k.discardAndDrain(u.stopReason==="aborted"?"assistant stream aborted":"assistant stream error",u.stopReason==="aborted"?"cancel":"all"):{toolResults:[],contextMessages:[],permissionDenials:[]},f=x(l.toolResults,o.maxToolResultBatchSizeChars),w=J(u,new Set(f.map(i=>i.toolCallId))),S=[...f,...w];for(const i of S)e.messages.push(i),s.push(i),a.push({type:"message_start",message:i}),a.push({type:"message_end",message:i});for(const i of l.contextMessages)e.messages.push(i),s.push(i),a.push({type:"message_start",message:i}),a.push({type:"message_end",message:i});if(u.stopReason==="error"&&o.recoverModelError&&t.modelErrorRecoveryCount<U){const i=t.modelErrorRecoveryCount+1,D=await o.recoverModelError({message:u,messages:e.messages,errorSubtype:n,attempt:i});if(D.action==="retry"){a.push({type:"turn_end",message:u,toolResults:S}),t.modelErrorRecoveryCount=i,s.splice(g),e.messages=D.messages,v(t,D.transition??{reason:"model_error_recovery",subtype:n,attempt:i});continue}}t.permissionDenials.push(...l.permissionDenials),a.push({type:"turn_end",message:u,toolResults:S}),t.finalStopReason=u.stopReason,t.finalErrorMessage=u.errorMessage,t.finalErrorSubtype=n,M(a,s,t);return}const R=u.content.filter(n=>n.type==="toolCall");if(R.length===0){if(a.push({type:"turn_end",message:u,toolResults:[]}),u.stopReason==="length"&&t.maxOutputTokensRecoveryCount<C){t.maxOutputTokensRecoveryCount+=1,t.maxOutputTokensOverride=Q(o,u),t.pendingMessages=[j(t.maxOutputTokensRecoveryCount)],v(t,{reason:"max_output_tokens_recovery",attempt:t.maxOutputTokensRecoveryCount});continue}if(o.runStopHooks&&!t.stopHookActive){t.stopHookActive=!0;const w=await E(o.runStopHooks({message:u,messages:e.messages}),r);if(t.stopHookActive=!1,w.type==="aborted"){H(a,e,s,t);return}const S=w.value;if(S.action==="continue"&&S.messages.length>0){if(t.stopHookContinuationCount>=b){const i=T(o,`stop_hook_limit_reached: stopped after ${b} stop-hook continuation turns.`);e.messages.push(i),s.push(i),a.push({type:"message_start",message:{...i}}),a.push({type:"message_end",message:i}),a.push({type:"turn_end",message:i,toolResults:[]}),v(t,{reason:"stop_hook_limit_reached",maxContinuations:b,continuationCount:t.stopHookContinuationCount}),t.finalStopReason="error",t.finalErrorMessage=i.errorMessage,t.finalErrorSubtype="stop_hook_limit_reached",M(a,s,t);return}t.stopHookContinuationCount+=1,t.pendingMessages=S.messages,v(t,{reason:"stop_hook_blocking",continuationCount:t.stopHookContinuationCount});continue}}const n=G(o,t.usage.output,t.tokenBudgetContinuationCount);if(n){t.tokenBudgetContinuationCount+=1,t.pendingMessages=[n.message],v(t,{reason:"token_budget_continuation",continuationCount:t.tokenBudgetContinuationCount,outputTokens:n.outputTokens,targetTokens:n.targetTokens});continue}const l=await E(o.getFollowUpMessages?o.getFollowUpMessages():[],r);if(l.type==="aborted"){H(a,e,s,t);return}const f=l.value||[];if(f.length===0)break;t.pendingMessages=f,v(t,{reason:"follow_up"});continue}if(t.toolCallCount+R.length>y){const n=Z(u,`Tool call skipped because this prompt reached the ${y} tool-call limit.`);for(const f of n)e.messages.push(f),s.push(f),a.push({type:"message_start",message:f}),a.push({type:"message_end",message:f});const l=T(o,`tool_call_limit_reached: stopped before executing ${R.length} tool call${R.length===1?"":"s"} because this prompt reached the ${y} tool-call limit.`);e.messages.push(l),s.push(l),a.push({type:"message_start",message:{...l}}),a.push({type:"message_end",message:l}),a.push({type:"turn_end",message:l,toolResults:n}),v(t,{reason:"tool_call_limit_reached",maxToolCalls:y,requestedToolCalls:R.length,toolCallCount:t.toolCallCount}),t.finalStopReason="error",t.finalErrorMessage=l.errorMessage,t.finalErrorSubtype="tool_call_limit_reached",M(a,s,t);return}t.toolCallCount+=R.length;const c=k.size>0?await k.drain():await V(R,e.tools,r,a,o.getSteeringMessages,o.maxToolConcurrency,o.canUseTool),m=x(c.toolResults,o.maxToolResultBatchSizeChars);t.permissionDenials.push(...c.permissionDenials);for(const n of m)e.messages.push(n),s.push(n),a.push({type:"message_start",message:n}),a.push({type:"message_end",message:n});for(const n of c.contextMessages)e.messages.push(n),s.push(n),a.push({type:"message_start",message:n}),a.push({type:"message_end",message:n});const h=se(o,{assistantMessage:u,toolResults:m,contextMessages:c.contextMessages,messages:e.messages});h&&t.pendingToolUseSummaries.push(h),a.push({type:"turn_end",message:u,toolResults:m}),c.steeringMessages&&c.steeringMessages.length>0?t.pendingMessages=c.steeringMessages:t.pendingMessages=await o.getSteeringMessages?.()||[],v(t,{reason:"tool_result",toolCallCount:R.length})}t.finalStopReason=t.finalStopReason??I(s),M(a,s,t)}d(W,"runStructuredAdaptiveQueryLoop");async function me(e,s,o,r,a,p,_){let y=e.messages;if(s.transformContext){const m=await E(s.transformContext(y,o),o);if(m.type==="aborted")return P(e,r,s);y=m.value}const C=await E(s.convertToLlm(y),o);if(C.type==="aborted")return P(e,r,s);const b=C.value,U={systemPrompt:e.systemPrompt,messages:b,tools:e.tools},A=a||N,t=await E(s.getApiKey?s.getApiKey(s.model.provider):void 0,o);if(t.type==="aborted")return P(e,r,s);const O=t.value||s.apiKey;r.push({type:"stream_request_start",model:s.model.id,provider:s.model.provider,api:s.model.api,messageCount:b.length,maxTokens:p??s.maxTokens});const k=await ae(A(s.model,U,{...s,maxTokens:p??s.maxTokens,apiKey:O,signal:o}),o);if(k==="aborted"){const m=T(s,"Request was aborted");return m.stopReason="aborted",e.messages.push(m),r.push({type:"message_start",message:{...m}}),r.push({type:"message_end",message:m}),m}let g=null,u=!1;const R=k[Symbol.asyncIterator]();for(;;){let m;try{m=await ne(R,o)}catch(n){const l=T(s,n instanceof Error?n.message:String(n));return u?e.messages[e.messages.length-1]=l:(e.messages.push(l),r.push({type:"message_start",message:{...l}})),r.push({type:"message_end",message:l}),l}if(m==="aborted"){R.return?.();const n=T(s,"Request was aborted");return n.stopReason="aborted",u?e.messages[e.messages.length-1]=n:(e.messages.push(n),r.push({type:"message_start",message:{...n}})),r.push({type:"message_end",message:n}),n}if(m.done)break;const h=m.value;switch(h.type){case"start":g=h.partial,e.messages.push(g),u=!0,r.push({type:"message_start",message:{...g}});break;case"text_start":case"text_delta":case"text_end":case"thinking_start":case"thinking_delta":case"thinking_end":case"toolcall_start":case"toolcall_delta":g&&(g=h.partial,e.messages[e.messages.length-1]=g,r.push({type:"message_update",assistantMessageEvent:h,message:{...g}}));break;case"toolcall_end":g&&(g=h.partial,e.messages[e.messages.length-1]=g,r.push({type:"message_update",assistantMessageEvent:h,message:{...g}}),_?.addTool(h.toolCall));break;case"done":case"error":{const n=h.type==="done"?h.message:h.error;return u?e.messages[e.messages.length-1]=n:e.messages.push(n),u||r.push({type:"message_start",message:{...n}}),r.push({type:"message_end",message:n}),n}}}const c=k.resultIfResolved()??T(s,"Provider stream ended without a final assistant message");return u?e.messages[e.messages.length-1]=c:(e.messages.push(c),r.push({type:"message_start",message:{...c}})),r.push({type:"message_end",message:c}),c}d(me,"streamAssistantResponse");function P(e,s,o){const r=T(o,"Request was aborted");return r.stopReason="aborted",e.messages.push(r),s.push({type:"message_start",message:{...r}}),s.push({type:"message_end",message:r}),r}d(P,"pushAbortedAssistantMessage");function H(e,s,o,r){const a=T(r.config,"Request was aborted");a.stopReason="aborted",s.messages.push(a),o.push(a),e.push({type:"message_start",message:{...a}}),e.push({type:"message_end",message:a}),e.push({type:"turn_end",message:a,toolResults:[]}),r.finalStopReason="aborted",r.finalErrorMessage=a.errorMessage,r.finalErrorSubtype="aborted",M(e,o,r)}d(H,"finishStructuredAdaptiveWithAbortedTurn");function T(e,s){return{role:"assistant",content:[{type:"text",text:""}],api:e.model.api,provider:e.model.provider,model:e.model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"error",errorMessage:s,timestamp:Date.now()}}d(T,"createLoopLimitMessage");function B(e,s,o,r,a){const p=T(o,r instanceof Error?r.message:String(r));a?.aborted&&(p.stopReason="aborted"),s.push(p),e.push({type:"message_start",message:{...p}}),e.push({type:"message_end",message:p}),e.push({type:"turn_end",message:p,toolResults:[]});const _={config:o,turnCount:0,toolCallCount:0,transition:{reason:"start"},transitions:[],pendingMessages:[],pendingToolUseSummaries:[],stopHookActive:!1,stopHookContinuationCount:0,maxOutputTokensRecoveryCount:0,modelErrorRecoveryCount:0,tokenBudgetContinuationCount:0,hasAttemptedReactiveCompact:!1,startedAt:Date.now(),usage:K(),permissionDenials:[],finalStopReason:p.stopReason,finalErrorMessage:p.errorMessage,finalErrorSubtype:a?.aborted?"aborted":"loop_error"};M(e,s,_)}d(B,"endWithLoopError");function M(e,s,o){e.push({type:"agent_result",stopReason:o.finalStopReason??I(s),loopFramework:oe(o.config),loopPolicy:te(o.config),turnCount:o.turnCount,toolCallCount:o.toolCallCount,durationMs:Date.now()-o.startedAt,usage:o.usage,permissionDenialCount:o.permissionDenials.length,permissionDenials:o.permissionDenials,transitions:o.transitions.length>0?o.transitions:void 0,lastTransition:o.transition,errorMessage:o.finalErrorMessage,errorSubtype:o.finalErrorSubtype}),e.push({type:"agent_end",messages:s}),e.end(s)}d(M,"finish");function v(e,s){e.transition=s,e.transitions.push(s)}d(v,"recordTransition");function K(){return{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}}}d(K,"emptyUsage");function de(e,s){e.input+=s.input,e.output+=s.output,e.cacheRead+=s.cacheRead,e.cacheWrite+=s.cacheWrite,e.totalTokens+=s.totalTokens,e.cost.input+=s.cost.input,e.cost.output+=s.cost.output,e.cost.cacheRead+=s.cost.cacheRead,e.cost.cacheWrite+=s.cost.cacheWrite,e.cost.total+=s.cost.total}d(de,"addUsage");function I(e){for(let s=e.length-1;s>=0;s-=1){const o=e[s];if(o?.role==="assistant")return o.stopReason}return"stop"}d(I,"inferStopReason");export{Me as structuredAdaptiveAgentLoop,be as structuredAdaptiveAgentLoopContinue};
1
+ var N=Object.defineProperty;var c=(e,s)=>N(e,"name",{value:s,configurable:!0});import{EventStream as z}from"@pencil-agent/ai/events";import{isContextOverflow as X}from"@pencil-agent/ai/overflow";import{streamSimple as V}from"@pencil-agent/ai/stream";import{resolveMaxToolConcurrency as Y,runStructuredAdaptiveTools as j}from"./structured-adaptive-tool-orchestration.js";import{StructuredAdaptiveStreamingToolExecutor as G}from"./structured-adaptive-streaming-tool-executor.js";import{ValidationError as H}from"./errors.js";import{computeRecoveryMaxTokens as Q,createOutputTokenRecoveryMessage as J,createTokenBudgetContinuation as Z}from"./agent-loop-continuations.js";import{createInterruptedToolResults as ee,createSkippedToolCallLimitResults as se,enforceToolResultBatchSize as B}from"./agent-loop-tool-results.js";import{flushReadyToolUseSummaries as te,startToolUseSummary as oe}from"./agent-loop-tool-summaries.js";import{buildAgentRunPolicy as ae,resolveAgentRunLoopFramework as ne}from"./agent-run-result.js";import{waitForAbortableOperation as b,waitForAssistantStream as re,waitForAssistantStreamEvent as ue}from"./agent-loop-stream-events.js";const pe=256,le=512,ie=1,me=3,de=1;function O(e){if(process.env.NANOPENCIL_DEBUG==="1")try{const{appendFileSync:s}=require("fs"),{join:t}=require("path"),{homedir:r}=require("os");s(t(r(),".nanopencil","agent","nanopencil-debug.log"),`[${new Date().toISOString()}] [loop] ${e}
2
+ `)}catch{}}c(O,"_tlog");function be(e,s,t,r,a){const p=W();return(async()=>{const y=[...e],l={...s,messages:[...s.messages,...e]};try{p.push({type:"agent_start"}),p.push({type:"turn_start"});for(const R of e)p.push({type:"message_start",message:R}),p.push({type:"message_end",message:R});await q(l,y,t,r,p,a)}catch(R){I(p,y,t,R,r)}})(),p}c(be,"structuredAdaptiveAgentLoop");function Ee(e,s,t,r){if(e.messages.length===0)throw new H("Cannot continue: no messages in context");if(e.messages[e.messages.length-1].role==="assistant")throw new H("Cannot continue from message role: assistant");const a=W();return(async()=>{const p=[],y={...e};try{a.push({type:"agent_start"}),a.push({type:"turn_start"}),await q(y,p,s,t,a,r)}catch(l){I(a,p,s,l,t)}})(),a}c(Ee,"structuredAdaptiveAgentLoopContinue");function W(){return new z(e=>e.type==="agent_end",e=>e.type==="agent_end"?e.messages:[])}c(W,"createAgentStream");async function q(e,s,t,r,a,p){const y=t.maxTurnsPerPrompt??pe,l=t.maxToolCallsPerPrompt??le,R=t.maxOutputTokenRecoveryAttempts??ie,A=t.maxStopHookContinuations??me,E=t.maxModelErrorRecoveryAttempts??de,w=await b(t.getSteeringMessages?t.getSteeringMessages():[],r),D={loopStart:performance.now(),streamStart:0,firstTokenAt:0,turnCount:0};O("run_loop start (structured-adaptive)");const o={config:t,turnCount:0,toolCallCount:0,transition:{reason:"start"},transitions:[],pendingMessages:w.type==="resolved"?w.value||[]:[],pendingToolUseSummaries:[],stopHookActive:!1,stopHookContinuationCount:0,maxOutputTokensRecoveryCount:0,modelErrorRecoveryCount:0,tokenBudgetContinuationCount:0,hasAttemptedReactiveCompact:!1,startedAt:Date.now(),usage:K(),permissionDenials:[]};if(w.type==="aborted"){F(a,e,s,o);return}let U=!0;for(;;){if(U?U=!1:a.push({type:"turn_start"}),o.pendingToolUseSummaries=te(o.pendingToolUseSummaries,e.messages,s,a),o.pendingMessages.length>0){for(const n of o.pendingMessages)a.push({type:"message_start",message:n}),a.push({type:"message_end",message:n}),e.messages.push(n),s.push(n);o.pendingMessages=[]}if(o.turnCount+=1,o.turnCount>y){const n=C(t,`max_turns_reached: stopped after ${y} assistant turns to prevent a runaway agent loop.`);e.messages.push(n),s.push(n),a.push({type:"message_start",message:{...n}}),a.push({type:"message_end",message:n}),a.push({type:"turn_end",message:n,toolResults:[]}),S(o,{reason:"max_turns_reached",maxTurns:y,turnCount:o.turnCount}),o.finalStopReason="error",o.finalErrorMessage=n.errorMessage,o.finalErrorSubtype="max_turns_reached",M(a,s,o);return}const k=new G(e.tools,r,a,Y(t.maxToolConcurrency),t.canUseTool);D.turnCount++;const g=s.length,u=await ce(e,t,r,a,p,o.maxOutputTokensOverride,k,D);if(s.push(u),ge(o.usage,u.usage),o.maxOutputTokensOverride=void 0,u.stopReason==="error"||u.stopReason==="aborted"){const n=u.stopReason==="aborted"?"aborted":X(u,t.model.contextWindow)?"context_overflow":"model_error",d=k.size>0?await k.discardAndDrain(u.stopReason==="aborted"?"assistant stream aborted":"assistant stream error",u.stopReason==="aborted"?"cancel":"all"):{toolResults:[],contextMessages:[],permissionDenials:[]},T=B(d.toolResults,t.maxToolResultBatchSizeChars),x=ee(u,new Set(T.map(i=>i.toolCallId))),v=[...T,...x];for(const i of v)e.messages.push(i),s.push(i),a.push({type:"message_start",message:i}),a.push({type:"message_end",message:i});for(const i of d.contextMessages)e.messages.push(i),s.push(i),a.push({type:"message_start",message:i}),a.push({type:"message_end",message:i});if(u.stopReason==="error"&&t.recoverModelError&&o.modelErrorRecoveryCount<E){const i=o.modelErrorRecoveryCount+1,P=await t.recoverModelError({message:u,messages:e.messages,errorSubtype:n,attempt:i});if(P.action==="retry"){a.push({type:"turn_end",message:u,toolResults:v}),o.modelErrorRecoveryCount=i,s.splice(g),e.messages=P.messages,S(o,P.transition??{reason:"model_error_recovery",subtype:n,attempt:i});continue}}o.permissionDenials.push(...d.permissionDenials),a.push({type:"turn_end",message:u,toolResults:v}),o.finalStopReason=u.stopReason,o.finalErrorMessage=u.errorMessage,o.finalErrorSubtype=n,M(a,s,o);return}const f=u.content.filter(n=>n.type==="toolCall");if(f.length===0){if(a.push({type:"turn_end",message:u,toolResults:[]}),u.stopReason==="length"&&o.maxOutputTokensRecoveryCount<R){o.maxOutputTokensRecoveryCount+=1,o.maxOutputTokensOverride=Q(t,u),o.pendingMessages=[J(o.maxOutputTokensRecoveryCount)],S(o,{reason:"max_output_tokens_recovery",attempt:o.maxOutputTokensRecoveryCount});continue}if(t.runStopHooks&&!o.stopHookActive){o.stopHookActive=!0;const x=await b(t.runStopHooks({message:u,messages:e.messages}),r);if(o.stopHookActive=!1,x.type==="aborted"){F(a,e,s,o);return}const v=x.value;if(v.action==="continue"&&v.messages.length>0){if(o.stopHookContinuationCount>=A){const i=C(t,`stop_hook_limit_reached: stopped after ${A} stop-hook continuation turns.`);e.messages.push(i),s.push(i),a.push({type:"message_start",message:{...i}}),a.push({type:"message_end",message:i}),a.push({type:"turn_end",message:i,toolResults:[]}),S(o,{reason:"stop_hook_limit_reached",maxContinuations:A,continuationCount:o.stopHookContinuationCount}),o.finalStopReason="error",o.finalErrorMessage=i.errorMessage,o.finalErrorSubtype="stop_hook_limit_reached",M(a,s,o);return}o.stopHookContinuationCount+=1,o.pendingMessages=v.messages,S(o,{reason:"stop_hook_blocking",continuationCount:o.stopHookContinuationCount});continue}}const n=Z(t,o.usage.output,o.tokenBudgetContinuationCount);if(n){o.tokenBudgetContinuationCount+=1,o.pendingMessages=[n.message],S(o,{reason:"token_budget_continuation",continuationCount:o.tokenBudgetContinuationCount,outputTokens:n.outputTokens,targetTokens:n.targetTokens});continue}const d=await b(t.getFollowUpMessages?t.getFollowUpMessages():[],r);if(d.type==="aborted"){F(a,e,s,o);return}const T=d.value||[];if(T.length===0)break;o.pendingMessages=T,S(o,{reason:"follow_up"});continue}if(o.toolCallCount+f.length>l){const n=se(u,`Tool call skipped because this prompt reached the ${l} tool-call limit.`);for(const T of n)e.messages.push(T),s.push(T),a.push({type:"message_start",message:T}),a.push({type:"message_end",message:T});const d=C(t,`tool_call_limit_reached: stopped before executing ${f.length} tool call${f.length===1?"":"s"} because this prompt reached the ${l} tool-call limit.`);e.messages.push(d),s.push(d),a.push({type:"message_start",message:{...d}}),a.push({type:"message_end",message:d}),a.push({type:"turn_end",message:d,toolResults:n}),S(o,{reason:"tool_call_limit_reached",maxToolCalls:l,requestedToolCalls:f.length,toolCallCount:o.toolCallCount}),o.finalStopReason="error",o.finalErrorMessage=d.errorMessage,o.finalErrorSubtype="tool_call_limit_reached",M(a,s,o);return}o.toolCallCount+=f.length;const h=k.size>0?await k.drain():await j(f,e.tools,r,a,t.getSteeringMessages,t.maxToolConcurrency,t.canUseTool),m=B(h.toolResults,t.maxToolResultBatchSizeChars);o.permissionDenials.push(...h.permissionDenials);for(const n of m)e.messages.push(n),s.push(n),a.push({type:"message_start",message:n}),a.push({type:"message_end",message:n});for(const n of h.contextMessages)e.messages.push(n),s.push(n),a.push({type:"message_start",message:n}),a.push({type:"message_end",message:n});const _=oe(t,{assistantMessage:u,toolResults:m,contextMessages:h.contextMessages,messages:e.messages});_&&o.pendingToolUseSummaries.push(_),a.push({type:"turn_end",message:u,toolResults:m}),h.steeringMessages&&h.steeringMessages.length>0?o.pendingMessages=h.steeringMessages:o.pendingMessages=await t.getSteeringMessages?.()||[],S(o,{reason:"tool_result",toolCallCount:f.length})}o.finalStopReason=o.finalStopReason??L(s),M(a,s,o)}c(q,"runStructuredAdaptiveQueryLoop");async function ce(e,s,t,r,a,p,y,l){let R=e.messages;if(s.transformContext){const m=await b(s.transformContext(R,t),t);if(m.type==="aborted")return $(e,r,s);R=m.value}const A=await b(s.convertToLlm(R),t);if(A.type==="aborted")return $(e,r,s);const E=A.value,w={systemPrompt:e.systemPrompt,messages:E,tools:e.tools},D=a||V,o=await b(s.getApiKey?s.getApiKey(s.model.provider):void 0,t);if(o.type==="aborted")return $(e,r,s);const U=o.value||s.apiKey;l&&(l.streamStart=performance.now(),O(`stream_request_start model=${s.model.id} provider=${s.model.provider} msgCount=${E.length} maxTokens=${p??s.maxTokens} (+${(l.streamStart-l.loopStart).toFixed(0)}ms from loop_start)`)),r.push({type:"stream_request_start",model:s.model.id,provider:s.model.provider,api:s.model.api,messageCount:E.length,maxTokens:p??s.maxTokens});const k=await re(D(s.model,w,{...s,maxTokens:p??s.maxTokens,apiKey:U,signal:t}),t);if(k==="aborted"){const m=C(s,"Request was aborted");return m.stopReason="aborted",e.messages.push(m),r.push({type:"message_start",message:{...m}}),r.push({type:"message_end",message:m}),m}let g=null,u=!1;const f=k[Symbol.asyncIterator]();for(;;){let m;try{m=await ue(f,t)}catch(n){const d=C(s,n instanceof Error?n.message:String(n));return u?e.messages[e.messages.length-1]=d:(e.messages.push(d),r.push({type:"message_start",message:{...d}})),r.push({type:"message_end",message:d}),d}if(m==="aborted"){f.return?.();const n=C(s,"Request was aborted");return n.stopReason="aborted",u?e.messages[e.messages.length-1]=n:(e.messages.push(n),r.push({type:"message_start",message:{...n}})),r.push({type:"message_end",message:n}),n}if(m.done)break;const _=m.value;switch(l&&!l.firstTokenAt&&(l.firstTokenAt=performance.now(),O(`first_token ttft=${(l.firstTokenAt-l.streamStart).toFixed(0)}ms (+${(l.firstTokenAt-l.loopStart).toFixed(0)}ms from loop_start)`)),_.type){case"start":g=_.partial,e.messages.push(g),u=!0,r.push({type:"message_start",message:{...g}});break;case"text_start":case"text_delta":case"text_end":case"thinking_start":case"thinking_delta":case"thinking_end":case"toolcall_start":case"toolcall_delta":g&&(g=_.partial,e.messages[e.messages.length-1]=g,r.push({type:"message_update",assistantMessageEvent:_,message:{...g}}));break;case"toolcall_end":g&&(g=_.partial,e.messages[e.messages.length-1]=g,r.push({type:"message_update",assistantMessageEvent:_,message:{...g}}),y?.addTool(_.toolCall));break;case"done":case"error":{const n=_.type==="done"?_.message:_.error;return u?e.messages[e.messages.length-1]=n:e.messages.push(n),u||r.push({type:"message_start",message:{...n}}),r.push({type:"message_end",message:n}),n}}}if(l){const m=performance.now();O(`stream_end duration=${(m-l.streamStart).toFixed(0)}ms total=${(m-l.loopStart).toFixed(0)}ms`)}const h=k.resultIfResolved()??C(s,"Provider stream ended without a final assistant message");return u?e.messages[e.messages.length-1]=h:(e.messages.push(h),r.push({type:"message_start",message:{...h}})),r.push({type:"message_end",message:h}),h}c(ce,"streamAssistantResponse");function $(e,s,t){const r=C(t,"Request was aborted");return r.stopReason="aborted",e.messages.push(r),s.push({type:"message_start",message:{...r}}),s.push({type:"message_end",message:r}),r}c($,"pushAbortedAssistantMessage");function F(e,s,t,r){const a=C(r.config,"Request was aborted");a.stopReason="aborted",s.messages.push(a),t.push(a),e.push({type:"message_start",message:{...a}}),e.push({type:"message_end",message:a}),e.push({type:"turn_end",message:a,toolResults:[]}),r.finalStopReason="aborted",r.finalErrorMessage=a.errorMessage,r.finalErrorSubtype="aborted",M(e,t,r)}c(F,"finishStructuredAdaptiveWithAbortedTurn");function C(e,s){return{role:"assistant",content:[{type:"text",text:""}],api:e.model.api,provider:e.model.provider,model:e.model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"error",errorMessage:s,timestamp:Date.now()}}c(C,"createLoopLimitMessage");function I(e,s,t,r,a){const p=C(t,r instanceof Error?r.message:String(r));a?.aborted&&(p.stopReason="aborted"),s.push(p),e.push({type:"message_start",message:{...p}}),e.push({type:"message_end",message:p}),e.push({type:"turn_end",message:p,toolResults:[]});const y={config:t,turnCount:0,toolCallCount:0,transition:{reason:"start"},transitions:[],pendingMessages:[],pendingToolUseSummaries:[],stopHookActive:!1,stopHookContinuationCount:0,maxOutputTokensRecoveryCount:0,modelErrorRecoveryCount:0,tokenBudgetContinuationCount:0,hasAttemptedReactiveCompact:!1,startedAt:Date.now(),usage:K(),permissionDenials:[],finalStopReason:p.stopReason,finalErrorMessage:p.errorMessage,finalErrorSubtype:a?.aborted?"aborted":"loop_error"};M(e,s,y)}c(I,"endWithLoopError");function M(e,s,t){e.push({type:"agent_result",stopReason:t.finalStopReason??L(s),loopFramework:ne(t.config),loopPolicy:ae(t.config),turnCount:t.turnCount,toolCallCount:t.toolCallCount,durationMs:Date.now()-t.startedAt,usage:t.usage,permissionDenialCount:t.permissionDenials.length,permissionDenials:t.permissionDenials,transitions:t.transitions.length>0?t.transitions:void 0,lastTransition:t.transition,errorMessage:t.finalErrorMessage,errorSubtype:t.finalErrorSubtype}),O(`loop_finished stopReason=${t.finalStopReason??L(s)} turns=${t.turnCount} tools=${t.toolCallCount} duration=${Date.now()-t.startedAt}ms`),e.push({type:"agent_end",messages:s}),e.end(s)}c(M,"finish");function S(e,s){e.transition=s,e.transitions.push(s)}c(S,"recordTransition");function K(){return{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}}}c(K,"emptyUsage");function ge(e,s){e.input+=s.input,e.output+=s.output,e.cacheRead+=s.cacheRead,e.cacheWrite+=s.cacheWrite,e.totalTokens+=s.totalTokens,e.cost.input+=s.cost.input,e.cost.output+=s.cost.output,e.cost.cacheRead+=s.cost.cacheRead,e.cost.cacheWrite+=s.cost.cacheWrite,e.cost.total+=s.cost.total}c(ge,"addUsage");function L(e){for(let s=e.length-1;s>=0;s-=1){const t=e[s];if(t?.role==="assistant")return t.stopReason}return"stop"}c(L,"inferStopReason");export{be as structuredAdaptiveAgentLoop,Ee as structuredAdaptiveAgentLoopContinue};
File without changes