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.
Files changed (147) hide show
  1. package/dist/agent/agent-pool.d.ts +1 -1
  2. package/dist/agent/orchestrator.d.ts +1 -1
  3. package/dist/agent/orchestrator.js +36 -4
  4. package/dist/agent/orchestrator.js.map +1 -1
  5. package/dist/cli/setup-wizard.d.ts +2 -2
  6. package/dist/cli/setup-wizard.js +1 -1
  7. package/dist/cli/theme.d.ts +1 -1
  8. package/dist/core/secrets/registry.js +9 -2
  9. package/dist/core/secrets/registry.js.map +1 -1
  10. package/dist/core/types.js +1 -1
  11. package/dist/core/types.js.map +1 -1
  12. package/dist/core/user-config.js +1 -1
  13. package/dist/core/user-config.js.map +1 -1
  14. package/dist/server/index.js +13 -0
  15. package/dist/server/index.js.map +1 -1
  16. package/dist/server/routes/ai-usage-api.d.ts +24 -0
  17. package/dist/server/routes/ai-usage-api.js +68 -0
  18. package/dist/server/routes/ai-usage-api.js.map +1 -0
  19. package/dist/server/routes/asset-api.js +43 -0
  20. package/dist/server/routes/asset-api.js.map +1 -1
  21. package/dist/server/routes/capture-api.js +23 -0
  22. package/dist/server/routes/capture-api.js.map +1 -1
  23. package/dist/server/routes/chat.js +12 -0
  24. package/dist/server/routes/chat.js.map +1 -1
  25. package/dist/server/routes/workspace-api.js +5 -0
  26. package/dist/server/routes/workspace-api.js.map +1 -1
  27. package/dist/services/ai-usage-ledger.d.ts +75 -0
  28. package/dist/services/ai-usage-ledger.js +250 -0
  29. package/dist/services/ai-usage-ledger.js.map +1 -0
  30. package/dist/services/asset-caption-service.js +15 -1
  31. package/dist/services/asset-caption-service.js.map +1 -1
  32. package/dist/services/asset-delete-impact.js +17 -105
  33. package/dist/services/asset-delete-impact.js.map +1 -1
  34. package/dist/services/asset-index-sweep.js +22 -0
  35. package/dist/services/asset-index-sweep.js.map +1 -1
  36. package/dist/services/asset-reference-index.d.ts +39 -0
  37. package/dist/services/asset-reference-index.js +33 -0
  38. package/dist/services/asset-reference-index.js.map +1 -0
  39. package/dist/services/asset-reference-scan.d.ts +57 -0
  40. package/dist/services/asset-reference-scan.js +150 -0
  41. package/dist/services/asset-reference-scan.js.map +1 -0
  42. package/dist/services/cloud-inference-billing.d.ts +2 -2
  43. package/dist/services/cloud-inference-billing.js +10 -2
  44. package/dist/services/cloud-inference-billing.js.map +1 -1
  45. package/dist/services/event-processor.js +5 -1
  46. package/dist/services/event-processor.js.map +1 -1
  47. package/dist/services/model-capabilities.js +1 -1
  48. package/dist/services/model-capabilities.js.map +1 -1
  49. package/dist/services/scratch-attachment-service.d.ts +1 -1
  50. package/dist/web/_app/immutable/assets/BulkActionsBar.D_-CBnA5.css +1 -0
  51. package/dist/web/_app/immutable/assets/{Markdown.1r8v3hpC.css → Markdown.CSYKSAm0.css} +1 -1
  52. package/dist/web/_app/immutable/chunks/{BSQ1QNW32.js → 0Q9Poj7Q2.js} +1 -1
  53. package/dist/web/_app/immutable/chunks/{DtCrXNDU.js → 1WNYnx2s.js} +1 -1
  54. package/dist/web/_app/immutable/chunks/{C3m2Uq4g.js → B-53fhEp.js} +1 -1
  55. package/dist/web/_app/immutable/chunks/B9tdcPFd2.js +1 -0
  56. package/dist/web/_app/immutable/chunks/BNFLmNbm.js +3 -0
  57. package/dist/web/_app/immutable/chunks/{sjKLWCue.js → BNyqaReS.js} +4 -4
  58. package/dist/web/_app/immutable/chunks/BPILs-6H.js +1 -0
  59. package/dist/web/_app/immutable/chunks/{0PnZwgWn.js → BX58EMfc.js} +1 -1
  60. package/dist/web/_app/immutable/chunks/{CVLnsfaP.js → BZRSMLpj.js} +1 -1
  61. package/dist/web/_app/immutable/chunks/{C3iXOzlc.js → B_Q2ikpC.js} +1 -1
  62. package/dist/web/_app/immutable/chunks/{B-RJDnQx.js → Be8atwXD.js} +2 -2
  63. package/dist/web/_app/immutable/chunks/{CMYkbOHH.js → BlB-J7g2.js} +1 -1
  64. package/dist/web/_app/immutable/chunks/{1rby9kmc.js → Bqj5THe4.js} +1 -1
  65. package/dist/web/_app/immutable/chunks/{DXSotRNL.js → Bu68wlAv.js} +2 -2
  66. package/dist/web/_app/immutable/chunks/{Dd7bkVml.js → BwNx-Krs.js} +2 -2
  67. package/dist/web/_app/immutable/chunks/{B-vWtmR7.js → BzqwCWHS.js} +1 -1
  68. package/dist/web/_app/immutable/chunks/{CWFuFysO.js → C6_MueJs.js} +1 -1
  69. package/dist/web/_app/immutable/chunks/{BjHTv1l72.js → C87IaHYh2.js} +2 -2
  70. package/dist/web/_app/immutable/chunks/{BYA7Rrzt.js → C9-W5gb5.js} +2 -2
  71. package/dist/web/_app/immutable/chunks/{B44DTjoO2.js → CE4L9Tdp2.js} +1 -1
  72. package/dist/web/_app/immutable/chunks/{J9wzmy3l2.js → CIfkrRcg2.js} +1 -1
  73. package/dist/web/_app/immutable/chunks/{B0d8HR61.js → CM2kFeMr.js} +1 -1
  74. package/dist/web/_app/immutable/chunks/{C0mi618o.js → CVKD10C7.js} +1 -1
  75. package/dist/web/_app/immutable/chunks/{D0tmF18U2.js → CW-Ov0pM2.js} +1 -1
  76. package/dist/web/_app/immutable/chunks/CdmK3A3f2.js +66 -0
  77. package/dist/web/_app/immutable/chunks/{C1QKRCU-.js → CfWggRjP.js} +1 -1
  78. package/dist/web/_app/immutable/chunks/{CrZvYR5P2.js → CfzXQJbU2.js} +2 -2
  79. package/dist/web/_app/immutable/chunks/{iZ7-Tw7U2.js → CjBwpMBz2.js} +1 -1
  80. package/dist/web/_app/immutable/chunks/{C1EvrL_7.js → Cj_OZrfj.js} +1 -1
  81. package/dist/web/_app/immutable/chunks/{BrnN_HSo2.js → ClfNZrQj2.js} +1 -1
  82. package/dist/web/_app/immutable/chunks/{zWel6LHH.js → CqFbmzSF.js} +1 -1
  83. package/dist/web/_app/immutable/chunks/{D4KwPRah.js → Cr5BwQl3.js} +2 -2
  84. package/dist/web/_app/immutable/chunks/{DUAqDJxa.js → Crp6TpJG.js} +1 -1
  85. package/dist/web/_app/immutable/chunks/{yywLqG5W2.js → Cy5jFIwC2.js} +1 -1
  86. package/dist/web/_app/immutable/chunks/{C-tNFk92.js → CzGq8Ipm.js} +1 -1
  87. package/dist/web/_app/immutable/chunks/{sj-wNjc-.js → D3DRGdDK.js} +2 -2
  88. package/dist/web/_app/immutable/chunks/{_wW4T6R2.js → D4w_-z_1.js} +1 -1
  89. package/dist/web/_app/immutable/chunks/{BWIgIymm2.js → D5B_tKDU2.js} +1 -1
  90. package/dist/web/_app/immutable/chunks/{B29EhrOv2.js → DA1j3PV-2.js} +1 -1
  91. package/dist/web/_app/immutable/chunks/{DjmCCRoK.js → DDGvXH7D.js} +1 -1
  92. package/dist/web/_app/immutable/chunks/{DhUOgfgR.js → DGxjBBgc.js} +2 -2
  93. package/dist/web/_app/immutable/chunks/{BME5JXHO.js → DIjVvUkI.js} +1 -1
  94. package/dist/web/_app/immutable/chunks/{CypyklLr.js → DJJ3G70D.js} +1 -1
  95. package/dist/web/_app/immutable/chunks/{cuN5XjUH.js → DKotJLkU.js} +1 -1
  96. package/dist/web/_app/immutable/chunks/{D2KDjtf9.js → DU4VHSBM.js} +1 -1
  97. package/dist/web/_app/immutable/chunks/{DCrXivaw2.js → DbrXa1V62.js} +1 -1
  98. package/dist/web/_app/immutable/chunks/{DFjGiEbx2.js → DcYQcDrH2.js} +1 -1
  99. package/dist/web/_app/immutable/chunks/{BRoraic8.js → Dd3b5zAE.js} +2 -2
  100. package/dist/web/_app/immutable/chunks/{cg9eVoLO.js → DdVDf5xu.js} +1 -1
  101. package/dist/web/_app/immutable/chunks/{BUT2UiIX.js → DftarwxC.js} +1 -1
  102. package/dist/web/_app/immutable/chunks/DgF3ta9a.js +1 -0
  103. package/dist/web/_app/immutable/chunks/{Pc5_42cj.js → Dme6nqpX.js} +3 -3
  104. package/dist/web/_app/immutable/chunks/{BcK0Ez95.js → Dnh8R-L4.js} +1 -1
  105. package/dist/web/_app/immutable/chunks/{AyylXGSv2.js → DsLjiBTy2.js} +2 -2
  106. package/dist/web/_app/immutable/chunks/{2lP0otoc.js → Dtg0mY8S.js} +1 -1
  107. package/dist/web/_app/immutable/chunks/{D4WDOSTI.js → DzPoqIW3.js} +1 -1
  108. package/dist/web/_app/immutable/chunks/Kh-6DI1Z.js +1 -0
  109. package/dist/web/_app/immutable/chunks/{3HNH6GR3.js → QFgAlnjg.js} +1 -1
  110. package/dist/web/_app/immutable/chunks/{DSXnCWGk.js → bXA0LEtk.js} +1 -1
  111. package/dist/web/_app/immutable/chunks/{n2xzKaVS.js → c_0_3I7o.js} +1 -1
  112. package/dist/web/_app/immutable/chunks/{B9UyjBos2.js → e8-FLj6j2.js} +1 -1
  113. package/dist/web/_app/immutable/chunks/{B-gUYquP2.js → iERz5c4V2.js} +1 -1
  114. package/dist/web/_app/immutable/chunks/{C18dD2J-.js → ltIFKHeT.js} +1 -1
  115. package/dist/web/_app/immutable/chunks/{DmfQFTnb.js → opOSqe3M.js} +1 -1
  116. package/dist/web/_app/immutable/chunks/{uBQcaK0U.js → s3KhJbPc.js} +1 -1
  117. package/dist/web/_app/immutable/entry/{app.CdqoThtw.js → app.D5h04EVK.js} +2 -2
  118. package/dist/web/_app/immutable/entry/start.qaBR9PnG.js +1 -0
  119. package/dist/web/_app/immutable/nodes/{0.CDrYGZrF.js → 0.Uo_fpMxv.js} +2 -2
  120. package/dist/web/_app/immutable/nodes/{1.Db3GKNa_.js → 1.CNWAaSgM.js} +1 -1
  121. package/dist/web/_app/immutable/nodes/{10.BxX5374d.js → 10.CcrAJFX3.js} +1 -1
  122. package/dist/web/_app/immutable/nodes/{11.CaRo9tsl.js → 11.BpqEWp0v.js} +1 -1
  123. package/dist/web/_app/immutable/nodes/{12.BEE3skpI.js → 12.qOg-Rv20.js} +1 -1
  124. package/dist/web/_app/immutable/nodes/{13.Dzr1VXUT.js → 13.BOu1vBz9.js} +1 -1
  125. package/dist/web/_app/immutable/nodes/{15.DyByLaAI.js → 15.BS5-L-82.js} +1 -1
  126. package/dist/web/_app/immutable/nodes/{17.BbE6Ymxb.js → 17.C4R428bf.js} +1 -1
  127. package/dist/web/_app/immutable/nodes/{18.M8tlcB7i.js → 18.BTMNXp-p.js} +1 -1
  128. package/dist/web/_app/immutable/nodes/{2.D5mBiTdK.js → 2.B9o6EQbw.js} +4 -4
  129. package/dist/web/_app/immutable/nodes/{3.DpkHByUG.js → 3.BgHyHKnp.js} +3 -3
  130. package/dist/web/_app/immutable/nodes/{4.CED6FDPc.js → 4.PNVLzVyZ.js} +3 -3
  131. package/dist/web/_app/immutable/nodes/{5.h64blRxn.js → 5.C452eJJj.js} +1 -1
  132. package/dist/web/_app/immutable/nodes/6.lD-emq-Y.js +6 -0
  133. package/dist/web/_app/immutable/nodes/{7.DqvXtdXA.js → 7.BtJajjKA.js} +1 -1
  134. package/dist/web/_app/immutable/nodes/{8.BsTKfXV8.js → 8.CT5hirOF.js} +1 -1
  135. package/dist/web/_app/immutable/nodes/{9.BZqNZnO6.js → 9.jKfHATxg.js} +1 -1
  136. package/dist/web/_app/version.json +1 -1
  137. package/dist/web/index.html +13 -13
  138. package/package.json +6 -5
  139. package/dist/web/_app/immutable/assets/BulkActionsBar.uuv1XnDn.css +0 -1
  140. package/dist/web/_app/immutable/chunks/B4p_LX9w2.js +0 -66
  141. package/dist/web/_app/immutable/chunks/CUXamJaA.js +0 -1
  142. package/dist/web/_app/immutable/chunks/CkCX2Cbp2.js +0 -1
  143. package/dist/web/_app/immutable/chunks/Cn00Qj9G.js +0 -1
  144. package/dist/web/_app/immutable/chunks/MXBsawC4.js +0 -1
  145. package/dist/web/_app/immutable/chunks/d2Yb968P.js +0 -3
  146. package/dist/web/_app/immutable/entry/start.Fm1pGXR-.js +0 -1
  147. 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 '@mariozechner/pi-ai';
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":"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"}
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 { readFileSync } from 'node:fs';
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
- /** Soft wall-clock budget for the workspace reference scan. User-initiated
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
- const deadline = Date.now() + budgetMs;
57
- const patterns = rows.map(r => ({ assetId: r.assetId, pattern: `/api/assets/${r.assetId}/` }));
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
- let partial = false;
60
- const selfKey = `${repo}/${entityType}/${entityId}`;
61
- const scanText = (text) => {
62
- for (const p of patterns) {
63
- if (!referencedElsewhere.has(p.assetId) && text.includes(p.pattern)) {
64
- referencedElsewhere.add(p.assetId);
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":"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"}
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 '@mariozechner/pi-ai';
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("@mariozechner/pi-ai").AssistantMessageEventStream;
58
+ streamChat(context: Context, options?: SimpleStreamOptions): import("@earendil-works/pi-ai").AssistantMessageEventStream;
59
59
  private requireConfigOrNull;
60
60
  private runtimePath;
61
61
  private runStreamChat;