@dev-sergeev/datalab-kit 0.1.1 → 0.1.3

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 (339) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +26 -8
  3. package/THIRD_PARTY_NOTICES.md +6 -2
  4. package/dist/extension.js +8 -1
  5. package/dist/recap.d.ts +2 -0
  6. package/dist/recap.js +31 -0
  7. package/docs/adr/0002-package-delivery.md +2 -0
  8. package/node_modules/@gotgenes/pi-permission-system/src/authority/permission-prompt-component.ts +0 -11
  9. package/node_modules/@gotgenes/pi-permission-system/src/config/config-store.ts +0 -5
  10. package/node_modules/@gotgenes/pi-permission-system/src/index.ts +3 -15
  11. package/node_modules/@pi-plugins/elapsed/LICENSE +21 -0
  12. package/node_modules/@pi-plugins/elapsed/README.md +45 -0
  13. package/node_modules/@pi-plugins/elapsed/dist/index.d.mts +8 -0
  14. package/node_modules/@pi-plugins/elapsed/dist/index.d.mts.map +1 -0
  15. package/node_modules/@pi-plugins/elapsed/dist/index.mjs +47 -0
  16. package/node_modules/@pi-plugins/elapsed/dist/index.mjs.map +1 -0
  17. package/node_modules/@pi-plugins/elapsed/package.json +65 -0
  18. package/node_modules/@tifan/pi-recap/README.md +61 -0
  19. package/node_modules/@tifan/pi-recap/package.json +43 -0
  20. package/node_modules/@tifan/pi-recap/src/index.ts +584 -0
  21. package/node_modules/@tifan/pi-recap/src/model-picker.ts +233 -0
  22. package/node_modules/@tifan/pi-recap/src/models.ts +183 -0
  23. package/node_modules/@tifan/pi-recap/src/sanitize.ts +119 -0
  24. package/node_modules/@tifan/pi-recap/src/tui.ts +155 -0
  25. package/node_modules/@zigai/pi-extension-internals/README.md +24 -0
  26. package/node_modules/@zigai/pi-extension-internals/dist/editor-enhancer-registry.d.ts +21 -0
  27. package/node_modules/@zigai/pi-extension-internals/dist/editor-enhancer-registry.js +233 -0
  28. package/node_modules/@zigai/pi-extension-internals/dist/index.d.ts +6 -0
  29. package/node_modules/@zigai/pi-extension-internals/dist/index.js +3 -0
  30. package/node_modules/@zigai/pi-extension-internals/dist/linked-method-patch.d.ts +34 -0
  31. package/node_modules/@zigai/pi-extension-internals/dist/linked-method-patch.js +272 -0
  32. package/node_modules/@zigai/pi-extension-internals/dist/pi-internal-import.d.ts +11 -0
  33. package/node_modules/@zigai/pi-extension-internals/dist/pi-internal-import.js +139 -0
  34. package/node_modules/@zigai/pi-extension-internals/package.json +41 -0
  35. package/node_modules/@zigai/pi-extension-settings/LICENSE +21 -0
  36. package/node_modules/@zigai/pi-extension-settings/README.md +36 -0
  37. package/node_modules/@zigai/pi-extension-settings/dist/artifacts.d.ts +23 -0
  38. package/node_modules/@zigai/pi-extension-settings/dist/artifacts.d.ts.map +1 -0
  39. package/node_modules/@zigai/pi-extension-settings/dist/artifacts.js +75 -0
  40. package/node_modules/@zigai/pi-extension-settings/dist/artifacts.js.map +1 -0
  41. package/node_modules/@zigai/pi-extension-settings/dist/cli-entry.d.ts +3 -0
  42. package/node_modules/@zigai/pi-extension-settings/dist/cli-entry.d.ts.map +1 -0
  43. package/node_modules/@zigai/pi-extension-settings/dist/cli-entry.js +5 -0
  44. package/node_modules/@zigai/pi-extension-settings/dist/cli-entry.js.map +1 -0
  45. package/node_modules/@zigai/pi-extension-settings/dist/cli.d.ts +6 -0
  46. package/node_modules/@zigai/pi-extension-settings/dist/cli.d.ts.map +1 -0
  47. package/node_modules/@zigai/pi-extension-settings/dist/cli.js +87 -0
  48. package/node_modules/@zigai/pi-extension-settings/dist/cli.js.map +1 -0
  49. package/node_modules/@zigai/pi-extension-settings/dist/definition-marker.d.ts +2 -0
  50. package/node_modules/@zigai/pi-extension-settings/dist/definition-marker.d.ts.map +1 -0
  51. package/node_modules/@zigai/pi-extension-settings/dist/definition-marker.js +2 -0
  52. package/node_modules/@zigai/pi-extension-settings/dist/definition-marker.js.map +1 -0
  53. package/node_modules/@zigai/pi-extension-settings/dist/definition.d.ts +159 -0
  54. package/node_modules/@zigai/pi-extension-settings/dist/definition.d.ts.map +1 -0
  55. package/node_modules/@zigai/pi-extension-settings/dist/definition.js +248 -0
  56. package/node_modules/@zigai/pi-extension-settings/dist/definition.js.map +1 -0
  57. package/node_modules/@zigai/pi-extension-settings/dist/file-system.d.ts +10 -0
  58. package/node_modules/@zigai/pi-extension-settings/dist/file-system.d.ts.map +1 -0
  59. package/node_modules/@zigai/pi-extension-settings/dist/file-system.js +115 -0
  60. package/node_modules/@zigai/pi-extension-settings/dist/file-system.js.map +1 -0
  61. package/node_modules/@zigai/pi-extension-settings/dist/index.d.ts +2 -0
  62. package/node_modules/@zigai/pi-extension-settings/dist/index.d.ts.map +1 -0
  63. package/node_modules/@zigai/pi-extension-settings/dist/index.js +2 -0
  64. package/node_modules/@zigai/pi-extension-settings/dist/index.js.map +1 -0
  65. package/node_modules/@zigai/pi-extension-settings/dist/json-value.d.ts +18 -0
  66. package/node_modules/@zigai/pi-extension-settings/dist/json-value.d.ts.map +1 -0
  67. package/node_modules/@zigai/pi-extension-settings/dist/json-value.js +56 -0
  68. package/node_modules/@zigai/pi-extension-settings/dist/json-value.js.map +1 -0
  69. package/node_modules/@zigai/pi-extension-settings/dist/paths.d.ts +11 -0
  70. package/node_modules/@zigai/pi-extension-settings/dist/paths.d.ts.map +1 -0
  71. package/node_modules/@zigai/pi-extension-settings/dist/paths.js +23 -0
  72. package/node_modules/@zigai/pi-extension-settings/dist/paths.js.map +1 -0
  73. package/node_modules/@zigai/pi-extension-settings/dist/pi-host-paths.d.ts +5 -0
  74. package/node_modules/@zigai/pi-extension-settings/dist/pi-host-paths.d.ts.map +1 -0
  75. package/node_modules/@zigai/pi-extension-settings/dist/pi-host-paths.js +21 -0
  76. package/node_modules/@zigai/pi-extension-settings/dist/pi-host-paths.js.map +1 -0
  77. package/node_modules/@zigai/pi-extension-settings/dist/pi.d.ts +106 -0
  78. package/node_modules/@zigai/pi-extension-settings/dist/pi.d.ts.map +1 -0
  79. package/node_modules/@zigai/pi-extension-settings/dist/pi.js +122 -0
  80. package/node_modules/@zigai/pi-extension-settings/dist/pi.js.map +1 -0
  81. package/node_modules/@zigai/pi-extension-settings/dist/pi.ts +2537 -0
  82. package/node_modules/@zigai/pi-extension-settings/dist/pi.ts.map +7 -0
  83. package/node_modules/@zigai/pi-extension-settings/dist/projects.d.ts +10 -0
  84. package/node_modules/@zigai/pi-extension-settings/dist/projects.d.ts.map +1 -0
  85. package/node_modules/@zigai/pi-extension-settings/dist/projects.js +177 -0
  86. package/node_modules/@zigai/pi-extension-settings/dist/projects.js.map +1 -0
  87. package/node_modules/@zigai/pi-extension-settings/dist/runtime.d.ts +40 -0
  88. package/node_modules/@zigai/pi-extension-settings/dist/runtime.d.ts.map +1 -0
  89. package/node_modules/@zigai/pi-extension-settings/dist/runtime.js +158 -0
  90. package/node_modules/@zigai/pi-extension-settings/dist/runtime.js.map +1 -0
  91. package/node_modules/@zigai/pi-extension-settings/dist/runtime.ts +158 -0
  92. package/node_modules/@zigai/pi-extension-settings/dist/runtime.ts.map +7 -0
  93. package/node_modules/@zigai/pi-extension-settings/dist/schema-document.d.ts +19 -0
  94. package/node_modules/@zigai/pi-extension-settings/dist/schema-document.d.ts.map +1 -0
  95. package/node_modules/@zigai/pi-extension-settings/dist/schema-document.js +168 -0
  96. package/node_modules/@zigai/pi-extension-settings/dist/schema-document.js.map +1 -0
  97. package/node_modules/@zigai/pi-extension-settings/dist/settings-documentation.d.ts +9 -0
  98. package/node_modules/@zigai/pi-extension-settings/dist/settings-documentation.d.ts.map +1 -0
  99. package/node_modules/@zigai/pi-extension-settings/dist/settings-documentation.js +242 -0
  100. package/node_modules/@zigai/pi-extension-settings/dist/settings-documentation.js.map +1 -0
  101. package/node_modules/@zigai/pi-extension-settings/dist/settings-layer.d.ts +59 -0
  102. package/node_modules/@zigai/pi-extension-settings/dist/settings-layer.d.ts.map +1 -0
  103. package/node_modules/@zigai/pi-extension-settings/dist/settings-layer.js +98 -0
  104. package/node_modules/@zigai/pi-extension-settings/dist/settings-layer.js.map +1 -0
  105. package/node_modules/@zigai/pi-extension-settings/dist/settings-loader.d.ts +80 -0
  106. package/node_modules/@zigai/pi-extension-settings/dist/settings-loader.d.ts.map +1 -0
  107. package/node_modules/@zigai/pi-extension-settings/dist/settings-loader.js +144 -0
  108. package/node_modules/@zigai/pi-extension-settings/dist/settings-loader.js.map +1 -0
  109. package/node_modules/@zigai/pi-extension-settings/dist/settings-merge.d.ts +5 -0
  110. package/node_modules/@zigai/pi-extension-settings/dist/settings-merge.d.ts.map +1 -0
  111. package/node_modules/@zigai/pi-extension-settings/dist/settings-merge.js +30 -0
  112. package/node_modules/@zigai/pi-extension-settings/dist/settings-merge.js.map +1 -0
  113. package/node_modules/@zigai/pi-extension-settings/dist/settings-revision.d.ts +10 -0
  114. package/node_modules/@zigai/pi-extension-settings/dist/settings-revision.d.ts.map +1 -0
  115. package/node_modules/@zigai/pi-extension-settings/dist/settings-revision.js +16 -0
  116. package/node_modules/@zigai/pi-extension-settings/dist/settings-revision.js.map +1 -0
  117. package/node_modules/@zigai/pi-extension-settings/dist/settings-transaction.d.ts +54 -0
  118. package/node_modules/@zigai/pi-extension-settings/dist/settings-transaction.d.ts.map +1 -0
  119. package/node_modules/@zigai/pi-extension-settings/dist/settings-transaction.js +202 -0
  120. package/node_modules/@zigai/pi-extension-settings/dist/settings-transaction.js.map +1 -0
  121. package/node_modules/@zigai/pi-extension-settings/dist/typebox-runtime.d.ts +5 -0
  122. package/node_modules/@zigai/pi-extension-settings/dist/typebox-runtime.d.ts.map +1 -0
  123. package/node_modules/@zigai/pi-extension-settings/dist/typebox-runtime.js +9 -0
  124. package/node_modules/@zigai/pi-extension-settings/dist/typebox-runtime.js.map +1 -0
  125. package/node_modules/@zigai/pi-extension-settings/docs/generation.md +71 -0
  126. package/node_modules/@zigai/pi-extension-settings/docs/manual-setup.md +98 -0
  127. package/node_modules/@zigai/pi-extension-settings/docs/runtime.md +100 -0
  128. package/node_modules/@zigai/pi-extension-settings/docs/ui-controls.md +31 -0
  129. package/node_modules/@zigai/pi-extension-settings/package.json +97 -0
  130. package/node_modules/@zigai/pi-mention-anything/README.md +113 -0
  131. package/node_modules/@zigai/pi-mention-anything/config.schema.json +313 -0
  132. package/node_modules/@zigai/pi-mention-anything/docs/command-protocol.md +106 -0
  133. package/node_modules/@zigai/pi-mention-anything/docs/providers.md +128 -0
  134. package/node_modules/@zigai/pi-mention-anything/examples/query-command.mjs +96 -0
  135. package/node_modules/@zigai/pi-mention-anything/examples/recursive-tree.ts +28 -0
  136. package/node_modules/@zigai/pi-mention-anything/examples/static.ts +28 -0
  137. package/node_modules/@zigai/pi-mention-anything/examples/tmux.ts +90 -0
  138. package/node_modules/@zigai/pi-mention-anything/examples/tree-settings.json +25 -0
  139. package/node_modules/@zigai/pi-mention-anything/package.json +58 -0
  140. package/node_modules/@zigai/pi-mention-anything/src/api.ts +75 -0
  141. package/node_modules/@zigai/pi-mention-anything/src/autocomplete.ts +231 -0
  142. package/node_modules/@zigai/pi-mention-anything/src/chain-autocomplete.ts +596 -0
  143. package/node_modules/@zigai/pi-mention-anything/src/chain-syntax.ts +345 -0
  144. package/node_modules/@zigai/pi-mention-anything/src/command-provider.ts +291 -0
  145. package/node_modules/@zigai/pi-mention-anything/src/configured-source.ts +66 -0
  146. package/node_modules/@zigai/pi-mention-anything/src/editor.ts +180 -0
  147. package/node_modules/@zigai/pi-mention-anything/src/expand-mentions.ts +162 -0
  148. package/node_modules/@zigai/pi-mention-anything/src/index.ts +54 -0
  149. package/node_modules/@zigai/pi-mention-anything/src/initial-suggestions.ts +190 -0
  150. package/node_modules/@zigai/pi-mention-anything/src/list-provider.ts +71 -0
  151. package/node_modules/@zigai/pi-mention-anything/src/mention-hub.ts +307 -0
  152. package/node_modules/@zigai/pi-mention-anything/src/mention-resolution.ts +374 -0
  153. package/node_modules/@zigai/pi-mention-anything/src/mention-syntax.ts +105 -0
  154. package/node_modules/@zigai/pi-mention-anything/src/register-mention.ts +89 -0
  155. package/node_modules/@zigai/pi-mention-anything/src/rendering.ts +53 -0
  156. package/node_modules/@zigai/pi-mention-anything/src/selected-items.ts +21 -0
  157. package/node_modules/@zigai/pi-mention-anything/src/selection-history.ts +135 -0
  158. package/node_modules/@zigai/pi-mention-anything/src/settings-input.ts +317 -0
  159. package/node_modules/@zigai/pi-mention-anything/src/settings.prevalidated.ts +57 -0
  160. package/node_modules/@zigai/pi-mention-anything/src/settings.ts +52 -0
  161. package/node_modules/@zigai/pi-mention-anything/src/source-contract.ts +174 -0
  162. package/node_modules/@zigai/pi-mention-anything/src/source-controller.ts +1070 -0
  163. package/node_modules/@zigai/pi-mention-anything/src/source-runtime.ts +99 -0
  164. package/node_modules/@zigai/pi-mention-skill/README.md +60 -0
  165. package/node_modules/@zigai/pi-mention-skill/config.schema.json +81 -0
  166. package/node_modules/@zigai/pi-mention-skill/package.json +56 -0
  167. package/node_modules/@zigai/pi-mention-skill/src/index.ts +60 -0
  168. package/node_modules/@zigai/pi-mention-skill/src/settings-input.ts +74 -0
  169. package/node_modules/@zigai/pi-mention-skill/src/settings.prevalidated.ts +18 -0
  170. package/node_modules/@zigai/pi-mention-skill/src/settings.ts +54 -0
  171. package/node_modules/@zigai/pi-mention-skill/src/skill-commands.ts +18 -0
  172. package/node_modules/@zigai/pi-mention-skill/src/skill-content.ts +60 -0
  173. package/node_modules/@zigai/pi-mention-skill/src/skill-provider.ts +105 -0
  174. package/node_modules/@zigai/pi-mention-skill/src/slash-skill-filter.ts +29 -0
  175. package/node_modules/argparse/LICENSE +21 -0
  176. package/node_modules/argparse/README.md +257 -0
  177. package/node_modules/argparse/index.js +3 -0
  178. package/node_modules/argparse/lib/action/append/constant.js +47 -0
  179. package/node_modules/argparse/lib/action/append.js +53 -0
  180. package/node_modules/argparse/lib/action/count.js +40 -0
  181. package/node_modules/argparse/lib/action/help.js +47 -0
  182. package/node_modules/argparse/lib/action/store/constant.js +43 -0
  183. package/node_modules/argparse/lib/action/store/false.js +27 -0
  184. package/node_modules/argparse/lib/action/store/true.js +26 -0
  185. package/node_modules/argparse/lib/action/store.js +50 -0
  186. package/node_modules/argparse/lib/action/subparsers.js +149 -0
  187. package/node_modules/argparse/lib/action/version.js +47 -0
  188. package/node_modules/argparse/lib/action.js +146 -0
  189. package/node_modules/argparse/lib/action_container.js +482 -0
  190. package/node_modules/argparse/lib/argparse.js +14 -0
  191. package/node_modules/argparse/lib/argument/error.js +50 -0
  192. package/node_modules/argparse/lib/argument/exclusive.js +54 -0
  193. package/node_modules/argparse/lib/argument/group.js +75 -0
  194. package/node_modules/argparse/lib/argument_parser.js +1161 -0
  195. package/node_modules/argparse/lib/const.js +21 -0
  196. package/node_modules/argparse/lib/help/added_formatters.js +87 -0
  197. package/node_modules/argparse/lib/help/formatter.js +795 -0
  198. package/node_modules/argparse/lib/namespace.js +76 -0
  199. package/node_modules/argparse/lib/utils.js +57 -0
  200. package/node_modules/argparse/package.json +34 -0
  201. package/node_modules/esprima/LICENSE.BSD +21 -0
  202. package/node_modules/esprima/README.md +46 -0
  203. package/node_modules/esprima/bin/esparse.js +139 -0
  204. package/node_modules/esprima/bin/esvalidate.js +236 -0
  205. package/node_modules/esprima/dist/esprima.js +6709 -0
  206. package/node_modules/esprima/package.json +112 -0
  207. package/node_modules/extend-shallow/LICENSE +21 -0
  208. package/node_modules/extend-shallow/README.md +61 -0
  209. package/node_modules/extend-shallow/index.js +33 -0
  210. package/node_modules/extend-shallow/package.json +56 -0
  211. package/node_modules/graceful-fs/LICENSE +15 -0
  212. package/node_modules/graceful-fs/README.md +143 -0
  213. package/node_modules/graceful-fs/clone.js +23 -0
  214. package/node_modules/graceful-fs/graceful-fs.js +448 -0
  215. package/node_modules/graceful-fs/legacy-streams.js +118 -0
  216. package/node_modules/graceful-fs/package.json +53 -0
  217. package/node_modules/graceful-fs/polyfills.js +355 -0
  218. package/node_modules/gray-matter/LICENSE +21 -0
  219. package/node_modules/gray-matter/README.md +565 -0
  220. package/node_modules/gray-matter/gray-matter.d.ts +114 -0
  221. package/node_modules/gray-matter/index.js +228 -0
  222. package/node_modules/gray-matter/lib/defaults.js +18 -0
  223. package/node_modules/gray-matter/lib/engine.js +30 -0
  224. package/node_modules/gray-matter/lib/engines.js +54 -0
  225. package/node_modules/gray-matter/lib/excerpt.js +32 -0
  226. package/node_modules/gray-matter/lib/parse.js +13 -0
  227. package/node_modules/gray-matter/lib/stringify.js +56 -0
  228. package/node_modules/gray-matter/lib/to-file.js +43 -0
  229. package/node_modules/gray-matter/lib/utils.js +66 -0
  230. package/node_modules/gray-matter/package.json +127 -0
  231. package/node_modules/is-extendable/LICENSE +21 -0
  232. package/node_modules/is-extendable/README.md +72 -0
  233. package/node_modules/is-extendable/index.js +13 -0
  234. package/node_modules/is-extendable/package.json +51 -0
  235. package/node_modules/js-yaml/LICENSE +21 -0
  236. package/node_modules/js-yaml/README.md +302 -0
  237. package/node_modules/js-yaml/bin/js-yaml.js +132 -0
  238. package/node_modules/js-yaml/dist/js-yaml.js +4024 -0
  239. package/node_modules/js-yaml/dist/js-yaml.min.js +1 -0
  240. package/node_modules/js-yaml/index.js +7 -0
  241. package/node_modules/js-yaml/lib/js-yaml/common.js +59 -0
  242. package/node_modules/js-yaml/lib/js-yaml/dumper.js +850 -0
  243. package/node_modules/js-yaml/lib/js-yaml/exception.js +43 -0
  244. package/node_modules/js-yaml/lib/js-yaml/loader.js +1679 -0
  245. package/node_modules/js-yaml/lib/js-yaml/mark.js +76 -0
  246. package/node_modules/js-yaml/lib/js-yaml/schema/core.js +18 -0
  247. package/node_modules/js-yaml/lib/js-yaml/schema/default_full.js +25 -0
  248. package/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js +28 -0
  249. package/node_modules/js-yaml/lib/js-yaml/schema/failsafe.js +17 -0
  250. package/node_modules/js-yaml/lib/js-yaml/schema/json.js +25 -0
  251. package/node_modules/js-yaml/lib/js-yaml/schema.js +108 -0
  252. package/node_modules/js-yaml/lib/js-yaml/type/binary.js +138 -0
  253. package/node_modules/js-yaml/lib/js-yaml/type/bool.js +35 -0
  254. package/node_modules/js-yaml/lib/js-yaml/type/float.js +116 -0
  255. package/node_modules/js-yaml/lib/js-yaml/type/int.js +173 -0
  256. package/node_modules/js-yaml/lib/js-yaml/type/js/function.js +93 -0
  257. package/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js +60 -0
  258. package/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js +28 -0
  259. package/node_modules/js-yaml/lib/js-yaml/type/map.js +8 -0
  260. package/node_modules/js-yaml/lib/js-yaml/type/merge.js +12 -0
  261. package/node_modules/js-yaml/lib/js-yaml/type/null.js +34 -0
  262. package/node_modules/js-yaml/lib/js-yaml/type/omap.js +44 -0
  263. package/node_modules/js-yaml/lib/js-yaml/type/pairs.js +53 -0
  264. package/node_modules/js-yaml/lib/js-yaml/type/seq.js +8 -0
  265. package/node_modules/js-yaml/lib/js-yaml/type/set.js +29 -0
  266. package/node_modules/js-yaml/lib/js-yaml/type/str.js +8 -0
  267. package/node_modules/js-yaml/lib/js-yaml/type/timestamp.js +88 -0
  268. package/node_modules/js-yaml/lib/js-yaml/type.js +61 -0
  269. package/node_modules/js-yaml/lib/js-yaml.js +39 -0
  270. package/node_modules/js-yaml/package.json +52 -0
  271. package/node_modules/kind-of/LICENSE +21 -0
  272. package/node_modules/kind-of/README.md +367 -0
  273. package/node_modules/kind-of/index.js +129 -0
  274. package/node_modules/kind-of/package.json +88 -0
  275. package/node_modules/pi-toggle-skills/README.md +213 -0
  276. package/node_modules/pi-toggle-skills/package.json +60 -0
  277. package/node_modules/pi-toggle-skills/src/index.ts +112 -0
  278. package/node_modules/pi-toggle-skills/src/skill-discovery.ts +258 -0
  279. package/node_modules/pi-toggle-skills/src/skill-selector.ts +435 -0
  280. package/node_modules/pi-toggle-skills/toggle-skills.ts +316 -0
  281. package/node_modules/pi-toggle-skills/vitest.config.ts +15 -0
  282. package/node_modules/proper-lockfile/LICENSE +21 -0
  283. package/node_modules/proper-lockfile/README.md +183 -0
  284. package/node_modules/proper-lockfile/index.js +40 -0
  285. package/node_modules/proper-lockfile/lib/adapter.js +85 -0
  286. package/node_modules/proper-lockfile/lib/lockfile.js +342 -0
  287. package/node_modules/proper-lockfile/lib/mtime-precision.js +55 -0
  288. package/node_modules/proper-lockfile/node_modules/retry/.npmignore +3 -0
  289. package/node_modules/proper-lockfile/node_modules/retry/.travis.yml +15 -0
  290. package/node_modules/proper-lockfile/node_modules/retry/License +21 -0
  291. package/node_modules/proper-lockfile/node_modules/retry/Makefile +18 -0
  292. package/node_modules/proper-lockfile/node_modules/retry/README.md +227 -0
  293. package/node_modules/proper-lockfile/node_modules/retry/equation.gif +0 -0
  294. package/node_modules/proper-lockfile/node_modules/retry/example/dns.js +31 -0
  295. package/node_modules/proper-lockfile/node_modules/retry/example/stop.js +40 -0
  296. package/node_modules/proper-lockfile/node_modules/retry/index.js +1 -0
  297. package/node_modules/proper-lockfile/node_modules/retry/lib/retry.js +100 -0
  298. package/node_modules/proper-lockfile/node_modules/retry/lib/retry_operation.js +158 -0
  299. package/node_modules/proper-lockfile/node_modules/retry/package.json +32 -0
  300. package/node_modules/proper-lockfile/node_modules/retry/test/common.js +10 -0
  301. package/node_modules/proper-lockfile/node_modules/retry/test/integration/test-forever.js +24 -0
  302. package/node_modules/proper-lockfile/node_modules/retry/test/integration/test-retry-operation.js +258 -0
  303. package/node_modules/proper-lockfile/node_modules/retry/test/integration/test-retry-wrap.js +101 -0
  304. package/node_modules/proper-lockfile/node_modules/retry/test/integration/test-timeouts.js +69 -0
  305. package/node_modules/proper-lockfile/package.json +71 -0
  306. package/node_modules/section-matter/LICENSE +21 -0
  307. package/node_modules/section-matter/README.md +236 -0
  308. package/node_modules/section-matter/index.js +136 -0
  309. package/node_modules/section-matter/package.json +55 -0
  310. package/node_modules/signal-exit/LICENSE.txt +16 -0
  311. package/node_modules/signal-exit/README.md +39 -0
  312. package/node_modules/signal-exit/index.js +202 -0
  313. package/node_modules/signal-exit/package.json +38 -0
  314. package/node_modules/signal-exit/signals.js +53 -0
  315. package/node_modules/sprintf-js/.npmignore +1 -0
  316. package/node_modules/sprintf-js/LICENSE +24 -0
  317. package/node_modules/sprintf-js/README.md +88 -0
  318. package/node_modules/sprintf-js/bower.json +14 -0
  319. package/node_modules/sprintf-js/demo/angular.html +20 -0
  320. package/node_modules/sprintf-js/dist/angular-sprintf.min.js +4 -0
  321. package/node_modules/sprintf-js/dist/angular-sprintf.min.js.map +1 -0
  322. package/node_modules/sprintf-js/dist/angular-sprintf.min.map +1 -0
  323. package/node_modules/sprintf-js/dist/sprintf.min.js +4 -0
  324. package/node_modules/sprintf-js/dist/sprintf.min.js.map +1 -0
  325. package/node_modules/sprintf-js/dist/sprintf.min.map +1 -0
  326. package/node_modules/sprintf-js/gruntfile.js +36 -0
  327. package/node_modules/sprintf-js/package.json +22 -0
  328. package/node_modules/sprintf-js/src/angular-sprintf.js +18 -0
  329. package/node_modules/sprintf-js/src/sprintf.js +208 -0
  330. package/node_modules/sprintf-js/test/test.js +82 -0
  331. package/node_modules/strip-bom-string/LICENSE +21 -0
  332. package/node_modules/strip-bom-string/README.md +66 -0
  333. package/node_modules/strip-bom-string/index.js +15 -0
  334. package/node_modules/strip-bom-string/package.json +60 -0
  335. package/package.json +13 -4
  336. package/dist/confirmation.d.ts +0 -33
  337. package/dist/confirmation.js +0 -64
  338. package/dist/yolo.d.ts +0 -6
  339. package/dist/yolo.js +0 -33
