@dudousxd/nestjs-agent-opencode 0.2.0 → 0.2.1

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/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { d as OpenCodeClient, e as OpenCodeEvent, f as OpenCodeForm, g as OpenCodeFormValue, h as OpenCodeFormField, i as OpenCodeMcpEndpoint, O as OpenCodeTurns, a as OpenCodeEngineSettings } from './engine-JnBbcRxh.cjs';
2
- export { I as InMemoryOpenCodeSessionStore, M as Milestone, j as OpenCodeAmendment, k as OpenCodeCallContext, c as OpenCodeEngineOptions, b as OpenCodeHost, l as OpenCodeKeyValue, m as OpenCodeModelRef, n as OpenCodePermissionRequest, o as OpenCodePermissionRule, p as OpenCodeReplyMismatchError, q as OpenCodeRunResult, r as OpenCodeServer, s as OpenCodeSessionCreate, t as OpenCodeSessionRef, u as OpenCodeSessionStore, v as OpenCodeToolCall, w as OpenCodeToolRefusedError, x as OpenCodeToolsClaims, y as OpenCodeToolsOptions, z as OpenCodeToolsTokens, A as OpenCodeTurn, B as OpenCodeTurnContext, C as OpenCodeUsage, P as PendingAsk, S as SessionHandle, D as StepCost, E as StepModel, T as TurnOutcome, F as addUsage, G as emptyUsage, H as keyValueOpenCodeSessionStore, J as openCode, K as openCodeControllers, L as openCodeProviders, N as usageOf } from './engine-JnBbcRxh.cjs';
1
+ import { d as OpenCodeClient, e as OpenCodeEvent, f as OpenCodeForm, g as OpenCodeFormValue, h as OpenCodeFormField, i as OpenCodeMcpEndpoint, O as OpenCodeTurns, a as OpenCodeEngineSettings } from './engine-0YkBLWZR.cjs';
2
+ export { I as InMemoryOpenCodeSessionStore, M as Milestone, j as OpenCodeAmendment, k as OpenCodeCallContext, c as OpenCodeEngineOptions, b as OpenCodeHost, l as OpenCodeKeyValue, m as OpenCodeModelRef, n as OpenCodePermissionRequest, o as OpenCodePermissionRule, p as OpenCodeReplyMismatchError, q as OpenCodeRunResult, r as OpenCodeServer, s as OpenCodeSessionCreate, t as OpenCodeSessionRef, u as OpenCodeSessionStore, v as OpenCodeToolCall, w as OpenCodeToolRefusedError, x as OpenCodeToolsClaims, y as OpenCodeToolsOptions, z as OpenCodeToolsTokens, A as OpenCodeTurn, B as OpenCodeTurnContext, C as OpenCodeUsage, P as PendingAsk, S as SessionHandle, D as StepCost, E as StepModel, T as TurnOutcome, F as addUsage, G as emptyUsage, H as keyValueOpenCodeSessionStore, J as openCode, K as openCodeControllers, L as openCodeProviders, N as usageOf } from './engine-0YkBLWZR.cjs';
3
3
  import { ElicitationRequest, ElicitationQuestion, AgentRunner, AgentRunInput, AgentRunStartOptions, HumanReply } from '@dudousxd/nestjs-agent-core';
4
4
  import { IncomingMessage, ServerResponse } from 'node:http';
