@opencode/client 2.0.27 → 2.0.29

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.
@@ -5,12 +5,12 @@ import {
5
5
  ClientError3
6
6
  } from "./contract-7f0py9js.js";
7
7
  import {
8
- make5
9
- } from "./contract-9swsjjg0.js";
8
+ make6
9
+ } from "./contract-x13xxskh.js";
10
10
  import {
11
- make6,
11
+ make5,
12
12
  aborted2
13
- } from "./contract-w1w809zr.js";
13
+ } from "./contract-mnyft54j.js";
14
14
  import {
15
15
  __export
16
16
  } from "./contract-9rqn6x4v.js";
@@ -30,7 +30,7 @@ var CurrentHeaders = Context.Reference("@opencode/client/effect/rpc/headers", {
30
30
  });
31
31
  var make4 = Effect.fn("OpenCode.make")(function* (options) {
32
32
  const httpClient = yield* HttpClient.HttpClient;
33
- const raw = yield* make5(options).pipe(Effect.provideService(HttpClient.HttpClient, HttpClient.mapRequestEffect(httpClient, (request) => Effect.map(CurrentHeaders, (headers) => headers ? HttpClientRequest.setHeaders(request, new Headers(headers)) : request))));
33
+ const raw = yield* make6(options).pipe(Effect.provideService(HttpClient.HttpClient, HttpClient.mapRequestEffect(httpClient, (request) => Effect.map(CurrentHeaders, (headers) => headers ? HttpClientRequest.setHeaders(request, new Headers(headers)) : request))));
34
34
  const context = yield* Effect.context();
35
35
  const native = raw.event.subscribe();
36
36
 
@@ -45,7 +45,7 @@ var make4 = Effect.fn("OpenCode.make")(function* (options) {
45
45
  return {
46
46
  ...raw,
47
47
  event: { ...raw.event, subscribe },
48
- rpc: Object.assign(make6((input, options) => raw.rpc.call(input).pipe(Effect.provideService(CurrentHeaders, options?.headers)), subscribe), raw.rpc)
48
+ rpc: Object.assign(make5((input, options) => raw.rpc.call(input).pipe(Effect.provideService(CurrentHeaders, options?.headers)), subscribe), raw.rpc)
49
49
  };
50
50
  });
51
51
 
@@ -0,0 +1,11 @@
1
+ // src/solid/usage.ts
2
+ function lastAssistantWithUsage2(messages, boundary) {
3
+ const boundaryIndex = boundary ? messages.findIndex((message) => message.id === boundary) : -1;
4
+ if (boundary && boundaryIndex === -1)
5
+ return;
6
+ const end = boundaryIndex === -1 ? messages.length : boundaryIndex;
7
+ const compactionIndex = messages.findLastIndex((message, index) => message.type === "compaction" && message.status === "completed" && index < end);
8
+ return messages.findLast((message, index) => message.type === "assistant" && message.tokens !== undefined && index > compactionIndex && index < end);
9
+ }
10
+
11
+ export { lastAssistantWithUsage2 };
@@ -19,6 +19,32 @@ function locationKey2(location) {
19
19
  function locationQuery(ref) {
20
20
  return { directory: ref.directory };
21
21
  }
22
+ function optimisticFiles(files) {
23
+ const items = files?.flatMap((file) => {
24
+ if (!file.uri.startsWith("data:"))
25
+ return [];
26
+ const comma = file.uri.indexOf(",");
27
+ if (comma < 0)
28
+ return [];
29
+ const header = file.uri.slice(5, comma);
30
+ const parts = header.split(";");
31
+ if (!parts.slice(1).some((part) => part.toLowerCase() === "base64"))
32
+ return [];
33
+ const item = {
34
+ data: file.uri.slice(comma + 1),
35
+ mime: parts[0] || "application/octet-stream",
36
+ source: { type: "inline" }
37
+ };
38
+ if (file.name !== undefined)
39
+ item.name = file.name;
40
+ if (file.description !== undefined)
41
+ item.description = file.description;
42
+ if (file.mention !== undefined)
43
+ item.mention = { ...file.mention };
44
+ return [item];
45
+ });
46
+ return items?.length ? items : undefined;
47
+ }
22
48
  function formRequestOptions(sessionID, ref) {
23
49
  if (sessionID !== "global" || !ref)
24
50
  return;
@@ -89,6 +115,7 @@ function createSync() {
89
115
  }
90
116
  };
91
117
  }
118
+ var CHILD_PAGE = 200;
92
119
  function createData2(config) {
93
120
  const api = config.api;
94
121
  let disposed = false;
@@ -324,6 +351,12 @@ function createData2(config) {
324
351
  messageIndex.set(sessionID, created);
325
352
  return created;
326
353
  }
354
+ async function listChildren(input) {
355
+ const page = await api().session.list(input);
356
+ if (page.data.length < CHILD_PAGE || !page.cursor.next)
357
+ return page.data;
358
+ return [...page.data, ...await listChildren({ cursor: page.cursor.next, limit: CHILD_PAGE })];
359
+ }
327
360
  function resolveRoot(sessionID) {
328
361
  let current = sessionID;
329
362
  let parentID = store.session.info[sessionID]?.parentID;
@@ -467,7 +500,8 @@ function createData2(config) {
467
500
  });
468
501
  return;
469
502
  }
470
- case "session.model.selected":
503
+ case "session.model.selected": {
504
+ const previous = event.data.previous ?? store.session.info[event.data.sessionID]?.model;
471
505
  if (store.session.info[event.data.sessionID])
472
506
  setStore("session", "info", event.data.sessionID, "model", event.data.model);
473
507
  if (!store.session.message[event.data.sessionID])
@@ -476,6 +510,7 @@ function createData2(config) {
476
510
  id: messageIDFromEvent(event.id),
477
511
  type: "model-switched",
478
512
  model: event.data.model,
513
+ previous,
479
514
  time: { created: event.created }
480
515
  });
481
516
  refresh(() => api().session.message.get({ sessionID: event.data.sessionID, messageID: messageIDFromEvent(event.id) }).then((item) => {
@@ -487,6 +522,7 @@ function createData2(config) {
487
522
  });
488
523
  }));
489
524
  return;
525
+ }
490
526
  case "session.renamed": {
491
527
  refresh(() => {
492
528
  const family = sync.pending(`session.family:${event.data.sessionID}`) ? result.session.sync(event.data.sessionID, { children: true }) : Promise.resolve();
@@ -1310,6 +1346,14 @@ function createData2(config) {
1310
1346
  const id = request.id ?? SessionMessage.ID.create();
1311
1347
  const fresh = !messageIndex.get(request.sessionID)?.has(id) && !store.session.pending[request.sessionID]?.some((item) => item.id === id);
1312
1348
  if (fresh) {
1349
+ const files = optimisticFiles(request.files);
1350
+ const payload = {
1351
+ text: request.text,
1352
+ agents: request.agents?.map((agent) => ({ ...agent })),
1353
+ metadata: request.metadata
1354
+ };
1355
+ if (files)
1356
+ payload.files = files;
1313
1357
  outbox.add(id);
1314
1358
  admitLocal({
1315
1359
  id,
@@ -1317,11 +1361,7 @@ function createData2(config) {
1317
1361
  time: { created: Date.now() },
1318
1362
  type: "user",
1319
1363
  delivery: request.delivery ?? "steer",
1320
- payload: {
1321
- text: request.text,
1322
- agents: request.agents?.map((agent) => ({ ...agent })),
1323
- metadata: request.metadata
1324
- }
1364
+ payload
1325
1365
  });
1326
1366
  }
1327
1367
  return sendAdmission(request.sessionID, async () => {
@@ -1337,7 +1377,7 @@ function createData2(config) {
1337
1377
  return sync.run(options?.children ? `session.family:${sessionID}` : `session:${sessionID}`, async () => {
1338
1378
  const [info, children] = await Promise.all([
1339
1379
  api().session.get({ sessionID }),
1340
- options?.children ? api().session.list({ parentID: sessionID, order: "desc" }).then((response) => response.data) : []
1380
+ options?.children ? listChildren({ parentID: sessionID, order: "desc", limit: CHILD_PAGE }) : []
1341
1381
  ]);
1342
1382
  const sessions = [info, ...children];
1343
1383
  batch(() => {
@@ -13,10 +13,10 @@ var exports_rpc = {};
13
13
  __export(exports_rpc, {
14
14
  RpcClientRuntime: () => exports_rpc,
15
15
  aborted: () => aborted2,
16
- make: () => make6
16
+ make: () => make5
17
17
  });
18
18
  import { Effect, Stream } from "effect";
19
- function make6(call, subscribe) {
19
+ function make5(call, subscribe) {
20
20
  return (definition) => {
21
21
  const methods = Object.fromEntries(Object.entries(definition.methods).map(([name, method]) => [
22
22
  name,
@@ -59,4 +59,4 @@ function aborted2(signal) {
59
59
  });
60
60
  }
61
61
 
62
- export { make6, aborted2, exports_rpc };
62
+ export { make5, aborted2, exports_rpc };
@@ -11,7 +11,7 @@ import {
11
11
  // src/effect/generated/client.ts
12
12
  var exports_client4 = {};
13
13
  __export(exports_client4, {
14
- make: () => make5
14
+ make: () => make6
15
15
  });
16
16
  import { Effect, Stream, Schema } from "effect";
17
17
  import { Sse } from "effect/encoding";
@@ -618,6 +618,6 @@ var adaptClient = (raw) => ({
618
618
  websearch: adaptGroupWebsearch(raw["server.websearch"]),
619
619
  config: adaptGroupConfig(raw["server.config"])
620
620
  });
621
- var make5 = (options) => HttpApiClient.make(ClientApi2, options).pipe(Effect.map(adaptClient));
621
+ var make6 = (options) => HttpApiClient.make(ClientApi2, options).pipe(Effect.map(adaptClient));
622
622
 
623
- export { make5, exports_client4 };
623
+ export { make6, exports_client4 };
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  make4,
3
3
  exports_client3
4
- } from "../chunks/contract-ww92gbf0.js";
4
+ } from "../chunks/contract-1akb9sg5.js";
5
+ import"../chunks/contract-mnyft54j.js";
5
6
  import"../chunks/contract-6mptkzbc.js";
6
- import"../chunks/contract-9swsjjg0.js";
7
+ import"../chunks/contract-x13xxskh.js";
7
8
  import"../chunks/contract-7f0py9js.js";
8
- import"../chunks/contract-w1w809zr.js";
9
- import"../chunks/contract-t1xa31vm.js";
10
9
  import"../chunks/contract-vmytr4q8.js";
10
+ import"../chunks/contract-t1xa31vm.js";
11
11
  import"../chunks/contract-frbwqjmf.js";
12
12
  export {
13
13
  exports_client3 as OpenCode,
@@ -1,8 +1,8 @@
1
1
  import {
2
- make5
3
- } from "../../chunks/contract-9swsjjg0.js";
2
+ make6
3
+ } from "../../chunks/contract-x13xxskh.js";
4
4
  import"../../chunks/contract-7f0py9js.js";
5
5
  import"../../chunks/contract-vmytr4q8.js";
6
6
  export {
7
- make5 as make
7
+ make6 as make
8
8
  };
@@ -1,7 +1,7 @@
1
1
  import"../../chunks/contract-6mptkzbc.js";
2
2
  import {
3
3
  exports_client4
4
- } from "../../chunks/contract-9swsjjg0.js";
4
+ } from "../../chunks/contract-x13xxskh.js";
5
5
  import {
6
6
  ClientError3
7
7
  } from "../../chunks/contract-7f0py9js.js";
@@ -2,14 +2,14 @@ import {
2
2
  ClientError3
3
3
  } from "../chunks/contract-7f0py9js.js";
4
4
  import"../chunks/contract-vmytr4q8.js";
5
- import"../chunks/contract-9swsjjg0.js";
5
+ import"../chunks/contract-x13xxskh.js";
6
6
  import"../chunks/contract-6mptkzbc.js";
7
7
  import"../chunks/contract-frbwqjmf.js";
8
8
  import"../chunks/contract-t1xa31vm.js";
9
- import"../chunks/contract-w1w809zr.js";
9
+ import"../chunks/contract-mnyft54j.js";
10
10
  import {
11
11
  exports_client3
12
- } from "../chunks/contract-ww92gbf0.js";
12
+ } from "../chunks/contract-1akb9sg5.js";
13
13
 
14
14
  // src/effect/index.ts
15
15
  import { Agent } from "@opencode/schema/agent";
@@ -1,11 +1,11 @@
1
1
  import {
2
- make6,
2
+ make5,
3
3
  aborted2,
4
4
  exports_rpc
5
- } from "../chunks/contract-w1w809zr.js";
5
+ } from "../chunks/contract-mnyft54j.js";
6
6
  import"../chunks/contract-t1xa31vm.js";
7
7
  export {
8
8
  exports_rpc as RpcClientRuntime,
9
9
  aborted2 as aborted,
10
- make6 as make
10
+ make5 as make
11
11
  };
@@ -14,14 +14,14 @@ import {
14
14
  environment2,
15
15
  complete2,
16
16
  clear2
17
- } from "../chunks/contract-j4tgja9b.js";
17
+ } from "../chunks/contract-tpb4j56n.js";
18
18
  import {
19
19
  decide2,
20
20
  fallback2,
21
21
  same2,
22
22
  probeResult2,
23
23
  headers2
24
- } from "../chunks/contract-2ny4vxct.js";
24
+ } from "../chunks/contract-8ye1ye6f.js";
25
25
  import"../chunks/contract-qav6mfdz.js";
26
26
 
27
27
  // src/effect/service.ts
@@ -4,6 +4,7 @@ export type { RpcApi, RpcCallOptions, RpcClient, RpcEventPayload } from "./rpc.j
4
4
  export type AgentApi = Client["agent"];
5
5
  export type CommandApi = Client["command"];
6
6
  export type ConfigApi = Client["config"];
7
+ export type CredentialApi = Client["credential"];
7
8
  export type EventApi = Client["event"];
8
9
  export type GenerateApi = Client["generate"];
9
10
  export type IntegrationApi = Client["integration"];
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  make2,
3
3
  exports_client
4
- } from "../chunks/contract-csw6v8a4.js";
4
+ } from "../chunks/contract-7393xcww.js";
5
+ import"../chunks/contract-1y4a697q.js";
5
6
  import"../chunks/contract-vyas3vgt.js";
6
7
  import"../chunks/contract-qfk0hgz0.js";
7
8
  import"../chunks/contract-js54wxgp.js";
8
- import"../chunks/contract-1y4a697q.js";
9
9
  import"../chunks/contract-vt9jbch8.js";
10
10
  import"../chunks/contract-frbwqjmf.js";
11
11
  export {
@@ -29,6 +29,7 @@ export type ProviderCompaction = {
29
29
  type: "native";
30
30
  };
31
31
  export type ProviderTransport = "http" | "websocket";
32
+ export type ProviderEncoding = "zstd" | "gzip" | "none";
32
33
  export type AgentColor = string;
33
34
  export type PermissionEffect = "allow" | "deny" | "ask";
34
35
  export type PluginSource = {
@@ -224,6 +225,7 @@ export type FormExternalField = {
224
225
  export type FormValue = string | number | "Infinity" | "-Infinity" | "NaN" | boolean | Array<string>;
225
226
  export type ModelReasoningField = "reasoning" | "reasoning_content" | "reasoning_text" | (string & {});
226
227
  export type ModelMaxTokensField = "max_completion_tokens" | "max_tokens";
228
+ export type ModelCacheFormat = "anthropic" | "alibaba";
227
229
  export type ModelCapabilities = {
228
230
  tools: boolean;
229
231
  input: Array<string>;
@@ -482,22 +484,19 @@ export type SessionProviderContextProvenance = {
482
484
  protocol: string;
483
485
  endpoint: string;
484
486
  };
485
- export type ModelSettings = {
486
- compaction?: ProviderCompaction;
487
- } & {
488
- [x: string]: any;
489
- };
490
- export type ConfigModelSettings = {
491
- compaction?: ProviderCompaction;
492
- } & {
493
- [x: string]: JsonValue | null;
494
- };
495
487
  export type ProviderSettings = {
496
488
  timeout?: number | false;
497
489
  headerTimeout?: number | false;
498
490
  chunkTimeout?: number | false;
499
491
  compaction?: ProviderCompaction;
500
492
  transport?: ProviderTransport;
493
+ encoding?: ProviderEncoding;
494
+ } & {
495
+ [x: string]: any;
496
+ };
497
+ export type ModelSettings = {
498
+ compaction?: ProviderCompaction;
499
+ encoding?: ProviderEncoding;
501
500
  } & {
502
501
  [x: string]: any;
503
502
  };
@@ -507,6 +506,13 @@ export type ConfigProviderSettings = {
507
506
  chunkTimeout?: number | false;
508
507
  compaction?: ProviderCompaction;
509
508
  transport?: ProviderTransport;
509
+ encoding?: ProviderEncoding;
510
+ } & {
511
+ [x: string]: JsonValue | null;
512
+ };
513
+ export type ConfigModelSettings = {
514
+ compaction?: ProviderCompaction;
515
+ encoding?: ProviderEncoding;
510
516
  } & {
511
517
  [x: string]: JsonValue | null;
512
518
  };
@@ -869,9 +875,19 @@ export type ModelCompatibility = {
869
875
  requireFinishReason?: boolean;
870
876
  requireAssistantAfterTool?: boolean;
871
877
  supportsPromptCacheKey?: boolean;
878
+ cacheFormat?: ModelCacheFormat;
872
879
  supportsThinkingBlockBinding?: boolean;
873
880
  supportsEffortUpdates?: boolean;
874
881
  };
882
+ export type ProviderCompatibility = {
883
+ reasoningField?: ModelReasoningField;
884
+ requireReasoning?: boolean;
885
+ maxTokensField?: ModelMaxTokensField;
886
+ requireFinishReason?: boolean;
887
+ requireAssistantAfterTool?: boolean;
888
+ supportsPromptCacheKey?: boolean;
889
+ cacheFormat?: ModelCacheFormat;
890
+ };
875
891
  export type ModelCost = {
876
892
  tier?: {
877
893
  type: "context";
@@ -1167,16 +1183,6 @@ export type SessionProviderContext = {
1167
1183
  provenance: SessionProviderContextProvenance;
1168
1184
  messages: JsonValue;
1169
1185
  };
1170
- export type ModelVariant = {
1171
- id: string;
1172
- settings?: ModelSettings;
1173
- headers?: {
1174
- [x: string]: string;
1175
- };
1176
- body?: {
1177
- [x: string]: any;
1178
- };
1179
- };
1180
1186
  export type ProviderRequest = {
1181
1187
  settings: ProviderSettings;
1182
1188
  headers: {
@@ -1186,14 +1192,9 @@ export type ProviderRequest = {
1186
1192
  [x: string]: any;
1187
1193
  };
1188
1194
  };
1189
- export type ProviderInfo = {
1190
- id: ProviderID;
1191
- canonical?: ProviderID;
1192
- integrationID?: IntegrationID;
1193
- name: string;
1194
- activation: "auto" | "enabled" | "disabled";
1195
- package: string;
1196
- settings?: ProviderSettings;
1195
+ export type ModelVariant = {
1196
+ id: string;
1197
+ settings?: ModelSettings;
1197
1198
  headers?: {
1198
1199
  [x: string]: string;
1199
1200
  };
@@ -2660,6 +2661,22 @@ export type CredentialKey = {
2660
2661
  };
2661
2662
  configuration?: FormAnswer;
2662
2663
  };
2664
+ export type ProviderInfo = {
2665
+ id: ProviderID;
2666
+ canonical?: ProviderID;
2667
+ integrationID?: IntegrationID;
2668
+ name: string;
2669
+ activation: "auto" | "enabled" | "disabled";
2670
+ package: string;
2671
+ compatibility?: ProviderCompatibility;
2672
+ settings?: ProviderSettings;
2673
+ headers?: {
2674
+ [x: string]: string;
2675
+ };
2676
+ body?: {
2677
+ [x: string]: any;
2678
+ };
2679
+ };
2663
2680
  export type ConnectionInfo = ConnectionCredentialInfo | ConnectionEnvInfo;
2664
2681
  export type PtyCreated = {
2665
2682
  id: EventID;
@@ -2935,6 +2952,11 @@ export type ConfigEntry = {
2935
2952
  };
2936
2953
  username?: string;
2937
2954
  permissions?: PermissionRuleset;
2955
+ policies?: Array<{
2956
+ action: "provider.use" | "tool.use" | "integration.use";
2957
+ resource: string;
2958
+ effect: "allow" | "deny";
2959
+ }>;
2938
2960
  agents?: {
2939
2961
  [x: string]: {
2940
2962
  model?: string | {
@@ -3104,6 +3126,7 @@ export type ConfigEntry = {
3104
3126
  name?: string;
3105
3127
  env?: Array<string>;
3106
3128
  package?: string;
3129
+ compatibility?: ProviderCompatibility;
3107
3130
  settings?: ConfigProviderSettings;
3108
3131
  headers?: {
3109
3132
  [x: string]: string;
@@ -1,13 +1,13 @@
1
1
  import"../chunks/contract-m2eywc8w.js";
2
2
  import {
3
3
  exports_client
4
- } from "../chunks/contract-csw6v8a4.js";
4
+ } from "../chunks/contract-7393xcww.js";
5
+ import"../chunks/contract-1y4a697q.js";
5
6
  import"../chunks/contract-vyas3vgt.js";
6
7
  import"../chunks/contract-qfk0hgz0.js";
7
8
  import {
8
9
  ClientError2
9
10
  } from "../chunks/contract-js54wxgp.js";
10
- import"../chunks/contract-1y4a697q.js";
11
11
  import {
12
12
  isInvalidRequestError2,
13
13
  isUnauthorizedError2,
@@ -14,14 +14,14 @@ import {
14
14
  environment2,
15
15
  complete2,
16
16
  clear2
17
- } from "../chunks/contract-j4tgja9b.js";
17
+ } from "../chunks/contract-tpb4j56n.js";
18
18
  import {
19
19
  decide2,
20
20
  fallback2,
21
21
  same2,
22
22
  probeResult2,
23
23
  headers2
24
- } from "../chunks/contract-2ny4vxct.js";
24
+ } from "../chunks/contract-8ye1ye6f.js";
25
25
  import"../chunks/contract-qav6mfdz.js";
26
26
 
27
27
  // src/promise/service.ts
@@ -4,7 +4,7 @@ import {
4
4
  complete2,
5
5
  clear2,
6
6
  exports_pty_handoff
7
- } from "./chunks/contract-j4tgja9b.js";
7
+ } from "./chunks/contract-tpb4j56n.js";
8
8
  export {
9
9
  exports_pty_handoff as PtyHandoff,
10
10
  clear2 as clear,
@@ -4,9 +4,9 @@ import {
4
4
  same2,
5
5
  probeResult2,
6
6
  headers2
7
- } from "./chunks/contract-2ny4vxct.js";
8
- import"./chunks/contract-sxt88q69.js";
7
+ } from "./chunks/contract-8ye1ye6f.js";
9
8
  import"./chunks/contract-xgnj2w4v.js";
9
+ import"./chunks/contract-sxt88q69.js";
10
10
  export {
11
11
  decide2 as decide,
12
12
  fallback2 as fallback,
@@ -2,13 +2,13 @@ import {
2
2
  settleMs2,
3
3
  locationKey2,
4
4
  createData2
5
- } from "../chunks/contract-9vdz0zwn.js";
5
+ } from "../chunks/contract-m77rqa4a.js";
6
6
  import"../chunks/contract-m2eywc8w.js";
7
- import"../chunks/contract-csw6v8a4.js";
7
+ import"../chunks/contract-7393xcww.js";
8
+ import"../chunks/contract-1y4a697q.js";
8
9
  import"../chunks/contract-vyas3vgt.js";
9
10
  import"../chunks/contract-qfk0hgz0.js";
10
11
  import"../chunks/contract-js54wxgp.js";
11
- import"../chunks/contract-1y4a697q.js";
12
12
  import"../chunks/contract-vt9jbch8.js";
13
13
  import"../chunks/contract-frbwqjmf.js";
14
14
  export {
@@ -1,3 +1,4 @@
1
1
  export * from "./data";
2
2
  export * from "./connection";
3
3
  export * from "./pty";
4
+ export * from "./usage";
@@ -4,13 +4,13 @@ import"../chunks/contract-vt9jbch8.js";
4
4
  import"../chunks/contract-vyas3vgt.js";
5
5
  import"../chunks/contract-frbwqjmf.js";
6
6
  import"../chunks/contract-1y4a697q.js";
7
- import"../chunks/contract-csw6v8a4.js";
7
+ import"../chunks/contract-7393xcww.js";
8
8
  import"../chunks/contract-m2eywc8w.js";
9
9
  import {
10
10
  settleMs2,
11
11
  locationKey2,
12
12
  createData2
13
- } from "../chunks/contract-9vdz0zwn.js";
13
+ } from "../chunks/contract-m77rqa4a.js";
14
14
  import {
15
15
  defaultIdleTimeout2,
16
16
  foregroundIdleThreshold2,
@@ -20,6 +20,9 @@ import {
20
20
  createPtyClient2,
21
21
  createPersistentPtyClient2
22
22
  } from "../chunks/contract-gne7h7mq.js";
23
+ import {
24
+ lastAssistantWithUsage2
25
+ } from "../chunks/contract-8s2anffy.js";
23
26
  export {
24
27
  createClientConnection2 as createClientConnection,
25
28
  createData2 as createData,
@@ -27,6 +30,7 @@ export {
27
30
  createPtyClient2 as createPtyClient,
28
31
  defaultIdleTimeout2 as defaultIdleTimeout,
29
32
  foregroundIdleThreshold2 as foregroundIdleThreshold,
33
+ lastAssistantWithUsage2 as lastAssistantWithUsage,
30
34
  locationKey2 as locationKey,
31
35
  settleMs2 as settleMs
32
36
  };
@@ -0,0 +1,9 @@
1
+ import type { SessionMessageAssistant, SessionMessageInfo } from "../promise";
2
+ /**
3
+ * The assistant step whose tokens fill the context window now: the latest one after the last completed
4
+ * compaction and before the revert boundary. Every client shows context usage from this step, so the TUI
5
+ * and the desktop app agree on it.
6
+ */
7
+ export declare function lastAssistantWithUsage(messages: ReadonlyArray<SessionMessageInfo>, boundary?: string): (SessionMessageAssistant & {
8
+ tokens: NonNullable<SessionMessageAssistant["tokens"]>;
9
+ }) | undefined;
@@ -0,0 +1,6 @@
1
+ import {
2
+ lastAssistantWithUsage2
3
+ } from "../chunks/contract-8s2anffy.js";
4
+ export {
5
+ lastAssistantWithUsage2 as lastAssistantWithUsage
6
+ };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@opencode/client",
4
- "version": "2.0.27",
4
+ "version": "2.0.29",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -57,8 +57,8 @@
57
57
  "typecheck": "tsgo --noEmit"
58
58
  },
59
59
  "dependencies": {
60
- "@opencode/schema": "2.0.27",
61
- "@opencode/protocol": "2.0.27"
60
+ "@opencode/schema": "2.0.29",
61
+ "@opencode/protocol": "2.0.29"
62
62
  },
63
63
  "peerDependencies": {
64
64
  "effect": "4.0.1",
@@ -74,7 +74,7 @@
74
74
  },
75
75
  "devDependencies": {
76
76
  "@effect/platform-node": "4.0.1",
77
- "@opencode/httpapi-codegen": "2.0.27",
77
+ "@opencode/httpapi-codegen": "2.0.29",
78
78
  "@tsconfig/bun": "1.0.9",
79
79
  "@types/bun": "1.4.0",
80
80
  "@typescript/native-preview": "7.0.0-dev.20251207.1",