@dungle-scrubs/tallow 0.9.4 → 0.9.7

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 (212) hide show
  1. package/dist/cli.js +8 -5
  2. package/dist/cli.js.map +1 -1
  3. package/dist/config.d.ts +1 -1
  4. package/dist/config.js +1 -1
  5. package/dist/interactive-mode-patch.d.ts +24 -12
  6. package/dist/interactive-mode-patch.d.ts.map +1 -1
  7. package/dist/interactive-mode-patch.js +229 -146
  8. package/dist/interactive-mode-patch.js.map +1 -1
  9. package/dist/interactive-reset.d.ts +49 -0
  10. package/dist/interactive-reset.d.ts.map +1 -0
  11. package/dist/interactive-reset.js +40 -0
  12. package/dist/interactive-reset.js.map +1 -0
  13. package/dist/pi-tui-editor-patch.d.ts +10 -0
  14. package/dist/pi-tui-editor-patch.d.ts.map +1 -0
  15. package/dist/pi-tui-editor-patch.js +159 -0
  16. package/dist/pi-tui-editor-patch.js.map +1 -0
  17. package/dist/pi-tui-patch.d.ts +2 -0
  18. package/dist/pi-tui-patch.d.ts.map +1 -0
  19. package/dist/pi-tui-patch.js +563 -0
  20. package/dist/pi-tui-patch.js.map +1 -0
  21. package/dist/pi-tui-settings-list-patch.d.ts +11 -0
  22. package/dist/pi-tui-settings-list-patch.d.ts.map +1 -0
  23. package/dist/pi-tui-settings-list-patch.js +38 -0
  24. package/dist/pi-tui-settings-list-patch.js.map +1 -0
  25. package/dist/process-cleanup.js +1 -1
  26. package/dist/process-cleanup.js.map +1 -1
  27. package/dist/reset-diagnostics.d.ts +69 -0
  28. package/dist/reset-diagnostics.d.ts.map +1 -0
  29. package/dist/reset-diagnostics.js +41 -0
  30. package/dist/reset-diagnostics.js.map +1 -0
  31. package/dist/sdk.d.ts +7 -23
  32. package/dist/sdk.d.ts.map +1 -1
  33. package/dist/sdk.js +211 -174
  34. package/dist/sdk.js.map +1 -1
  35. package/dist/workspace-transition-interactive.d.ts +1 -0
  36. package/dist/workspace-transition-interactive.d.ts.map +1 -1
  37. package/dist/workspace-transition-interactive.js +8 -18
  38. package/dist/workspace-transition-interactive.js.map +1 -1
  39. package/extensions/__integration__/audit-findings.test.ts +4 -5
  40. package/extensions/_icons/index.ts +2 -4
  41. package/extensions/_shared/__tests__/image-metadata.test.ts +33 -0
  42. package/extensions/_shared/__tests__/shell-policy.test.ts +19 -0
  43. package/extensions/_shared/__tests__/terminal-links.test.ts +18 -0
  44. package/extensions/_shared/image-metadata.ts +99 -0
  45. package/extensions/_shared/inline-preview.ts +1 -1
  46. package/extensions/_shared/shell-policy.ts +121 -1
  47. package/extensions/_shared/terminal-links.ts +22 -0
  48. package/extensions/ask-user-question-tool/index.ts +0 -3
  49. package/extensions/clear/__tests__/clear.test.ts +269 -2
  50. package/extensions/command-expansion/index.ts +9 -3
  51. package/extensions/context-files/index.ts +5 -1
  52. package/extensions/context-fork/__tests__/context-fork.test.ts +94 -1
  53. package/extensions/context-fork/extension.json +1 -1
  54. package/extensions/context-fork/frontmatter-index.ts +6 -1
  55. package/extensions/context-fork/index.ts +32 -0
  56. package/extensions/edit-tool-enhanced/index.ts +2 -1
  57. package/extensions/git-status/__tests__/git-status.test.ts +65 -2
  58. package/extensions/git-status/index.ts +268 -98
  59. package/extensions/hooks/index.ts +33 -11
  60. package/extensions/loop/index.ts +14 -1
  61. package/extensions/lsp/index.ts +64 -13
  62. package/extensions/lsp/package.json +2 -2
  63. package/extensions/minimal-skill-display/index.ts +7 -1
  64. package/extensions/random-spinner/index.ts +7 -642
  65. package/extensions/read-tool-enhanced/index.ts +13 -10
  66. package/extensions/render-stabilizer/__tests__/render-stabilizer.test.ts +2 -3
  67. package/extensions/render-stabilizer/index.ts +6 -6
  68. package/extensions/rewind/__tests__/session-files.test.ts +115 -0
  69. package/extensions/rewind/__tests__/snapshots.test.ts +23 -0
  70. package/extensions/rewind/index.ts +5 -0
  71. package/extensions/rewind/session-files.ts +138 -0
  72. package/extensions/rewind/snapshots.ts +104 -5
  73. package/extensions/skill-commands/index.ts +6 -1
  74. package/extensions/slash-command-bridge/__tests__/slash-command-bridge.test.ts +26 -0
  75. package/extensions/slash-command-bridge/index.ts +14 -2
  76. package/extensions/subagent-tool/model-resolver.ts +274 -7
  77. package/extensions/subagent-tool/schema.ts +1 -2
  78. package/extensions/tasks/commands/register-tasks-extension.ts +9 -9
  79. package/extensions/teams-tool/tools/register-extension.ts +1 -3
  80. package/extensions/teams-tool/tools/teammate-tools.ts +1 -2
  81. package/extensions/web-search-tool/index.ts +2 -1
  82. package/extensions/wezterm-pane-control/index.ts +1 -2
  83. package/extensions/write-tool-enhanced/index.ts +2 -1
  84. package/node_modules/@mariozechner/pi-tui/README.md +56 -34
  85. package/node_modules/@mariozechner/pi-tui/dist/autocomplete.d.ts +18 -13
  86. package/node_modules/@mariozechner/pi-tui/dist/autocomplete.d.ts.map +1 -1
  87. package/node_modules/@mariozechner/pi-tui/dist/autocomplete.js +182 -113
  88. package/node_modules/@mariozechner/pi-tui/dist/autocomplete.js.map +1 -1
  89. package/node_modules/@mariozechner/pi-tui/dist/components/cancellable-loader.js +3 -3
  90. package/node_modules/@mariozechner/pi-tui/dist/components/cancellable-loader.js.map +1 -1
  91. package/node_modules/@mariozechner/pi-tui/dist/components/editor.d.ts +45 -36
  92. package/node_modules/@mariozechner/pi-tui/dist/components/editor.d.ts.map +1 -1
  93. package/node_modules/@mariozechner/pi-tui/dist/components/editor.js +489 -325
  94. package/node_modules/@mariozechner/pi-tui/dist/components/editor.js.map +1 -1
  95. package/node_modules/@mariozechner/pi-tui/dist/components/image.d.ts +1 -99
  96. package/node_modules/@mariozechner/pi-tui/dist/components/image.d.ts.map +1 -1
  97. package/node_modules/@mariozechner/pi-tui/dist/components/image.js +17 -192
  98. package/node_modules/@mariozechner/pi-tui/dist/components/image.js.map +1 -1
  99. package/node_modules/@mariozechner/pi-tui/dist/components/input.d.ts.map +1 -1
  100. package/node_modules/@mariozechner/pi-tui/dist/components/input.js +57 -60
  101. package/node_modules/@mariozechner/pi-tui/dist/components/input.js.map +1 -1
  102. package/node_modules/@mariozechner/pi-tui/dist/components/loader.d.ts +2 -69
  103. package/node_modules/@mariozechner/pi-tui/dist/components/loader.d.ts.map +1 -1
  104. package/node_modules/@mariozechner/pi-tui/dist/components/loader.js +5 -102
  105. package/node_modules/@mariozechner/pi-tui/dist/components/loader.js.map +1 -1
  106. package/node_modules/@mariozechner/pi-tui/dist/components/markdown.d.ts.map +1 -1
  107. package/node_modules/@mariozechner/pi-tui/dist/components/markdown.js +111 -53
  108. package/node_modules/@mariozechner/pi-tui/dist/components/markdown.js.map +1 -1
  109. package/node_modules/@mariozechner/pi-tui/dist/components/select-list.d.ts +19 -1
  110. package/node_modules/@mariozechner/pi-tui/dist/components/select-list.d.ts.map +1 -1
  111. package/node_modules/@mariozechner/pi-tui/dist/components/select-list.js +78 -67
  112. package/node_modules/@mariozechner/pi-tui/dist/components/select-list.js.map +1 -1
  113. package/node_modules/@mariozechner/pi-tui/dist/components/settings-list.d.ts +1 -25
  114. package/node_modules/@mariozechner/pi-tui/dist/components/settings-list.d.ts.map +1 -1
  115. package/node_modules/@mariozechner/pi-tui/dist/components/settings-list.js +13 -50
  116. package/node_modules/@mariozechner/pi-tui/dist/components/settings-list.js.map +1 -1
  117. package/node_modules/@mariozechner/pi-tui/dist/index.d.ts +8 -10
  118. package/node_modules/@mariozechner/pi-tui/dist/index.d.ts.map +1 -1
  119. package/node_modules/@mariozechner/pi-tui/dist/index.js +6 -9
  120. package/node_modules/@mariozechner/pi-tui/dist/index.js.map +1 -1
  121. package/node_modules/@mariozechner/pi-tui/dist/keybindings.d.ts +108 -238
  122. package/node_modules/@mariozechner/pi-tui/dist/keybindings.d.ts.map +1 -1
  123. package/node_modules/@mariozechner/pi-tui/dist/keybindings.js +108 -365
  124. package/node_modules/@mariozechner/pi-tui/dist/keybindings.js.map +1 -1
  125. package/node_modules/@mariozechner/pi-tui/dist/keys.d.ts +33 -48
  126. package/node_modules/@mariozechner/pi-tui/dist/keys.d.ts.map +1 -1
  127. package/node_modules/@mariozechner/pi-tui/dist/keys.js +239 -155
  128. package/node_modules/@mariozechner/pi-tui/dist/keys.js.map +1 -1
  129. package/node_modules/@mariozechner/pi-tui/dist/terminal-image.d.ts +14 -94
  130. package/node_modules/@mariozechner/pi-tui/dist/terminal-image.d.ts.map +1 -1
  131. package/node_modules/@mariozechner/pi-tui/dist/terminal-image.js +44 -186
  132. package/node_modules/@mariozechner/pi-tui/dist/terminal-image.js.map +1 -1
  133. package/node_modules/@mariozechner/pi-tui/dist/terminal.d.ts +13 -58
  134. package/node_modules/@mariozechner/pi-tui/dist/terminal.d.ts.map +1 -1
  135. package/node_modules/@mariozechner/pi-tui/dist/terminal.js +78 -111
  136. package/node_modules/@mariozechner/pi-tui/dist/terminal.js.map +1 -1
  137. package/node_modules/@mariozechner/pi-tui/dist/tui.d.ts +24 -110
  138. package/node_modules/@mariozechner/pi-tui/dist/tui.d.ts.map +1 -1
  139. package/node_modules/@mariozechner/pi-tui/dist/tui.js +188 -435
  140. package/node_modules/@mariozechner/pi-tui/dist/tui.js.map +1 -1
  141. package/node_modules/@mariozechner/pi-tui/dist/utils.d.ts +0 -18
  142. package/node_modules/@mariozechner/pi-tui/dist/utils.d.ts.map +1 -1
  143. package/node_modules/@mariozechner/pi-tui/dist/utils.js +251 -119
  144. package/node_modules/@mariozechner/pi-tui/dist/utils.js.map +1 -1
  145. package/node_modules/@mariozechner/pi-tui/package.json +6 -6
  146. package/node_modules/@mariozechner/pi-tui/src/__tests__/__snapshots__/render.test.ts.snap +3 -40
  147. package/node_modules/@mariozechner/pi-tui/src/__tests__/image-component.test.ts +71 -81
  148. package/node_modules/@mariozechner/pi-tui/src/__tests__/render.test.ts +0 -33
  149. package/node_modules/@mariozechner/pi-tui/src/__tests__/terminal-image.test.ts +93 -334
  150. package/node_modules/@mariozechner/pi-tui/src/__tests__/tui-render-scheduling.test.ts +1 -1
  151. package/node_modules/@mariozechner/pi-tui/src/__tests__/utils.test.ts +11 -196
  152. package/node_modules/@mariozechner/pi-tui/src/autocomplete.ts +228 -142
  153. package/node_modules/@mariozechner/pi-tui/src/components/cancellable-loader.ts +3 -3
  154. package/node_modules/@mariozechner/pi-tui/src/components/editor.ts +624 -390
  155. package/node_modules/@mariozechner/pi-tui/src/components/image.ts +17 -227
  156. package/node_modules/@mariozechner/pi-tui/src/components/input.ts +71 -63
  157. package/node_modules/@mariozechner/pi-tui/src/components/loader.ts +5 -137
  158. package/node_modules/@mariozechner/pi-tui/src/components/markdown.ts +143 -52
  159. package/node_modules/@mariozechner/pi-tui/src/components/select-list.ts +136 -70
  160. package/node_modules/@mariozechner/pi-tui/src/components/settings-list.ts +12 -51
  161. package/node_modules/@mariozechner/pi-tui/src/index.ts +17 -36
  162. package/node_modules/@mariozechner/pi-tui/src/keybindings.ts +148 -421
  163. package/node_modules/@mariozechner/pi-tui/src/keys.ts +253 -181
  164. package/node_modules/@mariozechner/pi-tui/src/terminal-image.ts +51 -252
  165. package/node_modules/@mariozechner/pi-tui/src/terminal.ts +78 -133
  166. package/node_modules/@mariozechner/pi-tui/src/tui.ts +202 -478
  167. package/node_modules/@mariozechner/pi-tui/src/utils.ts +289 -125
  168. package/node_modules/@mariozechner/pi-tui/tsconfig.build.json +1 -0
  169. package/package.json +13 -13
  170. package/packages/tallow-tui/node_modules/@types/mime-types/README.md +8 -2
  171. package/packages/tallow-tui/node_modules/@types/mime-types/index.d.ts +6 -0
  172. package/packages/tallow-tui/node_modules/@types/mime-types/package.json +9 -3
  173. package/packages/tallow-tui/node_modules/get-east-asian-width/lookup-data.js +18 -0
  174. package/packages/tallow-tui/node_modules/get-east-asian-width/lookup.js +116 -384
  175. package/packages/tallow-tui/node_modules/get-east-asian-width/package.json +5 -4
  176. package/packages/tallow-tui/node_modules/get-east-asian-width/utilities.js +24 -0
  177. package/packages/tallow-tui/node_modules/marked/README.md +5 -4
  178. package/packages/tallow-tui/node_modules/marked/bin/main.js +10 -8
  179. package/packages/tallow-tui/node_modules/marked/bin/marked.js +2 -1
  180. package/packages/tallow-tui/node_modules/marked/lib/marked.d.ts +156 -125
  181. package/packages/tallow-tui/node_modules/marked/lib/marked.esm.js +67 -2179
  182. package/packages/tallow-tui/node_modules/marked/lib/marked.esm.js.map +3 -3
  183. package/packages/tallow-tui/node_modules/marked/lib/marked.umd.js +67 -2201
  184. package/packages/tallow-tui/node_modules/marked/lib/marked.umd.js.map +3 -3
  185. package/packages/tallow-tui/node_modules/marked/man/marked.1 +4 -2
  186. package/packages/tallow-tui/node_modules/marked/man/marked.1.md +2 -1
  187. package/packages/tallow-tui/node_modules/marked/package.json +26 -34
  188. package/skills/tallow-expert/SKILL.md +3 -5
  189. package/node_modules/@mariozechner/pi-tui/dist/border-styles.d.ts +0 -32
  190. package/node_modules/@mariozechner/pi-tui/dist/border-styles.d.ts.map +0 -1
  191. package/node_modules/@mariozechner/pi-tui/dist/border-styles.js +0 -46
  192. package/node_modules/@mariozechner/pi-tui/dist/border-styles.js.map +0 -1
  193. package/node_modules/@mariozechner/pi-tui/dist/components/bordered-box.d.ts +0 -52
  194. package/node_modules/@mariozechner/pi-tui/dist/components/bordered-box.d.ts.map +0 -1
  195. package/node_modules/@mariozechner/pi-tui/dist/components/bordered-box.js +0 -89
  196. package/node_modules/@mariozechner/pi-tui/dist/components/bordered-box.js.map +0 -1
  197. package/node_modules/@mariozechner/pi-tui/dist/test-utils/capability-env.d.ts +0 -14
  198. package/node_modules/@mariozechner/pi-tui/dist/test-utils/capability-env.d.ts.map +0 -1
  199. package/node_modules/@mariozechner/pi-tui/dist/test-utils/capability-env.js +0 -55
  200. package/node_modules/@mariozechner/pi-tui/dist/test-utils/capability-env.js.map +0 -1
  201. package/node_modules/@mariozechner/pi-tui/src/__tests__/editor-change-listener.test.ts +0 -121
  202. package/node_modules/@mariozechner/pi-tui/src/__tests__/editor-ghost-text.test.ts +0 -112
  203. package/node_modules/@mariozechner/pi-tui/src/__tests__/mouse-events.test.ts +0 -134
  204. package/node_modules/@mariozechner/pi-tui/src/__tests__/settings-list.test.ts +0 -81
  205. package/node_modules/@mariozechner/pi-tui/src/__tests__/tui-diff-regression.test.ts +0 -555
  206. package/node_modules/@mariozechner/pi-tui/src/border-styles.ts +0 -60
  207. package/node_modules/@mariozechner/pi-tui/src/components/bordered-box.ts +0 -113
  208. package/node_modules/@mariozechner/pi-tui/src/test-utils/capability-env.ts +0 -56
  209. package/packages/tallow-tui/node_modules/marked/lib/marked.cjs +0 -2211
  210. package/packages/tallow-tui/node_modules/marked/lib/marked.cjs.map +0 -7
  211. package/packages/tallow-tui/node_modules/marked/lib/marked.d.cts +0 -728
  212. package/packages/tallow-tui/node_modules/marked/marked.min.js +0 -69
