@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/README.md +6 -1
- package/dist/durable/index.cjs +77 -0
- package/dist/durable/index.cjs.map +1 -1
- package/dist/durable/index.d.cts +1 -1
- package/dist/durable/index.d.ts +1 -1
- package/dist/durable/index.js +77 -0
- package/dist/durable/index.js.map +1 -1
- package/dist/{engine-JnBbcRxh.d.cts → engine-0YkBLWZR.d.cts} +31 -0
- package/dist/{engine-JnBbcRxh.d.ts → engine-0YkBLWZR.d.ts} +31 -0
- package/dist/index.cjs +77 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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);
|