studiograph 1.3.48-next.237 → 1.3.48-next.239
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/agent/agent-pool.d.ts +1 -1
- package/dist/agent/orchestrator.d.ts +1 -1
- package/dist/agent/orchestrator.js +36 -4
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/cli/setup-wizard.d.ts +2 -2
- package/dist/cli/setup-wizard.js +1 -1
- package/dist/cli/theme.d.ts +1 -1
- package/dist/core/secrets/registry.js +9 -2
- package/dist/core/secrets/registry.js.map +1 -1
- package/dist/core/types.js +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.js +1 -1
- package/dist/core/user-config.js.map +1 -1
- package/dist/server/index.js +13 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/routes/ai-usage-api.d.ts +24 -0
- package/dist/server/routes/ai-usage-api.js +68 -0
- package/dist/server/routes/ai-usage-api.js.map +1 -0
- package/dist/server/routes/asset-api.js +43 -0
- package/dist/server/routes/asset-api.js.map +1 -1
- package/dist/server/routes/capture-api.js +23 -0
- package/dist/server/routes/capture-api.js.map +1 -1
- package/dist/server/routes/chat.js +12 -0
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/routes/workspace-api.js +5 -0
- package/dist/server/routes/workspace-api.js.map +1 -1
- package/dist/services/ai-usage-ledger.d.ts +75 -0
- package/dist/services/ai-usage-ledger.js +250 -0
- package/dist/services/ai-usage-ledger.js.map +1 -0
- package/dist/services/asset-caption-service.js +15 -1
- package/dist/services/asset-caption-service.js.map +1 -1
- package/dist/services/asset-delete-impact.js +17 -105
- package/dist/services/asset-delete-impact.js.map +1 -1
- package/dist/services/asset-index-sweep.js +22 -0
- package/dist/services/asset-index-sweep.js.map +1 -1
- package/dist/services/asset-reference-index.d.ts +39 -0
- package/dist/services/asset-reference-index.js +33 -0
- package/dist/services/asset-reference-index.js.map +1 -0
- package/dist/services/asset-reference-scan.d.ts +57 -0
- package/dist/services/asset-reference-scan.js +150 -0
- package/dist/services/asset-reference-scan.js.map +1 -0
- package/dist/services/cloud-inference-billing.d.ts +2 -2
- package/dist/services/cloud-inference-billing.js +10 -2
- package/dist/services/cloud-inference-billing.js.map +1 -1
- package/dist/services/event-processor.js +5 -1
- package/dist/services/event-processor.js.map +1 -1
- package/dist/services/model-capabilities.js +1 -1
- package/dist/services/model-capabilities.js.map +1 -1
- package/dist/services/scratch-attachment-service.d.ts +1 -1
- package/dist/web/_app/immutable/assets/BulkActionsBar.D_-CBnA5.css +1 -0
- package/dist/web/_app/immutable/assets/{Markdown.1r8v3hpC.css → Markdown.CSYKSAm0.css} +1 -1
- package/dist/web/_app/immutable/chunks/{BSQ1QNW32.js → 0Q9Poj7Q2.js} +1 -1
- package/dist/web/_app/immutable/chunks/{DtCrXNDU.js → 1WNYnx2s.js} +1 -1
- package/dist/web/_app/immutable/chunks/{C3m2Uq4g.js → B-53fhEp.js} +1 -1
- package/dist/web/_app/immutable/chunks/B9tdcPFd2.js +1 -0
- package/dist/web/_app/immutable/chunks/BNFLmNbm.js +3 -0
- package/dist/web/_app/immutable/chunks/{sjKLWCue.js → BNyqaReS.js} +4 -4
- package/dist/web/_app/immutable/chunks/BPILs-6H.js +1 -0
- package/dist/web/_app/immutable/chunks/{0PnZwgWn.js → BX58EMfc.js} +1 -1
- package/dist/web/_app/immutable/chunks/{CVLnsfaP.js → BZRSMLpj.js} +1 -1
- package/dist/web/_app/immutable/chunks/{C3iXOzlc.js → B_Q2ikpC.js} +1 -1
- package/dist/web/_app/immutable/chunks/{B-RJDnQx.js → Be8atwXD.js} +2 -2
- package/dist/web/_app/immutable/chunks/{CMYkbOHH.js → BlB-J7g2.js} +1 -1
- package/dist/web/_app/immutable/chunks/{1rby9kmc.js → Bqj5THe4.js} +1 -1
- package/dist/web/_app/immutable/chunks/{DXSotRNL.js → Bu68wlAv.js} +2 -2
- package/dist/web/_app/immutable/chunks/{Dd7bkVml.js → BwNx-Krs.js} +2 -2
- package/dist/web/_app/immutable/chunks/{B-vWtmR7.js → BzqwCWHS.js} +1 -1
- package/dist/web/_app/immutable/chunks/{CWFuFysO.js → C6_MueJs.js} +1 -1
- package/dist/web/_app/immutable/chunks/{BjHTv1l72.js → C87IaHYh2.js} +2 -2
- package/dist/web/_app/immutable/chunks/{BYA7Rrzt.js → C9-W5gb5.js} +2 -2
- package/dist/web/_app/immutable/chunks/{B44DTjoO2.js → CE4L9Tdp2.js} +1 -1
- package/dist/web/_app/immutable/chunks/{J9wzmy3l2.js → CIfkrRcg2.js} +1 -1
- package/dist/web/_app/immutable/chunks/{B0d8HR61.js → CM2kFeMr.js} +1 -1
- package/dist/web/_app/immutable/chunks/{C0mi618o.js → CVKD10C7.js} +1 -1
- package/dist/web/_app/immutable/chunks/{D0tmF18U2.js → CW-Ov0pM2.js} +1 -1
- package/dist/web/_app/immutable/chunks/CdmK3A3f2.js +66 -0
- package/dist/web/_app/immutable/chunks/{C1QKRCU-.js → CfWggRjP.js} +1 -1
- package/dist/web/_app/immutable/chunks/{CrZvYR5P2.js → CfzXQJbU2.js} +2 -2
- package/dist/web/_app/immutable/chunks/{iZ7-Tw7U2.js → CjBwpMBz2.js} +1 -1
- package/dist/web/_app/immutable/chunks/{C1EvrL_7.js → Cj_OZrfj.js} +1 -1
- package/dist/web/_app/immutable/chunks/{BrnN_HSo2.js → ClfNZrQj2.js} +1 -1
- package/dist/web/_app/immutable/chunks/{zWel6LHH.js → CqFbmzSF.js} +1 -1
- package/dist/web/_app/immutable/chunks/{D4KwPRah.js → Cr5BwQl3.js} +2 -2
- package/dist/web/_app/immutable/chunks/{DUAqDJxa.js → Crp6TpJG.js} +1 -1
- package/dist/web/_app/immutable/chunks/{yywLqG5W2.js → Cy5jFIwC2.js} +1 -1
- package/dist/web/_app/immutable/chunks/{C-tNFk92.js → CzGq8Ipm.js} +1 -1
- package/dist/web/_app/immutable/chunks/{sj-wNjc-.js → D3DRGdDK.js} +2 -2
- package/dist/web/_app/immutable/chunks/{_wW4T6R2.js → D4w_-z_1.js} +1 -1
- package/dist/web/_app/immutable/chunks/{BWIgIymm2.js → D5B_tKDU2.js} +1 -1
- package/dist/web/_app/immutable/chunks/{B29EhrOv2.js → DA1j3PV-2.js} +1 -1
- package/dist/web/_app/immutable/chunks/{DjmCCRoK.js → DDGvXH7D.js} +1 -1
- package/dist/web/_app/immutable/chunks/{DhUOgfgR.js → DGxjBBgc.js} +2 -2
- package/dist/web/_app/immutable/chunks/{BME5JXHO.js → DIjVvUkI.js} +1 -1
- package/dist/web/_app/immutable/chunks/{CypyklLr.js → DJJ3G70D.js} +1 -1
- package/dist/web/_app/immutable/chunks/{cuN5XjUH.js → DKotJLkU.js} +1 -1
- package/dist/web/_app/immutable/chunks/{D2KDjtf9.js → DU4VHSBM.js} +1 -1
- package/dist/web/_app/immutable/chunks/{DCrXivaw2.js → DbrXa1V62.js} +1 -1
- package/dist/web/_app/immutable/chunks/{DFjGiEbx2.js → DcYQcDrH2.js} +1 -1
- package/dist/web/_app/immutable/chunks/{BRoraic8.js → Dd3b5zAE.js} +2 -2
- package/dist/web/_app/immutable/chunks/{cg9eVoLO.js → DdVDf5xu.js} +1 -1
- package/dist/web/_app/immutable/chunks/{BUT2UiIX.js → DftarwxC.js} +1 -1
- package/dist/web/_app/immutable/chunks/DgF3ta9a.js +1 -0
- package/dist/web/_app/immutable/chunks/{Pc5_42cj.js → Dme6nqpX.js} +3 -3
- package/dist/web/_app/immutable/chunks/{BcK0Ez95.js → Dnh8R-L4.js} +1 -1
- package/dist/web/_app/immutable/chunks/{AyylXGSv2.js → DsLjiBTy2.js} +2 -2
- package/dist/web/_app/immutable/chunks/{2lP0otoc.js → Dtg0mY8S.js} +1 -1
- package/dist/web/_app/immutable/chunks/{D4WDOSTI.js → DzPoqIW3.js} +1 -1
- package/dist/web/_app/immutable/chunks/Kh-6DI1Z.js +1 -0
- package/dist/web/_app/immutable/chunks/{3HNH6GR3.js → QFgAlnjg.js} +1 -1
- package/dist/web/_app/immutable/chunks/{DSXnCWGk.js → bXA0LEtk.js} +1 -1
- package/dist/web/_app/immutable/chunks/{n2xzKaVS.js → c_0_3I7o.js} +1 -1
- package/dist/web/_app/immutable/chunks/{B9UyjBos2.js → e8-FLj6j2.js} +1 -1
- package/dist/web/_app/immutable/chunks/{B-gUYquP2.js → iERz5c4V2.js} +1 -1
- package/dist/web/_app/immutable/chunks/{C18dD2J-.js → ltIFKHeT.js} +1 -1
- package/dist/web/_app/immutable/chunks/{DmfQFTnb.js → opOSqe3M.js} +1 -1
- package/dist/web/_app/immutable/chunks/{uBQcaK0U.js → s3KhJbPc.js} +1 -1
- package/dist/web/_app/immutable/entry/{app.CdqoThtw.js → app.D5h04EVK.js} +2 -2
- package/dist/web/_app/immutable/entry/start.qaBR9PnG.js +1 -0
- package/dist/web/_app/immutable/nodes/{0.CDrYGZrF.js → 0.Uo_fpMxv.js} +2 -2
- package/dist/web/_app/immutable/nodes/{1.Db3GKNa_.js → 1.CNWAaSgM.js} +1 -1
- package/dist/web/_app/immutable/nodes/{10.BxX5374d.js → 10.CcrAJFX3.js} +1 -1
- package/dist/web/_app/immutable/nodes/{11.CaRo9tsl.js → 11.BpqEWp0v.js} +1 -1
- package/dist/web/_app/immutable/nodes/{12.BEE3skpI.js → 12.qOg-Rv20.js} +1 -1
- package/dist/web/_app/immutable/nodes/{13.Dzr1VXUT.js → 13.BOu1vBz9.js} +1 -1
- package/dist/web/_app/immutable/nodes/{15.DyByLaAI.js → 15.BS5-L-82.js} +1 -1
- package/dist/web/_app/immutable/nodes/{17.BbE6Ymxb.js → 17.C4R428bf.js} +1 -1
- package/dist/web/_app/immutable/nodes/{18.M8tlcB7i.js → 18.BTMNXp-p.js} +1 -1
- package/dist/web/_app/immutable/nodes/{2.D5mBiTdK.js → 2.B9o6EQbw.js} +4 -4
- package/dist/web/_app/immutable/nodes/{3.DpkHByUG.js → 3.BgHyHKnp.js} +3 -3
- package/dist/web/_app/immutable/nodes/{4.CED6FDPc.js → 4.PNVLzVyZ.js} +3 -3
- package/dist/web/_app/immutable/nodes/{5.h64blRxn.js → 5.C452eJJj.js} +1 -1
- package/dist/web/_app/immutable/nodes/6.lD-emq-Y.js +6 -0
- package/dist/web/_app/immutable/nodes/{7.DqvXtdXA.js → 7.BtJajjKA.js} +1 -1
- package/dist/web/_app/immutable/nodes/{8.BsTKfXV8.js → 8.CT5hirOF.js} +1 -1
- package/dist/web/_app/immutable/nodes/{9.BZqNZnO6.js → 9.jKfHATxg.js} +1 -1
- package/dist/web/_app/version.json +1 -1
- package/dist/web/index.html +13 -13
- package/package.json +6 -5
- package/dist/web/_app/immutable/assets/BulkActionsBar.uuv1XnDn.css +0 -1
- package/dist/web/_app/immutable/chunks/B4p_LX9w2.js +0 -66
- package/dist/web/_app/immutable/chunks/CUXamJaA.js +0 -1
- package/dist/web/_app/immutable/chunks/CkCX2Cbp2.js +0 -1
- package/dist/web/_app/immutable/chunks/Cn00Qj9G.js +0 -1
- package/dist/web/_app/immutable/chunks/MXBsawC4.js +0 -1
- package/dist/web/_app/immutable/chunks/d2Yb968P.js +0 -3
- package/dist/web/_app/immutable/entry/start.Fm1pGXR-.js +0 -1
- package/dist/web/_app/immutable/nodes/6.BvvpiAqF.js +0 -6
|
@@ -24,8 +24,9 @@
|
|
|
24
24
|
* gateway mode captioning is skipped and the image stays honestly
|
|
25
25
|
* filename-only — NOT routed through the gateway here.
|
|
26
26
|
*/
|
|
27
|
-
import { getModel, completeSimple } from '@
|
|
27
|
+
import { getModel, completeSimple } from '@earendil-works/pi-ai';
|
|
28
28
|
import { isStudiographCreditsMode } from './cloud-inference-billing.js';
|
|
29
|
+
import { recordAiUsage } from './ai-usage-ledger.js';
|
|
29
30
|
import { supportsVision } from './model-capabilities.js';
|
|
30
31
|
import { bufferToImageContent } from './scratch-attachment-service.js';
|
|
31
32
|
const DEFAULT_TIMEOUT_MS = 60_000;
|
|
@@ -134,7 +135,20 @@ export async function captionImage(buffer, mimeType, config, opts = {}) {
|
|
|
134
135
|
let lastReason = 'error';
|
|
135
136
|
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
136
137
|
try {
|
|
138
|
+
const startedAt = Date.now();
|
|
137
139
|
const result = await withTimeout(complete(model, context, { apiKey: config.apiKey, maxTokens }), timeoutMs);
|
|
140
|
+
// Usage ledger (fire-and-forget): tokens are spent on errored attempts too.
|
|
141
|
+
// Injected test completeFns return no usage and tests set no ledger → no-op.
|
|
142
|
+
const callUsage = result.usage;
|
|
143
|
+
if (callUsage) {
|
|
144
|
+
recordAiUsage({
|
|
145
|
+
feature: 'caption',
|
|
146
|
+
provider: config.provider,
|
|
147
|
+
modelId: config.modelId,
|
|
148
|
+
usage: callUsage,
|
|
149
|
+
durationMs: Date.now() - startedAt,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
138
152
|
if (result.stopReason === 'error') {
|
|
139
153
|
lastReason = 'error';
|
|
140
154
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-caption-service.js","sourceRoot":"","sources":["../../src/services/asset-caption-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"asset-caption-service.js","sourceRoot":"","sources":["../../src/services/asset-caption-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,16 +23,11 @@
|
|
|
23
23
|
* partial reference info). On budget overrun `partial` is true and every
|
|
24
24
|
* asset reports solelyReferenced=false — the prompt then offers nothing.
|
|
25
25
|
*/
|
|
26
|
-
import {
|
|
27
|
-
import { setImmediate } from 'node:timers';
|
|
28
|
-
import { embeddedAssetIds, stripFrontmatter } from '../core/embeds.js';
|
|
26
|
+
import { embeddedAssetIds } from '../core/embeds.js';
|
|
29
27
|
import { publicUrlForAssetId, getMediaType } from './assets/index.js';
|
|
30
28
|
import * as access from './access-control.js';
|
|
31
29
|
import { assetDeleteDenialByAssetId } from './asset-delete-authz.js';
|
|
32
|
-
|
|
33
|
-
* and low-frequency, so a scan is acceptable — but it must never stall the
|
|
34
|
-
* delete dialog indefinitely on a huge workspace. */
|
|
35
|
-
const DEFAULT_SCAN_BUDGET_MS = 4000;
|
|
30
|
+
import { scanWorkspaceAssetReferences, DEFAULT_SCAN_BUDGET_MS } from './asset-reference-scan.js';
|
|
36
31
|
export async function computeAssetDeleteImpact(opts) {
|
|
37
32
|
const { workspaceManager: wm, authService, user, repo, entityType, entityId } = opts;
|
|
38
33
|
const budgetMs = opts.budgetMs ?? DEFAULT_SCAN_BUDGET_MS;
|
|
@@ -52,105 +47,22 @@ export async function computeAssetDeleteImpact(opts) {
|
|
|
52
47
|
.filter((r) => r != null);
|
|
53
48
|
if (rows.length === 0)
|
|
54
49
|
return { assets: [], partial: false };
|
|
55
|
-
// ── Workspace reference scan (live-reconciled) ──
|
|
56
|
-
|
|
57
|
-
|
|
50
|
+
// ── Workspace reference scan (live-reconciled, budgeted) ──
|
|
51
|
+
// The walk itself — repo iteration, live reconcile, budget, live-only-doc
|
|
52
|
+
// sweep — is shared with the P3 loose-filter index (asset-reference-scan).
|
|
53
|
+
// Here we only need: is any TARGET asset referenced by an entry OTHER than
|
|
54
|
+
// the one being deleted? Early-exit once every target is proven shared.
|
|
55
|
+
const targetIdSet = new Set(rows.map(r => r.assetId));
|
|
58
56
|
const referencedElsewhere = new Set();
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
};
|
|
68
|
-
let visited = 0;
|
|
69
|
-
scan: for (const cfg of wm.getAllRepoConfigs()) {
|
|
70
|
-
// Per-repo deadline check too: listEntityIds builds the repo's file
|
|
71
|
-
// index on first touch, which itself can be slow on a huge cold repo.
|
|
72
|
-
if (Date.now() > deadline) {
|
|
73
|
-
partial = true;
|
|
74
|
-
break;
|
|
75
|
-
}
|
|
76
|
-
let g;
|
|
77
|
-
try {
|
|
78
|
-
g = wm.getGraph(cfg.name);
|
|
79
|
-
}
|
|
80
|
-
catch {
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
for (const { entityType: eType, id: eId } of g.listEntityIds()) {
|
|
84
|
-
if (Date.now() > deadline) {
|
|
85
|
-
partial = true;
|
|
86
|
-
break scan;
|
|
87
|
-
}
|
|
88
|
-
// Yield the event loop periodically — the walk is sync I/O and must
|
|
89
|
-
// not starve other requests for the full budget on a big workspace.
|
|
90
|
-
if (++visited % 200 === 0)
|
|
91
|
-
await new Promise(r => setImmediate(r));
|
|
92
|
-
if (`${cfg.name}/${eType}/${eId}` === selfKey)
|
|
93
|
-
continue;
|
|
94
|
-
const path = g.getEntityFilePath(eType, eId);
|
|
95
|
-
if (!path)
|
|
96
|
-
continue;
|
|
97
|
-
let raw;
|
|
98
|
-
try {
|
|
99
|
-
raw = readFileSync(path, 'utf-8');
|
|
100
|
-
}
|
|
101
|
-
catch {
|
|
102
|
-
continue;
|
|
103
|
-
}
|
|
104
|
-
// Live reconcile (D1): an open editor's Y.Doc body REPLACES the disk
|
|
105
|
-
// body — additions block the offer, removals enable it. The disk
|
|
106
|
-
// FRONTMATTER is always scanned (it isn't editable in the live doc).
|
|
107
|
-
const live = g.getLiveBody(eType, eId);
|
|
108
|
-
if (live === null) {
|
|
109
|
-
scanText(raw); // body + frontmatter in one pass
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
// BOM-strip before the frontmatter split: an externally-edited file
|
|
113
|
-
// with a leading BOM would otherwise defeat stripFrontmatter and the
|
|
114
|
-
// frontmatter reference would never be scanned (a wrong delete).
|
|
115
|
-
const norm = raw.replace(/^\uFEFF/, '');
|
|
116
|
-
const diskBody = stripFrontmatter(norm);
|
|
117
|
-
const frontmatterRaw = norm.slice(0, norm.length - diskBody.length);
|
|
118
|
-
scanText(live);
|
|
119
|
-
scanText(frontmatterRaw);
|
|
120
|
-
}
|
|
121
|
-
if (referencedElsewhere.size === rows.length)
|
|
122
|
-
break scan; // all shared
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
// Live-only docs: an open editor for an entity that has no disk file yet
|
|
126
|
-
// (fresh create mid-typing) isn't in any file index — peek those directly.
|
|
127
|
-
if (!partial && referencedElsewhere.size < rows.length) {
|
|
128
|
-
for (const docName of wm.getBodyWriteCoordinator()?.activeDocNames() ?? []) {
|
|
129
|
-
if (Date.now() > deadline) {
|
|
130
|
-
partial = true;
|
|
131
|
-
break;
|
|
132
|
-
}
|
|
133
|
-
const parts = docName.split('/');
|
|
134
|
-
if (parts.length !== 3)
|
|
135
|
-
continue;
|
|
136
|
-
const [dRepo, dType, dId] = parts;
|
|
137
|
-
if (docName === selfKey)
|
|
138
|
-
continue;
|
|
139
|
-
let dGraph;
|
|
140
|
-
try {
|
|
141
|
-
dGraph = wm.getGraph(dRepo);
|
|
142
|
-
}
|
|
143
|
-
catch {
|
|
144
|
-
continue;
|
|
145
|
-
}
|
|
146
|
-
// Disk-backed docs were already live-reconciled in the walk above.
|
|
147
|
-
if (dGraph.getEntityFilePath(dType, dId))
|
|
148
|
-
continue;
|
|
149
|
-
const live = dGraph.getLiveBody(dType, dId);
|
|
150
|
-
if (live !== null)
|
|
151
|
-
scanText(live);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
57
|
+
const { partial } = await scanWorkspaceAssetReferences(wm, (ids) => {
|
|
58
|
+
for (const id of ids)
|
|
59
|
+
if (targetIdSet.has(id))
|
|
60
|
+
referencedElsewhere.add(id);
|
|
61
|
+
}, {
|
|
62
|
+
budgetMs,
|
|
63
|
+
skipKey: `${repo}/${entityType}/${entityId}`,
|
|
64
|
+
stopWhen: () => referencedElsewhere.size === targetIdSet.size,
|
|
65
|
+
});
|
|
154
66
|
// ── Per-asset permission gate ──
|
|
155
67
|
const assets = rows.map(row => {
|
|
156
68
|
let canDelete = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-delete-impact.js","sourceRoot":"","sources":["../../src/services/asset-delete-impact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;
|
|
1
|
+
{"version":3,"file":"asset-delete-impact.js","sourceRoot":"","sources":["../../src/services/asset-delete-impact.ts"],"names":[],"mappings":"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"}
|
|
@@ -117,6 +117,9 @@ export async function sweepAssetIndex(deps, opts = {}) {
|
|
|
117
117
|
const stateMap = await vec.getAllIndexStates();
|
|
118
118
|
// Collect the work-list from assets.db image rows across the swept repos.
|
|
119
119
|
const items = [];
|
|
120
|
+
// Count of already-captioned assets skipped via the durable-store rescue below
|
|
121
|
+
// (their rebuildable index-state was lost) — logged so a wiped cache is visible.
|
|
122
|
+
let rescued = 0;
|
|
120
123
|
for (const repo of deps.repos) {
|
|
121
124
|
let rows;
|
|
122
125
|
try {
|
|
@@ -146,9 +149,28 @@ export async function sweepAssetIndex(deps, opts = {}) {
|
|
|
146
149
|
result.skippedUpToDate++;
|
|
147
150
|
continue;
|
|
148
151
|
}
|
|
152
|
+
// Durable-store rescue: the LanceDB index-state is a REBUILDABLE cache and
|
|
153
|
+
// can vanish between boots (e.g. it lives outside the persistent volume
|
|
154
|
+
// while the caption text does not), making every image read back as "no
|
|
155
|
+
// state" and re-captioning the whole library on the (paid) vision model.
|
|
156
|
+
// assets.db.caption is the source of truth (D1): if a caption is already
|
|
157
|
+
// stored, the asset is really `full`, so skip the vision call. We do NOT
|
|
158
|
+
// re-stamp the cache — when it's truly ephemeral the stamp is wiped again
|
|
159
|
+
// next boot, and this check is free (the row is already loaded). NOTE: only
|
|
160
|
+
// `full` assets are rescued; a `failed` asset has no caption text and is
|
|
161
|
+
// still re-tried on a wiped cache. The complete fix is to persist the
|
|
162
|
+
// index-state itself (point `vector_db_path` at the durable volume).
|
|
163
|
+
if (row.caption && row.caption.trim()) {
|
|
164
|
+
result.skippedUpToDate++;
|
|
165
|
+
rescued++;
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
149
168
|
items.push({ assetId: row.assetId, repo: repo.name, filename: row.filename, contentType: row.contentType });
|
|
150
169
|
}
|
|
151
170
|
}
|
|
171
|
+
if (rescued > 0) {
|
|
172
|
+
log(`[index-sweep] rescued ${rescued} already-captioned asset(s) from a lost index-state (no re-derive)`);
|
|
173
|
+
}
|
|
152
174
|
// Respect the optional safety cap.
|
|
153
175
|
const images = opts.maxAssets != null ? items.slice(0, Math.max(0, opts.maxAssets)) : items;
|
|
154
176
|
// Caption reachability gate (per-workspace flag + model capability).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-index-sweep.js","sourceRoot":"","sources":["../../src/services/asset-index-sweep.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"asset-index-sweep.js","sourceRoot":"","sources":["../../src/services/asset-index-sweep.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inverted asset-reference index (assets-referenced-not-owned, Phase 3).
|
|
3
|
+
*
|
|
4
|
+
* The Library "loose / unreferenced" filter needs to know, for EVERY asset, how
|
|
5
|
+
* many entries reference it — so deliberate library uploads (and the owner
|
|
6
|
+
* migration's re-homed orphan pastes) aren't drowned by incidental ones. This
|
|
7
|
+
* is the inversion of P2's delete-impact (which asks the question for one
|
|
8
|
+
* entry's assets); both consume the same workspace walk (asset-reference-scan).
|
|
9
|
+
*
|
|
10
|
+
* An asset with count 0 is "loose". Unreferenced is a VALID steady state — a
|
|
11
|
+
* not-yet-embedded library upload looks identical to an orphan paste — so this
|
|
12
|
+
* NEVER drives deletion; it only powers a filter.
|
|
13
|
+
*
|
|
14
|
+
* Fail-safe (eng review): on a `partial` scan the counts are INCOMPLETE — an
|
|
15
|
+
* asset absent from the index might simply not have been reached. Callers must
|
|
16
|
+
* NOT mark such assets loose (a false-loose could lure a user into deleting a
|
|
17
|
+
* still-referenced asset); the client gates the whole loose filter on `partial`.
|
|
18
|
+
*/
|
|
19
|
+
import type { WorkspaceManager } from '../core/workspace-manager.js';
|
|
20
|
+
export interface AssetReferenceIndex {
|
|
21
|
+
/** assetId → number of distinct entries that reference it (live-reconciled).
|
|
22
|
+
* Assets referenced by no entry are absent (count 0). Legacy un-indexed
|
|
23
|
+
* blobs use 3-segment URLs the immutable-ref scan ignores, so they never
|
|
24
|
+
* appear here — the client treats an unknown count as "not loose". */
|
|
25
|
+
index: Record<string, number>;
|
|
26
|
+
/** True when the scan hit its budget before covering the workspace — counts
|
|
27
|
+
* are then incomplete and the client must mark nothing loose. */
|
|
28
|
+
partial: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Build the workspace-wide assetId → referencing-entry-count map in one walk.
|
|
32
|
+
* Each entry contributes at most 1 to an asset's count (the scan dedupes
|
|
33
|
+
* assetIds per entry), so the count is "how many entries reference this asset".
|
|
34
|
+
*/
|
|
35
|
+
export declare function computeAssetReferenceIndex(opts: {
|
|
36
|
+
workspaceManager: WorkspaceManager;
|
|
37
|
+
/** Test hook — overrides the scan budget. */
|
|
38
|
+
budgetMs?: number;
|
|
39
|
+
}): Promise<AssetReferenceIndex>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inverted asset-reference index (assets-referenced-not-owned, Phase 3).
|
|
3
|
+
*
|
|
4
|
+
* The Library "loose / unreferenced" filter needs to know, for EVERY asset, how
|
|
5
|
+
* many entries reference it — so deliberate library uploads (and the owner
|
|
6
|
+
* migration's re-homed orphan pastes) aren't drowned by incidental ones. This
|
|
7
|
+
* is the inversion of P2's delete-impact (which asks the question for one
|
|
8
|
+
* entry's assets); both consume the same workspace walk (asset-reference-scan).
|
|
9
|
+
*
|
|
10
|
+
* An asset with count 0 is "loose". Unreferenced is a VALID steady state — a
|
|
11
|
+
* not-yet-embedded library upload looks identical to an orphan paste — so this
|
|
12
|
+
* NEVER drives deletion; it only powers a filter.
|
|
13
|
+
*
|
|
14
|
+
* Fail-safe (eng review): on a `partial` scan the counts are INCOMPLETE — an
|
|
15
|
+
* asset absent from the index might simply not have been reached. Callers must
|
|
16
|
+
* NOT mark such assets loose (a false-loose could lure a user into deleting a
|
|
17
|
+
* still-referenced asset); the client gates the whole loose filter on `partial`.
|
|
18
|
+
*/
|
|
19
|
+
import { scanWorkspaceAssetReferences } from './asset-reference-scan.js';
|
|
20
|
+
/**
|
|
21
|
+
* Build the workspace-wide assetId → referencing-entry-count map in one walk.
|
|
22
|
+
* Each entry contributes at most 1 to an asset's count (the scan dedupes
|
|
23
|
+
* assetIds per entry), so the count is "how many entries reference this asset".
|
|
24
|
+
*/
|
|
25
|
+
export async function computeAssetReferenceIndex(opts) {
|
|
26
|
+
const index = {};
|
|
27
|
+
const { partial } = await scanWorkspaceAssetReferences(opts.workspaceManager, (assetIds) => {
|
|
28
|
+
for (const id of assetIds)
|
|
29
|
+
index[id] = (index[id] ?? 0) + 1;
|
|
30
|
+
}, { budgetMs: opts.budgetMs });
|
|
31
|
+
return { index, partial };
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=asset-reference-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-reference-index.js","sourceRoot":"","sources":["../../src/services/asset-reference-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAazE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,IAIhD;IACC,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,4BAA4B,CACpD,IAAI,CAAC,gBAAgB,EACrB,CAAC,QAAQ,EAAE,EAAE;QACX,KAAK,MAAM,EAAE,IAAI,QAAQ;YAAE,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9D,CAAC,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5B,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace-wide asset reference scan (assets-referenced-not-owned).
|
|
3
|
+
*
|
|
4
|
+
* Two features need the same walk: "which assets does this entry SOLELY
|
|
5
|
+
* reference" (P2 delete prompt) and "how many entries reference each asset"
|
|
6
|
+
* (P3 loose/unreferenced filter — the inverted index). This is the one
|
|
7
|
+
* implementation of that walk; both are thin consumers.
|
|
8
|
+
*
|
|
9
|
+
* The walk is:
|
|
10
|
+
* - LIVE-RECONCILED (eng review D1): for an entry with an open editor doc the
|
|
11
|
+
* live Y.Doc body REPLACES the disk body (a reference just pasted blocks an
|
|
12
|
+
* offer / inflates a count; one just removed does the opposite). Disk
|
|
13
|
+
* FRONTMATTER is always scanned (it isn't editable live). Live-only docs
|
|
14
|
+
* (a fresh create still being typed, no disk file yet) are swept directly.
|
|
15
|
+
* - BUDGETED (fail-safe): a soft wall-clock cap. On overrun the walk stops and
|
|
16
|
+
* `partial` is true — the user-initiated, low-frequency scan must never
|
|
17
|
+
* stall the UI on a huge workspace, and callers must NEVER treat an
|
|
18
|
+
* unscanned asset as unreferenced (P2 offers nothing; P3 marks nothing loose).
|
|
19
|
+
* - ALL repos, even ones the caller can't read: a reference is a reference
|
|
20
|
+
* wherever it lives. Consumers reveal only an aggregate (a boolean / a
|
|
21
|
+
* count), never the referencing entry or its folder.
|
|
22
|
+
*/
|
|
23
|
+
import type { WorkspaceManager } from '../core/workspace-manager.js';
|
|
24
|
+
/** Soft wall-clock budget for the workspace reference scan. User-initiated and
|
|
25
|
+
* low-frequency, so a full walk is acceptable — but it must never stall the UI
|
|
26
|
+
* indefinitely on a huge workspace. Shared by every consumer so the fail-safe
|
|
27
|
+
* boundary is identical. */
|
|
28
|
+
export declare const DEFAULT_SCAN_BUDGET_MS = 4000;
|
|
29
|
+
export interface WorkspaceScanOptions {
|
|
30
|
+
/** Override the scan budget (test hook / per-caller tuning). */
|
|
31
|
+
budgetMs?: number;
|
|
32
|
+
/** Entity key `${repo}/${entityType}/${entityId}` to skip — e.g. the entry
|
|
33
|
+
* being deleted, whose own references must not count as "elsewhere". */
|
|
34
|
+
skipKey?: string;
|
|
35
|
+
/** Optional early-exit, checked after each visited entry: returning true
|
|
36
|
+
* stops the walk WITHOUT marking it partial (the caller has all it needs,
|
|
37
|
+
* e.g. every target asset already proven shared). */
|
|
38
|
+
stopWhen?: () => boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface WorkspaceScanResult {
|
|
41
|
+
/** True when the walk hit its budget before covering the workspace. Callers
|
|
42
|
+
* must fail safe: never treat an asset unseen by a partial scan as
|
|
43
|
+
* unreferenced. */
|
|
44
|
+
partial: boolean;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Walk every entry in every repo (live-reconciled, budgeted) and hand the
|
|
48
|
+
* `visit` callback the set of immutable assetIds each entry references. The
|
|
49
|
+
* callback owns what to do with them (intersect a target set, accumulate a
|
|
50
|
+
* count, …). `visit` is never called for the `skipKey` entry.
|
|
51
|
+
*/
|
|
52
|
+
export declare function scanWorkspaceAssetReferences(wm: WorkspaceManager, visit: (assetIds: Set<string>, entry: {
|
|
53
|
+
repo: string;
|
|
54
|
+
entityType: string;
|
|
55
|
+
entityId: string;
|
|
56
|
+
key: string;
|
|
57
|
+
}) => void, opts?: WorkspaceScanOptions): Promise<WorkspaceScanResult>;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace-wide asset reference scan (assets-referenced-not-owned).
|
|
3
|
+
*
|
|
4
|
+
* Two features need the same walk: "which assets does this entry SOLELY
|
|
5
|
+
* reference" (P2 delete prompt) and "how many entries reference each asset"
|
|
6
|
+
* (P3 loose/unreferenced filter — the inverted index). This is the one
|
|
7
|
+
* implementation of that walk; both are thin consumers.
|
|
8
|
+
*
|
|
9
|
+
* The walk is:
|
|
10
|
+
* - LIVE-RECONCILED (eng review D1): for an entry with an open editor doc the
|
|
11
|
+
* live Y.Doc body REPLACES the disk body (a reference just pasted blocks an
|
|
12
|
+
* offer / inflates a count; one just removed does the opposite). Disk
|
|
13
|
+
* FRONTMATTER is always scanned (it isn't editable live). Live-only docs
|
|
14
|
+
* (a fresh create still being typed, no disk file yet) are swept directly.
|
|
15
|
+
* - BUDGETED (fail-safe): a soft wall-clock cap. On overrun the walk stops and
|
|
16
|
+
* `partial` is true — the user-initiated, low-frequency scan must never
|
|
17
|
+
* stall the UI on a huge workspace, and callers must NEVER treat an
|
|
18
|
+
* unscanned asset as unreferenced (P2 offers nothing; P3 marks nothing loose).
|
|
19
|
+
* - ALL repos, even ones the caller can't read: a reference is a reference
|
|
20
|
+
* wherever it lives. Consumers reveal only an aggregate (a boolean / a
|
|
21
|
+
* count), never the referencing entry or its folder.
|
|
22
|
+
*/
|
|
23
|
+
import { readFileSync } from 'node:fs';
|
|
24
|
+
import { setImmediate } from 'node:timers';
|
|
25
|
+
import { extractImmutableAssetRefs, stripFrontmatter } from '../core/embeds.js';
|
|
26
|
+
/** Soft wall-clock budget for the workspace reference scan. User-initiated and
|
|
27
|
+
* low-frequency, so a full walk is acceptable — but it must never stall the UI
|
|
28
|
+
* indefinitely on a huge workspace. Shared by every consumer so the fail-safe
|
|
29
|
+
* boundary is identical. */
|
|
30
|
+
export const DEFAULT_SCAN_BUDGET_MS = 4000;
|
|
31
|
+
/**
|
|
32
|
+
* Walk every entry in every repo (live-reconciled, budgeted) and hand the
|
|
33
|
+
* `visit` callback the set of immutable assetIds each entry references. The
|
|
34
|
+
* callback owns what to do with them (intersect a target set, accumulate a
|
|
35
|
+
* count, …). `visit` is never called for the `skipKey` entry.
|
|
36
|
+
*/
|
|
37
|
+
export async function scanWorkspaceAssetReferences(wm, visit, opts = {}) {
|
|
38
|
+
const budgetMs = opts.budgetMs ?? DEFAULT_SCAN_BUDGET_MS;
|
|
39
|
+
const deadline = Date.now() + budgetMs;
|
|
40
|
+
const { skipKey, stopWhen } = opts;
|
|
41
|
+
let partial = false;
|
|
42
|
+
// Cheap substring pre-check before the regex — the common entry embeds no
|
|
43
|
+
// asset, so most bodies skip extraction entirely.
|
|
44
|
+
const extractInto = (text, into) => {
|
|
45
|
+
if (!text || text.indexOf('/api/assets/') === -1)
|
|
46
|
+
return;
|
|
47
|
+
for (const ref of extractImmutableAssetRefs(text))
|
|
48
|
+
into.add(ref.assetId);
|
|
49
|
+
};
|
|
50
|
+
const visited = (() => {
|
|
51
|
+
let n = 0;
|
|
52
|
+
return () => ++n;
|
|
53
|
+
})();
|
|
54
|
+
scan: for (const cfg of wm.getAllRepoConfigs()) {
|
|
55
|
+
// Per-repo deadline check too: listEntityIds builds the repo's file index on
|
|
56
|
+
// first touch, which itself can be slow on a huge cold repo.
|
|
57
|
+
if (Date.now() > deadline) {
|
|
58
|
+
partial = true;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
let g;
|
|
62
|
+
try {
|
|
63
|
+
g = wm.getGraph(cfg.name);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
for (const { entityType: eType, id: eId } of g.listEntityIds()) {
|
|
69
|
+
if (Date.now() > deadline) {
|
|
70
|
+
partial = true;
|
|
71
|
+
break scan;
|
|
72
|
+
}
|
|
73
|
+
// Yield the event loop periodically — the walk is sync I/O and must not
|
|
74
|
+
// starve other requests for the full budget on a big workspace.
|
|
75
|
+
if (visited() % 200 === 0)
|
|
76
|
+
await new Promise(r => setImmediate(r));
|
|
77
|
+
const key = `${cfg.name}/${eType}/${eId}`;
|
|
78
|
+
if (key === skipKey)
|
|
79
|
+
continue;
|
|
80
|
+
const path = g.getEntityFilePath(eType, eId);
|
|
81
|
+
if (!path)
|
|
82
|
+
continue;
|
|
83
|
+
let raw;
|
|
84
|
+
try {
|
|
85
|
+
raw = readFileSync(path, 'utf-8');
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const ids = new Set();
|
|
91
|
+
// Live reconcile (D1): an open editor's Y.Doc body REPLACES the disk body
|
|
92
|
+
// — additions inflate, removals deflate. Disk FRONTMATTER is always
|
|
93
|
+
// scanned (not editable in the live doc).
|
|
94
|
+
const live = g.getLiveBody(eType, eId);
|
|
95
|
+
if (live === null) {
|
|
96
|
+
extractInto(raw, ids); // body + frontmatter in one pass
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// BOM-strip before the frontmatter split: an externally-edited file with
|
|
100
|
+
// a leading BOM would otherwise defeat stripFrontmatter and the
|
|
101
|
+
// frontmatter reference would never be scanned.
|
|
102
|
+
const norm = raw.replace(/^\uFEFF/, '');
|
|
103
|
+
const diskBody = stripFrontmatter(norm);
|
|
104
|
+
const frontmatterRaw = norm.slice(0, norm.length - diskBody.length);
|
|
105
|
+
extractInto(live, ids);
|
|
106
|
+
extractInto(frontmatterRaw, ids);
|
|
107
|
+
}
|
|
108
|
+
visit(ids, { repo: cfg.name, entityType: eType, entityId: eId, key });
|
|
109
|
+
if (stopWhen?.())
|
|
110
|
+
break scan;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Live-only docs: an open editor for an entity that has no disk file yet (a
|
|
114
|
+
// fresh create mid-typing) is in no file index — peek those directly. Skipped
|
|
115
|
+
// when the scan went partial (we can't claim completeness) or already stopped.
|
|
116
|
+
if (!partial && !stopWhen?.()) {
|
|
117
|
+
for (const docName of wm.getBodyWriteCoordinator()?.activeDocNames() ?? []) {
|
|
118
|
+
if (Date.now() > deadline) {
|
|
119
|
+
partial = true;
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
if (docName === skipKey)
|
|
123
|
+
continue;
|
|
124
|
+
const parts = docName.split('/');
|
|
125
|
+
if (parts.length !== 3)
|
|
126
|
+
continue;
|
|
127
|
+
const [dRepo, dType, dId] = parts;
|
|
128
|
+
let dGraph;
|
|
129
|
+
try {
|
|
130
|
+
dGraph = wm.getGraph(dRepo);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
// Disk-backed docs were already live-reconciled in the walk above.
|
|
136
|
+
if (dGraph.getEntityFilePath(dType, dId))
|
|
137
|
+
continue;
|
|
138
|
+
const live = dGraph.getLiveBody(dType, dId);
|
|
139
|
+
if (live === null)
|
|
140
|
+
continue;
|
|
141
|
+
const ids = new Set();
|
|
142
|
+
extractInto(live, ids);
|
|
143
|
+
visit(ids, { repo: dRepo, entityType: dType, entityId: dId, key: docName });
|
|
144
|
+
if (stopWhen?.())
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return { partial };
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=asset-reference-scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-reference-scan.js","sourceRoot":"","sources":["../../src/services/asset-reference-scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Context, type Model, type SimpleStreamOptions, type StreamFunction } from '@
|
|
1
|
+
import { type Context, type Model, type SimpleStreamOptions, type StreamFunction } from '@earendil-works/pi-ai';
|
|
2
2
|
export interface InferenceUsageSummary {
|
|
3
3
|
inputTokens: number;
|
|
4
4
|
outputTokens: number;
|
|
@@ -55,7 +55,7 @@ export declare class CloudInferenceBillingClient {
|
|
|
55
55
|
description?: string;
|
|
56
56
|
}): Promise<void>;
|
|
57
57
|
release(reservation: CloudInferenceReservation, reason: string): Promise<void>;
|
|
58
|
-
streamChat(context: Context, options?: SimpleStreamOptions): import("@
|
|
58
|
+
streamChat(context: Context, options?: SimpleStreamOptions): import("@earendil-works/pi-ai").AssistantMessageEventStream;
|
|
59
59
|
private requireConfigOrNull;
|
|
60
60
|
private runtimePath;
|
|
61
61
|
private runStreamChat;
|