@alisio/plugin-reportforge 0.1.0 → 0.1.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/service.js CHANGED
@@ -15,6 +15,8 @@ import { initialReport, PALETTES } from "./types.js";
15
15
  export const MAX_SOURCES = 30;
16
16
  export const SOURCE_BUDGET = 3_000_000;
17
17
  const MAX_JOBS = 50;
18
+ /** Longest wait for a cancelled generation to stop before its report is deleted anyway. */
19
+ const CANCEL_WAIT_MS = 10_000;
18
20
  const str = (value, max = 4000) => (typeof value === "string" ? value.slice(0, max) : "");
19
21
  export function exportName(name) {
20
22
  const base = name
@@ -23,6 +25,13 @@ export function exportName(name) {
23
25
  .slice(0, 90);
24
26
  return `${base || "report"}.html`;
25
27
  }
28
+ /** A readable label: provider (and profile, when not the default) · model name. */
29
+ export function modelLabel(m) {
30
+ const provider = m.providerName || m.provider || "";
31
+ const profile = m.profile && m.profile !== "default" ? ` (${m.profile})` : "";
32
+ const name = m.model?.name || m.model?.id || m.reference;
33
+ return provider ? `${provider}${profile} · ${name}` : name;
34
+ }
26
35
  export function createService(deps) {
27
36
  const { api } = deps;
28
37
  const stores = new Map();
@@ -48,6 +57,15 @@ export function createService(deps) {
48
57
  }
49
58
  return pending;
50
59
  }
60
+ async function listModels() {
61
+ try {
62
+ const list = await api.models.list();
63
+ return Array.isArray(list) ? list.filter((m) => typeof m?.reference === "string") : [];
64
+ }
65
+ catch {
66
+ throw new Error("models_unavailable");
67
+ }
68
+ }
51
69
  function addSource(r, source) {
52
70
  if (r.sources.length >= MAX_SOURCES)
53
71
  throw new Error("too_many_sources");
@@ -78,18 +96,28 @@ export function createService(deps) {
78
96
  if (running.has(r.id))
79
97
  throw new Error("report_busy");
80
98
  const controller = new AbortController();
81
- running.set(r.id, controller);
82
99
  const job = { id: randomUUID(), reportId: r.id, status: "running" };
83
100
  rememberJob(job);
84
- void (async () => {
101
+ const done = (async () => {
85
102
  try {
86
103
  const result = await generate(sessionId, r, prompt || r.goal, controller.signal);
104
+ // A cancelled (or deleted) report never gets a late write.
105
+ controller.signal.throwIfAborted();
87
106
  const latest = await store.get(r.id);
107
+ controller.signal.throwIfAborted();
88
108
  if (latest.revision !== r.revision)
89
109
  throw new Error("revision_conflict");
90
- Object.assign(latest, result);
110
+ latest.title = result.title;
111
+ latest.subtitle = result.subtitle;
112
+ latest.eyebrow = result.eyebrow;
113
+ latest.summary = result.summary;
114
+ latest.blocks = result.blocks;
91
115
  bump(latest, prompt || "Generated");
92
116
  await store.put(latest);
117
+ if (result.dropped)
118
+ job.dropped = result.dropped;
119
+ if (result.modelFallback)
120
+ job.modelFallback = true;
93
121
  job.status = "succeeded";
94
122
  }
95
123
  catch (error) {
@@ -100,19 +128,15 @@ export function createService(deps) {
100
128
  running.delete(r.id);
101
129
  }
102
130
  })();
131
+ running.set(r.id, { controller, done });
103
132
  return job;
104
133
  }
105
134
  async function run(action, input, sessionId) {
106
135
  switch (action) {
107
136
  case "context":
108
137
  return { locale: api.options?.locale === "en" ? "en" : "es", palettes: PALETTES };
109
- case "models": {
110
- const models = await api.models.list();
111
- return models.map((m) => ({
112
- reference: m.reference,
113
- label: `${m.providerName} · ${m.model.name ?? m.reference}`,
114
- }));
115
- }
138
+ case "models":
139
+ return (await listModels()).map((m) => ({ reference: m.reference, label: modelLabel(m) }));
116
140
  case "jobs.get": {
117
141
  const job = jobs.get(str(input.jobId, 64));
118
142
  if (!job)
@@ -123,7 +147,7 @@ export function createService(deps) {
123
147
  const job = jobs.get(str(input.jobId, 64));
124
148
  if (!job)
125
149
  throw new Error("job_not_found");
126
- running.get(job.reportId)?.abort();
150
+ running.get(job.reportId)?.controller.abort();
127
151
  return { ...job };
128
152
  }
129
153
  }
@@ -132,6 +156,21 @@ export function createService(deps) {
132
156
  return store.list();
133
157
  if (action === "reports.create")
134
158
  return store.put(initialReport(input));
159
+ if (action === "reports.delete") {
160
+ const id = str(input.id, 64);
161
+ store.check(id);
162
+ const task = running.get(id);
163
+ if (task) {
164
+ // The user confirmed the deletion: stop the generation instead of refusing with `busy`.
165
+ task.controller.abort();
166
+ await Promise.race([
167
+ task.done,
168
+ new Promise((resolve) => setTimeout(resolve, CANCEL_WAIT_MS)),
169
+ ]);
170
+ }
171
+ await store.remove(id);
172
+ return { id, deleted: true };
173
+ }
135
174
  const r = await store.get(str(input.id, 64));
136
175
  switch (action) {
137
176
  case "reports.get":
@@ -158,8 +197,14 @@ export function createService(deps) {
158
197
  r.pageSize = input.pageSize;
159
198
  if (input.language === "es" || input.language === "en")
160
199
  r.language = input.language;
161
- if (typeof input.model === "string")
162
- r.model = input.model.slice(0, 256);
200
+ return store.put(r);
201
+ }
202
+ case "report.setModel": {
203
+ const model = str(input.model, 256);
204
+ if (model && !(await listModels()).some((m) => m.reference === model)) {
205
+ throw new Error("unknown_model");
206
+ }
207
+ r.model = model;
163
208
  return store.put(r);
164
209
  }
165
210
  case "report.fit": {
@@ -251,8 +296,8 @@ export function createService(deps) {
251
296
  run,
252
297
  busy: () => running.size > 0,
253
298
  dispose() {
254
- for (const controller of running.values())
255
- controller.abort();
299
+ for (const task of running.values())
300
+ task.controller.abort();
256
301
  running.clear();
257
302
  jobs.clear();
258
303
  stores.clear();
@@ -305,9 +350,13 @@ export const ACTIONS = {
305
350
  mode: { type: "string", enum: ["multipage", "singlepage"] },
306
351
  pageSize: { type: "string", enum: ["A4", "Letter"] },
307
352
  language: { type: "string", enum: ["es", "en"] },
308
- model: { type: "string", maxLength: 256 },
309
353
  }, ["id"]),
310
354
  },
355
+ "report.setModel": {
356
+ effect: "write",
357
+ inputSchema: object({ id, model: { type: "string", maxLength: 256 } }, ["id", "model"]),
358
+ },
359
+ "reports.delete": { effect: "write", inputSchema: object({ id }, ["id"]) },
311
360
  "report.fit": {
312
361
  effect: "write",
313
362
  inputSchema: object({
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
package/dist/store.d.ts CHANGED
@@ -10,9 +10,16 @@ export declare class Store {
10
10
  readonly root: string;
11
11
  constructor(root: string);
12
12
  init(): Promise<void>;
13
+ /** Throws `invalid_id` unless `id` is a report id. */
14
+ check(id: string): void;
13
15
  private file;
14
16
  list(): Promise<ReportSummary[]>;
15
17
  get(id: string): Promise<Report>;
16
18
  put(r: Report): Promise<Report>;
19
+ /**
20
+ * Deletes a report (its sources live in the same file). Only entries of this directory named by
21
+ * a valid id are touched, and a symbolic link is removed itself, never followed.
22
+ */
23
+ remove(id: string): Promise<void>;
17
24
  }
18
25
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAIzC,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,KAAK;IACJ,QAAQ,CAAC,IAAI,EAAE,MAAM;IAAjC,YAAqB,IAAI,EAAE,MAAM,EAAI;IAE/B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1B;IAED,OAAO,CAAC,IAAI;IAKN,IAAI,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAkBrC;IAEK,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOrC;IAEK,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWpC;CACF"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAOzC,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,KAAK;IACJ,QAAQ,CAAC,IAAI,EAAE,MAAM;IAAjC,YAAqB,IAAI,EAAE,MAAM,EAAI;IAE/B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAK1B;IAED,sDAAsD;IACtD,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEtB;IAED,OAAO,CAAC,IAAI;IAKN,IAAI,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAkBrC;IAEK,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOrC;IAEK,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWpC;IAED;;;OAGG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAatC;CACF"}
package/dist/store.js CHANGED
@@ -1,8 +1,15 @@
1
- /** One JSON file per report, written atomically (temporary file + rename) with private modes. */
1
+ /**
2
+ * One JSON file per report (sources included), written atomically (temporary file + rename) with
3
+ * private modes. Deleting renames the file out of the listing first, so a crash never leaves a
4
+ * half-deleted report visible; leftovers are swept on the next start.
5
+ */
2
6
  import { randomBytes } from "node:crypto";
3
- import { mkdir, readdir, readFile, rename, rm, writeFile } from "node:fs/promises";
7
+ import { lstat, mkdir, readdir, readFile, rename, rm, writeFile } from "node:fs/promises";
4
8
  import { join } from "node:path";
5
9
  const ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
10
+ const UUID = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
11
+ /** Our own leftovers: a deletion or a write interrupted by a crash. */
12
+ const LEFTOVER = new RegExp(`^${UUID}\\.json\\.[0-9a-f]{12}\\.(deleted|tmp)$`);
6
13
  export class Store {
7
14
  root;
8
15
  constructor(root) {
@@ -10,6 +17,14 @@ export class Store {
10
17
  }
11
18
  async init() {
12
19
  await mkdir(this.root, { recursive: true, mode: 0o700 });
20
+ for (const name of await readdir(this.root)) {
21
+ if (LEFTOVER.test(name))
22
+ await rm(join(this.root, name), { force: true }).catch(() => { });
23
+ }
24
+ }
25
+ /** Throws `invalid_id` unless `id` is a report id. */
26
+ check(id) {
27
+ this.file(id);
13
28
  }
14
29
  file(id) {
15
30
  if (typeof id !== "string" || !ID.test(id))
@@ -59,5 +74,26 @@ export class Store {
59
74
  }
60
75
  return r;
61
76
  }
77
+ /**
78
+ * Deletes a report (its sources live in the same file). Only entries of this directory named by
79
+ * a valid id are touched, and a symbolic link is removed itself, never followed.
80
+ */
81
+ async remove(id) {
82
+ const dest = this.file(id);
83
+ let info;
84
+ try {
85
+ info = await lstat(dest);
86
+ }
87
+ catch (error) {
88
+ if (error.code === "ENOENT")
89
+ throw new Error("report_not_found");
90
+ throw error;
91
+ }
92
+ if (info.isDirectory())
93
+ throw new Error("invalid_report");
94
+ const grave = `${dest}.${randomBytes(6).toString("hex")}.deleted`;
95
+ await rename(dest, grave);
96
+ await rm(grave, { force: true });
97
+ }
62
98
  }
63
99
  //# sourceMappingURL=store.js.map
package/dist/store.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/dist/ui.html CHANGED
@@ -6,11 +6,11 @@
6
6
  <title>ReportForge</title>
7
7
  <style>
8
8
  :root{font-family:Inter,system-ui,'Segoe UI',sans-serif;color:#e8edf9;background:#0b1020;--line:#29314d;--soft:#141b30;--accent:#8f75f8}*{box-sizing:border-box}body{margin:0}button,input,select,textarea{font:inherit}button{cursor:pointer}button:disabled{opacity:.5;cursor:not-allowed}.shell{display:grid;grid-template-columns:235px minmax(0,1fr);min-height:100vh}.side{padding:24px 16px;background:#10162a;border-right:1px solid var(--line)}.brand{font-weight:850;font-size:22px;letter-spacing:-.04em}.brand b{color:#b9a7ff}.side p{color:#8592ad;font-size:12px;line-height:1.5}.nav{margin-top:34px;display:grid;gap:8px}.nav button{text-align:left;background:transparent;border:0;color:#b9c4e0;padding:13px 12px;border-radius:11px}.nav button.current,.nav button:hover{background:#252a49;color:white}.content{padding:30px;min-width:0}.top{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:25px}.top h1{font-size:25px;margin:0;letter-spacing:-.04em}.top small{color:#929bb3}.primary{background:#8871f8;color:#fff;border:0;border-radius:10px;padding:11px 17px;font-weight:750}.secondary{background:#1b2541;color:#d7dff5;border:1px solid #354064;border-radius:10px;padding:11px 17px}.muted{color:#96a3c2}.grid{display:grid;grid-template-columns: minmax(280px,410px) minmax(0,1fr);gap:22px}.panel{background:var(--soft);border:1px solid var(--line);border-radius:17px;padding:22px;min-width:0}.panel h2{font-size:17px;margin:0 0 18px}.field{display:grid;gap:7px;margin-bottom:15px}.field label{font-size:12px;color:#b3bdd6;font-weight:700}input,select,textarea{width:100%;background:#0c1428;color:#f0f2ff;border:1px solid #323e5b;border-radius:9px;padding:11px;outline:none}input:focus,select:focus,textarea:focus{border-color:#9382fa}textarea{resize:vertical;min-height:80px}.stephead{display:flex;gap:8px;align-items:center;margin-bottom:18px}.step{background:#25304c;color:#a8b6d1;border-radius:99px;padding:7px 12px;font-size:11px;font-weight:700}.step.active{background:#6f5fd3;color:white}.palettes{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.palette{border:1px solid #3c4660;border-radius:11px;padding:8px;background:#0e172c;color:#cbd2e3;text-align:left}.palette.selected{outline:2px solid #c4b8ff}.palette i{display:block;height:18px;border-radius:5px;margin-bottom:8px}.palette span{font-size:10px}.help{font-size:12px;color:#97a4bd;line-height:1.55}.preview{border-radius:13px;overflow:hidden;background:#e6ecf3;height:67vh;min-height:500px}.preview iframe{border:0;width:100%;height:100%;background:white}.toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:15px}.toolbar>*{flex-shrink:0}.list{display:grid;gap:10px}.list button{background:#19223a;border:1px solid #35405f;color:#e6eaff;text-align:left;border-radius:12px;padding:16px}.list small{color:#96a2bf}.notice{border-left:3px solid #9685ff;background:#262445;border-radius:4px;padding:12px;font-size:12px;color:#d6d2ff;margin:14px 0}.hidden{display:none!important}.error{color:#ffbcb8;font-size:12px;white-space:pre-wrap}.actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:16px}.formrow{display:grid;grid-template-columns:1fr 1fr;gap:12px}@media(max-width:1100px){.shell{grid-template-columns:1fr}.side{display:none}.grid{grid-template-columns:1fr}.content{padding:14px}}@media(max-width:650px){.formrow{grid-template-columns:1fr}.palettes{grid-template-columns:repeat(2,1fr)}.top{align-items:start}.preview{height:55vh}}
9
- .measure{position:absolute;left:-10000px;top:0;width:1200px;height:800px;border:0;visibility:hidden}.fitnote{font-size:12px;color:#c9d2ea;margin:8px 0 0}.fitnote.warn{color:#ffd59a}.banner{background:#3b1d2a;border:1px solid #7a3550;color:#ffd6e0;border-radius:10px;padding:14px;margin-bottom:16px}.srcrow{display:flex;justify-content:space-between;gap:8px;align-items:center;background:#19223a;border:1px solid #35405f;border-radius:10px;padding:8px 10px}.srcrow small{overflow-wrap:anywhere}.link{background:none;border:0;color:#b9a7ff;padding:4px;text-decoration:underline}.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}</style>
9
+ .measure{position:absolute;left:-10000px;top:0;width:1200px;height:800px;border:0;visibility:hidden}.fitnote{font-size:12px;color:#c9d2ea;margin:8px 0 0}.fitnote.warn{color:#ffd59a}.banner{background:#3b1d2a;border:1px solid #7a3550;color:#ffd6e0;border-radius:10px;padding:14px;margin-bottom:16px}.srcrow{display:flex;justify-content:space-between;gap:8px;align-items:center;background:#19223a;border:1px solid #35405f;border-radius:10px;padding:8px 10px}.srcrow small{overflow-wrap:anywhere}.link{background:none;border:0;color:#b9a7ff;padding:4px;text-decoration:underline}.reportrow{display:flex;gap:8px;align-items:stretch}.reportrow>button:first-child{flex:1}.list .rowdel{background:transparent;border:1px solid #5a3346;color:#ffb8c8;padding:0 14px;text-align:center}.danger{background:#a8324f;color:#fff;border:0;border-radius:10px;padding:11px 17px;font-weight:750}.confirm{position:fixed;inset:0;background:rgba(5,8,18,.72);display:grid;place-items:center;z-index:10;padding:16px}.confirm .panel{max-width:440px}.brand{display:flex;align-items:center;gap:10px}.logo{display:inline-flex;width:30px;height:30px;flex:none;border-radius:7px;box-shadow:0 0 0 1px #343f66}.logo svg{width:30px;height:30px;display:block}.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}</style>
10
10
  </head>
11
11
  <body>
12
12
  <div class="shell">
13
- <aside class="side"><div class="brand">◈ Report<b>Forge</b></div><p data-i="tagline">Reports that impress, data that explains.</p>
13
+ <aside class="side"><div class="brand"><span class="logo" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="30" height="30" aria-hidden="true" focusable="false"><g transform="scale(4)"><defs><linearGradient id="rf-brand-g" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#7F54F9"/><stop offset="1" stop-color="#06C8E8"/></linearGradient></defs><rect width="128" height="128" rx="28" fill="#10162B"/><path d="M35 23h43l18 18v63H35a10 10 0 0 1-10-10V33a10 10 0 0 1 10-10Z" fill="#FFFFFF"/><path d="M78 23v18h18" fill="#C7B4FF"/><path d="M40 51h30" stroke="#9DA8C5" stroke-width="6" stroke-linecap="round"/><rect x="41" y="78" width="10" height="14" rx="3" fill="#7F54F9"/><rect x="56" y="66" width="10" height="26" rx="3" fill="#4B77E4"/><rect x="71" y="57" width="10" height="35" rx="3" fill="#06C8E8"/><path d="M40 47h36" stroke="#DCE3F4" stroke-width="3"/></g></svg></span><span>Report<b>Forge</b></span></div><p data-i="tagline">Reports that impress, data that explains.</p>
14
14
  <nav class="nav"><button type="button" class="current" id="navReports">▤ <span data-i="reports">My reports</span></button><button type="button" id="navCreate">✦ <span data-i="new">New report</span></button></nav></aside>
15
15
  <main class="content">
16
16
  <header class="top"><div><h1 id="heading">ReportForge</h1><small data-i="subheading">Editorial report studio</small></div><button type="button" class="primary" id="newTop">+ <span data-i="new">New report</span></button></header>
@@ -21,7 +21,7 @@
21
21
  <div class="field"><label for="name" data-i="name">Report name</label><input id="name" maxlength="120" data-ip="namePh" placeholder="Q4 strategy report"></div>
22
22
  <div class="formrow"><div class="field"><label for="type" data-i="type">Report type</label><select id="type"></select></div>
23
23
  <div class="field"><label for="language" data-i="language">Report language</label><select id="language"><option value="es">Español</option><option value="en">English</option></select></div></div>
24
- <div class="field"><label for="model" data-i="model">Alisio model</label><select id="model"><option value="" data-i="defaultModel">Default model</option></select></div>
24
+ <div class="field"><label for="model" data-i="model">Alisio model</label><select id="model"><option value="">Alisio default model</option></select><p id="modelsNote" class="help" role="status"></p></div>
25
25
  <div class="field"><label for="creativity" data-i="creativity">Creative freedom</label><select id="creativity"><option value="strict" data-i="strict">Conservative · evidence only</option><option value="balanced" data-i="balanced" selected>Balanced · recommended</option><option value="bold" data-i="bold">Bold · experimental design</option></select></div>
26
26
  <div class="field"><label for="goal" data-i="goal">Goal and intended decisions</label><textarea id="goal" data-ip="goalPh" placeholder="What should the reader understand and decide?"></textarea></div>
27
27
  <div class="field"><label for="context" data-i="context">Additional context</label><textarea id="context" data-ip="contextPh" placeholder="Company, period, audience, constraints…"></textarea></div>
@@ -35,9 +35,10 @@
35
35
  <label class="sr" for="columns" data-i="columns">Columns</label><select style="width:95px" id="columns"><option value="1">1 col.</option><option value="2">2 col.</option><option value="3">3 col.</option></select>
36
36
  <label class="sr" for="pageSize" data-i="pageSize">Page size</label><select style="width:125px" id="pageSize"><option value="A4">A4</option><option value="Letter">Letter</option></select>
37
37
  <label class="sr" for="mode" data-i="layout">Layout</label><select style="width:165px" id="mode"><option value="multipage" data-i="multipage">Multiple pages</option><option value="singlepage" data-i="singlepage">Fit to one page</option></select>
38
- <button type="button" class="secondary" id="exportHtml" data-i="exportHtml">↓ HTML</button><button type="button" class="primary" id="printPdf" data-i="print">PDF / Print</button></div>
38
+ <button type="button" class="secondary" id="exportHtml" data-i="exportHtml">↓ HTML</button><button type="button" class="primary" id="printPdf" data-i="print">PDF / Print</button><button type="button" class="secondary" id="deleteReport" data-i="deleteReport">Delete report</button></div>
39
39
  <p id="fitNote" class="fitnote" role="status" aria-live="polite"></p>
40
40
  <div class="grid"><div class="panel"><h2 id="docTitle">—</h2><p class="help" id="docMeta"></p>
41
+ <div class="field"><label for="editModel" data-i="editModel">Model for the next generation</label><select id="editModel"><option value="">Alisio default model</option></select><p id="modelNote" class="fitnote warn" role="status" aria-live="polite"></p></div>
41
42
  <div class="field"><label for="file" data-i="sources">Information sources</label><input id="file" type="file" multiple accept=".csv,.txt,.md,.json,.html,.xlsx,.docx,.pdf"></div>
42
43
  <div id="sources" class="list"></div>
43
44
  <div class="field" style="margin-top:14px"><label for="sourceUrl" data-i="url">Public web page (HTTPS)</label><input id="sourceUrl" type="url" placeholder="https://example.org/report"></div>
@@ -54,6 +55,7 @@
54
55
  <div class="field" style="margin-top:24px"><label for="revisionPrompt" data-i="editPrompt">Request a change</label><textarea id="revisionPrompt" data-ip="revisionPh" placeholder="Make the conclusion clearer, compare by quarter…"></textarea></div>
55
56
  <button type="button" class="secondary" id="revise" data-i="modify">Apply change</button></div>
56
57
  <div class="panel"><h2 data-i="preview">Preview</h2><div class="preview"><iframe id="frame" title="Report preview" sandbox="allow-same-origin allow-modals"></iframe></div></div></div></section>
58
+ <div id="confirmBox" class="confirm hidden" role="alertdialog" aria-modal="true" aria-labelledby="confirmText"><div class="panel"><p id="confirmText"></p><div class="actions"><button type="button" class="secondary" id="confirmCancel" data-i="cancel">Cancel</button><button type="button" class="danger" id="confirmDelete" data-i="delete">Delete</button></div></div></div>
57
59
  <iframe id="measure" class="measure" title="Layout measurement" aria-hidden="true" tabindex="-1" sandbox="allow-same-origin"></iframe>
58
60
  </main></div>
59
61
  <script nonce="__ALISIO_NONCE__">
@@ -65,7 +67,13 @@ const DICT = {
65
67
  en: {
66
68
  tagline: "Reports that impress, data that explains.", subheading: "Editorial report studio",
67
69
  reports: "My reports", new: "New report", name: "Report name", namePh: "Q4 strategy report",
68
- type: "Report type", language: "Report language", model: "Alisio model", defaultModel: "Default model",
70
+ type: "Report type", language: "Report language", model: "Alisio model", defaultModel: "Alisio default model",
71
+ editModel: "Model for the next generation", modelGone: "The model {model} is no longer available; the Alisio default model will be used.",
72
+ modelsFailed: "Could not list the Alisio models; the Alisio default model will be used.",
73
+ modelsEmpty: "No models are configured in Alisio (/connect); the Alisio default model will be used.",
74
+ deleteReport: "Delete report", delete: "Delete",
75
+ confirmDelete: "Delete “{name}”? Its sources and history are removed too. This cannot be undone.",
76
+ dropped: "{n} invalid components were left out.", modelFallback: "The report's model is no longer available; the Alisio default model was used.",
69
77
  creativity: "Creative freedom", strict: "Conservative · evidence only", balanced: "Balanced · recommended",
70
78
  bold: "Bold · experimental design", goal: "Goal and intended decisions",
71
79
  goalPh: "What should the reader understand and decide?", context: "Additional context",
@@ -97,7 +105,15 @@ const DICT = {
97
105
  url_not_html: "That page is not HTML.", url_too_large: "That page is larger than 2 MB.",
98
106
  url_no_extractable_text: "No readable text was found on that page.", report_busy: "This report is already being generated.",
99
107
  generation_malformed: "The model's answer could not be read. Try again or choose another model.",
100
- generation_too_large: "The model's answer was too large.", generation_incomplete: "The model did not finish. Try again.",
108
+ generation_too_large: "The model's answer was too large.",
109
+ generation_truncated: "The model's answer was cut off (too long). Try again; ReportForge will ask for a more compact report.",
110
+ generation_unreadable: "The model's answer did not contain a readable report. Try again or choose another model.",
111
+ generation_invalid_structure: "The model returned a report without enough valid components. Try again or choose another model.",
112
+ generation_incomplete: "The model did not finish answering (timeout or interrupted session). Try again.",
113
+ generation_model_error: "The model provider returned an error. Check the model connection in Alisio or choose another model.",
114
+ unknown_model: "That model is not available in Alisio. Choose another one.",
115
+ models_unavailable: "Could not list the Alisio models. Try again in a moment.",
116
+ report_not_found: "That report no longer exists.",
101
117
  revision_conflict: "The report changed while generating. Generate again.", invalid_chart_data: "Chart data must be labels and numbers of equal length (at most 35).",
102
118
  request_timeout: "No answer from Alisio.", invalid_json: "The chart data is not valid JSON.",
103
119
  },
@@ -105,7 +121,13 @@ const DICT = {
105
121
  es: {
106
122
  tagline: "Informes que impresionan, datos que explican.", subheading: "Estudio de informes editoriales",
107
123
  reports: "Mis informes", new: "Nuevo informe", name: "Nombre del informe", namePh: "Informe estratégico T4",
108
- type: "Tipo de informe", language: "Idioma del informe", model: "Modelo de Alisio", defaultModel: "Modelo predeterminado",
124
+ type: "Tipo de informe", language: "Idioma del informe", model: "Modelo de Alisio", defaultModel: "Modelo predeterminado de Alisio",
125
+ editModel: "Modelo para la próxima generación", modelGone: "El modelo {model} ya no está disponible; se usará el Modelo predeterminado de Alisio.",
126
+ modelsFailed: "No se pudieron listar los modelos de Alisio; se usará el Modelo predeterminado de Alisio.",
127
+ modelsEmpty: "No hay modelos configurados en Alisio (/connect); se usará el Modelo predeterminado de Alisio.",
128
+ deleteReport: "Borrar informe", delete: "Borrar",
129
+ confirmDelete: "¿Borrar «{name}»? También se eliminan sus fuentes y su historial. No se puede deshacer.",
130
+ dropped: "Se omitieron {n} componentes no válidos.", modelFallback: "El modelo del informe ya no está disponible; se usó el Modelo predeterminado de Alisio.",
109
131
  creativity: "Libertad creativa", strict: "Conservadora · solo evidencia", balanced: "Equilibrada · recomendada",
110
132
  bold: "Audaz · diseño experimental", goal: "Objetivo y decisiones esperadas",
111
133
  goalPh: "¿Qué debe comprender y decidir el lector?", context: "Contexto adicional",
@@ -137,7 +159,15 @@ const DICT = {
137
159
  url_not_html: "Esa página no es HTML.", url_too_large: "Esa página supera los 2 MB.",
138
160
  url_no_extractable_text: "No se encontró texto legible en esa página.", report_busy: "Este informe ya se está generando.",
139
161
  generation_malformed: "No se pudo leer la respuesta del modelo. Inténtalo de nuevo o elige otro modelo.",
140
- generation_too_large: "La respuesta del modelo era demasiado grande.", generation_incomplete: "El modelo no terminó. Inténtalo de nuevo.",
162
+ generation_too_large: "La respuesta del modelo era demasiado grande.",
163
+ generation_truncated: "La respuesta del modelo quedó incompleta (demasiado larga). Inténtalo de nuevo; ReportForge pedirá un informe más compacto.",
164
+ generation_unreadable: "La respuesta del modelo no contenía un informe legible. Inténtalo de nuevo o elige otro modelo.",
165
+ generation_invalid_structure: "El modelo devolvió un informe sin suficientes componentes válidos. Inténtalo de nuevo o elige otro modelo.",
166
+ generation_incomplete: "El modelo no terminó de responder (tiempo agotado o sesión interrumpida). Inténtalo de nuevo.",
167
+ generation_model_error: "El proveedor del modelo devolvió un error. Revisa la conexión del modelo en Alisio o elige otro modelo.",
168
+ unknown_model: "Ese modelo no está disponible en Alisio. Elige otro.",
169
+ models_unavailable: "No se pudieron listar los modelos de Alisio. Inténtalo de nuevo en un momento.",
170
+ report_not_found: "Ese informe ya no existe.",
141
171
  revision_conflict: "El informe cambió durante la generación. Genera de nuevo.", invalid_chart_data: "Los datos deben ser etiquetas y números de igual longitud (máximo 35).",
142
172
  request_timeout: "Alisio no respondió.", invalid_json: "Los datos del gráfico no son JSON válido.",
143
173
  },
@@ -149,7 +179,7 @@ const MAX_IN_FLIGHT = 6;
149
179
  const RESPONSE_GUARD_MS = 11 * 60 * 1000;
150
180
  const POLL_MS = 1000;
151
181
 
152
- const state = { locale: "en", palettes: [], current: null, html: "", job: null, visible: true };
182
+ const state = { locale: "en", palettes: [], current: null, html: "", job: null, visible: true, models: [], modelsStatus: "ok", deleting: null };
153
183
  const t = (key) => DICT[state.locale][key] ?? DICT.en[key] ?? key;
154
184
  const fill = (text, values) => text.replace(/\{(\w+)\}/g, (_, k) => String(values[k] ?? ""));
155
185
 
@@ -248,6 +278,7 @@ function localize() {
248
278
  $("audience").value = t("audienceDefault");
249
279
  }
250
280
  $("language").value = state.locale;
281
+ renderModels();
251
282
  }
252
283
  function option(value, label) {
253
284
  const node = document.createElement("option");
@@ -255,6 +286,38 @@ function option(value, label) {
255
286
  node.textContent = label;
256
287
  return node;
257
288
  }
289
+ /** Fills a model select: the Alisio default first, then the listed models (and `extra`, if any). */
290
+ function fillModels(select, selected, extra) {
291
+ const options = [option("", t("defaultModel")), ...state.models.map((m) => option(m.reference, m.label || m.reference))];
292
+ if (extra) options.push(option(extra, extra));
293
+ select.replaceChildren(...options);
294
+ select.value = [...select.options].some((o) => o.value === selected) ? selected : "";
295
+ }
296
+ function catalogNote() {
297
+ return state.modelsStatus === "failed" ? t("modelsFailed") : state.modelsStatus === "empty" ? t("modelsEmpty") : "";
298
+ }
299
+ function renderModels() {
300
+ fillModels($("model"), $("model").value);
301
+ $("modelsNote").textContent = catalogNote();
302
+ const r = state.current;
303
+ if (!r) return;
304
+ const stored = r.model || "";
305
+ const listed = !stored || state.models.some((m) => m.reference === stored);
306
+ // A stored model we cannot check (listing failed) stays visible; a model that is gone does not.
307
+ fillModels($("editModel"), stored, !listed && state.modelsStatus === "failed" ? stored : "");
308
+ $("modelNote").textContent = !listed && state.modelsStatus !== "failed" ? fill(t("modelGone"), { model: stored }) : catalogNote();
309
+ }
310
+ function askDelete(id, name) {
311
+ state.deleting = id;
312
+ $("confirmText").textContent = fill(t("confirmDelete"), { name });
313
+ $("confirmBox").classList.remove("hidden");
314
+ $("confirmCancel").focus?.();
315
+ }
316
+ function closeConfirm() {
317
+ state.deleting = null;
318
+ $("confirmBox").classList.add("hidden");
319
+ }
320
+
258
321
  function renderPalettes() {
259
322
  const box = $("palettes");
260
323
  box.replaceChildren();
@@ -287,10 +350,15 @@ async function init() {
287
350
  const context = await call("context");
288
351
  state.palettes = Array.isArray(context?.palettes) ? context.palettes : [];
289
352
  renderPalettes();
290
- const models = await call("models").catch(() => []);
291
- for (const m of Array.isArray(models) ? models : []) {
292
- if (m?.reference) $("model").append(option(m.reference, m.label || m.reference));
353
+ try {
354
+ const models = await call("models");
355
+ state.models = (Array.isArray(models) ? models : []).filter((m) => typeof m?.reference === "string" && m.reference);
356
+ state.modelsStatus = state.models.length ? "ok" : "empty";
357
+ } catch {
358
+ state.models = [];
359
+ state.modelsStatus = "failed";
293
360
  }
361
+ renderModels();
294
362
  await listing();
295
363
  } catch (error) {
296
364
  showError(error);
@@ -313,7 +381,17 @@ async function listing() {
313
381
  const date = new Date(r.updatedAt);
314
382
  button.textContent = `${r.name} · ${t("types")[r.type] ?? r.type} · ${Number.isNaN(date.getTime()) ? "" : date.toLocaleDateString(state.locale)}`;
315
383
  button.onclick = () => openReport(r.id).catch(showError);
316
- list.append(button);
384
+ const remove = document.createElement("button");
385
+ remove.type = "button";
386
+ remove.className = "rowdel";
387
+ remove.dataset.delete = r.id;
388
+ remove.textContent = t("delete");
389
+ remove.setAttribute("aria-label", `${t("deleteReport")}: ${r.name}`);
390
+ remove.onclick = () => askDelete(r.id, r.name);
391
+ const row = document.createElement("div");
392
+ row.className = "reportrow";
393
+ row.append(button, remove);
394
+ list.append(row);
317
395
  }
318
396
  }
319
397
 
@@ -327,6 +405,7 @@ async function openReport(id) {
327
405
  $("columns").value = String(r.columns);
328
406
  $("pageSize").value = r.pageSize;
329
407
  $("mode").value = r.mode;
408
+ renderModels();
330
409
  const select = $("blockSelect");
331
410
  select.replaceChildren(option("", "—"), ...r.blocks.map((b, i) => option(b.id, `${i + 1}. ${b.title || b.label || b.type}`)));
332
411
  $("blockData").value = "";
@@ -442,7 +521,10 @@ async function work(action, prompt) {
442
521
  const status = await call("jobs.get", { jobId: job.id });
443
522
  if (status.status === "running") continue;
444
523
  if (status.status === "succeeded") {
445
- $("jobState").textContent = t("done");
524
+ const notes = [t("done")];
525
+ if (Number(status.dropped) > 0) notes.push(fill(t("dropped"), { n: Number(status.dropped) }));
526
+ if (status.modelFallback) notes.push(t("modelFallback"));
527
+ $("jobState").textContent = notes.join(" ");
446
528
  await openReport(r.id);
447
529
  } else if (status.status === "cancelled") {
448
530
  $("jobState").textContent = t("cancelled");
@@ -544,6 +626,36 @@ $("addUrl").onclick = async () => {
544
626
  showError(error);
545
627
  }
546
628
  };
629
+ $("editModel").onchange = async () => {
630
+ const r = state.current;
631
+ if (!r) return;
632
+ try {
633
+ await call("report.setModel", { id: r.id, model: $("editModel").value });
634
+ await openReport(r.id);
635
+ } catch (error) {
636
+ showError(error);
637
+ renderModels();
638
+ }
639
+ };
640
+ $("deleteReport").onclick = () => {
641
+ if (state.current) askDelete(state.current.id, state.current.name);
642
+ };
643
+ $("confirmCancel").onclick = closeConfirm;
644
+ $("confirmDelete").onclick = async () => {
645
+ const id = state.deleting;
646
+ closeConfirm();
647
+ if (!id) return;
648
+ try {
649
+ await call("reports.delete", { id });
650
+ if (state.current?.id === id) state.current = null;
651
+ await listing();
652
+ } catch (error) {
653
+ showError(error);
654
+ }
655
+ };
656
+ document.addEventListener("keydown", (event) => {
657
+ if (event.key === "Escape" && state.deleting) closeConfirm();
658
+ });
547
659
  $("generate").onclick = () => work("report.generate", "");
548
660
  $("revise").onclick = () => work("report.revise", $("revisionPrompt").value);
549
661
  $("cancelJob").onclick = () => {
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.1.0";
1
+ export declare const VERSION = "0.1.1";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  // Updated by scripts/sync-versions.mjs.
2
- export const VERSION = "0.1.0";
2
+ export const VERSION = "0.1.1";
3
3
  //# sourceMappingURL=version.js.map