@@ -0,0 +1,584 @@
1
+ import type { AgentMessage } from "@earendil-works/pi-agent-core"
2
+ import type { Message } from "@earendil-works/pi-ai"
3
+ import type { AutocompleteItem } from "@earendil-works/pi-tui"
4
+ import type {
5
+ ExtensionAPI,
6
+ ExtensionContext,
7
+ SessionEntry,
8
+ } from "@earendil-works/pi-coding-agent"
9
+ import {
10
+ buildSessionContext,
11
+ convertToLlm,
12
+ serializeConversation,
13
+ } from "@earendil-works/pi-coding-agent"
14
+ import { pickRecapModel } from "./model-picker.js"
15
+ import {
16
+ deleteRecapConfig,
17
+ formatAuthModelKey,
18
+ formatModelPreference,
19
+ formatRecapModelKey,
20
+ getAuthenticatedTextModelPreferences,
21
+ getRecapModelAuth,
22
+ resolveInitialModelConfig,
23
+ saveModelPreference,
24
+ type RecapModelConfig,
25
+ type ResolvedRecapModelAuth,
26
+ } from "./models.js"
27
+ import { sanitizeRecapText } from "./sanitize.js"
28
+ import {
29
+ clearNoModelWarning,
30
+ clearWidget,
31
+ notifyUser,
32
+ showLoadingWidget,
33
+ showNoModelWarning,
34
+ showWidget,
35
+ } from "./tui.js"
36
+
37
+ const RECAP_MAX_TOKENS = 160
38
+ const RECAP_REQUEST_TIMEOUT_MS = 4_000
39
+ const AWAY_RECAP_DELAY_MS = 5 * 60 * 1_000
40
+ const RECAP_ENTRY_TYPE = "pi-recap:state"
41
+
42
+ interface PersistedRecapState {
43
+ version: 2
44
+ lastRecap: string
45
+ contextLeafId: string | null
46
+ }
47
+
48
+ interface SessionContextReader {
49
+ buildSessionContext(): { messages: AgentMessage[] }
50
+ }
51
+
52
+ function isRecapStateEntry(entry: SessionEntry): boolean {
53
+ return entry.type === "custom" && entry.customType === RECAP_ENTRY_TYPE
54
+ }
55
+
56
+ function getRecapContextLeafId(ctx: ExtensionContext): string | null {
57
+ const contextEntry = ctx.sessionManager
58
+ .getBranch()
59
+ .toReversed()
60
+ .find((entry) => !isRecapStateEntry(entry))
61
+
62
+ return contextEntry?.id ?? null
63
+ }
64
+
65
+ const RECAP_SUBCOMMANDS: AutocompleteItem[] = [
66
+ {
67
+ value: "status",
68
+ label: "status",
69
+ description: "Show model and recap status",
70
+ },
71
+ {
72
+ value: "config",
73
+ label: "config",
74
+ description: "Choose the recap model",
75
+ },
76
+ {
77
+ value: "help",
78
+ label: "help",
79
+ description: "List recap commands",
80
+ },
81
+ ]
82
+
83
+ const RECAP_SYSTEM_PROMPT = `You write compact recaps for an AI coding-agent session.
84
+
85
+ Given the current session context, produce one plain-text sentence for the user to resume later.
86
+ Start with the user's goal or reason for the session, inferred from user messages. Do not start with the assistant's answer.
87
+ Then include the current outcome, important decision, touched file, blocker, or likely next action only if it helps resume.
88
+ Prefer: Goal/purpose. Current state. Next action.
89
+ Target about 160 characters. Stay under 240 characters.
90
+ Do not add a label or prefix. Do not use markdown. Do not mention yourself as "the assistant".
91
+
92
+ Good: Deciding whether pi-inline-skills should switch from $skill to /skill. Recommendation is / only with commands winning; next decide whether leading /skill should expand.
93
+ Bad: Feasible; I’d default to / and skip config. Extension commands win first; next decide whether leading /skill tokens should expand.`
94
+
95
+ interface RecapState {
96
+ sessionActive: boolean
97
+ runId: number
98
+ modelConfig: RecapModelConfig
99
+ lastRecap: string
100
+ visible: boolean
101
+ stale: boolean
102
+ lastRecapCurrent: boolean
103
+ skipNextAwayRecap: boolean
104
+ abortController: AbortController | undefined
105
+ awayTimer: ReturnType<typeof setTimeout> | undefined
106
+ }
107
+
108
+ function createRecapState(): RecapState {
109
+ return {
110
+ sessionActive: false,
111
+ runId: 0,
112
+ modelConfig: { kind: "missing" },
113
+ lastRecap: "",
114
+ visible: false,
115
+ stale: false,
116
+ lastRecapCurrent: false,
117
+ skipNextAwayRecap: false,
118
+ abortController: undefined,
119
+ awayTimer: undefined,
120
+ }
121
+ }
122
+
123
+ function abortPendingGeneration(state: RecapState): void {
124
+ state.abortController?.abort()
125
+ state.abortController = undefined
126
+ }
127
+
128
+ function clearAwayTimer(state: RecapState): void {
129
+ if (!state.awayTimer) return
130
+ clearTimeout(state.awayTimer)
131
+ state.awayTimer = undefined
132
+ }
133
+
134
+ function hideRecap(ctx: ExtensionContext, state: RecapState): void {
135
+ state.visible = false
136
+ clearWidget(ctx)
137
+ }
138
+
139
+ function resetRecapSession(ctx: ExtensionContext, state: RecapState): void {
140
+ state.runId++
141
+ state.lastRecap = ""
142
+ state.visible = false
143
+ state.stale = false
144
+ state.lastRecapCurrent = false
145
+ state.skipNextAwayRecap = false
146
+ clearAwayTimer(state)
147
+ abortPendingGeneration(state)
148
+ clearWidget(ctx)
149
+ clearNoModelWarning(ctx)
150
+ }
151
+
152
+ function extractTextContent(
153
+ content: readonly { readonly type: string; readonly text?: string }[],
154
+ ): string {
155
+ return content
156
+ .filter(
157
+ (item): item is { readonly type: string; readonly text: string } =>
158
+ item.type === "text" && typeof item.text === "string",
159
+ )
160
+ .map((item) => item.text)
161
+ .join("\n")
162
+ }
163
+
164
+ function isPersistedRecapState(data: unknown): data is PersistedRecapState {
165
+ if (!data || typeof data !== "object") return false
166
+ const candidate = data as Partial<PersistedRecapState>
167
+ return (
168
+ candidate.version === 2 &&
169
+ typeof candidate.lastRecap === "string" &&
170
+ (typeof candidate.contextLeafId === "string" ||
171
+ candidate.contextLeafId === null)
172
+ )
173
+ }
174
+
175
+ function restoreRecapState(ctx: ExtensionContext, state: RecapState): void {
176
+ const latestEntry = ctx.sessionManager
177
+ .getBranch()
178
+ .toReversed()
179
+ .find(
180
+ (entry) =>
181
+ entry.type === "custom" &&
182
+ entry.customType === RECAP_ENTRY_TYPE &&
183
+ isPersistedRecapState(entry.data),
184
+ )
185
+
186
+ if (latestEntry?.type !== "custom") return
187
+ if (!isPersistedRecapState(latestEntry.data)) return
188
+
189
+ state.lastRecap = latestEntry.data.lastRecap
190
+ state.lastRecapCurrent =
191
+ latestEntry.id === ctx.sessionManager.getLeafId() &&
192
+ latestEntry.data.contextLeafId === getRecapContextLeafId(ctx)
193
+ }
194
+
195
+ function showRestoredRecap(ctx: ExtensionContext, state: RecapState): boolean {
196
+ if (!state.lastRecap || !state.lastRecapCurrent) return false
197
+
198
+ state.visible = true
199
+ showWidget(ctx, state.lastRecap)
200
+ return true
201
+ }
202
+
203
+ function persistRecapState(
204
+ pi: ExtensionAPI,
205
+ state: RecapState,
206
+ contextLeafId: string | null,
207
+ ): void {
208
+ pi.appendEntry<PersistedRecapState>(RECAP_ENTRY_TYPE, {
209
+ version: 2,
210
+ lastRecap: state.lastRecap,
211
+ contextLeafId,
212
+ })
213
+ }
214
+
215
+ function hasSessionContextReader(
216
+ value: unknown,
217
+ ): value is SessionContextReader {
218
+ return (
219
+ typeof value === "object" &&
220
+ value !== null &&
221
+ "buildSessionContext" in value &&
222
+ typeof value.buildSessionContext === "function"
223
+ )
224
+ }
225
+
226
+ function getCurrentSessionMessages(
227
+ ctx: ExtensionContext,
228
+ contextLeafId: string | null,
229
+ ): AgentMessage[] {
230
+ if (
231
+ contextLeafId === ctx.sessionManager.getLeafId() &&
232
+ hasSessionContextReader(ctx.sessionManager)
233
+ ) {
234
+ return ctx.sessionManager.buildSessionContext().messages
235
+ }
236
+
237
+ return buildSessionContext(ctx.sessionManager.getEntries(), contextLeafId)
238
+ .messages
239
+ }
240
+
241
+ function buildPrompt(messages: AgentMessage[]): Message {
242
+ const conversationText = serializeConversation(convertToLlm(messages))
243
+ return {
244
+ role: "user",
245
+ content: [
246
+ {
247
+ type: "text",
248
+ text: ["## Current Session Context", conversationText].join("\n"),
249
+ },
250
+ ],
251
+ timestamp: Date.now(),
252
+ }
253
+ }
254
+
255
+ async function generateRecap(
256
+ pi: ExtensionAPI,
257
+ ctx: ExtensionContext,
258
+ state: RecapState,
259
+ options: { manual: boolean },
260
+ ): Promise<void> {
261
+ if (!ctx.hasUI) return
262
+
263
+ const contextLeafId = getRecapContextLeafId(ctx)
264
+ const messages = getCurrentSessionMessages(ctx, contextLeafId)
265
+ if (messages.length === 0) {
266
+ if (options.manual) notifyUser(ctx, "No conversation to recap yet.", "info")
267
+ return
268
+ }
269
+
270
+ if (options.manual) showLoadingWidget(ctx)
271
+
272
+ const runId = state.runId
273
+ const modelAuth = await getRecapModelAuth(ctx, state.modelConfig)
274
+ if (runId !== state.runId || !state.sessionActive) return
275
+
276
+ if (modelAuth.status !== "ok") {
277
+ if (options.manual) clearWidget(ctx)
278
+ handleMissingRecapModel(ctx, modelAuth, options)
279
+ return
280
+ }
281
+
282
+ const abortController = new AbortController()
283
+ abortPendingGeneration(state)
284
+ state.abortController = abortController
285
+
286
+ try {
287
+ const response = await ctx.modelRegistry.complete(
288
+ modelAuth.auth,
289
+ {
290
+ systemPrompt: RECAP_SYSTEM_PROMPT,
291
+ messages: [buildPrompt(messages)],
292
+ },
293
+ {
294
+ maxTokens: RECAP_MAX_TOKENS,
295
+ maxRetries: 0,
296
+ cacheRetention: "none",
297
+ timeoutMs: RECAP_REQUEST_TIMEOUT_MS,
298
+ signal: abortController.signal,
299
+ },
300
+ )
301
+
302
+ if (runId !== state.runId || !state.sessionActive) return
303
+ if (response.stopReason !== "stop") {
304
+ if (options.manual) {
305
+ clearWidget(ctx)
306
+ notifyUser(ctx, "Recap generation failed.", "error")
307
+ }
308
+ return
309
+ }
310
+
311
+ const recap = sanitizeRecapText(extractTextContent(response.content))
312
+ if (!recap) {
313
+ if (options.manual) {
314
+ clearWidget(ctx)
315
+ notifyUser(ctx, "Recap generation returned empty text.", "error")
316
+ }
317
+ return
318
+ }
319
+
320
+ state.lastRecap = recap
321
+ state.visible = true
322
+ state.stale = false
323
+ persistRecapState(pi, state, contextLeafId)
324
+ state.lastRecapCurrent = true
325
+ clearNoModelWarning(ctx)
326
+ showWidget(ctx, recap)
327
+ } catch {
328
+ if (options.manual) {
329
+ clearWidget(ctx)
330
+ notifyUser(ctx, "Recap generation failed.", "error")
331
+ }
332
+ // Automatic recaps are best-effort. Keep the previous recap on transient failures.
333
+ } finally {
334
+ if (state.abortController === abortController) {
335
+ state.abortController = undefined
336
+ }
337
+ }
338
+ }
339
+
340
+ function handleMissingRecapModel(
341
+ ctx: ExtensionContext,
342
+ modelAuth: Exclude<ResolvedRecapModelAuth, { status: "ok" }>,
343
+ options: { manual: boolean },
344
+ ): void {
345
+ if (!options.manual) {
346
+ showNoModelWarning(ctx)
347
+ return
348
+ }
349
+
350
+ if (modelAuth.status === "invalid-config") {
351
+ notifyUser(ctx, "Invalid recap model config. Run /recap config.", "error")
352
+ return
353
+ }
354
+
355
+ if (modelAuth.source === "configured" && modelAuth.model) {
356
+ notifyUser(
357
+ ctx,
358
+ `Recap model is not authenticated: ${formatRecapModelKey(modelAuth.model)}. Run /recap config.`,
359
+ "error",
360
+ )
361
+ return
362
+ }
363
+
364
+ notifyUser(
365
+ ctx,
366
+ "No default recap model authenticated. Run /recap config.",
367
+ "error",
368
+ )
369
+ }
370
+
371
+ function scheduleAwayRecap(
372
+ pi: ExtensionAPI,
373
+ ctx: ExtensionContext,
374
+ state: RecapState,
375
+ ): void {
376
+ clearAwayTimer(state)
377
+ state.awayTimer = setTimeout(() => {
378
+ state.awayTimer = undefined
379
+ if (!state.sessionActive || !state.stale || !ctx.isIdle()) return
380
+ state.stale = false
381
+ void generateRecap(pi, ctx, state, { manual: false })
382
+ }, AWAY_RECAP_DELAY_MS)
383
+ }
384
+
385
+ function isRecapCommand(text: string): boolean {
386
+ return /^\/recap(?:\s|$)/u.test(text.trimStart())
387
+ }
388
+
389
+ function getRecapArgumentCompletions(
390
+ prefix: string,
391
+ ): AutocompleteItem[] | null {
392
+ const query = prefix.trimStart().toLowerCase()
393
+ const items = RECAP_SUBCOMMANDS.filter((item) => item.value.startsWith(query))
394
+ return items.length > 0 ? items : null
395
+ }
396
+
397
+ async function configureRecapModel(
398
+ ctx: ExtensionContext,
399
+ state: RecapState,
400
+ ): Promise<void> {
401
+ const models = await getAuthenticatedTextModelPreferences(ctx)
402
+ if (models.length === 0) {
403
+ notifyUser(
404
+ ctx,
405
+ "No authenticated models available. Run /login or configure a model first.",
406
+ "error",
407
+ )
408
+ return
409
+ }
410
+
411
+ const result = await pickRecapModel(ctx, models)
412
+ if (result.action === "cancel") return
413
+
414
+ try {
415
+ if (result.action === "default") {
416
+ deleteRecapConfig()
417
+ state.modelConfig = { kind: "missing" }
418
+ notifyUser(ctx, "Recap model reset to default.", "info")
419
+ return
420
+ }
421
+
422
+ saveModelPreference(result.model)
423
+ state.modelConfig = { kind: "configured", model: result.model }
424
+ notifyUser(
425
+ ctx,
426
+ `Recap model set to ${formatRecapModelKey(result.model)}.`,
427
+ "info",
428
+ )
429
+ } catch (error) {
430
+ const reason =
431
+ error instanceof SyntaxError ? "invalid JSON" : "write failed"
432
+ notifyUser(ctx, `Could not update recap config: ${reason}.`, "error")
433
+ }
434
+ }
435
+
436
+ function registerRecapCommand(pi: ExtensionAPI, state: RecapState): void {
437
+ pi.registerCommand("recap", {
438
+ description: "generate a one-line session recap",
439
+ getArgumentCompletions: getRecapArgumentCompletions,
440
+ handler: async (args, ctx) => {
441
+ const action = args.trim().split(/\s+/u)[0]?.toLowerCase() ?? ""
442
+
443
+ clearAwayTimer(state)
444
+
445
+ if (!action) {
446
+ await generateRecap(pi, ctx, state, { manual: true })
447
+ return
448
+ }
449
+
450
+ if (action === "help") {
451
+ notifyUser(
452
+ ctx,
453
+ [
454
+ "pi-recap commands",
455
+ "/recap - generate and show a fresh recap",
456
+ "/recap status - show model and recap status",
457
+ "/recap config - choose the recap model",
458
+ "/recap help - show this help",
459
+ ].join("\n"),
460
+ "info",
461
+ )
462
+ return
463
+ }
464
+
465
+ if (action === "status") {
466
+ await notifyRecapStatus(ctx, state)
467
+ return
468
+ }
469
+
470
+ if (action === "config") {
471
+ await configureRecapModel(ctx, state)
472
+ return
473
+ }
474
+
475
+ notifyUser(ctx, "Use /recap [config|help|status]", "error")
476
+ },
477
+ })
478
+ }
479
+
480
+ async function notifyRecapStatus(
481
+ ctx: ExtensionContext,
482
+ state: RecapState,
483
+ ): Promise<void> {
484
+ let selectedModelLine = `selected model: ${formatModelPreference(state.modelConfig)}`
485
+ let activeModelLine: string
486
+
487
+ try {
488
+ const modelAuth = await getRecapModelAuth(ctx, state.modelConfig)
489
+ if (modelAuth.status === "ok") {
490
+ clearNoModelWarning(ctx)
491
+ const suffix = modelAuth.source === "default" ? " (default)" : ""
492
+ selectedModelLine = `selected model: ${formatAuthModelKey(modelAuth.auth)}${suffix}`
493
+ activeModelLine = `active model: ${formatAuthModelKey(modelAuth.auth)}`
494
+ } else if (modelAuth.status === "invalid-config") {
495
+ activeModelLine = "active model: none (invalid config)"
496
+ } else {
497
+ activeModelLine = "active model: none"
498
+ }
499
+ } catch {
500
+ activeModelLine = "active model: unknown (auth check failed)"
501
+ }
502
+
503
+ const lastRecapStatus = state.lastRecap
504
+ ? state.lastRecapCurrent
505
+ ? "current"
506
+ : "stale"
507
+ : "none"
508
+ const lastRecapLine = `last recap: ${lastRecapStatus}`
509
+ const visibleLine = `visible: ${state.visible ? "yes" : "no"}`
510
+ notifyUser(
511
+ ctx,
512
+ [
513
+ "pi-recap status",
514
+ selectedModelLine,
515
+ activeModelLine,
516
+ lastRecapLine,
517
+ visibleLine,
518
+ ].join("\n"),
519
+ "info",
520
+ )
521
+ }
522
+
523
+ export default function (pi: ExtensionAPI): void {
524
+ const state = createRecapState()
525
+
526
+ registerRecapCommand(pi, state)
527
+
528
+ pi.on("session_start", (_event, ctx) => {
529
+ state.sessionActive = true
530
+ state.modelConfig = resolveInitialModelConfig()
531
+ resetRecapSession(ctx, state)
532
+ restoreRecapState(ctx, state)
533
+
534
+ if (showRestoredRecap(ctx, state)) return
535
+
536
+ void generateRecap(pi, ctx, state, { manual: false })
537
+ })
538
+
539
+ pi.on("input", (event, ctx) => {
540
+ if (event.source === "extension") return { action: "continue" as const }
541
+
542
+ clearAwayTimer(state)
543
+
544
+ if (!isRecapCommand(event.text)) {
545
+ state.lastRecapCurrent = false
546
+ hideRecap(ctx, state)
547
+ clearNoModelWarning(ctx)
548
+ }
549
+
550
+ return { action: "continue" as const }
551
+ })
552
+
553
+ pi.on("agent_start", (_event, ctx) => {
554
+ state.runId++
555
+ state.stale = false
556
+ state.lastRecapCurrent = false
557
+ state.skipNextAwayRecap = false
558
+ clearAwayTimer(state)
559
+ abortPendingGeneration(state)
560
+ hideRecap(ctx, state)
561
+ clearNoModelWarning(ctx)
562
+ })
563
+
564
+ pi.on("session_compact_failed", (event) => {
565
+ if (event.willRetry) return
566
+ state.skipNextAwayRecap = true
567
+ clearAwayTimer(state)
568
+ })
569
+
570
+ pi.on("agent_settled", (_event, ctx) => {
571
+ if (state.skipNextAwayRecap) {
572
+ state.skipNextAwayRecap = false
573
+ return
574
+ }
575
+
576
+ state.stale = true
577
+ scheduleAwayRecap(pi, ctx, state)
578
+ })
579
+
580
+ pi.on("session_shutdown", (_event, ctx) => {
581
+ state.sessionActive = false
582
+ resetRecapSession(ctx, state)
583
+ })
584
+ }