@@ -1,12 +1,279 @@
1
1
  /**
2
- * Fuzzy model name resolution re-exports from synapse.
2
+ * Deterministic fuzzy model resolution for subagents.
3
+ *
4
+ * We keep a local implementation instead of delegating straight to synapse
5
+ * because the direct dependency path was flaky under Linux CI in this repo.
6
+ * The behavior mirrors synapse's public resolver cascade closely enough for
7
+ * runtime callers and keeps tests deterministic across platforms.
3
8
  *
4
9
  * @module
5
10
  */
6
11
 
7
- export type { ModelSource, ResolvedModel } from "@dungle-scrubs/synapse";
8
- export {
9
- listAvailableModels,
10
- resolveModelCandidates,
11
- resolveModelFuzzy,
12
- } from "@dungle-scrubs/synapse";
12
+ import type { CandidateModel, ModelSource, ResolvedModel } from "@dungle-scrubs/synapse";
13
+ import { getModels, getProviders } from "@mariozechner/pi-ai";
14
+
15
+ export type { ModelSource, ResolvedModel };
16
+
17
+ /**
18
+ * Collect all models from the registered pi-ai providers.
19
+ *
20
+ * @returns Flat list of candidate models
21
+ */
22
+ function getAllModels(): CandidateModel[] {
23
+ const result: CandidateModel[] = [];
24
+ for (const provider of getProviders()) {
25
+ for (const model of getModels(provider)) {
26
+ result.push({ provider: model.provider, id: model.id, name: model.name });
27
+ }
28
+ }
29
+ return result;
30
+ }
31
+
32
+ /**
33
+ * Convert a candidate model into the resolved public shape.
34
+ *
35
+ * @param model - Candidate model
36
+ * @returns Resolved model descriptor
37
+ */
38
+ function toResolved(model: CandidateModel): ResolvedModel {
39
+ return {
40
+ displayName: `${model.provider}/${model.id}`,
41
+ id: model.id,
42
+ provider: model.provider,
43
+ };
44
+ }
45
+
46
+ /**
47
+ * Tokenize a query or model identifier for overlap matching.
48
+ *
49
+ * @param value - Raw query or identifier
50
+ * @returns Lowercase tokens split on separators and digit boundaries
51
+ */
52
+ function tokenize(value: string): string[] {
53
+ return value
54
+ .toLowerCase()
55
+ .replace(/([a-z])(\d)/g, "$1 $2")
56
+ .replace(/(\d)([a-z])/g, "$1 $2")
57
+ .split(/[\s\-_.]+/)
58
+ .filter((token) => token.length > 0);
59
+ }
60
+
61
+ /**
62
+ * Normalize a query or identifier by removing separators.
63
+ *
64
+ * @param value - Raw query or identifier
65
+ * @returns Lowercase normalized string
66
+ */
67
+ function normalize(value: string): string {
68
+ return value.toLowerCase().replace(/[\s\-_.]+/g, "");
69
+ }
70
+
71
+ /**
72
+ * Compare model IDs using numeric-aware sorting.
73
+ *
74
+ * @param a - First model ID
75
+ * @param b - Second model ID
76
+ * @returns Positive when a is newer/higher than b
77
+ */
78
+ function compareModelIds(a: string, b: string): number {
79
+ return a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" });
80
+ }
81
+
82
+ /**
83
+ * Build a provider-priority lookup map.
84
+ *
85
+ * @param preferredProviders - Ordered provider preference list
86
+ * @returns Provider -> priority map (lower is better)
87
+ */
88
+ function buildProviderPreferenceMap(
89
+ preferredProviders: readonly string[] | undefined
90
+ ): ReadonlyMap<string, number> {
91
+ const priorities = new Map<string, number>();
92
+ for (const [index, provider] of (preferredProviders ?? []).entries()) {
93
+ priorities.set(provider.toLowerCase(), index);
94
+ }
95
+ return priorities;
96
+ }
97
+
98
+ /**
99
+ * Resolve one provider's priority, defaulting unknown providers last.
100
+ *
101
+ * @param preferenceMap - Provider priority map
102
+ * @param provider - Provider to score
103
+ * @returns Numeric priority (lower is better)
104
+ */
105
+ function getProviderPriority(preferenceMap: ReadonlyMap<string, number>, provider: string): number {
106
+ return preferenceMap.get(provider.toLowerCase()) ?? Number.MAX_SAFE_INTEGER;
107
+ }
108
+
109
+ /**
110
+ * Pick the best candidate by ID quality only.
111
+ *
112
+ * Tiebreak order:
113
+ * 1. Higher numeric-aware model ID
114
+ * 2. Shorter ID when numeric ordering ties
115
+ * 3. Lexicographically last as deterministic fallback
116
+ *
117
+ * @param models - Candidate models
118
+ * @returns Best candidate
119
+ */
120
+ function pickBestModel(models: readonly CandidateModel[]): CandidateModel {
121
+ return models.reduce((best, current) => {
122
+ const versionDiff = compareModelIds(best.id, current.id);
123
+ if (versionDiff !== 0) {
124
+ return versionDiff > 0 ? best : current;
125
+ }
126
+ if (best.id.length !== current.id.length) {
127
+ return best.id.length < current.id.length ? best : current;
128
+ }
129
+ return best.id >= current.id ? best : current;
130
+ });
131
+ }
132
+
133
+ /**
134
+ * Pick the best final candidate, optionally preferring specific providers.
135
+ *
136
+ * @param models - Candidate models
137
+ * @param preferredProviders - Ordered provider preference list
138
+ * @returns Best candidate
139
+ */
140
+ function pickBest(
141
+ models: readonly CandidateModel[],
142
+ preferredProviders?: readonly string[]
143
+ ): CandidateModel {
144
+ const bestModel = pickBestModel(models);
145
+ if (!preferredProviders || preferredProviders.length === 0) {
146
+ return bestModel;
147
+ }
148
+
149
+ const sameModel = models.filter((model) => model.id === bestModel.id);
150
+ if (sameModel.length <= 1) {
151
+ return bestModel;
152
+ }
153
+
154
+ const preferenceMap = buildProviderPreferenceMap(preferredProviders);
155
+ return sameModel.reduce((best, current) => {
156
+ return getProviderPriority(preferenceMap, best.provider) <=
157
+ getProviderPriority(preferenceMap, current.provider)
158
+ ? best
159
+ : current;
160
+ });
161
+ }
162
+
163
+ /**
164
+ * Find all candidates that tie at the best score for the first matching tier.
165
+ *
166
+ * Resolution cascade:
167
+ * 1. Exact ID match
168
+ * 2. Case-insensitive ID match
169
+ * 3. Normalized ID match (strips separators)
170
+ * 4. Provider/ID exact match
171
+ * 5. Token overlap scoring
172
+ * 6. Raw substring match
173
+ * 7. Normalized substring match
174
+ *
175
+ * @param query - Human-friendly query
176
+ * @param modelSource - Optional injected model source
177
+ * @returns Tied candidates from the first matching tier
178
+ */
179
+ function findCandidates(query: string, modelSource?: ModelSource): CandidateModel[] {
180
+ const models = modelSource ? modelSource() : getAllModels();
181
+ if (models.length === 0) return [];
182
+
183
+ const trimmed = query.trim();
184
+ if (trimmed.length === 0) return [];
185
+
186
+ const lower = trimmed.toLowerCase();
187
+ const normalized = normalize(trimmed);
188
+
189
+ const exact = models.filter((model) => model.id === trimmed);
190
+ if (exact.length > 0) return exact;
191
+
192
+ const caseInsensitive = models.filter((model) => model.id.toLowerCase() === lower);
193
+ if (caseInsensitive.length > 0) return caseInsensitive;
194
+
195
+ const normalizedId = models.filter((model) => normalize(model.id) === normalized);
196
+ if (normalizedId.length > 0) return normalizedId;
197
+
198
+ if (trimmed.includes("/")) {
199
+ const slashIndex = trimmed.indexOf("/");
200
+ const provider = trimmed.slice(0, slashIndex).toLowerCase();
201
+ const id = trimmed.slice(slashIndex + 1).toLowerCase();
202
+ const providerMatch = models.filter(
203
+ (model) => model.provider.toLowerCase() === provider && model.id.toLowerCase() === id
204
+ );
205
+ if (providerMatch.length > 0) return providerMatch;
206
+ }
207
+
208
+ const queryTokens = tokenize(trimmed);
209
+ if (queryTokens.length > 0) {
210
+ let bestScore = 0;
211
+ let bestMatches: CandidateModel[] = [];
212
+ for (const model of models) {
213
+ const idName = `${model.id} ${model.name}`.toLowerCase();
214
+ const providerText = model.provider.toLowerCase();
215
+ let score = 0;
216
+ for (const token of queryTokens) {
217
+ if (idName.includes(token)) score += 2;
218
+ else if (providerText.includes(token)) score += 1;
219
+ }
220
+ if (score > bestScore) {
221
+ bestScore = score;
222
+ bestMatches = [model];
223
+ } else if (score === bestScore && score > 0) {
224
+ bestMatches.push(model);
225
+ }
226
+ }
227
+ if (bestMatches.length > 0) return bestMatches;
228
+ }
229
+
230
+ const substring = models.filter(
231
+ (model) => model.id.toLowerCase().includes(lower) || model.name.toLowerCase().includes(lower)
232
+ );
233
+ if (substring.length > 0) return substring;
234
+
235
+ return models.filter(
236
+ (model) =>
237
+ normalize(model.id).includes(normalized) || normalize(model.name).includes(normalized)
238
+ );
239
+ }
240
+
241
+ /**
242
+ * Resolve a fuzzy model query to one best match.
243
+ *
244
+ * @param query - Human-friendly model query
245
+ * @param modelSource - Optional injected model source for deterministic tests
246
+ * @param preferredProviders - Optional provider preference ordering
247
+ * @returns Best matching model or undefined
248
+ */
249
+ export function resolveModelFuzzy(
250
+ query: string,
251
+ modelSource?: ModelSource,
252
+ preferredProviders?: string[]
253
+ ): ResolvedModel | undefined {
254
+ const candidates = findCandidates(query, modelSource);
255
+ if (candidates.length === 0) return undefined;
256
+ return toResolved(pickBest(candidates, preferredProviders));
257
+ }
258
+
259
+ /**
260
+ * Resolve a fuzzy model query to all tied candidates.
261
+ *
262
+ * @param query - Human-friendly model query
263
+ * @param modelSource - Optional injected model source for deterministic tests
264
+ * @returns Candidate matches
265
+ */
266
+ export function resolveModelCandidates(query: string, modelSource?: ModelSource): ResolvedModel[] {
267
+ return findCandidates(query, modelSource).map(toResolved);
268
+ }
269
+
270
+ /**
271
+ * List available provider/model identifiers.
272
+ *
273
+ * @param modelSource - Optional injected model source for deterministic tests
274
+ * @returns Provider/model identifier strings
275
+ */
276
+ export function listAvailableModels(modelSource?: ModelSource): string[] {
277
+ const models = modelSource ? modelSource() : getAllModels();
278
+ return models.map((model) => `${model.provider}/${model.id}`);
279
+ }
@@ -2,8 +2,7 @@
2
2
  * TypeBox parameter schemas and event type definitions for the subagent tool.
