@esso0428/pi-subagents 0.17.15 → 0.17.17

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 (359) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/ROADMAP.md +87 -0
  3. package/docs/post-0.17.6-agents-roster-viewer-spec.md +42 -0
  4. package/docs/post-0.17.6-durable-history-spec.md +41 -0
  5. package/docs/post-0.17.6-feature-specs.md +50 -0
  6. package/docs/post-0.17.6-nested-agents-spec.md +38 -0
  7. package/docs/post-0.17.6-recovery-shutdown-spec.md +46 -0
  8. package/docs/post-0.17.6-ui-latency-baseline-spec.md +46 -0
  9. package/docs/post-0.17.6-workflow-rpc-lifecycle-spec.md +54 -0
  10. package/package.json +2 -3
  11. package/src/agent-history.ts +2 -54
  12. package/src/agent-manager.ts +406 -1288
  13. package/src/agent-runner.ts +27 -251
  14. package/src/agent-types.ts +32 -188
  15. package/src/cross-extension-rpc.ts +20 -96
  16. package/src/custom-agents.ts +13 -170
  17. package/src/index.ts +480 -1920
  18. package/src/invocation-config.ts +3 -118
  19. package/src/model-resolver.ts +0 -18
  20. package/src/output-file.ts +6 -61
  21. package/src/prompts.ts +2 -45
  22. package/src/schedule.ts +14 -35
  23. package/src/settings.ts +2 -301
  24. package/src/status-note.ts +1 -66
  25. package/src/types.ts +10 -177
  26. package/src/ui/agent-widget.ts +57 -278
  27. package/src/ui/conversation-blocks.ts +0 -6
  28. package/src/ui/conversation-timeline.ts +25 -139
  29. package/src/ui/conversation-viewer.ts +48 -212
  30. package/src/ui/schedule-menu.ts +8 -9
  31. package/src/usage.ts +2 -109
  32. package/src/worktree.ts +55 -69
  33. package/dist/abortable.d.ts +0 -13
  34. package/dist/abortable.d.ts.map +0 -1
  35. package/dist/abortable.js +0 -43
  36. package/dist/abortable.js.map +0 -1
  37. package/dist/agent-color.d.ts +0 -36
  38. package/dist/agent-color.d.ts.map +0 -1
  39. package/dist/agent-color.js +0 -124
  40. package/dist/agent-color.js.map +0 -1
  41. package/dist/agent-file-toggle.d.ts +0 -126
  42. package/dist/agent-file-toggle.d.ts.map +0 -1
  43. package/dist/agent-file-toggle.js +0 -259
  44. package/dist/agent-file-toggle.js.map +0 -1
  45. package/dist/agent-history-list.d.ts +0 -19
  46. package/dist/agent-history-list.d.ts.map +0 -1
  47. package/dist/agent-history-list.js +0 -69
  48. package/dist/agent-history-list.js.map +0 -1
  49. package/dist/agent-history.d.ts +0 -35
  50. package/dist/agent-history.d.ts.map +0 -1
  51. package/dist/agent-history.js +0 -188
  52. package/dist/agent-history.js.map +0 -1
  53. package/dist/agent-manager.d.ts +0 -503
  54. package/dist/agent-manager.d.ts.map +0 -1
  55. package/dist/agent-manager.js +0 -1572
  56. package/dist/agent-manager.js.map +0 -1
  57. package/dist/agent-recovery.d.ts +0 -37
  58. package/dist/agent-recovery.d.ts.map +0 -1
  59. package/dist/agent-recovery.js +0 -171
  60. package/dist/agent-recovery.js.map +0 -1
  61. package/dist/agent-runner.d.ts +0 -303
  62. package/dist/agent-runner.d.ts.map +0 -1
  63. package/dist/agent-runner.js +0 -1003
  64. package/dist/agent-runner.js.map +0 -1
  65. package/dist/agent-types.d.ts +0 -120
  66. package/dist/agent-types.d.ts.map +0 -1
  67. package/dist/agent-types.js +0 -301
  68. package/dist/agent-types.js.map +0 -1
  69. package/dist/child-context.d.ts +0 -3
  70. package/dist/child-context.d.ts.map +0 -1
  71. package/dist/child-context.js +0 -13
  72. package/dist/child-context.js.map +0 -1
  73. package/dist/context.d.ts +0 -13
  74. package/dist/context.d.ts.map +0 -1
  75. package/dist/context.js +0 -57
  76. package/dist/context.js.map +0 -1
  77. package/dist/cross-extension-rpc.d.ts +0 -67
  78. package/dist/cross-extension-rpc.d.ts.map +0 -1
  79. package/dist/cross-extension-rpc.js +0 -139
  80. package/dist/cross-extension-rpc.js.map +0 -1
  81. package/dist/custom-agents.d.ts +0 -55
  82. package/dist/custom-agents.d.ts.map +0 -1
  83. package/dist/custom-agents.js +0 -309
  84. package/dist/custom-agents.js.map +0 -1
  85. package/dist/default-agents.d.ts +0 -8
  86. package/dist/default-agents.d.ts.map +0 -1
  87. package/dist/default-agents.js +0 -123
  88. package/dist/default-agents.js.map +0 -1
  89. package/dist/enabled-models.d.ts +0 -50
  90. package/dist/enabled-models.d.ts.map +0 -1
  91. package/dist/enabled-models.js +0 -146
  92. package/dist/enabled-models.js.map +0 -1
  93. package/dist/env.d.ts +0 -7
  94. package/dist/env.d.ts.map +0 -1
  95. package/dist/env.js +0 -29
  96. package/dist/env.js.map +0 -1
  97. package/dist/group-join.d.ts +0 -33
  98. package/dist/group-join.d.ts.map +0 -1
  99. package/dist/group-join.js +0 -117
  100. package/dist/group-join.js.map +0 -1
  101. package/dist/index.d.ts +0 -51
  102. package/dist/index.d.ts.map +0 -1
  103. package/dist/index.js +0 -3687
  104. package/dist/index.js.map +0 -1
  105. package/dist/invocation-config.d.ts +0 -108
  106. package/dist/invocation-config.d.ts.map +0 -1
  107. package/dist/invocation-config.js +0 -84
  108. package/dist/invocation-config.js.map +0 -1
  109. package/dist/memory.d.ts +0 -54
  110. package/dist/memory.d.ts.map +0 -1
  111. package/dist/memory.js +0 -166
  112. package/dist/memory.js.map +0 -1
  113. package/dist/mention-clone.d.ts +0 -88
  114. package/dist/mention-clone.d.ts.map +0 -1
  115. package/dist/mention-clone.js +0 -154
  116. package/dist/mention-clone.js.map +0 -1
  117. package/dist/mention.d.ts +0 -82
  118. package/dist/mention.d.ts.map +0 -1
  119. package/dist/mention.js +0 -132
  120. package/dist/mention.js.map +0 -1
  121. package/dist/model-resolver.d.ts +0 -37
  122. package/dist/model-resolver.d.ts.map +0 -1
  123. package/dist/model-resolver.js +0 -96
  124. package/dist/model-resolver.js.map +0 -1
  125. package/dist/model-scope.d.ts +0 -50
  126. package/dist/model-scope.d.ts.map +0 -1
  127. package/dist/model-scope.js +0 -49
  128. package/dist/model-scope.js.map +0 -1
  129. package/dist/nested-tools.d.ts +0 -57
  130. package/dist/nested-tools.d.ts.map +0 -1
  131. package/dist/nested-tools.js +0 -301
  132. package/dist/nested-tools.js.map +0 -1
  133. package/dist/nico-overrides.d.ts +0 -54
  134. package/dist/nico-overrides.d.ts.map +0 -1
  135. package/dist/nico-overrides.js +0 -170
  136. package/dist/nico-overrides.js.map +0 -1
  137. package/dist/output-file.d.ts +0 -44
  138. package/dist/output-file.d.ts.map +0 -1
  139. package/dist/output-file.js +0 -156
  140. package/dist/output-file.js.map +0 -1
  141. package/dist/prompts.d.ts +0 -56
  142. package/dist/prompts.d.ts.map +0 -1
  143. package/dist/prompts.js +0 -92
  144. package/dist/prompts.js.map +0 -1
  145. package/dist/schedule-store.d.ts +0 -39
  146. package/dist/schedule-store.d.ts.map +0 -1
  147. package/dist/schedule-store.js +0 -156
  148. package/dist/schedule-store.js.map +0 -1
  149. package/dist/schedule.d.ts +0 -110
  150. package/dist/schedule.d.ts.map +0 -1
  151. package/dist/schedule.js +0 -360
  152. package/dist/schedule.js.map +0 -1
  153. package/dist/settings.d.ts +0 -354
  154. package/dist/settings.d.ts.map +0 -1
  155. package/dist/settings.js +0 -247
  156. package/dist/settings.js.map +0 -1
  157. package/dist/skill-loader.d.ts +0 -25
  158. package/dist/skill-loader.d.ts.map +0 -1
  159. package/dist/skill-loader.js +0 -94
  160. package/dist/skill-loader.js.map +0 -1
  161. package/dist/status-note.d.ts +0 -62
  162. package/dist/status-note.d.ts.map +0 -1
  163. package/dist/status-note.js +0 -86
  164. package/dist/status-note.js.map +0 -1
  165. package/dist/structured-output.d.ts +0 -62
  166. package/dist/structured-output.d.ts.map +0 -1
  167. package/dist/structured-output.js +0 -113
  168. package/dist/structured-output.js.map +0 -1
  169. package/dist/types.d.ts +0 -372
  170. package/dist/types.d.ts.map +0 -1
  171. package/dist/types.js +0 -6
  172. package/dist/types.js.map +0 -1
  173. package/dist/ui/agent-mention.d.ts +0 -83
  174. package/dist/ui/agent-mention.d.ts.map +0 -1
  175. package/dist/ui/agent-mention.js +0 -188
  176. package/dist/ui/agent-mention.js.map +0 -1
  177. package/dist/ui/agent-widget.d.ts +0 -241
  178. package/dist/ui/agent-widget.d.ts.map +0 -1
  179. package/dist/ui/agent-widget.js +0 -992
  180. package/dist/ui/agent-widget.js.map +0 -1
  181. package/dist/ui/ccstyle/diff/ansi-utils.d.ts +0 -11
  182. package/dist/ui/ccstyle/diff/ansi-utils.d.ts.map +0 -1
  183. package/dist/ui/ccstyle/diff/ansi-utils.js +0 -145
  184. package/dist/ui/ccstyle/diff/ansi-utils.js.map +0 -1
  185. package/dist/ui/ccstyle/diff/diff-presentation.d.ts +0 -12
  186. package/dist/ui/ccstyle/diff/diff-presentation.d.ts.map +0 -1
  187. package/dist/ui/ccstyle/diff/diff-presentation.js +0 -48
  188. package/dist/ui/ccstyle/diff/diff-presentation.js.map +0 -1
  189. package/dist/ui/ccstyle/diff/diff-renderer.d.ts +0 -46
  190. package/dist/ui/ccstyle/diff/diff-renderer.d.ts.map +0 -1
  191. package/dist/ui/ccstyle/diff/diff-renderer.js +0 -2049
  192. package/dist/ui/ccstyle/diff/diff-renderer.js.map +0 -1
  193. package/dist/ui/ccstyle/diff/line-width-safety.d.ts +0 -12
  194. package/dist/ui/ccstyle/diff/line-width-safety.d.ts.map +0 -1
  195. package/dist/ui/ccstyle/diff/line-width-safety.js +0 -58
  196. package/dist/ui/ccstyle/diff/line-width-safety.js.map +0 -1
  197. package/dist/ui/ccstyle/diff/render-utils.d.ts +0 -6
  198. package/dist/ui/ccstyle/diff/render-utils.d.ts.map +0 -1
  199. package/dist/ui/ccstyle/diff/render-utils.js +0 -25
  200. package/dist/ui/ccstyle/diff/render-utils.js.map +0 -1
  201. package/dist/ui/ccstyle/diff/shiki-highlight.d.ts +0 -19
  202. package/dist/ui/ccstyle/diff/shiki-highlight.d.ts.map +0 -1
  203. package/dist/ui/ccstyle/diff/shiki-highlight.js +0 -85
  204. package/dist/ui/ccstyle/diff/shiki-highlight.js.map +0 -1
  205. package/dist/ui/ccstyle/diff/types.d.ts +0 -22
  206. package/dist/ui/ccstyle/diff/types.d.ts.map +0 -1
  207. package/dist/ui/ccstyle/diff/types.js +0 -10
  208. package/dist/ui/ccstyle/diff/types.js.map +0 -1
  209. package/dist/ui/ccstyle/diff/write-display-utils.d.ts +0 -2
  210. package/dist/ui/ccstyle/diff/write-display-utils.d.ts.map +0 -1
  211. package/dist/ui/ccstyle/diff/write-display-utils.js +0 -12
  212. package/dist/ui/ccstyle/diff/write-display-utils.js.map +0 -1
  213. package/dist/ui/ccstyle/tool-renderer.d.ts +0 -17
  214. package/dist/ui/ccstyle/tool-renderer.d.ts.map +0 -1
  215. package/dist/ui/ccstyle/tool-renderer.js +0 -74
  216. package/dist/ui/ccstyle/tool-renderer.js.map +0 -1
  217. package/dist/ui/ccstyle/tool-result.d.ts +0 -44
  218. package/dist/ui/ccstyle/tool-result.d.ts.map +0 -1
  219. package/dist/ui/ccstyle/tool-result.js +0 -423
  220. package/dist/ui/ccstyle/tool-result.js.map +0 -1
  221. package/dist/ui/conversation-blocks.d.ts +0 -46
  222. package/dist/ui/conversation-blocks.d.ts.map +0 -1
  223. package/dist/ui/conversation-blocks.js +0 -313
  224. package/dist/ui/conversation-blocks.js.map +0 -1
  225. package/dist/ui/conversation-nvim.d.ts +0 -8
  226. package/dist/ui/conversation-nvim.d.ts.map +0 -1
  227. package/dist/ui/conversation-nvim.js +0 -117
  228. package/dist/ui/conversation-nvim.js.map +0 -1
  229. package/dist/ui/conversation-role.d.ts +0 -13
  230. package/dist/ui/conversation-role.d.ts.map +0 -1
  231. package/dist/ui/conversation-role.js +0 -39
  232. package/dist/ui/conversation-role.js.map +0 -1
  233. package/dist/ui/conversation-search.d.ts +0 -39
  234. package/dist/ui/conversation-search.d.ts.map +0 -1
  235. package/dist/ui/conversation-search.js +0 -124
  236. package/dist/ui/conversation-search.js.map +0 -1
  237. package/dist/ui/conversation-timeline.d.ts +0 -102
  238. package/dist/ui/conversation-timeline.d.ts.map +0 -1
  239. package/dist/ui/conversation-timeline.js +0 -555
  240. package/dist/ui/conversation-timeline.js.map +0 -1
  241. package/dist/ui/conversation-viewer.d.ts +0 -138
  242. package/dist/ui/conversation-viewer.d.ts.map +0 -1
  243. package/dist/ui/conversation-viewer.js +0 -1175
  244. package/dist/ui/conversation-viewer.js.map +0 -1
  245. package/dist/ui/schedule-menu.d.ts +0 -17
  246. package/dist/ui/schedule-menu.d.ts.map +0 -1
  247. package/dist/ui/schedule-menu.js +0 -95
  248. package/dist/ui/schedule-menu.js.map +0 -1
  249. package/dist/ui/select-item.d.ts +0 -28
  250. package/dist/ui/select-item.d.ts.map +0 -1
  251. package/dist/ui/select-item.js +0 -35
  252. package/dist/ui/select-item.js.map +0 -1
  253. package/dist/ui/viewer-keys.d.ts +0 -21
  254. package/dist/ui/viewer-keys.d.ts.map +0 -1
  255. package/dist/ui/viewer-keys.js +0 -18
  256. package/dist/ui/viewer-keys.js.map +0 -1
  257. package/dist/ui/workflow-card.d.ts +0 -176
  258. package/dist/ui/workflow-card.d.ts.map +0 -1
  259. package/dist/ui/workflow-card.js +0 -333
  260. package/dist/ui/workflow-card.js.map +0 -1
  261. package/dist/ui/workflow-dialog.d.ts +0 -306
  262. package/dist/ui/workflow-dialog.d.ts.map +0 -1
  263. package/dist/ui/workflow-dialog.js +0 -844
  264. package/dist/ui/workflow-dialog.js.map +0 -1
  265. package/dist/ui/workflow-menu.d.ts +0 -42
  266. package/dist/ui/workflow-menu.d.ts.map +0 -1
  267. package/dist/ui/workflow-menu.js +0 -127
  268. package/dist/ui/workflow-menu.js.map +0 -1
  269. package/dist/usage.d.ts +0 -136
  270. package/dist/usage.d.ts.map +0 -1
  271. package/dist/usage.js +0 -121
  272. package/dist/usage.js.map +0 -1
  273. package/dist/workflow/collisions.d.ts +0 -96
  274. package/dist/workflow/collisions.d.ts.map +0 -1
  275. package/dist/workflow/collisions.js +0 -89
  276. package/dist/workflow/collisions.js.map +0 -1
  277. package/dist/workflow/entry.d.ts +0 -33
  278. package/dist/workflow/entry.d.ts.map +0 -1
  279. package/dist/workflow/entry.js +0 -30
  280. package/dist/workflow/entry.js.map +0 -1
  281. package/dist/workflow/host.d.ts +0 -63
  282. package/dist/workflow/host.d.ts.map +0 -1
  283. package/dist/workflow/host.js +0 -363
  284. package/dist/workflow/host.js.map +0 -1
  285. package/dist/workflow/journal.d.ts +0 -98
  286. package/dist/workflow/journal.d.ts.map +0 -1
  287. package/dist/workflow/journal.js +0 -121
  288. package/dist/workflow/journal.js.map +0 -1
  289. package/dist/workflow/json-schema.d.ts +0 -52
  290. package/dist/workflow/json-schema.d.ts.map +0 -1
  291. package/dist/workflow/json-schema.js +0 -112
  292. package/dist/workflow/json-schema.js.map +0 -1
  293. package/dist/workflow/meta.d.ts +0 -68
  294. package/dist/workflow/meta.d.ts.map +0 -1
  295. package/dist/workflow/meta.js +0 -318
  296. package/dist/workflow/meta.js.map +0 -1
  297. package/dist/workflow/progress.d.ts +0 -225
  298. package/dist/workflow/progress.d.ts.map +0 -1
  299. package/dist/workflow/progress.js +0 -362
  300. package/dist/workflow/progress.js.map +0 -1
  301. package/dist/workflow/runtime.d.ts +0 -335
  302. package/dist/workflow/runtime.d.ts.map +0 -1
  303. package/dist/workflow/runtime.js +0 -831
  304. package/dist/workflow/runtime.js.map +0 -1
  305. package/dist/workflow/saved.d.ts +0 -91
  306. package/dist/workflow/saved.d.ts.map +0 -1
  307. package/dist/workflow/saved.js +0 -204
  308. package/dist/workflow/saved.js.map +0 -1
  309. package/dist/workflow/task.d.ts +0 -137
  310. package/dist/workflow/task.d.ts.map +0 -1
  311. package/dist/workflow/task.js +0 -208
  312. package/dist/workflow/task.js.map +0 -1
  313. package/dist/workflow/tool-description.d.ts +0 -39
  314. package/dist/workflow/tool-description.d.ts.map +0 -1
  315. package/dist/workflow/tool-description.js +0 -200
  316. package/dist/workflow/tool-description.js.map +0 -1
  317. package/dist/workflow/worker-source.d.ts +0 -48
  318. package/dist/workflow/worker-source.d.ts.map +0 -1
  319. package/dist/workflow/worker-source.js +0 -779
  320. package/dist/workflow/worker-source.js.map +0 -1
  321. package/dist/worktree.d.ts +0 -53
  322. package/dist/worktree.d.ts.map +0 -1
  323. package/dist/worktree.js +0 -165
  324. package/dist/worktree.js.map +0 -1
  325. package/dist/write-execution.d.ts +0 -42
  326. package/dist/write-execution.d.ts.map +0 -1
  327. package/dist/write-execution.js +0 -138
  328. package/dist/write-execution.js.map +0 -1
  329. package/dist/xml.d.ts +0 -11
  330. package/dist/xml.d.ts.map +0 -1
  331. package/dist/xml.js +0 -13
  332. package/dist/xml.js.map +0 -1
  333. package/src/abortable.ts +0 -43
  334. package/src/agent-color.ts +0 -161
  335. package/src/agent-file-toggle.ts +0 -269
  336. package/src/child-context.ts +0 -15
  337. package/src/mention-clone.ts +0 -196
  338. package/src/mention.ts +0 -141
  339. package/src/model-scope.ts +0 -70
  340. package/src/nested-tools.ts +0 -424
  341. package/src/structured-output.ts +0 -130
  342. package/src/ui/agent-mention.ts +0 -216
  343. package/src/ui/select-item.ts +0 -45
  344. package/src/ui/workflow-card.ts +0 -470
  345. package/src/ui/workflow-dialog.ts +0 -1115
  346. package/src/ui/workflow-menu.ts +0 -166
  347. package/src/workflow/collisions.ts +0 -123
  348. package/src/workflow/entry.ts +0 -47
  349. package/src/workflow/host.ts +0 -403
  350. package/src/workflow/journal.ts +0 -164
  351. package/src/workflow/json-schema.ts +0 -128
  352. package/src/workflow/meta.ts +0 -325
  353. package/src/workflow/progress.ts +0 -550
  354. package/src/workflow/runtime.ts +0 -1219
  355. package/src/workflow/saved.ts +0 -217
  356. package/src/workflow/task.ts +0 -302
  357. package/src/workflow/tool-description.ts +0 -200
  358. package/src/workflow/worker-source.ts +0 -781
  359. package/src/xml.ts +0 -13
