@akanjs/cli 3.0.0-beta.5 → 3.0.0-beta.6

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
- f9a390615e90ca7105c69229c1dc5ec435a0ef90eb86456f57e6f47146898c45
1
+ fdc8c6e78c40accb0f6e5b895d646ae64cea4b64c0f22eb726690c373e78c22a
@@ -48,7 +48,9 @@ apps and libs never import it directly (`no-import-external-library`) — everyt
48
48
  slots: `AgentLauncher`, `AgentBubble`, `AgentComposer`, `AgentApproval`,
49
49
  `AgentQuestion`, `AgentQueued`, `AgentMenu`, `AgentMarkdown` and `AgentCode` each replace one part in `_overrides.tsx`, and
50
50
  `akanjs/ui` exports every default beside them (`DefaultBubble`, `DefaultComposer`, …) so a skin composes the
51
- one it is replacing. `AgentCode` is where a highlighter binds — the fence's language reaches it — and a
51
+ one it is replacing. The attachment row is exported on its own as `AgentAttachments`, because a replaced
52
+ `AgentBubble` that redraws it by hand forks the rule for which carrier is shown how — and then keeps whatever
53
+ that rule was on the day it was copied. `AgentCode` is where a highlighter binds — the fence's language reaches it — and a
52
54
  replacement for `AgentBubble` carries its own `memo`, since the transcript re-renders on every delta. Only then
53
55
  `AgentChat`, which replaces the panel whole: it also replaces the slash commands, the compaction notice and the
54
56
  approval gate, so reach for it when the *layout* differs, not when the look does.
@@ -110,8 +112,9 @@ apps and libs never import it directly (`no-import-external-library`) — everyt
110
112
  arrives as an image. `accepts.document` is one boolean over every non-image type, so an adaptor whose API has a
111
113
  block for only some of them — Anthropic's `document` is PDF and nothing else — names the rest in the text rather
112
114
  than dropping them, which is the wire's own rule applied at the one layer that knows which blocks exist. Persisting keeps each
113
- attachment's name and drops its content: web storage is a few megabytes, one screenshot fills a chunk of it, and
114
- a save that fails is silent — so keeping the bytes would quietly stop keeping the transcript.
115
+ attachment's name, type, address and `ref` and drops only its content: web storage is a few megabytes, one
116
+ screenshot fills a chunk of it, and a save that fails is silent — so keeping the bytes would quietly stop keeping
117
+ the transcript, while an id is the handle a restored conversation has left to find the file with.
115
118
  **The ceilings are the message's, not the file's**: 4 MB per file, 8 MB and five files per message, and the same
116
119
  file twice is refused by name. The bytes ride inside one turn's JSON, so what a provider refuses is the sum —
117
120
  and a request that cannot be sent is one the user has to empty the composer to escape, which is why the refusal
@@ -127,11 +130,13 @@ apps and libs never import it directly (`no-import-external-library`) — everyt
127
130
  Nothing downstream trusts the result: an attachment whose `mimeType` is not a string is noted like any other
128
131
  unreadable one, and its chip renders its name with no preview, because the host wrote the object and the declared
129
132
  type is a claim rather than a check. A field that arrives wrong costs that attachment, never the turn.
130
- - **A `url` carrier is an address the *provider* fetches, so a reader that uploads has to know its storage is
131
- reachable.** This is the one way an attachment fails with nobody reporting it: the default storage backend
132
- serves a path only the app can resolve, the adaptor hands it over as written, and the model answers about a
133
- picture it never saw. Answer `data` when the provider cannot reach the URL — the choice is the reader's,
134
- because the reader is what chose to upload.
133
+ - **A `url` carrier is an address the *provider* fetches, and bytes beside it win.** A reader that uploads answers
134
+ `{ url }` when its storage is publicly reachable, and `{ data }` — or both — when it is not: an attachment
135
+ carrying both is read from its bytes and displayed from its address, so the chip draws a thumbnail and the model
136
+ still gets the picture. That precedence exists because the other order fails the one way nothing reports: the
137
+ default storage backend serves a path only the app can resolve, the adaptor would hand it over as written, and
138
+ the model answers about a picture it never saw. Send a provider-reachable URL **alone** — paired with bytes it
139
+ costs the provider hop whatever the bytes weigh, for a fetch the provider would have done itself.
135
140
  - **An image type the provider has no block for is refused at the adaptor, not upstream.** `accepts.image` is one
136
141
  boolean, so `AgentService.readable` passes every `image/*` through, and the built-in composer reader base64s
137
142
  every `image/*` as well — an `AttachReader` answering `null` means "not mine" and falls through to it, so an app
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akanjs/cli",
3
- "version": "3.0.0-beta.5",
3
+ "version": "3.0.0-beta.6",
4
4
  "sourceType": "module",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -33,7 +33,7 @@
33
33
  "@langchain/openai": "^1.4.6",
34
34
  "@tailwindcss/node": "^4.3.0",
35
35
  "@trapezedev/project": "^7.1.4",
36
- "akanjs": "3.0.0-beta.5",
36
+ "akanjs": "3.0.0-beta.6",
37
37
  "chalk": "^5.6.2",
38
38
  "commander": "^14.0.3",
39
39
  "dayjs": "^1.11.20",