recappi 0.1.70 → 0.1.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1252,7 +1252,7 @@ function RecordingDetailView({
1252
1252
  scrollable ? " \xB7 \u2191\u2193 scroll" : "",
1253
1253
  ready ? " \xB7 " : "",
1254
1254
  `o open \xB7 d download \xB7 f finder`,
1255
- " \xB7 T re-transcribe",
1255
+ " \xB7 T re-transcribe \xB7 S re-summarize",
1256
1256
  item.activeTranscriptId ? " \xB7 t full" : "",
1257
1257
  links.webUrl ? " \xB7 w web" : "",
1258
1258
  " \xB7 esc back"
@@ -2004,6 +2004,7 @@ function AppShell({
2004
2004
  startRecordSetupPreview,
2005
2005
  transcribeRecordingArtifact,
2006
2006
  onRetranscribe,
2007
+ onResummarize,
2007
2008
  initialView = "overview",
2008
2009
  openUrl: openUrl2,
2009
2010
  copyText: copyText2,
@@ -2422,6 +2423,23 @@ function AppShell({
2422
2423
  },
2423
2424
  [onRetranscribe, refresh]
2424
2425
  );
2426
+ const resummarizeExistingRecording = useCallback(
2427
+ async (recordingId) => {
2428
+ if (!onResummarize) {
2429
+ setNotice("Re-summarize is not available in this CLI session.");
2430
+ return;
2431
+ }
2432
+ setNotice("Re-summarize started\u2026");
2433
+ try {
2434
+ await onResummarize(recordingId);
2435
+ setNotice("Re-summarize started \u2014 the summary will refresh shortly.");
2436
+ await refresh({ resetRecordings: true });
2437
+ } catch (error51) {
2438
+ setNotice(transcribeHandoffErrorCopy(error51));
2439
+ }
2440
+ },
2441
+ [onResummarize, refresh]
2442
+ );
2425
2443
  useEffect4(() => {
2426
2444
  if (liveRecord?.kind !== "stopped") return;
2427
2445
  const artifact = liveRecord.artifact;
@@ -2685,6 +2703,7 @@ function AppShell({
2685
2703
  const rec = recordings.find((r) => r.recordingId === screen.recordingId);
2686
2704
  const links = rec ? resolveRecordingLinks(rec.recordingId, rec.origin) : {};
2687
2705
  if (input === "T" && rec) void retranscribeExistingRecording(rec.recordingId);
2706
+ else if (input === "S" && rec) void resummarizeExistingRecording(rec.recordingId);
2688
2707
  else if (input === "t" && rec?.activeTranscriptId) void openTranscript(rec.activeTranscriptId);
2689
2708
  else if (input === "o" && rec) void runAudio(rec.recordingId, "open");
2690
2709
  else if (input === "d" && rec) void runAudio(rec.recordingId, "download");
@@ -2935,6 +2954,7 @@ async function runDashboard(deps) {
2935
2954
  startRecordSetupPreview: deps.startRecordSetupPreview,
2936
2955
  transcribeRecordingArtifact: deps.transcribeRecordingArtifact,
2937
2956
  onRetranscribe: deps.retranscribeRecording,
2957
+ onResummarize: deps.resummarizeRecording,
2938
2958
  initialView: deps.initialView ?? "overview",
2939
2959
  openUrl,
2940
2960
  copyText
@@ -18028,6 +18048,12 @@ var summaryStatusSchema = external_exports.enum([
18028
18048
  "failed",
18029
18049
  "skipped"
18030
18050
  ]);
18051
+ var recordingSummarizeDataSchema = external_exports.object({
18052
+ origin: external_exports.string(),
18053
+ recordingId: external_exports.string(),
18054
+ transcriptId: external_exports.string(),
18055
+ summaryStatus: summaryStatusSchema
18056
+ });
18031
18057
  var summaryActionItemSchema = external_exports.object({
18032
18058
  who: external_exports.string().optional(),
18033
18059
  what: external_exports.string()
@@ -19301,6 +19327,22 @@ var RecappiApiClient = class {
19301
19327
  }
19302
19328
  return result;
19303
19329
  }
19330
+ async summarizeRecording(opts) {
19331
+ const hasPrompt = Boolean(opts.prompt?.trim());
19332
+ const parsed = await this.postJson(
19333
+ `/api/recordings/${encodeURIComponent(opts.recordingId)}/summarize`,
19334
+ {
19335
+ ...hasPrompt ? { prompt: opts.prompt } : {},
19336
+ ...opts.model ? { model: opts.model } : {}
19337
+ }
19338
+ );
19339
+ return recordingSummarizeDataSchema.parse({
19340
+ origin: this.auth.origin,
19341
+ recordingId: opts.recordingId,
19342
+ transcriptId: parsed.transcriptId,
19343
+ summaryStatus: parsed.summaryStatus
19344
+ });
19345
+ }
19304
19346
  async downloadRecordingAudio(recordingId, opts = {}) {
19305
19347
  const response = await this.request(
19306
19348
  "GET",
@@ -20160,6 +20202,7 @@ var COMMON_TASKS = [
20160
20202
  { label: "Record audio + live captions", command: "recappi record --live" },
20161
20203
  { label: "Transcribe a local file", command: "recappi upload <file> --transcribe --wait" },
20162
20204
  { label: "Re-transcribe a recording", command: "recappi recordings retranscribe <recordingId> --wait" },
20205
+ { label: "Re-summarize a recording", command: "recappi recordings resummarize <recordingId>" },
20163
20206
  { label: "List / find recordings", command: "recappi recordings list" },
20164
20207
  { label: "Read a transcript", command: "recappi transcript get <transcriptId>" },
20165
20208
  { label: "Download / open audio", command: "recappi audio <recordingId> --open" },
@@ -20290,6 +20333,20 @@ var COMMAND_METADATA = {
20290
20333
  ],
20291
20334
  relatedCommands: ["jobs wait", "transcript get"]
20292
20335
  },
20336
+ "recordings resummarize": {
20337
+ capabilities: ["Retry or regenerate the summary for an existing recording", "Re-summarize with a custom prompt/model"],
20338
+ examples: [
20339
+ {
20340
+ description: "Retry summary generation for the active transcript",
20341
+ command: "recappi recordings resummarize <recordingId>"
20342
+ },
20343
+ {
20344
+ description: "Re-summarize with custom context",
20345
+ command: 'recappi recordings resummarize <recordingId> --prompt "focus on action items"'
20346
+ }
20347
+ ],
20348
+ relatedCommands: ["recordings get", "transcript get"]
20349
+ },
20293
20350
  "transcript get": {
20294
20351
  capabilities: ["Fetch a finished transcript by id"],
20295
20352
  examples: [{ description: "Fetch an existing transcript", command: "recappi transcript get <transcriptId>" }],
@@ -20850,6 +20907,24 @@ Next:
20850
20907
  opts.stdout(`
20851
20908
  Next:
20852
20909
  recappi jobs wait ${data.jobId}
20910
+ `);
20911
+ }
20912
+ return;
20913
+ }
20914
+ if (command === "recordings resummarize" && isRecord4(data)) {
20915
+ opts.stdout("Summary queued\n");
20916
+ if (typeof data.recordingId === "string") opts.stdout(` recordingId: ${data.recordingId}
20917
+ `);
20918
+ if (typeof data.transcriptId === "string") opts.stdout(` transcriptId: ${data.transcriptId}
20919
+ `);
20920
+ if (typeof data.summaryStatus === "string") {
20921
+ opts.stdout(` summaryStatus: ${data.summaryStatus}
20922
+ `);
20923
+ }
20924
+ if (typeof data.transcriptId === "string") {
20925
+ opts.stdout(`
20926
+ Next:
20927
+ recappi transcript get ${data.transcriptId}
20853
20928
  `);
20854
20929
  }
20855
20930
  return;
@@ -21308,6 +21383,7 @@ var COMMAND_DATA_SCHEMAS = {
21308
21383
  "recordings get": recordingDataSchema,
21309
21384
  "recordings list": recordingListDataSchema,
21310
21385
  "recordings retranscribe": recordingTranscribeDataSchema,
21386
+ "recordings resummarize": recordingSummarizeDataSchema,
21311
21387
  "jobs list": jobListDataSchema,
21312
21388
  "jobs wait": jobDataSchema,
21313
21389
  "transcript get": transcriptDataSchema
@@ -22812,6 +22888,7 @@ async function runCli(deps = {}) {
22812
22888
  return success2;
22813
22889
  },
22814
22890
  retranscribeRecording: (recordingId, options = {}) => client.transcribeRecording({ recordingId, ...options }),
22891
+ resummarizeRecording: (recordingId) => client.summarizeRecording({ recordingId }),
22815
22892
  initialView: parsed.initialView
22816
22893
  });
22817
22894
  return 0;
@@ -23020,6 +23097,15 @@ async function runCli(deps = {}) {
23020
23097
  renderSuccess("recordings retranscribe", data, render3);
23021
23098
  return 0;
23022
23099
  }
23100
+ if (parsed.kind === "recordings-resummarize") {
23101
+ const data = await client.summarizeRecording({
23102
+ recordingId: parsed.recordingId,
23103
+ prompt: parsed.prompt,
23104
+ model: parsed.model
23105
+ });
23106
+ renderSuccess("recordings resummarize", data, render3);
23107
+ return 0;
23108
+ }
23023
23109
  if (parsed.kind === "dashboard-stats") {
23024
23110
  const data = await client.dashboardStats();
23025
23111
  renderSuccess("dashboard stats", data, render3);
@@ -23321,7 +23407,7 @@ Agent mode:
23321
23407
  commandName: "dashboard stats"
23322
23408
  });
23323
23409
  });
23324
- const recordings = program.command("recordings").description("List, fetch, and re-transcribe recordings");
23410
+ const recordings = program.command("recordings").description("List, fetch, re-transcribe, and re-summarize recordings");
23325
23411
  addCommonOptions(recordings);
23326
23412
  const recordingsList = recordings.command("list").description("List recent recordings").option("--limit <n>", "number of recordings to show", parseLimitOption("--limit", 1, 100), 20).option("--cursor <cursor>", "pagination cursor", parseStringOption("--cursor")).option("--search <query>", "search recordings and transcripts", parseStringOption("--search")).addHelpText("after", commandMetadataHelpText("recordings list"));
23327
23413
  addCommonOptions(recordingsList);
@@ -23367,6 +23453,21 @@ Agent mode:
23367
23453
  });
23368
23454
  }
23369
23455
  );
23456
+ const recordingsResummarize = recordings.command("resummarize <recordingId>").description("Retry or regenerate the summary for an existing recording").option("--model <name>", "summary model", parseStringOption("--model")).option("--prompt <text>", "custom summary prompt/context", parseStringOption("--prompt")).addHelpText("after", commandMetadataHelpText("recordings resummarize"));
23457
+ addCommonOptions(recordingsResummarize);
23458
+ recordingsResummarize.action(
23459
+ (recordingId, _options, command) => {
23460
+ const opts = command.opts();
23461
+ onSelect({
23462
+ kind: "recordings-resummarize",
23463
+ options: collectGlobalOptions(command),
23464
+ commandName: "recordings resummarize",
23465
+ recordingId,
23466
+ ...typeof opts.model === "string" ? { model: opts.model } : {},
23467
+ ...typeof opts.prompt === "string" ? { prompt: opts.prompt } : {}
23468
+ });
23469
+ }
23470
+ );
23370
23471
  const transcript = program.command("transcript").description("Read transcripts (create via upload --transcribe or recordings retranscribe)").addHelpText(
23371
23472
  "after",
23372
23473
  `