@@ -1,94 +0,0 @@
1
- /**
2
- * skill-loader.ts — Preload named skills.
3
- *
4
- * Roots, in precedence order:
5
- * - <cwd>/.pi/skills (project, Pi's standard)
6
- * - <cwd>/.agents/skills (project, cross-tool Agent Skills spec — https://agentskills.io)
7
- * - getAgentDir()/skills (user, default ~/.pi/agent/skills — Pi's standard)
8
- * - ~/.agents/skills (user, cross-tool Agent Skills spec)
9
- * - ~/.pi/skills (legacy global, pre-Pi)
10
- *
11
- * Layout per root:
12
- * - <root>/<name>.md (flat file at the top level)
13
- * - <root>/.../<name>/SKILL.md (directory skill, may be nested — Pi's standard)
14
- *
15
- * Recursion skips dotfile entries and node_modules. A directory that itself contains
16
- * SKILL.md is a skill — we don't descend into it (Pi: skills don't nest).
17
- *
18
- * Symlinks are rejected for security (deviation from Pi, which follows them).
19
- */
20
- import { existsSync, readdirSync } from "node:fs";
21
- import { homedir } from "node:os";
22
- import { join } from "node:path";
23
- import { getAgentDir } from "@earendil-works/pi-coding-agent";
24
- import { isSymlink, isUnsafeName, safeReadFile } from "./memory.js";
25
- export function preloadSkills(skillNames, cwd) {
26
- return skillNames.map((name) => ({ name, content: loadSkillContent(name, cwd) }));
27
- }
28
- function loadSkillContent(name, cwd) {
29
- if (isUnsafeName(name)) {
30
- return `(Skill "${name}" skipped: name contains path traversal characters)`;
31
- }
32
- const roots = [
33
- join(cwd, ".pi", "skills"), // project — Pi standard
34
- join(cwd, ".agents", "skills"), // project — Agent Skills spec
35
- join(getAgentDir(), "skills"), // user — Pi standard
36
- join(homedir(), ".agents", "skills"), // user — Agent Skills spec
37
- join(homedir(), ".pi", "skills"), // legacy global, pre-Pi
38
- ];
39
- for (const root of roots) {
40
- const content = findInRoot(root, name);
41
- if (content !== undefined)
42
- return content;
43
- }
44
- return `(Skill "${name}" not found in .pi/skills/, .agents/skills/, or global skill locations)`;
45
- }
46
- function findInRoot(root, name) {
47
- if (isSymlink(root))
48
- return undefined; // reject symlinked roots entirely
49
- const flat = safeReadFile(join(root, `${name}.md`))?.trim();
50
- if (flat !== undefined)
51
- return flat;
52
- return findSkillDirectory(root, name);
53
- }
54
- /** BFS under `root` for a directory named `name` containing `SKILL.md`. Pi-conforming filters. */
55
- function findSkillDirectory(root, name) {
56
- if (!existsSync(root))
57
- return undefined;
58
- const queue = [root];
59
- while (queue.length > 0) {
60
- const current = queue.shift();
61
- if (current === undefined)
62
- continue;
63
- let entries;
64
- try {
65
- entries = readdirSync(current, { withFileTypes: true });
66
- }
67
- catch {
68
- continue;
69
- }
70
- // Deterministic byte-order traversal — locale-independent.
71
- entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
72
- for (const entry of entries) {
73
- if (!entry.isDirectory())
74
- continue;
75
- if (entry.name.startsWith(".") || entry.name === "node_modules")
76
- continue;
77
- // Symlinked dirs already filtered by entry.isDirectory() — Dirent uses lstat semantics.
78
- const path = join(current, entry.name);
79
- const skillMd = join(path, "SKILL.md");
80
- const isSkillDir = existsSync(skillMd);
81
- if (isSkillDir) {
82
- if (entry.name === name) {
83
- const content = safeReadFile(skillMd)?.trim();
84
- if (content !== undefined)
85
- return content;
86
- }
87
- continue; // Pi rule: skills don't nest — don't descend into a skill dir
88
- }
89
- queue.push(path);
90
- }
91
- }
92
- return undefined;
93
- }
94
- //# sourceMappingURL=skill-loader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../src/skill-loader.ts"],"names":[],"mappings":"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"}
@@ -1,62 +0,0 @@
1
- /**
2
- * status-note.ts — Honest framing for an agent result: the parenthetical status
3
- * note for a non-normal outcome, and the salvaged partial output of a failure.
4
- *
5
- * Lives here rather than in an index.ts closure because both entry points need
6
- * it — the top-level tools and the nested delegation tools, which can't import
7
- * from index.ts (that is the extension entry, and it already reaches these tools
8
- * through agent-runner).
9
- */
10
- import type { AgentRecord } from "./types.js";
11
- /**
12
- * Explicit parenthetical note for a non-normal terminal outcome, so the parent
13
- * agent can't mistake partial output for a completed result. Empty string for a
14
- * clean completion (and any unknown/non-terminal status).
15
- *
16
- * `stopped` (a human aborted it) is deliberately distinct from `aborted` (the
17
- * turn limit was hit) — the parent should treat human intervention differently
18
- * from a budget cutoff.
19
- */
20
- export declare function getStatusNote(status: string): string;
21
- /**
22
- * Foreground variant of `getStatusNote`. A foreground caller is in a different
23
- * position from a background one, so it needs different text:
24
- *
25
- * - It already holds the agent's ENTIRE output inline, whereas the background
26
- * notification carries a 500-char preview. So only here can we truthfully
27
- * say there is nothing more to fetch — which is the whole point, because
28
- * - it has no agent id. The id travels in the tool result's renderer
29
- * `details`, which is never serialized to the model. A parent that reads
30
- * "output may be partial" as "truncated, go retrieve the rest" therefore
31
- * has nothing valid to call `get_subagent_result` with, and will invent an
32
- * id (#174).
33
- *
34
- * Only the lead clause varies between the three, and each variation carries
35
- * information: `wrapped up` vs `aborted` tells the parent whether the output is
36
- * a considered final answer or a fragment, and `stopped` shouts because a human
37
- * intervening outranks everything else in the string. Only `steered` hedges on
38
- * completion — it was told to wrap up and did, so it may well have finished at
39
- * the limit; an aborted run blew through its grace turns while still working,
40
- * and `stopped` can only fire on a running agent, so neither ever delivered a
41
- * final answer. Identical confidence gets identical wording: phrasing one fact
42
- * two ways invites a hunt for a distinction that isn't there.
43
- *
44
- * Every clause is a statement about state, never an instruction to act, and
45
- * `get_subagent_result` is never named — naming the tool we steer away from only
46
- * raises its salience. Two instructions were tried here and cut: "re-spawn with
47
- * a higher max_turns" (pushes a fresh multi-minute run to save one wasted tool
48
- * call) and, on `stopped`, "ask before restarting it" (restates the lead, and
49
- * presumes someone is present to ask — false under `pi -p`, in scheduled jobs,
50
- * and in any background-driven run). Nothing here can measure whether wording
51
- * improves parent behavior, so removing a false cue (which cannot induce new
52
- * behavior) and adding an instruction (which can) are not equally safe bets.
53
- * Don't add either back without a way to measure it.
54
- */
55
- export declare function getForegroundOutcomeNote(status: string): string;
56
- /**
57
- * Salvaged partial output of a failed run, as a labeled suffix for the error
58
- * surfaces (or "" if the run produced nothing). `record.result` is bounded to
59
- * the run's own turns, so this is never a stale earlier answer (#144).
60
- */
61
- export declare function partialOutputSuffix(record: AgentRecord): string;
62
- //# sourceMappingURL=status-note.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status-note.d.ts","sourceRoot":"","sources":["../src/status-note.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAWpD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAW/D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAG/D"}
@@ -1,86 +0,0 @@
1
- /**
2
- * status-note.ts — Honest framing for an agent result: the parenthetical status
3
- * note for a non-normal outcome, and the salvaged partial output of a failure.
4
- *
5
- * Lives here rather than in an index.ts closure because both entry points need
6
- * it — the top-level tools and the nested delegation tools, which can't import
7
- * from index.ts (that is the extension entry, and it already reaches these tools
8
- * through agent-runner).
9
- */
10
- /**
11
- * Explicit parenthetical note for a non-normal terminal outcome, so the parent
12
- * agent can't mistake partial output for a completed result. Empty string for a
13
- * clean completion (and any unknown/non-terminal status).
14
- *
15
- * `stopped` (a human aborted it) is deliberately distinct from `aborted` (the
16
- * turn limit was hit) — the parent should treat human intervention differently
17
- * from a budget cutoff.
18
- */
19
- export function getStatusNote(status) {
20
- switch (status) {
21
- case "stopped":
22
- return " (STOPPED BY THE USER before completion — output is partial; the task was NOT finished)";
23
- case "aborted":
24
- return " (aborted — hit the turn limit before completion; output may be incomplete)";
25
- case "steered":
26
- return " (wrapped up at the turn limit — output may be partial)";
27
- default:
28
- return "";
29
- }
30
- }
31
- /**
32
- * Foreground variant of `getStatusNote`. A foreground caller is in a different
33
- * position from a background one, so it needs different text:
34
- *
35
- * - It already holds the agent's ENTIRE output inline, whereas the background
36
- * notification carries a 500-char preview. So only here can we truthfully
37
- * say there is nothing more to fetch — which is the whole point, because
38
- * - it has no agent id. The id travels in the tool result's renderer
39
- * `details`, which is never serialized to the model. A parent that reads
40
- * "output may be partial" as "truncated, go retrieve the rest" therefore
41
- * has nothing valid to call `get_subagent_result` with, and will invent an
42
- * id (#174).
43
- *
44
- * Only the lead clause varies between the three, and each variation carries
45
- * information: `wrapped up` vs `aborted` tells the parent whether the output is
46
- * a considered final answer or a fragment, and `stopped` shouts because a human
47
- * intervening outranks everything else in the string. Only `steered` hedges on
48
- * completion — it was told to wrap up and did, so it may well have finished at
49
- * the limit; an aborted run blew through its grace turns while still working,
50
- * and `stopped` can only fire on a running agent, so neither ever delivered a
51
- * final answer. Identical confidence gets identical wording: phrasing one fact
52
- * two ways invites a hunt for a distinction that isn't there.
53
- *
54
- * Every clause is a statement about state, never an instruction to act, and
55
- * `get_subagent_result` is never named — naming the tool we steer away from only
56
- * raises its salience. Two instructions were tried here and cut: "re-spawn with
57
- * a higher max_turns" (pushes a fresh multi-minute run to save one wasted tool
58
- * call) and, on `stopped`, "ask before restarting it" (restates the lead, and
59
- * presumes someone is present to ask — false under `pi -p`, in scheduled jobs,
60
- * and in any background-driven run). Nothing here can measure whether wording
61
- * improves parent behavior, so removing a false cue (which cannot induce new
62
- * behavior) and adding an instruction (which can) are not equally safe bets.
63
- * Don't add either back without a way to measure it.
64
- */
65
- export function getForegroundOutcomeNote(status) {
66
- switch (status) {
67
- case "stopped":
68
- return " (STOPPED BY THE USER — everything the agent produced is above; the task is unfinished)";
69
- case "aborted":
70
- return " (aborted at the turn limit — everything the agent produced is above; the task is unfinished)";
71
- case "steered":
72
- return " (wrapped up at the turn limit — everything the agent produced is above; the task may be unfinished)";
73
- default:
74
- return "";
75
- }
76
- }
77
- /**
78
- * Salvaged partial output of a failed run, as a labeled suffix for the error
79
- * surfaces (or "" if the run produced nothing). `record.result` is bounded to
80
- * the run's own turns, so this is never a stale earlier answer (#144).
81
- */
82
- export function partialOutputSuffix(record) {
83
- const partial = record.result?.trim();
84
- return partial ? `\n\nPartial output before the failure:\n${partial}` : "";
85
- }
86
- //# sourceMappingURL=status-note.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status-note.js","sourceRoot":"","sources":["../src/status-note.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,yFAAyF,CAAC;QACnG,KAAK,SAAS;YACZ,OAAO,6EAA6E,CAAC;QACvF,KAAK,SAAS;YACZ,OAAO,yDAAyD,CAAC;QACnE;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAc;IACrD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,yFAAyF,CAAC;QACnG,KAAK,SAAS;YACZ,OAAO,+FAA+F,CAAC;QACzG,KAAK,SAAS;YACZ,OAAO,sGAAsG,CAAC;QAChH;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAmB;IACrD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IACtC,OAAO,OAAO,CAAC,CAAC,CAAC,2CAA2C,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7E,CAAC"}
@@ -1,62 +0,0 @@
1
- /**
2
- * structured-output.ts — the synthetic tool behind `agent(prompt, { schema })`.
3
- *
4
- * A workflow script that passes a `schema` wants an *object* back, not prose it
5
- * has to parse. Claude Code does this by giving the child a `StructuredOutput`
6
- * tool whose input schema is the caller's schema, so the provider fills the
7
- * fields, and returning the validated payload as the agent's result.
8
- *
9
- * We do the same, with one gap named up front: Claude Code *forces* the call,
10
- * and we cannot. `toolChoice` exists in pi-ai's provider layer but is not
11
- * plumbed through `AgentSession`, so an extension has no way to require a
12
- * particular tool. What we have instead is three softer pressures —
13
- *
14
- * 1. `constrainedSampling`, so providers that support it hold the payload to
15
- * the schema at sampling time;
16
- * 2. the tool's description, snippet and guideline, which say the answer must
17
- * come through this call;
18
- * 3. validation here, answering a bad payload with `isError` so the model
19
- * sees what was wrong and calls again inside the same run.
20
- *
21
- * — and, when all three fail, one more prompt from `runAgent`. See
22
- * {@link structuredRetryPrompt}.
23
- *
24
- * The name matches Claude Code's exactly, so a ported prompt that mentions
25
- * `StructuredOutput` is still telling the truth.
26
- */
27
- import { type ToolDefinition } from "@earendil-works/pi-coding-agent";
28
- import type { CompiledSchema } from "./workflow/json-schema.js";
29
- /**
30
- * Deliberately NOT added to `SUBAGENT_TOOL_NAMES`: that list becomes
31
- * `EXCLUDED_TOOL_NAMES`, which is exactly the denial this tool has to avoid.
32
- * Nor to `BUILTIN_TOOL_NAMES` — it is ours to inject, never a name a user may
33
- * ask for in an agent's `tools:` frontmatter.
34
- */
35
- export declare const STRUCTURED_OUTPUT_TOOL_NAME = "StructuredOutput";
36
- /** What the child produced, filled in as the tool is called. */
37
- export interface StructuredCapture {
38
- /** The last payload that validated, canonicalised. Absent until one does. */
39
- json?: string;
40
- /** Why the most recent attempt was rejected, for the retry prompt. */
41
- lastError?: string;
42
- /** Whether the tool was called at all — "never tried" reads differently. */
43
- called: boolean;
44
- }
45
- export declare function createStructuredCapture(): StructuredCapture;
46
- /**
47
- * Build the tool for one child.
48
- *
49
- * `capture` is the box the caller reads afterwards. It is passed in rather than
50
- * returned so `runAgent` owns its lifetime and can consult it on every exit
51
- * path, including the ones where the tool was never reached.
52
- */
53
- export declare function createStructuredOutputTool(compiled: CompiledSchema, capture: StructuredCapture): ToolDefinition;
54
- /**
55
- * The one extra prompt sent when a run ended with nothing captured.
56
- *
57
- * Distinguishes "never called it" from "called it wrongly" — the two need
58
- * different corrections, and telling a model it got the shape wrong when it
59
- * never answered at all sends it looking for a mistake it did not make.
60
- */
61
- export declare function structuredRetryPrompt(capture: StructuredCapture): string;
62
- //# sourceMappingURL=structured-output.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"structured-output.d.ts","sourceRoot":"","sources":["../src/structured-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,qBAAqB,CAAC;AAE9D,gEAAgE;AAChE,MAAM,WAAW,iBAAiB;IAChC,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,uBAAuB,IAAI,iBAAiB,CAE3D;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,iBAAiB,GACzB,cAAc,CAqDhB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAKxE"}
@@ -1,113 +0,0 @@
1
- /**
2
- * structured-output.ts — the synthetic tool behind `agent(prompt, { schema })`.
3
- *
4
- * A workflow script that passes a `schema` wants an *object* back, not prose it
5
- * has to parse. Claude Code does this by giving the child a `StructuredOutput`
6
- * tool whose input schema is the caller's schema, so the provider fills the
7
- * fields, and returning the validated payload as the agent's result.
8
- *
9
- * We do the same, with one gap named up front: Claude Code *forces* the call,
10
- * and we cannot. `toolChoice` exists in pi-ai's provider layer but is not
11
- * plumbed through `AgentSession`, so an extension has no way to require a
12
- * particular tool. What we have instead is three softer pressures —
13
- *
14
- * 1. `constrainedSampling`, so providers that support it hold the payload to
15
- * the schema at sampling time;
16
- * 2. the tool's description, snippet and guideline, which say the answer must
17
- * come through this call;
18
- * 3. validation here, answering a bad payload with `isError` so the model
19
- * sees what was wrong and calls again inside the same run.
20
- *
21
- * — and, when all three fail, one more prompt from `runAgent`. See
22
- * {@link structuredRetryPrompt}.
23
- *
24
- * The name matches Claude Code's exactly, so a ported prompt that mentions
25
- * `StructuredOutput` is still telling the truth.
26
- */
27
- import { defineTool } from "@earendil-works/pi-coding-agent";
28
- /**
29
- * Deliberately NOT added to `SUBAGENT_TOOL_NAMES`: that list becomes
30
- * `EXCLUDED_TOOL_NAMES`, which is exactly the denial this tool has to avoid.
31
- * Nor to `BUILTIN_TOOL_NAMES` — it is ours to inject, never a name a user may
32
- * ask for in an agent's `tools:` frontmatter.
33
- */
34
- export const STRUCTURED_OUTPUT_TOOL_NAME = "StructuredOutput";
35
- export function createStructuredCapture() {
36
- return { called: false };
37
- }
38
- /**
39
- * Build the tool for one child.
40
- *
41
- * `capture` is the box the caller reads afterwards. It is passed in rather than
42
- * returned so `runAgent` owns its lifetime and can consult it on every exit
43
- * path, including the ones where the tool was never reached.
44
- */
45
- export function createStructuredOutputTool(compiled, capture) {
46
- return defineTool({
47
- name: STRUCTURED_OUTPUT_TOOL_NAME,
48
- label: "Structured Output",
49
- description: "Report your final answer. Call this exactly once, with the complete result, and put everything the "
50
- + "caller needs inside the arguments — text written outside this call is discarded. If a call is "
51
- + "rejected for not matching the schema, fix the reported fields and call it again.",
52
- promptSnippet: "Report your final answer as structured data",
53
- promptGuidelines: [
54
- "Your final answer MUST be reported by calling StructuredOutput. Prose outside that call is discarded.",
55
- ],
56
- // The caller's schema *is* the tool's input schema, verbatim — that is what
57
- // makes the provider fill the fields. pi types this as TypeBox's `TSchema`,
58
- // which v1 defines as an open interface, so a plain JSON Schema satisfies
59
- // it without a cast at runtime or a conversion at author time.
60
- parameters: compiled.schema,
61
- // "prefer", not "require": a provider that cannot constrain sampling should
62
- // fall through to validation-and-retry rather than fail the call outright.
63
- constrainedSampling: { type: "json_schema", strict: "prefer" },
64
- // Models occasionally send the whole payload as one JSON string instead of
65
- // an object. Recovering that costs nothing and saves a whole retry.
66
- prepareArguments: (args) => {
67
- if (typeof args !== "string")
68
- return args;
69
- try {
70
- return JSON.parse(args);
71
- }
72
- catch {
73
- return args;
74
- }
75
- },
76
- execute: async (_toolCallId, params) => {
77
- capture.called = true;
78
- const verdict = compiled.check(params);
79
- if (verdict !== true) {
80
- capture.lastError = verdict;
81
- // `isError` puts the reason in front of the model as a tool result, so
82
- // it can correct itself inside this same run. This is where most
83
- // mismatches are resolved; the prompt-level retry is the backstop.
84
- return {
85
- content: [{
86
- type: "text",
87
- text: `StructuredOutput did not match the required schema:\n${verdict}\nCall it again with a corrected value.`,
88
- }],
89
- isError: true,
90
- details: {},
91
- };
92
- }
93
- // Last valid call wins: a model that calls twice meant the second one.
94
- capture.json = JSON.stringify(params);
95
- capture.lastError = undefined;
96
- return { content: [{ type: "text", text: "Recorded." }], details: {} };
97
- },
98
- });
99
- }
100
- /**
101
- * The one extra prompt sent when a run ended with nothing captured.
102
- *
103
- * Distinguishes "never called it" from "called it wrongly" — the two need
104
- * different corrections, and telling a model it got the shape wrong when it
105
- * never answered at all sends it looking for a mistake it did not make.
106
- */
107
- export function structuredRetryPrompt(capture) {
108
- const reason = capture.called && capture.lastError !== undefined
109
- ? `Your last ${STRUCTURED_OUTPUT_TOOL_NAME} call did not match the required schema: ${capture.lastError}`
110
- : `You did not call ${STRUCTURED_OUTPUT_TOOL_NAME}, so your answer was not recorded.`;
111
- return `${reason}\n\nCall ${STRUCTURED_OUTPUT_TOOL_NAME} now with your complete final answer. Do not reply with prose.`;
112
- }
113
- //# sourceMappingURL=structured-output.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"structured-output.js","sourceRoot":"","sources":["../src/structured-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,UAAU,EAAuB,MAAM,iCAAiC,CAAC;AAGlF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,kBAAkB,CAAC;AAY9D,MAAM,UAAU,uBAAuB;IACrC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CACxC,QAAwB,EACxB,OAA0B;IAE1B,OAAO,UAAU,CAAC;QAChB,IAAI,EAAE,2BAA2B;QACjC,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,qGAAqG;cACnG,gGAAgG;cAChG,kFAAkF;QACtF,aAAa,EAAE,6CAA6C;QAC5D,gBAAgB,EAAE;YAChB,uGAAuG;SACxG;QACD,4EAA4E;QAC5E,4EAA4E;QAC5E,0EAA0E;QAC1E,+DAA+D;QAC/D,UAAU,EAAE,QAAQ,CAAC,MAAe;QACpC,4EAA4E;QAC5E,2EAA2E;QAC3E,mBAAmB,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE;QAC9D,2EAA2E;QAC3E,oEAAoE;QACpE,gBAAgB,EAAE,CAAC,IAAa,EAAE,EAAE;YAClC,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAa,CAAC;YACnD,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAU,CAAC;YACnC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAa,CAAC;YACvB,CAAC;QACH,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE;YACrC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YACtB,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC;gBAC5B,uEAAuE;gBACvE,iEAAiE;gBACjE,mEAAmE;gBACnE,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,wDAAwD,OAAO,yCAAyC;yBAC/G,CAAC;oBACF,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,EAAE;iBACZ,CAAC;YACJ,CAAC;YACD,uEAAuE;YACvE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACtC,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;YAC9B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACzE,CAAC;KACF,CAAmB,CAAC;AACvB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAA0B;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;QAC9D,CAAC,CAAC,aAAa,2BAA2B,4CAA4C,OAAO,CAAC,SAAS,EAAE;QACzG,CAAC,CAAC,oBAAoB,2BAA2B,oCAAoC,CAAC;IACxF,OAAO,GAAG,MAAM,YAAY,2BAA2B,gEAAgE,CAAC;AAC1H,CAAC"}