5
5
  import '@dudousxd/nestjs-agent';
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { d as OpenCodeClient, e as OpenCodeEvent, f as OpenCodeForm, g as OpenCodeFormValue, h as OpenCodeFormField, i as OpenCodeMcpEndpoint, O as OpenCodeTurns, a as OpenCodeEngineSettings } from './engine-JnBbcRxh.js';
2
- export { I as InMemoryOpenCodeSessionStore, M as Milestone, j as OpenCodeAmendment, k as OpenCodeCallContext, c as OpenCodeEngineOptions, b as OpenCodeHost, l as OpenCodeKeyValue, m as OpenCodeModelRef, n as OpenCodePermissionRequest, o as OpenCodePermissionRule, p as OpenCodeReplyMismatchError, q as OpenCodeRunResult, r as OpenCodeServer, s as OpenCodeSessionCreate, t as OpenCodeSessionRef, u as OpenCodeSessionStore, v as OpenCodeToolCall, w as OpenCodeToolRefusedError, x as OpenCodeToolsClaims, y as OpenCodeToolsOptions, z as OpenCodeToolsTokens, A as OpenCodeTurn, B as OpenCodeTurnContext, C as OpenCodeUsage, P as PendingAsk, S as SessionHandle, D as StepCost, E as StepModel, T as TurnOutcome, F as addUsage, G as emptyUsage, H as keyValueOpenCodeSessionStore, J as openCode, K as openCodeControllers, L as openCodeProviders, N as usageOf } from './engine-JnBbcRxh.js';
1
+ import { d as OpenCodeClient, e as OpenCodeEvent, f as OpenCodeForm, g as OpenCodeFormValue, h as OpenCodeFormField, i as OpenCodeMcpEndpoint, O as OpenCodeTurns, a as OpenCodeEngineSettings } from './engine-0YkBLWZR.js';
2
+ export { I as InMemoryOpenCodeSessionStore, M as Milestone, j as OpenCodeAmendment, k as OpenCodeCallContext, c as OpenCodeEngineOptions, b as OpenCodeHost, l as OpenCodeKeyValue, m as OpenCodeModelRef, n as OpenCodePermissionRequest, o as OpenCodePermissionRule, p as OpenCodeReplyMismatchError, q as OpenCodeRunResult, r as OpenCodeServer, s as OpenCodeSessionCreate, t as OpenCodeSessionRef, u as OpenCodeSessionStore, v as OpenCodeToolCall, w as OpenCodeToolRefusedError, x as OpenCodeToolsClaims, y as OpenCodeToolsOptions, z as OpenCodeToolsTokens, A as OpenCodeTurn, B as OpenCodeTurnContext, C as OpenCodeUsage, P as PendingAsk, S as SessionHandle, D as StepCost, E as StepModel, T as TurnOutcome, F as addUsage, G as emptyUsage, H as keyValueOpenCodeSessionStore, J as openCode, K as openCodeControllers, L as openCodeProviders, N as usageOf } from './engine-0YkBLWZR.js';
3
3
  import { ElicitationRequest, ElicitationQuestion, AgentRunner, AgentRunInput, AgentRunStartOptions, HumanReply } from '@dudousxd/nestjs-agent-core';
4
4
  import { IncomingMessage, ServerResponse } from 'node:http';
5
5
  import '@dudousxd/nestjs-agent';
