@dev-sergeev/datalab-kit 0.1.2 → 0.1.4

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