3
3
  */
4
4
 
5
- import { StringEnum } from "@mariozechner/pi-ai";
6
- import { Type } from "@sinclair/typebox";
5
+ import { StringEnum, Type } from "@mariozechner/pi-ai";
7
6
 
8
7
  // ── Parameter Schemas ────────────────────────────────────────────────────────
9
8
 
@@ -2168,15 +2168,15 @@ Before calling manage_tasks complete/update, call manage_tasks list first so ind
2168
2168
  updateAgentBar(ctx);
2169
2169
  }
2170
2170
 
2171
- pi.on("session_start", async (_event, ctx) => {
2172
- restoreSessionState(ctx);
2173
- });
2174
-
2175
- pi.on("session_switch", async (_event, ctx) => {
2176
- restoreSessionState(ctx);
2177
- });
2178
-
2179
- // Cleanup on session end
2171
+ pi.on("session_start", async (_event, ctx) => restoreSessionState(ctx));
2172
+ (
2173
+ pi as unknown as {
2174
+ on: (
2175
+ event: string,
2176
+ handler: (event: unknown, ctx: ExtensionContext) => Promise<void>
2177
+ ) => void;
2178
+ }
2179
+ ).on("session_switch", async (_event, ctx) => restoreSessionState(ctx));
2180
2180
  pi.on("session_shutdown", async () => {
2181
2181
  emitInteropEvent(pi.events, INTEROP_EVENT_NAMES.backgroundTasksPresenterState, {
2182
2182
  active: false,
@@ -20,7 +20,7 @@
20
20
  */
21
21
 
22
22
  import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent";
23
- import { Key, Loader, Text, type TUI } from "@mariozechner/pi-tui";
23
+ import { Key, Text, type TUI } from "@mariozechner/pi-tui";
24
24
  import { Type } from "@sinclair/typebox";
25
25
  import { INTEROP_EVENT_NAMES, onInteropEvent } from "../../_shared/interop-events.js";
26
26
  import {
@@ -248,7 +248,6 @@ export function registerTeamsToolExtension(pi: ExtensionAPI): void {
248
248
  dashboardEnabled = true;
249
249
  setDashboardFlag(true);
250
250
  startDashboardTicker();
251
- ctx.ui.setWorkingMessage(Loader.HIDE);
252
251
  ctx.ui.setStatus("team-dashboard", "Team dashboard active");
253
252
  ctx.ui.setEditorComponent((tui, editorTheme, keybindings) => {
254
253
  enterDashboardViewport(tui);
@@ -322,7 +321,6 @@ export function registerTeamsToolExtension(pi: ExtensionAPI): void {
322
321
 
323
322
  pi.on("turn_start", async (_event, ctx) => {
324
323
  if (!dashboardEnabled || !ctx.hasUI) return;
325
- ctx.ui.setWorkingMessage(Loader.HIDE);
326
324
  });
327
325
 
328
326
  // Archive all teams on session shutdown (preserves tasks for future recovery)
@@ -2,9 +2,8 @@
2
2
  * Teammate tool definitions — coordination tools injected into each teammate session.
3
3
  */
4
4
 
5
- import { StringEnum } from "@mariozechner/pi-ai";
5
+ import { StringEnum, Type } from "@mariozechner/pi-ai";
6
6
  import type { ExtensionAPI, ToolDefinition } from "@mariozechner/pi-coding-agent";
7
- import { Type } from "@sinclair/typebox";
8
7
  import { getIcon } from "../../_icons/index.js";
9
8
  import { appendDashboardFeedEvent, refreshTeamView } from "../dashboard/state.js";
10
9
  import { autoDispatch, wakeTeammate } from "../dispatch/auto-dispatch.js";
@@ -12,9 +12,10 @@
12
12
  */
13
13
 
14
14
  import type { ExtensionAPI, ThemeColor } from "@mariozechner/pi-coding-agent";
15
- import { hyperlink, Text } from "@mariozechner/pi-tui";
15
+ import { Text } from "@mariozechner/pi-tui";
16
16
  import { Type } from "@sinclair/typebox";
17
17
  import { getIcon } from "../_icons/index.js";
18
+ import { hyperlink } from "../_shared/terminal-links.js";
18
19
  import { formatToolVerb, renderLines } from "../tool-display/index.js";
19
20
  import { BraveSearchProvider } from "./providers/brave.js";
20
21
  import { SearchError, type SearchProvider, type SearchResult } from "./providers/interface.js";
@@ -9,9 +9,8 @@
9
9
  import { spawnSync } from "node:child_process";
10
10
  import { existsSync } from "node:fs";
11
11
  import { join } from "node:path";
12
- import { StringEnum } from "@mariozechner/pi-ai";
12
+ import { StringEnum, Type } from "@mariozechner/pi-ai";
13
13
  import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
14
- import { Type } from "@sinclair/typebox";
15
14
 
16
15
  export type WeztermAction =
17
16
  | "list"
@@ -2,8 +2,9 @@
2
2
  * Enhanced write tool — shows full written content with summary footer.
3
3
  */
4
4
  import { createWriteTool, type ExtensionAPI } from "@mariozechner/pi-coding-agent";
5
- import { fileLink, Text } from "@mariozechner/pi-tui";
5
+ import { Text } from "@mariozechner/pi-tui";
6
6
  import { getIcon } from "../_icons/index.js";
7
+ import { fileLink } from "../_shared/terminal-links.js";
7
8
  import {
8
9
  appendSection,
9
10
  dimProcessOutputLine,
@@ -1,51 +1,73 @@
1
1
  # @mariozechner/pi-tui (Tallow fork)
2
2
 
3
- Tallow's fork of `@mariozechner/pi-tui` (v0.52.9). Adds customizable
4
- loader, border styles, and input middleware changes that require
5
- modifying pi-tui internals.
3
+ Tallow vendors a local fork of `@mariozechner/pi-tui` to keep a small set
4
+ of UI primitives that upstream still does not expose in the form tallow
5
+ needs.
6
6
 
7
- ## What's different from upstream
7
+ This is **not** a tiny historical snapshot anymore. The authoritative
8
+ upstream reference for the current reduction effort is
9
+ `@mariozechner/pi-tui@0.67.68`.
8
10
 
9
- ### Configurable Loader
11
+ ## Why the fork existed
10
12
 
11
- `Loader` accepts optional `frames` and `intervalMs` via constructor
12
- options. Static `Loader.defaultFrames` / `Loader.defaultIntervalMs`
13
- let extensions set global defaults at session start.
13
+ The original fork was created because tallow needed a few TUI primitives
14
+ that extension APIs could not provide directly:
14
15
 
15
- ### Border styles
16
+ - configurable loader defaults
17
+ - border styles and bordered boxes
18
+ - earlier input interception hooks
16
19
 
17
- New `BorderStyle` interface with three presets: `SHARP` (┌┐└┘),
18
- `ROUNDED` (╭╮╰╯), `FLAT` (horizontal rules only).
19
- `BorderedBox` component wraps content in a full border with optional
20
- title, padding, and color functions.
20
+ Since then, upstream added several features that used to be local, so the
21
+ current fork is larger than the original rationale justifies.
21
22
 
22
- ### Input middleware
23
+ ## Long-term keep surface
23
24
 
24
- `TUI.addInputMiddleware(fn)` inserts a hook before `handleInput`
25
- forwards to the focused component. Middleware returns `true` to
26
- consume input. Used by the which-key overlay extension.
25
+ The fork reduction effort is shrinking the long-term delta to only the
26
+ smallest set of proven tallow requirements:
27
27
 
28
- ## Upstream sync
28
+ - border styles
29
+ - loader global defaults and hide sentinel
30
+ - editor ghost-text and change-listener APIs
31
+ - minimal reset/render primitives still required by tallow
29
32
 
30
- Source extracted from `@mariozechner/pi-tui@0.52.9` source maps.
33
+ Everything else is treated as revert-or-extract unless proven necessary.
31
34
 
32
- ### Modified files (conflict surface on sync)
35
+ ## Authoritative audit
33
36
 
34
- | File | Change |
35
- |------|--------|
36
- | `components/loader.ts` | Constructor options, static defaults |
37
- | `tui.ts` | Input middleware array + add/remove methods |
37
+ Do not trust this README alone for the current delta. The canonical
38
+ status document is `docs/research/pi-tui-fork-audit.md`, generated and
39
+ validated by the audit script:
38
40
 
39
- ### Added files (zero conflict)
41
+ ```bash
42
+ node scripts/audit-pi-tui-fork.mjs
43
+ ```
40
44
 
41
- | File | Purpose |
42
- |------|---------|
43
- | `border-styles.ts` | BorderStyle interface + presets |
44
- | `components/bordered-box.ts` | Box component with configurable borders |
45
+ To regenerate the human-readable audit note:
45
46
 
46
- ### How to sync
47
+ ```bash
48
+ node scripts/audit-pi-tui-fork.mjs \
49
+ --write-markdown docs/research/pi-tui-fork-audit.md
50
+ ```
47
51
 
48
- 1. Extract new upstream source from source maps (same script)
49
- 2. Diff against `src/` — conflicts only in modified files above
50
- 3. Apply upstream changes, keep our additions
51
- 4. Rebuild: `cd packages/tallow-tui && npm run build`
52
+ The generated report classifies each changed runtime file as one of:
53
+
54
+ - `keep`
55
+ - `extract`
56
+ - `upstream`
57
+ - `revert`
58
+
59
+ ## Current ownership rules
60
+
61
+ - `packages/tallow-tui` should own generic TUI primitives only
62
+ - tallow session/reset behavior belongs in `src/interactive-*.ts`, not in
63
+ the fork
64
+ - application helpers should move to tallow or upstream rather than stay
65
+ in the fork by accident
66
+
67
+ ## Sync approach
68
+
69
+ 1. audit local-vs-upstream runtime deltas
70
+ 2. revert low-risk files first
71
+ 3. extract tallow-owned helpers out of the fork
72
+ 4. keep only the justified primitive surface
73
+ 5. shrink high-risk render/input deltas last with PTY regression tests
@@ -3,16 +3,22 @@ export interface AutocompleteItem {
3
3
  label: string;
4
4
  description?: string;
5
5
  }
6
+ type Awaitable<T> = T | Promise<T>;
6
7
  export interface SlashCommand {
7
8
  name: string;
8
9
  description?: string;
9
- getArgumentCompletions?(argumentPrefix: string): AutocompleteItem[] | null;
10
+ argumentHint?: string;
11
+ getArgumentCompletions?(argumentPrefix: string): Awaitable<AutocompleteItem[] | null>;
12
+ }
13
+ export interface AutocompleteSuggestions {
14
+ items: AutocompleteItem[];
15
+ prefix: string;
10
16
  }
11
17
  export interface AutocompleteProvider {
12
- getSuggestions(lines: string[], cursorLine: number, cursorCol: number): {
13
- items: AutocompleteItem[];
14
- prefix: string;
15
- } | null;
18
+ getSuggestions(lines: string[], cursorLine: number, cursorCol: number, options: {
19
+ signal: AbortSignal;
20
+ force?: boolean;
21
+ }): Promise<AutocompleteSuggestions | null>;
16
22
  applyCompletion(lines: string[], cursorLine: number, cursorCol: number, item: AutocompleteItem, prefix: string): {
17
23
  lines: string[];
18
24
  cursorLine: number;
@@ -24,10 +30,10 @@ export declare class CombinedAutocompleteProvider implements AutocompleteProvide
24
30
  private basePath;
25
31
  private fdPath;
26
32
  constructor(commands?: (SlashCommand | AutocompleteItem)[], basePath?: string, fdPath?: string | null);
27
- getSuggestions(lines: string[], cursorLine: number, cursorCol: number): {
28
- items: AutocompleteItem[];
29
- prefix: string;
30
- } | null;
33
+ getSuggestions(lines: string[], cursorLine: number, cursorCol: number, options: {
34
+ signal: AbortSignal;
35
+ force?: boolean;
36
+ }): Promise<AutocompleteSuggestions | null>;
31
37
  applyCompletion(lines: string[], cursorLine: number, cursorCol: number, item: AutocompleteItem, prefix: string): {
32
38
  lines: string[];
33
39
  cursorLine: number;
@@ -36,13 +42,12 @@ export declare class CombinedAutocompleteProvider implements AutocompleteProvide
36
42
  private extractAtPrefix;
37
43
  private extractPathPrefix;
38
44
  private expandHomePath;
45
+ private resolveScopedFuzzyQuery;
46
+ private scopedPathForDisplay;
39
47
  private getFileSuggestions;
40
48
  private scoreEntry;
41
49
  private getFuzzyFileSuggestions;
42
- getForceFileSuggestions(lines: string[], cursorLine: number, cursorCol: number): {
43
- items: AutocompleteItem[];
44
- prefix: string;
45
- } | null;
46
50
  shouldTriggerFileCompletion(lines: string[], cursorLine: number, cursorCol: number): boolean;
47
51
  }
52
+ export {};
48
53
  //# sourceMappingURL=autocomplete.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"autocomplete.d.ts","sourceRoot":"","sources":["../src/autocomplete.ts"],"names":[],"mappings":"AA2JA,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,sBAAsB,CAAC,CAAC,cAAc,EAAE,MAAM,GAAG,gBAAgB,EAAE,GAAG,IAAI,CAAC;CAC3E;AAED,MAAM,WAAW,oBAAoB;IAGpC,cAAc,CACb,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GACf;QACF,KAAK,EAAE,gBAAgB,EAAE,CAAC;QAC1B,MAAM,EAAE,MAAM,CAAC;KACf,GAAG,IAAI,CAAC;IAIT,eAAe,CACd,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,MAAM,GACZ;QACF,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KAClB,CAAC;CACF;AAGD,qBAAa,4BAA6B,YAAW,oBAAoB;IACxE,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAgB;gBAG7B,QAAQ,GAAE,CAAC,YAAY,GAAG,gBAAgB,CAAC,EAAO,EAClD,QAAQ,GAAE,MAAsB,EAChC,MAAM,GAAE,MAAM,GAAG,IAAW;IAO7B,cAAc,CACb,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GACf;QAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAqGvD,eAAe,CACd,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,MAAM,GACZ;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAwF7D,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,iBAAiB;IA8BzB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,kBAAkB;IAoI1B,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,uBAAuB;IAkD/B,uBAAuB,CACtB,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GACf;QAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAyBvD,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;CAW5F"}
1
+ {"version":3,"file":"autocomplete.d.ts","sourceRoot":"","sources":["../src/autocomplete.ts"],"names":[],"mappings":"AA8NA,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEnC,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,sBAAsB,CAAC,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,CAAC;CACtF;AAED,MAAM,WAAW,uBAAuB;IACvC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IAGpC,cAAc,CACb,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/C,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAC;IAI3C,eAAe,CACd,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,MAAM,GACZ;QACF,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KAClB,CAAC;CACF;AAGD,qBAAa,4BAA6B,YAAW,oBAAoB;IACxE,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAgB;gBAG7B,QAAQ,GAAE,CAAC,YAAY,GAAG,gBAAgB,CAAC,EAAO,EAClD,QAAQ,GAAE,MAAsB,EAChC,MAAM,GAAE,MAAM,GAAG,IAAW;IAOvB,cAAc,CACnB,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/C,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;IAsF1C,eAAe,CACd,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,MAAM,GACZ;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAwF7D,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,iBAAiB;IA8BzB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,uBAAuB;IAgC/B,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,kBAAkB;IAyI1B,OAAO,CAAC,UAAU;YAuBJ,uBAAuB;IA6DrC,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;CAW5F"}