package/dist/index.js CHANGED
@@ -344,6 +344,17 @@ var OpenCodeTurn = class {
344
344
  reported = emptyUsage();
345
345
  priced = false;
346
346
  model;
347
+ /** What the session had spent when this turn prompted it; what OpenCode reported since. */
348
+ baseline;
349
+ seen = {
350
+ cost: 0,
351
+ input: 0,
352
+ output: 0,
353
+ reasoning: 0,
354
+ read: 0,
355
+ write: 0
356
+ };
357
+ compacted = false;
347
358
  stepOpen = false;
348
359
  sawText = false;
349
360
  separator = false;
@@ -355,6 +366,19 @@ var OpenCodeTurn = class {
355
366
  this.a = a;
356
367
  this.model = modelOfLabel(a.input.model);
357
368
  }
369
+ /**
370
+ * What the session had spent before this turn prompted it (`session.get`). When the execution
371
+ * ends, what the session spent since that this turn's events did not report — the title OpenCode
372
+ * generates, a compaction: OpenCode records those calls on the session without streaming them — is
373
+ * recorded as a usage row of its own.
374
+ */
375
+ setBaseline(info) {
376
+ if (info?.tokens === void 0) return;
377
+ this.baseline = {
378
+ cost: Number(info.cost) || 0,
379
+ tokens: info.tokens
380
+ };
381
+ }
358
382
  /** What the run spent so far: carried from before this turn object, plus what it saw. */
359
383
  totalUsage() {
360
384
  return addUsage(this.a.carried, this.spent);
@@ -611,6 +635,10 @@ var OpenCodeTurn = class {
611
635
  }
612
636
  if (this.ended) return;
613
637
  switch (e.type) {
638
+ case "session.compaction.started":
639
+ case "session.compaction.ended":
640
+ this.compacted = true;
641
+ return;
614
642
  case "session.step.started":
615
643
  case "session.model.selected": {
616
644
  const model = d.model;
@@ -780,6 +808,13 @@ ${delta}` : delta;
780
808
  async spend(d, purpose) {
781
809
  const usage = usageOf(d.tokens);
782
810
  const reportedCostUsd = typeof d.cost === "number" && Number.isFinite(d.cost) && d.cost >= 0 ? d.cost : void 0;
811
+ const n = /* @__PURE__ */ __name((v) => typeof v === "number" && Number.isFinite(v) && v > 0 ? v : 0, "n");
812
+ this.seen.cost += reportedCostUsd ?? 0;
813
+ this.seen.input += n(d.tokens?.input);
814
+ this.seen.output += n(d.tokens?.output);
815
+ this.seen.reasoning += n(d.tokens?.reasoning);
816
+ this.seen.read += n(d.tokens?.cache?.read);
817
+ this.seen.write += n(d.tokens?.cache?.write);
783
818
  const fallback = reportedCostUsd !== void 0 ? {
784
819
  costUsd: reportedCostUsd,
785
820
  costSource: "provider"
@@ -1247,9 +1282,39 @@ ${delta}` : delta;
1247
1282
  this.messageResults.set(messageId, results);
1248
1283
  await this.a.store.setMessageToolResults(messageId, results);
1249
1284
  }
1285
+ /** What the session spent since the baseline that no event of this turn reported. */
1286
+ async unreported() {
1287
+ const baseline = this.baseline;
1288
+ if (baseline === void 0) return;
1289
+ this.baseline = void 0;
1290
+ const info = await this.a.client.session.get?.({
1291
+ sessionID: this.a.sessionId
1292
+ }).catch(() => void 0);
1293
+ const after = info?.tokens;
1294
+ if (after === void 0) return;
1295
+ const before = baseline.tokens;
1296
+ const left = /* @__PURE__ */ __name((now, then, seen) => Math.max(0, (Number(now) || 0) - (Number(then) || 0) - seen), "left");
1297
+ const tokens = {
1298
+ input: left(after.input, before.input, this.seen.input),
1299
+ output: left(after.output, before.output, this.seen.output),
1300
+ reasoning: left(after.reasoning, before.reasoning, this.seen.reasoning),
1301
+ cache: {
1302
+ read: left(after.cache?.read, before.cache?.read, this.seen.read),
1303
+ write: left(after.cache?.write, before.cache?.write, this.seen.write)
1304
+ }
1305
+ };
1306
+ const total = tokens.input + tokens.output + tokens.reasoning + tokens.cache.read + tokens.cache.write;
1307
+ if (total === 0) return;
1308
+ const cost = left(info?.cost, baseline.cost, this.seen.cost);
1309
+ await this.spend({
1310
+ tokens,
1311
+ cost: cost < 1e-9 ? 0 : cost
1312
+ }, this.compacted ? "history_summary" : "title");
1313
+ }
1250
1314
  async end(outcome) {
1251
1315
  if (this.ended) return;
1252
1316
  this.ended = true;
1317
+ await this.unreported().catch((error) => this.a.logger.warn(`run ${this.a.runId}: ${errorText(error, "could not read the session usage")}`));
1253
1318
  if (outcome.status !== "failed" || this.segment.text || this.segment.calls.length > 0 || this.segment.ui.length > 0) {
1254
1319
  await this.flush(true);
1255
1320
  }
@@ -2366,6 +2431,7 @@ ${body}
2366
2431
  })
2367
2432
  } : {}
2368
2433
  };
2434
+ live.turn.setBaseline(await this.sessionUsage(live.client, handle.sessionId));
2369
2435
  await live.client.session.prompt({
2370
2436
  sessionID: handle.sessionId,
2371
2437
  text: prompt.text,
@@ -2445,12 +2511,23 @@ ${body}
2445
2511
  await live.turn.decide(ask, reply, {
2446
2512
  tellOpenCode: false
2447
2513
  });
2514
+ live.turn.setBaseline(await this.sessionUsage(live.client, handle.sessionId));
2448
2515
  await live.client.session.prompt({
2449
2516
  sessionID: handle.sessionId,
2450
2517
  text: note
2451
2518
  });
2452
2519
  return handle;
2453
2520
  }
2521
+ /** What a session spent so far (`session.get`), or nothing when OpenCode does not say. */
2522
+ async sessionUsage(client, sessionId) {
2523
+ try {
2524
+ return await client.session.get?.({
2525
+ sessionID: sessionId
2526
+ });
2527
+ } catch {
2528
+ return void 0;
2529
+ }
2530
+ }
2454
2531
  /** Interrupt the thread's session (cancel). */
2455
2532
  async interrupt(input) {
2456
2533
  const known = await this.sessions.get(input.threadId);