@akanjs/cli 3.0.0-alpha.39 → 3.0.0-alpha.40

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/.build-stamp CHANGED
@@ -1 +1 @@
1
- 30b6841e9753c3daa11bfb9f58d5e50f030a8a51a63c2c1070e02a7f041cbf68
1
+ 873ee7e4176e7c5645844f46050d48c225f02463271a6932419b73784565ed10
@@ -702,6 +702,21 @@ apps and libs never import it directly (`no-import-external-library`) — everyt
702
702
  reaches the chat as an attachment rather than the literal `[image]` it used to become. Persisting keeps each
703
703
  attachment's name and drops its content: web storage is a few megabytes, one screenshot fills a chunk of it, and
704
704
  a save that fails is silent — so keeping the bytes would quietly stop keeping the transcript.
705
+ - **Speech is one engine contract and the framework's own policy.** `<Agent.Chat voice={engine} />` takes a
706
+ `VoiceEngine` — `listen(handlers)` and `speak(sentence)`, both cancellable — and the chat decides everything
707
+ else: a press-to-talk microphone whose transcript lands in the composer to be corrected, one utterance per
708
+ press, sentence-at-a-time reading, barge-in on the next press or on Stop, and markdown stripped so `**bold**`
709
+ is not pronounced. **A reply is read aloud only when the ask arrived by voice**, so a typed question never turns
710
+ on the speakers — and it needs no wire field, because how a message was sent is the composer's own business.
711
+ The contract is a subscription rather than `listen(): Promise<string>` on purpose: a promise fits push-to-talk
712
+ and nothing else, so hands-free could then only arrive as a breaking change. `useSpeech` in
713
+ `libs/util/webkit` is the engine — the browser's own recognition and synthesis on the web, the Capacitor
714
+ plugins in a WebView, **which has neither on Android or iOS**, so `speech.plugin.ts` declares the permission and
715
+ the packages the native build needs. An engine answering `available()` false renders no microphone at all,
716
+ the same rule as publishing no tool for a control the screen does not draw.
717
+ - **`attach` and `voice` both carry functions, so a server layout cannot pass either.** A closure does not cross
718
+ the RSC boundary — `non-scalar-props-restricted` says so on `page/**` — so an app that wants either mounts the
719
+ chat from a small client component in `ui/` that calls the hook. `apps/akan/ui/DocsAgentChat.tsx` is the shape.
705
720
  - **A dialog's close is the dialog's own dismissal, not a state flip.** `closeDialogIn<Ns>` (and `Dialog.Close`)
706
721
  run through whatever `Dialog.Modal` registered, so the agent takes the exact path the X button takes —
707
722
  `confirmClose` still prompts and `onCancel` still fires. A close that only set `open` to false would skip both,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akanjs/cli",
3
- "version": "3.0.0-alpha.39",
3
+ "version": "3.0.0-alpha.40",
4
4
  "sourceType": "module",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -34,7 +34,7 @@
34
34
  "@langchain/openai": "^1.4.6",
35
35
  "@tailwindcss/node": "^4.3.0",
36
36
  "@trapezedev/project": "^7.1.4",
37
- "akanjs": "3.0.0-alpha.39",
37
+ "akanjs": "3.0.0-alpha.40",
38
38
  "chalk": "^5.6.2",
39
39
  "commander": "^14.0.3",
40
40
  "dayjs": "^1.11.20",