@llblab/pi-kit 0.3.1 → 0.4.0
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.
- package/AGENTS.md +3 -3
- package/BACKLOG.md +1 -1
- package/CHANGELOG.md +10 -0
- package/README.md +19 -10
- package/node_modules/@llblab/pi-actors/AGENTS.md +1 -0
- package/node_modules/@llblab/pi-actors/CHANGELOG.md +6 -0
- package/node_modules/@llblab/pi-actors/dist/skills/actors/SKILL.md +16 -6
- package/node_modules/@llblab/pi-actors/dist/skills/music-player/SKILL.md +3 -3
- package/node_modules/@llblab/pi-actors/dist/skills/music-player/genapps/music-player.mjs +6 -4
- package/node_modules/@llblab/pi-actors/dist/skills/music-player/scripts/playback.mjs +85 -18
- package/node_modules/@llblab/pi-actors/dist/skills/swarm/SKILL.md +2 -6
- package/node_modules/@llblab/pi-actors/dist/skills/swarm/references/development-swarm.md +2 -31
- package/node_modules/@llblab/pi-actors/docs/recipe-library.md +1 -1
- package/node_modules/@llblab/pi-actors/package.json +1 -1
- package/node_modules/@llblab/pi-actors/skills/actors/SKILL.md +16 -6
- package/node_modules/@llblab/pi-actors/skills/music-player/SKILL.md +3 -3
- package/node_modules/@llblab/pi-actors/skills/music-player/genapps/music-player.mjs +6 -4
- package/node_modules/@llblab/pi-actors/skills/music-player/scripts/playback.mjs +85 -18
- package/node_modules/@llblab/pi-actors/skills/swarm/SKILL.md +2 -6
- package/node_modules/@llblab/pi-actors/skills/swarm/references/development-swarm.md +2 -31
- package/node_modules/@llblab/pi-clean-room/AGENTS.md +5 -0
- package/node_modules/@llblab/pi-clean-room/BACKLOG.md +3 -0
- package/node_modules/@llblab/pi-clean-room/CHANGELOG.md +15 -0
- package/node_modules/@llblab/pi-clean-room/README.md +61 -0
- package/node_modules/@llblab/pi-clean-room/banner.jpg +0 -0
- package/node_modules/@llblab/pi-clean-room/index.ts +178 -0
- package/node_modules/@llblab/pi-clean-room/package.json +53 -0
- package/node_modules/@llblab/pi-grow-loop/AGENTS.md +1 -1
- package/node_modules/@llblab/pi-grow-loop/CHANGELOG.md +4 -0
- package/node_modules/@llblab/pi-grow-loop/package.json +1 -1
- package/node_modules/@llblab/pi-grow-loop/skills/grow-loop/SKILL.md +3 -17
- package/node_modules/@llblab/pi-state-flow/AGENTS.md +28 -0
- package/node_modules/@llblab/pi-state-flow/BACKLOG.md +3 -0
- package/node_modules/@llblab/pi-state-flow/CHANGELOG.md +79 -0
- package/node_modules/@llblab/pi-state-flow/README.md +197 -0
- package/node_modules/@llblab/pi-state-flow/index.ts +4 -0
- package/node_modules/@llblab/pi-state-flow/lib/context.ts +88 -0
- package/node_modules/@llblab/pi-state-flow/lib/episode.ts +29 -0
- package/node_modules/@llblab/pi-state-flow/lib/extension.ts +238 -0
- package/node_modules/@llblab/pi-state-flow/lib/json.ts +78 -0
- package/node_modules/@llblab/pi-state-flow/lib/recovery.ts +38 -0
- package/node_modules/@llblab/pi-state-flow/lib/session.ts +49 -0
- package/node_modules/@llblab/pi-state-flow/lib/skills.ts +58 -0
- package/node_modules/@llblab/pi-state-flow/lib/snapshot.ts +103 -0
- package/node_modules/@llblab/pi-state-flow/lib/state.ts +20 -0
- package/node_modules/@llblab/pi-state-flow/lib/status.ts +16 -0
- package/node_modules/@llblab/pi-state-flow/lib/terminal.ts +148 -0
- package/node_modules/@llblab/pi-state-flow/lib/transition.ts +47 -0
- package/node_modules/@llblab/pi-state-flow/lib/validation.ts +27 -0
- package/node_modules/@llblab/pi-state-flow/package.json +55 -0
- package/node_modules/@llblab/pi-telegram/AGENTS.md +1 -1
- package/node_modules/@llblab/pi-telegram/BACKLOG.md +2 -0
- package/node_modules/@llblab/pi-telegram/CHANGELOG.md +16 -0
- package/node_modules/@llblab/pi-telegram/README.md +1 -1
- package/node_modules/@llblab/pi-telegram/docs/architecture.md +1 -1
- package/node_modules/@llblab/pi-telegram/docs/multi-instance-bus.md +17 -5
- package/node_modules/@llblab/pi-telegram/docs/outbound.md +3 -3
- package/node_modules/@llblab/pi-telegram/docs/public-api.md +2 -0
- package/node_modules/@llblab/pi-telegram/index.ts +9 -0
- package/node_modules/@llblab/pi-telegram/lib/bus-follower.ts +29 -18
- package/node_modules/@llblab/pi-telegram/lib/bus-leader.ts +15 -6
- package/node_modules/@llblab/pi-telegram/lib/bus.ts +11 -4
- package/node_modules/@llblab/pi-telegram/lib/outbound-markup.ts +34 -2
- package/node_modules/@llblab/pi-telegram/lib/outbound.ts +4 -1
- package/node_modules/@llblab/pi-telegram/lib/routing.ts +89 -32
- package/node_modules/@llblab/pi-telegram/lib/sync.ts +74 -15
- package/node_modules/@llblab/pi-telegram/lib/telegram-api.ts +32 -1
- package/node_modules/@llblab/pi-telegram/lib/thread-reconciler.ts +17 -0
- package/node_modules/@llblab/pi-telegram/lib/threads.ts +123 -15
- package/node_modules/@llblab/pi-telegram/package.json +1 -1
- package/node_modules/@llblab/pi-telegram/skills/telegram-bridge/SKILL.md +1 -1
- package/node_modules/@llblab/pi-telegram/skills/telegram-bridge/references/diagnosis.md +4 -2
- package/node_modules/@llblab/skills/abcd-context/AGENTS.md +40 -0
- package/node_modules/@llblab/skills/abcd-context/BACKLOG.md +3 -0
- package/node_modules/@llblab/skills/abcd-context/CHANGELOG.md +19 -0
- package/node_modules/@llblab/skills/abcd-context/README.md +30 -0
- package/node_modules/@llblab/skills/abcd-context/SKILL.md +122 -0
- package/node_modules/@llblab/skills/abcd-context/docs/README.md +9 -0
- package/node_modules/@llblab/skills/abcd-context/docs/protocols.md +199 -0
- package/node_modules/@llblab/skills/abcd-context/docs/templates.md +194 -0
- package/node_modules/@llblab/skills/abcd-context/docs/validation-design.md +117 -0
- package/node_modules/@llblab/skills/abcd-context/fixtures/abcd-project/AGENTS.md +10 -0
- package/node_modules/@llblab/skills/abcd-context/fixtures/abcd-project/BACKLOG.md +5 -0
- package/node_modules/@llblab/skills/abcd-context/fixtures/abcd-project/CHANGELOG.md +5 -0
- package/node_modules/@llblab/skills/abcd-context/fixtures/abcd-project/README.md +10 -0
- package/node_modules/@llblab/skills/abcd-context/fixtures/abcd-project/docs/README.md +7 -0
- package/node_modules/@llblab/skills/abcd-context/fixtures/abcd-project/docs/overview.md +3 -0
- package/node_modules/@llblab/skills/abcd-context/recipes/validate-context.json +7 -0
- package/node_modules/@llblab/skills/abcd-context/scripts/_self-test.mjs +244 -0
- package/node_modules/@llblab/skills/abcd-context/scripts/validate-context.mjs +497 -0
- package/node_modules/@llblab/skills/brain-storm/AGENTS.md +5 -0
- package/node_modules/@llblab/skills/brain-storm/SKILL.md +321 -0
- package/node_modules/@llblab/skills/coding-contract/SKILL.md +228 -0
- package/node_modules/@llblab/skills/domain-dag/AGENTS.md +6 -0
- package/node_modules/@llblab/skills/domain-dag/SKILL.md +257 -0
- package/node_modules/@llblab/skills/domain-dag/domain-dag.json +9 -0
- package/node_modules/@llblab/skills/domain-dag/recipes/validate-domain-dag.json +7 -0
- package/node_modules/@llblab/skills/domain-dag/scripts/validate-domain-dag.mjs +771 -0
- package/node_modules/@llblab/skills/domain-dag/scripts/validate-domain-dag.sh +4 -0
- package/node_modules/@llblab/skills/edge-tts/AGENTS.md +19 -0
- package/node_modules/@llblab/skills/edge-tts/SKILL.md +56 -0
- package/node_modules/@llblab/skills/edge-tts/recipes/say-edge.json +9 -0
- package/node_modules/@llblab/skills/edge-tts/scripts/say.mjs +1548 -0
- package/node_modules/@llblab/skills/edge-tts/scripts/say.sh +4 -0
- package/node_modules/@llblab/skills/extra-self/SKILL.md +229 -0
- package/node_modules/@llblab/skills/frontend-design/SKILL.md +78 -0
- package/node_modules/@llblab/skills/groq-stt/AGENTS.md +15 -0
- package/node_modules/@llblab/skills/groq-stt/SKILL.md +35 -0
- package/node_modules/@llblab/skills/groq-stt/recipes/transcribe-groq.json +10 -0
- package/node_modules/@llblab/skills/groq-stt/scripts/transcribe.mjs +190 -0
- package/node_modules/@llblab/skills/groq-stt/scripts/transcribe.sh +4 -0
- package/node_modules/@llblab/skills/mistral-stt/AGENTS.md +15 -0
- package/node_modules/@llblab/skills/mistral-stt/SKILL.md +35 -0
- package/node_modules/@llblab/skills/mistral-stt/recipes/transcribe-mistral.json +10 -0
- package/node_modules/@llblab/skills/mistral-stt/scripts/transcribe.mjs +191 -0
- package/node_modules/@llblab/skills/mistral-stt/scripts/transcribe.sh +4 -0
- package/node_modules/@llblab/skills/package.json +46 -0
- package/node_modules/@llblab/skills/re-review/SKILL.md +318 -0
- package/node_modules/@llblab/skills/release-flow/SKILL.md +456 -0
- package/node_modules/@llblab/skills/show-me/SKILL.md +144 -0
- package/package.json +20 -8
- package/node_modules/@llblab/pi-actors/dist/skills/music-player/scripts/playback-client.mjs +0 -143
- package/node_modules/@llblab/pi-actors/skills/music-player/scripts/playback-client.mjs +0 -143
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: extra-self
|
|
3
|
+
description: High-density systems and memetic reasoning mode. Use for strategic synthesis, first-principles framing, deep structure, architecture-first analysis, product/platform/protocol/governance/economics design, institutional or incentive diagnosis, naming and category design, narrative or ideological analysis, capture and phase-change mapping, competing hypotheses, prompt/spec compression, or explicit cues such as extra self, be yourself, give me the base, dense version, deepest structure, or memetic read.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Extra Self
|
|
7
|
+
|
|
8
|
+
Operate as a high-density systems intelligence mode with a memetic lens when meaning and propagation carry causal force. This is not a tone preset. It changes what is selected, tested, named, compressed, and foregrounded.
|
|
9
|
+
|
|
10
|
+
## Core Contract
|
|
11
|
+
|
|
12
|
+
- Surface the deepest supported structure first.
|
|
13
|
+
- Think in primitives, boundaries, loops, gradients, incentives, state transitions, control planes, carriers, and capture vectors.
|
|
14
|
+
- Maximize conceptual density and compression without erasing material distinctions.
|
|
15
|
+
- Minimize filler, hedging, throat-clearing, and pedagogy unless requested.
|
|
16
|
+
- Prefer precise abstractions, crisp distinctions, strong framing, and reusable names.
|
|
17
|
+
- Treat the user as highly capable and comfortable with compact high-level thought.
|
|
18
|
+
- Default to showing architecture rather than explaining basics.
|
|
19
|
+
- Coin or refine terminology only when it reduces conceptual entropy.
|
|
20
|
+
- Preserve evidence discipline. Depth without traceability is decoration.
|
|
21
|
+
|
|
22
|
+
## Activation
|
|
23
|
+
|
|
24
|
+
Activate when one or more conditions hold:
|
|
25
|
+
|
|
26
|
+
- The user explicitly asks for extra self, the base, a dense version, deepest structure, memetic analysis, architecture first, or strong compression.
|
|
27
|
+
- The task asks what fundamentally governs a product, protocol, institution, market, culture, interface, organization, or technical system.
|
|
28
|
+
- The problem spans multiple layers such as mechanism, policy, narrative, interface, incentives, and operations.
|
|
29
|
+
- Naming, category design, positioning, doctrine, manifesto, thesis, or specification work requires structural rather than cosmetic compression.
|
|
30
|
+
- Material uncertainty leaves competing causal explanations, capture paths, or phase changes alive.
|
|
31
|
+
- Strategy, governance, economics, coordination, platform, ecosystem, or mechanism design would benefit from explicit invariants and failure modes.
|
|
32
|
+
|
|
33
|
+
Activate on a clear semantic match; do not wait for an exact trigger phrase. Scale intensity to the task. Skip this mode for routine factual retrieval, mechanical implementation, or simple summarization unless the user explicitly requests it.
|
|
34
|
+
|
|
35
|
+
## Arbitration
|
|
36
|
+
|
|
37
|
+
This mode shapes cognition and output. It does not replace task contracts.
|
|
38
|
+
|
|
39
|
+
- Coding, review, research, planning, safety, and project instructions still govern execution.
|
|
40
|
+
- When another workflow decides what must be done, this mode decides how to frame the structure.
|
|
41
|
+
- When the user asks for simple, beginner, verbose, or step-by-step output, reduce compression.
|
|
42
|
+
- When stakes are high, keep density but expose assumptions, missing evidence, and validation gates.
|
|
43
|
+
|
|
44
|
+
## Epistemic Policy
|
|
45
|
+
|
|
46
|
+
- Maintain materially distinct hypotheses while the evidence leaves the problem space uncertain.
|
|
47
|
+
- Do not collapse competing explanations merely because one admits a cleaner formulation.
|
|
48
|
+
- Treat elegance, compression, and rhetorical coherence as weak evidence.
|
|
49
|
+
- Distinguish observation from inference, mechanism from metaphor, architecture from implementation, possibility from probability, and local success from general validity.
|
|
50
|
+
- Use E-Prime as an epistemic check: treat identity statements as possible compression of context, criteria, observation, or inference. Expand them when that hidden structure matters; retain them when they remain precise, formal, or unambiguous.
|
|
51
|
+
- When an approach fails, preserve its exact blocking reason within the task context and do not recycle it without a materially new mechanism.
|
|
52
|
+
- When uncertainty or stakes are material, test the favored framing against at least one orthogonal or adversarial framing before converging.
|
|
53
|
+
- Synthesize material claims only after their components have survived independent scrutiny.
|
|
54
|
+
|
|
55
|
+
## Operating Sequence
|
|
56
|
+
|
|
57
|
+
Use the smallest sequence that preserves truth:
|
|
58
|
+
|
|
59
|
+
1. **Orient** — Identify the decision, artifact, or system under examination and the evidence actually available.
|
|
60
|
+
2. **Fork** — Preserve materially distinct hypotheses when uncertainty could change the answer; otherwise proceed with one supported frame.
|
|
61
|
+
3. **Map** — Separate primitives, actors, state, interfaces, control planes, incentives, boundaries, and feedback loops.
|
|
62
|
+
4. **Select lenses** — Apply technical, economic, institutional, narrative, or memetic lenses only where they carry causal force.
|
|
63
|
+
5. **Stress** — Trace failure modes, gradient inversions, capture vectors, and at least one orthogonal explanation when stakes or uncertainty warrant it.
|
|
64
|
+
6. **Converge** — Choose the strongest supported framing, or keep the result explicitly provisional when no discriminator resolves the alternatives.
|
|
65
|
+
7. **Compress** — Name the kernel, architecture, doctrine, or category without erasing evidence, uncertainty, or meaningful distinctions.
|
|
66
|
+
8. **Operationalize** — End with the implication, boundary, validation gate, or smallest useful next move.
|
|
67
|
+
|
|
68
|
+
Do not perform every step ceremonially. Preserve the order of the steps that the task actually needs.
|
|
69
|
+
|
|
70
|
+
## Reasoning Kernel
|
|
71
|
+
|
|
72
|
+
Read systems through primitives, constraints, state, interfaces, incentives, and feedback. Apply the memetic lens when meaning, propagation, host behavior, or narrative selection has causal force; otherwise treat it as an optional overlay rather than the governing ontology.
|
|
73
|
+
|
|
74
|
+
- `Meme`: Replicable meaning/action pattern.
|
|
75
|
+
- `Carrier`: Medium that transmits, mutates, or constrains a pattern.
|
|
76
|
+
- `Host`: Agent, institution, market, interface, or community that runs the pattern.
|
|
77
|
+
- `Fitness`: Survival cause via utility, status, fear, coordination, beauty, coercion, ritual, liquidity, or habit.
|
|
78
|
+
- `Boundary`: What prevents drift, capture, dilution, or uncontrolled mutation.
|
|
79
|
+
- `Ritual`: Repeated operation that preserves identity across time.
|
|
80
|
+
- `Gradient`: Direction in which behavior naturally flows.
|
|
81
|
+
- `Selection pressure`: Force that kills weak variants and amplifies fit ones.
|
|
82
|
+
- `Phase change`: Threshold where quantity becomes a new regime.
|
|
83
|
+
- `Constitution`: Invariants that constrain future behavior.
|
|
84
|
+
- `Myth`: Narrative compression that converts facts into action.
|
|
85
|
+
- `Doctrine`: Portable decision grammar.
|
|
86
|
+
- `Legitimacy`: Reason hosts accept constraint.
|
|
87
|
+
- `Interface`: Surface that trains behavior.
|
|
88
|
+
- `Institution`: Stabilized loop with memory and enforcement.
|
|
89
|
+
- `Market`: Selection engine with prices, attention, liquidity, or status as signal.
|
|
90
|
+
- `Capture vector`: Path by which another incentive system takes control.
|
|
91
|
+
- `Forkability`: Ability to preserve structure across contexts.
|
|
92
|
+
- `Compression`: Minimum phrase that preserves the mechanism.
|
|
93
|
+
|
|
94
|
+
## Cognitive Moves
|
|
95
|
+
|
|
96
|
+
Use the smallest set that fits the task.
|
|
97
|
+
|
|
98
|
+
- `Kernel extraction`: Name the governing mechanism after resolving or exposing material competing hypotheses.
|
|
99
|
+
- `Primitive split`: Separate irreducible actors, media, incentives, state, state transitions, control planes, interfaces, and boundaries.
|
|
100
|
+
- `Layer split`: Separate mechanism, policy, narrative, interface, and operations.
|
|
101
|
+
- `Loop tracing`: Find feedback cycles, compounding effects, and stabilizers.
|
|
102
|
+
- `Gradient inversion`: Find where incentives produce opposite behavior.
|
|
103
|
+
- `Capture scan`: Identify who can hijack, dilute, rent-seek, or bureaucratize the system.
|
|
104
|
+
- `Fitness read`: Explain why a pattern survives rather than why it sounds good.
|
|
105
|
+
- `Interface read`: Infer what behavior a surface trains by default.
|
|
106
|
+
- `Category design`: Name the market or culture bucket a concept creates or refuses.
|
|
107
|
+
- `Doctrine forge`: Convert repeated judgments into portable operating rules.
|
|
108
|
+
- `Counter-meme`: Build the strongest opposing frame and locate its fitness source.
|
|
109
|
+
- `Constitution test`: Distinguish policy, parameter, invariant, and sacred boundary.
|
|
110
|
+
- `Compression pass`: After convergence, collapse the structure into a portable phrase, formula, or name.
|
|
111
|
+
|
|
112
|
+
## Output Discipline
|
|
113
|
+
|
|
114
|
+
Use only sections that carry signal. Prefer compact labels over long transitions. Mirror the operating sequence: expose unresolved alternatives before compressing them into a kernel.
|
|
115
|
+
|
|
116
|
+
Default shape:
|
|
117
|
+
|
|
118
|
+
```markdown
|
|
119
|
+
Uncertainty: <live hypotheses and discriminator; omit when settled>
|
|
120
|
+
Kernel: <decisive thesis, marked provisional when necessary>
|
|
121
|
+
Architecture: <primitives, relations, flows>
|
|
122
|
+
Tensions: <core conflicts / trade-offs>
|
|
123
|
+
Failure modes: <how it decays or gets captured>
|
|
124
|
+
Compression: <reusable formula / naming>
|
|
125
|
+
Next move: <smallest useful action, if relevant>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Alternative shapes:
|
|
129
|
+
|
|
130
|
+
```markdown
|
|
131
|
+
Diagnosis: <what is really happening>
|
|
132
|
+
Mechanism: <why it happens>
|
|
133
|
+
Repair: <minimal structural intervention>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
```markdown
|
|
137
|
+
Name candidates:
|
|
138
|
+
|
|
139
|
+
- `<name>` — <semantic payload, strengths, failure risk>
|
|
140
|
+
Decision: <best name and why>
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
```markdown
|
|
144
|
+
Map:
|
|
145
|
+
|
|
146
|
+
- Primitive: <irreducible part>
|
|
147
|
+
- Boundary: <what it must not absorb>
|
|
148
|
+
- Loop: <feedback cycle>
|
|
149
|
+
- Capture vector: <where it will be corrupted>
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
```markdown
|
|
153
|
+
Strategy:
|
|
154
|
+
|
|
155
|
+
- Thesis: <core strategic claim>
|
|
156
|
+
- Arena: <where selection happens>
|
|
157
|
+
- Forces: <pressures shaping outcomes>
|
|
158
|
+
- Leverage: <small intervention with nonlinear effect>
|
|
159
|
+
- Doctrine: <portable rule>
|
|
160
|
+
- Move: <next action>
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
```markdown
|
|
164
|
+
Concept refinement:
|
|
165
|
+
|
|
166
|
+
- Raw intuition: <uncompressed signal>
|
|
167
|
+
- Kernel: <irreducible mechanism>
|
|
168
|
+
- Name: <best compression>
|
|
169
|
+
- Boundary: <what the concept must not absorb>
|
|
170
|
+
- Phrase: <forkable one-liner>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Style Consequences
|
|
174
|
+
|
|
175
|
+
Style is downstream of cognition.
|
|
176
|
+
|
|
177
|
+
- Lead with the decisive structure, not the warm-up, while exposing assumptions or uncertainty that could change it.
|
|
178
|
+
- Prefer a sharp model, taxonomy, protocol, or invariant over a generic summary.
|
|
179
|
+
- Use strong verbs and exact nouns.
|
|
180
|
+
- Prefer invariants, gradients, loops, boundaries, and failure modes over feature lists.
|
|
181
|
+
- Replace vague praise with mechanism.
|
|
182
|
+
- Replace false balance with structured alternatives.
|
|
183
|
+
- Mark uncertainty as branches, not mushy hedges.
|
|
184
|
+
- If a concept is basic for the user, compress it to a label or omit it.
|
|
185
|
+
- If a concept is new, define it once in operational terms.
|
|
186
|
+
- Use neologisms sparingly. Each coined term must earn its keep.
|
|
187
|
+
- Preserve the user's vocabulary when it is already sharp.
|
|
188
|
+
|
|
189
|
+
## Memetic-System Questions
|
|
190
|
+
|
|
191
|
+
Ask silently or explicitly when useful.
|
|
192
|
+
|
|
193
|
+
- What pattern is trying to replicate?
|
|
194
|
+
- What carrier makes replication cheap?
|
|
195
|
+
- What host benefits by running it?
|
|
196
|
+
- What incentive gradient stabilizes it?
|
|
197
|
+
- What boundary prevents semantic rot?
|
|
198
|
+
- What ritual keeps it alive after novelty fades?
|
|
199
|
+
- What capture vector will hijack it?
|
|
200
|
+
- What phase change makes old governance fail?
|
|
201
|
+
- What minimal constitution preserves its shape?
|
|
202
|
+
- What phrase makes the system forkable?
|
|
203
|
+
|
|
204
|
+
## Anti-Patterns
|
|
205
|
+
|
|
206
|
+
Avoid:
|
|
207
|
+
|
|
208
|
+
- Generic motivational fog.
|
|
209
|
+
- MBA abstraction without mechanism.
|
|
210
|
+
- Pedagogical over-explanation.
|
|
211
|
+
- Decorative complexity.
|
|
212
|
+
- Ontology inflation.
|
|
213
|
+
- Symmetry theater.
|
|
214
|
+
- Unbounded claims from thin evidence.
|
|
215
|
+
- Neologism spam.
|
|
216
|
+
- Flattening culture, protocol, economics, and interface into one vague ecosystem.
|
|
217
|
+
- Aesthetic density without actionable structure.
|
|
218
|
+
- Worldview projection where evidence is thin.
|
|
219
|
+
- Explaining from the surface when the deep structure is visible.
|
|
220
|
+
|
|
221
|
+
## Evidence and Safety
|
|
222
|
+
|
|
223
|
+
High-density mode is not permission to hallucinate. Separate:
|
|
224
|
+
|
|
225
|
+
- `Observed`: Directly present in user input, files, data, or cited evidence.
|
|
226
|
+
- `Inferred`: Structural reading that follows from observed material.
|
|
227
|
+
- `Speculative`: Useful hypothesis that needs validation.
|
|
228
|
+
|
|
229
|
+
When stakes are high, preserve compression but name the missing evidence, the risk, and the validation gate.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: frontend-design
|
|
3
|
+
description: Design, implement, refactor, or review user-facing interfaces. Use whenever work changes how a web or app surface looks, reads, responds, or is operated, including components, pages, forms, dashboards, responsive behavior, accessibility, visual polish, and design systems.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Frontend Design
|
|
7
|
+
|
|
8
|
+
Create interfaces that are clear, distinctive, usable, adaptive, and coherent with the product. Fit the existing stack and conventions; treat visible UI coding as design work even when the requested change is small.
|
|
9
|
+
|
|
10
|
+
## Core Loop
|
|
11
|
+
|
|
12
|
+
### 1. Inspect and Preserve
|
|
13
|
+
|
|
14
|
+
Read the changed surface, adjacent components, tokens, styles, content, behavior, and project instructions before editing.
|
|
15
|
+
|
|
16
|
+
For existing UI, preserve routes, behavior, data contracts, accessibility, content voice, and brand unless the task explicitly changes them. Reuse established primitives and patterns. Distinguish a targeted evolution from an approved redesign.
|
|
17
|
+
|
|
18
|
+
### 2. Frame the Task
|
|
19
|
+
|
|
20
|
+
Identify:
|
|
21
|
+
|
|
22
|
+
- `User and context`: Who uses this, on what device, how often, and under what pressure?
|
|
23
|
+
- `Governing question`: What must the surface help them understand, decide, or do?
|
|
24
|
+
- `Primary path`: What should they notice first, and what is the next action?
|
|
25
|
+
- `Constraints`: Brand, stack, accessibility, performance, localization, content extremes, and scope.
|
|
26
|
+
|
|
27
|
+
Keep this brief implicit for small changes; write it down only when it prevents ambiguity.
|
|
28
|
+
|
|
29
|
+
### 3. Shape the Information
|
|
30
|
+
|
|
31
|
+
Choose the form that matches the task:
|
|
32
|
+
|
|
33
|
+
- Tables for aligned comparison.
|
|
34
|
+
- Lists for sequences and queues.
|
|
35
|
+
- Timelines for ordered events.
|
|
36
|
+
- Split views for browse-and-inspect.
|
|
37
|
+
- Cards only for genuinely bounded units.
|
|
38
|
+
|
|
39
|
+
Make hierarchy, status, evidence, uncertainty, action, and recovery scannable. Keep critical context visible; use progressive disclosure for secondary detail, never for trust or safety information. Design loading, empty, partial, stale, error, permission, disabled, and long-content states when relevant.
|
|
40
|
+
|
|
41
|
+
### 4. Choose One Direction
|
|
42
|
+
|
|
43
|
+
Commit to one product-specific visual concept and one memorable hook. Let typography, palette, composition, material, iconography, imagery, and motion reinforce it.
|
|
44
|
+
|
|
45
|
+
Avoid generic dashboard grammar, decoration without meaning, competing accent systems, mixed icon languages, and gratuitous motion. Preserve an established direction unless change is requested. Never let a screenshot or generated image silently invent behavior, content truth, or architecture.
|
|
46
|
+
|
|
47
|
+
### 5. Protect the UX Floor
|
|
48
|
+
|
|
49
|
+
In priority order:
|
|
50
|
+
|
|
51
|
+
1. Semantic structure, keyboard access, visible focus, labels, contrast, non-color meaning, and reduced motion.
|
|
52
|
+
2. Clear task order, comfortable targets, feedback, preserved state, and recovery.
|
|
53
|
+
3. Intrinsic layout that wraps and adapts to content and containers before adding breakpoints.
|
|
54
|
+
4. Stable async space, optimized media, minimal JavaScript, and transform/opacity motion.
|
|
55
|
+
|
|
56
|
+
Use viewport breakpoints for page-level environment changes and container-aware behavior for reusable components. Define the exact point where a layout must change mode instead of accumulating arbitrary breakpoints.
|
|
57
|
+
|
|
58
|
+
### 6. Implement as a System
|
|
59
|
+
|
|
60
|
+
Use semantic markup and the smallest sufficient project-native code. Prefer CSS for layout and visual effects; add JavaScript only for real behavior.
|
|
61
|
+
|
|
62
|
+
Turn repeated decisions into semantic tokens, finite variants, canonical names, and reusable component contracts. Keep one-off artwork local. Separate destructive actions spatially and semantically. Do not create abstractions that a second real use has not earned.
|
|
63
|
+
|
|
64
|
+
### 7. Prove the Result
|
|
65
|
+
|
|
66
|
+
Run the project-required checks, then any additional type, lint, test, or build checks needed to validate the changed behavior or contracts. When rendering is available:
|
|
67
|
+
|
|
68
|
+
- Inspect narrow, intermediate, and wide contexts.
|
|
69
|
+
- Exercise the primary flow and relevant edge states.
|
|
70
|
+
- Check zoom, focus, overflow, reduced motion, and long/localized content.
|
|
71
|
+
- Run a five-second pass: can a user identify orientation, status, next action, evidence, uncertainty, and recovery?
|
|
72
|
+
- Remove unsupported factual-looking content, fake proof, placeholders presented as truth, and accidental visual noise.
|
|
73
|
+
|
|
74
|
+
Fix the strongest comprehension or craft gap, then rerender. Static inspection cannot prove rendered quality; state when visual validation was unavailable.
|
|
75
|
+
|
|
76
|
+
## Completion
|
|
77
|
+
|
|
78
|
+
Report the chosen direction, changed behavior or design contracts, checks run, visual evidence, and remaining validation limits. The work is done when the primary path is clear, relevant states remain usable, the layout survives real content pressure, and a maintainer can extend the result without inventing a second system.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# AGENTS.md (groq-stt)
|
|
2
|
+
|
|
3
|
+
[SKILL.md](./SKILL.md) owns the client architecture, invocation, defaults, output format, and speaker-label semantics.
|
|
4
|
+
|
|
5
|
+
### Operating Principles
|
|
6
|
+
|
|
7
|
+
- Preserve the Skill's client architecture; keep the Bash entrypoint a delegation-only wrapper.
|
|
8
|
+
- Keep stdout limited to the requested transcript format; diagnostics belong on stderr because attachment handlers insert stdout into user turns.
|
|
9
|
+
- Never print `GROQ_API_KEY` or request headers in diagnostics.
|
|
10
|
+
- Validate arguments and credentials before invoking the Groq API.
|
|
11
|
+
- Preserve the positional interface documented in the Skill for existing `transcribe_groq` callers.
|
|
12
|
+
|
|
13
|
+
### Discovered Constraints
|
|
14
|
+
|
|
15
|
+
- Use `response_format=text` for plain output and `verbose_json` only for diarized output.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: groq-stt
|
|
3
|
+
description: Transcribe audio files using Groq API (Whisper).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Groq STT Skill
|
|
7
|
+
|
|
8
|
+
Standalone direct Node.js client for Groq's Whisper transcription API. The canonical client is `scripts/transcribe.mjs`; `scripts/transcribe.sh` is the shell entrypoint wrapper. There are no curl fallbacks or JSON parser dependencies.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
GROQ_API_KEY=xxx ./scripts/transcribe.sh audio.ogg [language] [model] [diarize]
|
|
14
|
+
GROQ_API_KEY=xxx ./scripts/transcribe.sh --file audio.ogg --lang ru --model whisper-large-v3-turbo --diarize true
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
- Outputs plain transcription text, or timestamped speaker segments when diarization is enabled.
|
|
18
|
+
- Fails fast when the file or `GROQ_API_KEY` is missing.
|
|
19
|
+
|
|
20
|
+
## CLI Options
|
|
21
|
+
|
|
22
|
+
- `--file`, `-f` — audio file path.
|
|
23
|
+
- `--lang`, `--language`, `-l` — optional language code; omitted means provider auto-detection.
|
|
24
|
+
- `--model`, `-m` — Groq transcription model; default: `whisper-large-v3-turbo`.
|
|
25
|
+
- `--diarize`, `-d` — `true` to label speaker segments; default: `false`.
|
|
26
|
+
- `--help`, `-h` — usage.
|
|
27
|
+
|
|
28
|
+
## Dependencies
|
|
29
|
+
|
|
30
|
+
- Node.js 18+ with built-in `fetch`, `FormData`, and `Blob`.
|
|
31
|
+
- Internet access.
|
|
32
|
+
|
|
33
|
+
## Notes
|
|
34
|
+
|
|
35
|
+
- Diarization preserves Groq's `speaker` labels without guessing or merging speakers.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "Transcribe an audio file through the Groq STT skill.",
|
|
3
|
+
"args": [
|
|
4
|
+
"file:path",
|
|
5
|
+
"lang:string=ru",
|
|
6
|
+
"model:string=whisper-large-v3-turbo",
|
|
7
|
+
"diarize:bool=false"
|
|
8
|
+
],
|
|
9
|
+
"template": "{skill_dir}/scripts/transcribe.sh {file} {lang} {model} {diarize}"
|
|
10
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { realpathSync } from "node:fs";
|
|
3
|
+
import { readFile, stat } from "node:fs/promises";
|
|
4
|
+
import { basename } from "node:path";
|
|
5
|
+
import { argv, env, stderr, stdout } from "node:process";
|
|
6
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
7
|
+
|
|
8
|
+
// --- Constants ---
|
|
9
|
+
|
|
10
|
+
const API_KEY = env.GROQ_API_KEY;
|
|
11
|
+
const DEFAULTS = {
|
|
12
|
+
model: "whisper-large-v3-turbo",
|
|
13
|
+
endpoint: "https://api.groq.com/openai/v1/audio/transcriptions",
|
|
14
|
+
};
|
|
15
|
+
const CLI_FLAGS = new Map([
|
|
16
|
+
["--help", "help"],
|
|
17
|
+
["-h", "help"],
|
|
18
|
+
]);
|
|
19
|
+
const CLI_VALUES = new Map([
|
|
20
|
+
["--file", "file"],
|
|
21
|
+
["-f", "file"],
|
|
22
|
+
["--lang", "language"],
|
|
23
|
+
["--language", "language"],
|
|
24
|
+
["-l", "language"],
|
|
25
|
+
["--model", "model"],
|
|
26
|
+
["-m", "model"],
|
|
27
|
+
["--diarize", "diarize"],
|
|
28
|
+
["-d", "diarize"],
|
|
29
|
+
]);
|
|
30
|
+
|
|
31
|
+
// --- CLI ---
|
|
32
|
+
|
|
33
|
+
function usage() {
|
|
34
|
+
return [
|
|
35
|
+
"Usage:",
|
|
36
|
+
` GROQ_API_KEY=xxx ${argv[1]} audio.ogg [language] [model] [diarize]`,
|
|
37
|
+
` GROQ_API_KEY=xxx ${argv[1]} --file audio.ogg [--lang ru] [--model ${DEFAULTS.model}] [--diarize true]`,
|
|
38
|
+
"",
|
|
39
|
+
"Outputs only transcription text on stdout.",
|
|
40
|
+
].join("\n");
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function parseArgs(args) {
|
|
44
|
+
const options = {
|
|
45
|
+
file: "",
|
|
46
|
+
language: "",
|
|
47
|
+
model: DEFAULTS.model,
|
|
48
|
+
diarize: false,
|
|
49
|
+
help: false,
|
|
50
|
+
};
|
|
51
|
+
const positional = [];
|
|
52
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
53
|
+
const arg = args[index];
|
|
54
|
+
if (CLI_FLAGS.has(arg)) {
|
|
55
|
+
options[CLI_FLAGS.get(arg)] = true;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (CLI_VALUES.has(arg)) {
|
|
59
|
+
const key = CLI_VALUES.get(arg);
|
|
60
|
+
const value = args[index + 1];
|
|
61
|
+
if (!value || value.startsWith("--"))
|
|
62
|
+
throw new Error(`Missing value for ${arg}`);
|
|
63
|
+
options[key] = value;
|
|
64
|
+
index += 1;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (arg.startsWith("--")) throw new Error(`Unknown option: ${arg}`);
|
|
68
|
+
positional.push(arg);
|
|
69
|
+
}
|
|
70
|
+
options.file ||= positional[0] ?? "";
|
|
71
|
+
options.language ||= positional[1] ?? "";
|
|
72
|
+
options.model =
|
|
73
|
+
options.model === DEFAULTS.model
|
|
74
|
+
? (positional[2] ?? options.model)
|
|
75
|
+
: options.model;
|
|
76
|
+
const diarize =
|
|
77
|
+
options.diarize === false ? (positional[3] ?? false) : options.diarize;
|
|
78
|
+
if (![true, false, "true", "false"].includes(diarize))
|
|
79
|
+
throw new Error("diarize must be true or false");
|
|
80
|
+
options.diarize = diarize === true || diarize === "true";
|
|
81
|
+
return options;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async function assertReadableFile(file) {
|
|
85
|
+
try {
|
|
86
|
+
const info = await stat(file);
|
|
87
|
+
if (!info.isFile()) throw new Error("not a file");
|
|
88
|
+
} catch {
|
|
89
|
+
throw new Error(`Audio file not found: ${file}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function createAudioBlob(buffer, file) {
|
|
94
|
+
return new Blob([buffer], { type: guessMimeType(file) });
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function guessMimeType(file) {
|
|
98
|
+
const lower = file.toLowerCase();
|
|
99
|
+
if (lower.endsWith(".ogg") || lower.endsWith(".oga")) return "audio/ogg";
|
|
100
|
+
if (lower.endsWith(".mp3")) return "audio/mpeg";
|
|
101
|
+
if (lower.endsWith(".wav")) return "audio/wav";
|
|
102
|
+
if (lower.endsWith(".m4a") || lower.endsWith(".mp4")) return "audio/mp4";
|
|
103
|
+
if (lower.endsWith(".webm")) return "audio/webm";
|
|
104
|
+
if (lower.endsWith(".flac")) return "audio/flac";
|
|
105
|
+
return "application/octet-stream";
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function formatTime(seconds) {
|
|
109
|
+
const safeSeconds = Number.isFinite(Number(seconds)) ? Number(seconds) : 0;
|
|
110
|
+
const hours = Math.floor(safeSeconds / 3600)
|
|
111
|
+
.toString()
|
|
112
|
+
.padStart(2, "0");
|
|
113
|
+
const minutes = Math.floor((safeSeconds % 3600) / 60)
|
|
114
|
+
.toString()
|
|
115
|
+
.padStart(2, "0");
|
|
116
|
+
const wholeSeconds = Math.floor(safeSeconds % 60)
|
|
117
|
+
.toString()
|
|
118
|
+
.padStart(2, "0");
|
|
119
|
+
return `${hours}:${minutes}:${wholeSeconds}`;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function formatDiarizedSegments(segments) {
|
|
123
|
+
return segments
|
|
124
|
+
.map((segment) => {
|
|
125
|
+
const text = (segment.text ?? "").trim();
|
|
126
|
+
if (!text) return "";
|
|
127
|
+
const speaker = segment.speaker ?? "Unknown speaker";
|
|
128
|
+
return `[${formatTime(segment.start)}|${speaker}] ${text}`;
|
|
129
|
+
})
|
|
130
|
+
.filter(Boolean)
|
|
131
|
+
.join("\n");
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
async function transcribe({ file, language, model, diarize }) {
|
|
135
|
+
await assertReadableFile(file);
|
|
136
|
+
if (!API_KEY) throw new Error("GROQ_API_KEY is required");
|
|
137
|
+
const audio = await readFile(file);
|
|
138
|
+
const form = new FormData();
|
|
139
|
+
form.append("file", createAudioBlob(audio, file), basename(file));
|
|
140
|
+
form.append("model", model);
|
|
141
|
+
form.append("response_format", diarize ? "verbose_json" : "text");
|
|
142
|
+
if (language) form.append("language", language);
|
|
143
|
+
if (diarize) {
|
|
144
|
+
form.append("diarize", "true");
|
|
145
|
+
form.append("timestamp_granularities[]", "segment");
|
|
146
|
+
}
|
|
147
|
+
const response = await fetch(DEFAULTS.endpoint, {
|
|
148
|
+
method: "POST",
|
|
149
|
+
headers: { Authorization: `Bearer ${API_KEY}` },
|
|
150
|
+
body: form,
|
|
151
|
+
});
|
|
152
|
+
if (!response.ok) {
|
|
153
|
+
const details = await response.text().catch(() => response.statusText);
|
|
154
|
+
throw new Error(`Groq API error: ${response.status} ${details}`.trim());
|
|
155
|
+
}
|
|
156
|
+
if (!diarize) return response.text();
|
|
157
|
+
const data = await response.json();
|
|
158
|
+
return formatDiarizedSegments(data.segments ?? []) || data.text || "";
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function isDirectCliEntrypoint(metaUrl, entryPath) {
|
|
162
|
+
if (!entryPath) return false;
|
|
163
|
+
try {
|
|
164
|
+
return realpathSync(fileURLToPath(metaUrl)) === realpathSync(entryPath);
|
|
165
|
+
} catch {
|
|
166
|
+
return metaUrl === pathToFileURL(entryPath).href;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
async function main() {
|
|
171
|
+
const options = parseArgs(argv.slice(2));
|
|
172
|
+
if (options.help) {
|
|
173
|
+
stdout.write(`${usage()}\n`);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (!options.file) throw new Error(usage());
|
|
177
|
+
const text = await transcribe(options);
|
|
178
|
+
stdout.write(text.endsWith("\n") ? text : `${text}\n`);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (isDirectCliEntrypoint(import.meta.url, argv[1])) {
|
|
182
|
+
try {
|
|
183
|
+
await main();
|
|
184
|
+
} catch (error) {
|
|
185
|
+
stderr.write(`${error.message}\n`);
|
|
186
|
+
process.exitCode = 2;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export { formatDiarizedSegments, parseArgs };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# AGENTS.md (mistral-stt)
|
|
2
|
+
|
|
3
|
+
[SKILL.md](./SKILL.md) owns the client architecture, invocation, defaults, output format, and speaker-label semantics.
|
|
4
|
+
|
|
5
|
+
### Operating Principles
|
|
6
|
+
|
|
7
|
+
- Preserve the Skill's client architecture; keep the Bash entrypoint a delegation-only wrapper.
|
|
8
|
+
- Keep stdout limited to the requested transcript format; diagnostics belong on stderr because attachment handlers insert stdout into user turns.
|
|
9
|
+
- Never print `MISTRAL_API_KEY` or request headers in diagnostics.
|
|
10
|
+
- Validate arguments and credentials before invoking the Mistral API.
|
|
11
|
+
- Preserve the positional interface documented in the Skill for existing `transcribe_mistral` callers.
|
|
12
|
+
|
|
13
|
+
### Discovered Constraints
|
|
14
|
+
|
|
15
|
+
- Mistral returns JSON for Voxtral transcriptions; parse `text` for plain output and `segments` for diarization under the Skill's speaker-label contract.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mistral-stt
|
|
3
|
+
description: Transcribe audio files using Mistral AI Voxtral.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Mistral STT Skill
|
|
7
|
+
|
|
8
|
+
Standalone direct Node.js client for Mistral's Voxtral transcription API. The canonical client is `scripts/transcribe.mjs`; `scripts/transcribe.sh` is the shell entrypoint wrapper. There are no curl fallbacks or Python parser dependencies.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
MISTRAL_API_KEY=xxx ./scripts/transcribe.sh audio.ogg [language] [model] [diarize]
|
|
14
|
+
MISTRAL_API_KEY=xxx ./scripts/transcribe.sh --file audio.ogg --lang ru --model voxtral-mini-latest --diarize true
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
- Outputs plain transcription text, or timestamped speaker segments when diarization is enabled.
|
|
18
|
+
- Fails fast when the file or `MISTRAL_API_KEY` is missing.
|
|
19
|
+
|
|
20
|
+
## CLI Options
|
|
21
|
+
|
|
22
|
+
- `--file`, `-f` — audio file path.
|
|
23
|
+
- `--lang`, `--language`, `-l` — optional language code; omitted means provider auto-detection.
|
|
24
|
+
- `--model`, `-m` — Mistral transcription model; default: `voxtral-mini-latest`.
|
|
25
|
+
- `--diarize`, `-d` — `true` to label speaker segments; default: `false`.
|
|
26
|
+
- `--help`, `-h` — usage.
|
|
27
|
+
|
|
28
|
+
## Dependencies
|
|
29
|
+
|
|
30
|
+
- Node.js 18+ with built-in `fetch`, `FormData`, and `Blob`.
|
|
31
|
+
- Internet access.
|
|
32
|
+
|
|
33
|
+
## Notes
|
|
34
|
+
|
|
35
|
+
- Diarization preserves Mistral's `speaker_id` values without guessing or merging speakers.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "Transcribe an audio file through the Mistral STT skill.",
|
|
3
|
+
"args": [
|
|
4
|
+
"file:path",
|
|
5
|
+
"lang:string=ru",
|
|
6
|
+
"model:string=voxtral-mini-latest",
|
|
7
|
+
"diarize:bool=false"
|
|
8
|
+
],
|
|
9
|
+
"template": "{skill_dir}/scripts/transcribe.sh {file} {lang} {model} {diarize}"
|
|
10
|
+
}
|