fluncle 0.58.0 → 0.60.0

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 (2) hide show
  1. package/bin/fluncle.mjs +8 -61
  2. package/package.json +1 -1
package/bin/fluncle.mjs CHANGED
@@ -423,7 +423,7 @@ function parseVersion(version) {
423
423
  var currentVersion;
424
424
  var init_version = __esm(() => {
425
425
  init_output();
426
- currentVersion = "0.58.0".trim() ? "0.58.0".trim() : "0.1.0";
426
+ currentVersion = "0.60.0".trim() ? "0.60.0".trim() : "0.1.0";
427
427
  });
428
428
 
429
429
  // src/update-notifier.ts
@@ -1914,7 +1914,7 @@ function parseVersion2(version) {
1914
1914
  var currentVersion2, latestReleaseUrl = "https://api.github.com/repos/mauricekleine/fluncle/releases/latest";
1915
1915
  var init_version2 = __esm(() => {
1916
1916
  init_output();
1917
- currentVersion2 = "0.58.0".trim() ? "0.58.0".trim() : "0.1.0";
1917
+ currentVersion2 = "0.60.0".trim() ? "0.60.0".trim() : "0.1.0";
1918
1918
  });
1919
1919
 
1920
1920
  // src/commands/track.ts
@@ -2048,6 +2048,9 @@ async function trackObserveCommand(idOrLogId, options) {
2048
2048
  if (options.contextNote !== undefined) {
2049
2049
  body.contextNote = options.contextNote;
2050
2050
  }
2051
+ if (options.force) {
2052
+ body.force = true;
2053
+ }
2051
2054
  return adminApiPost(`/api/admin/tracks/${encodeURIComponent(idOrLogId)}/observe`, body);
2052
2055
  }
2053
2056
  async function trackContextCommand(idOrLogId, options = {}) {
@@ -2117,8 +2120,7 @@ __export(exports_admin_tracks, {
2117
2120
  enrichQueueCommand: () => enrichQueueCommand,
2118
2121
  contextQueueCommand: () => contextQueueCommand,
2119
2122
  backfillLastfmCommand: () => backfillLastfmCommand,
2120
- backfillDiscogsCommand: () => backfillDiscogsCommand,
2121
- backfillAlignmentCommand: () => backfillAlignmentCommand
2123
+ backfillDiscogsCommand: () => backfillDiscogsCommand
2122
2124
  });
2123
2125
  async function fetchAdminTracks(options) {
2124
2126
  const { hasContext, hasNote, hasObservation, hasVideo, max, order, status } = options;
@@ -2204,13 +2206,6 @@ async function backfillDiscogsCommand(limit, dryRun, cursor) {
2204
2206
  }
2205
2207
  return adminApiPost(`/api/admin/backfill/discogs?${params.toString()}`);
2206
2208
  }
2207
- async function backfillAlignmentCommand(limit, dryRun, cursor) {
2208
- const params = new URLSearchParams({ dryRun: String(dryRun), limit: String(limit) });
2209
- if (cursor) {
2210
- params.set("cursor", cursor);
2211
- }
2212
- return adminApiPost(`/api/admin/backfill/alignment?${params.toString()}`);
2213
- }
2214
2209
  async function vehiclesCommand(limit) {
2215
2210
  const tracks = await fetchAdminTracks({ hasVideo: true, max: limit, order: "desc" });
2216
2211
  return tracks.map((track) => ({
@@ -5522,7 +5517,7 @@ function addAdminCommands(program2) {
5522
5517
  const { previewArchiveUploadCommand: previewArchiveUploadCommand2 } = await Promise.resolve().then(() => (init_preview_archive(), exports_preview_archive));
5523
5518
  await runTrackPreviewArchive(idOrLogId, options, previewArchiveUploadCommand2);
5524
5519
  });
5525
- adminTrack.command("observe").description("Render Fluncle's spoken field observation for a track (ElevenLabs, Worker-side)").argument("[idOrLogId]").option("--queue", "Show the observe worklist (notes but no observation yet), oldest first", false).option("--limit <limit>", "Number of findings to show with --queue", "10").option("--script <text>", "The voice-gated observation script (the spoken text)").option("--script-file <file>", "Read the observation script from a file (e.g. observation.txt)").option("--voice-id <id>", "Override the configured ElevenLabs voice id").option("--model <model>", "TTS model (eleven_multilingual_v2 | eleven_v3)").option("--duration-ms <ms>", "Probed audio duration in ms (the agent runs ffprobe)").option("--duration-target-sec <sec>", "Target observation length in seconds (20\u201345)").option("--context-note <text>", "Pre-fetched factual context (else the Worker firecrawls)").option("--json", "Print JSON", false).allowExcessArguments().action(async (idOrLogId, options) => {
5520
+ adminTrack.command("observe").description("Render Fluncle's spoken field observation for a track (ElevenLabs, Worker-side)").argument("[idOrLogId]").option("--queue", "Show the observe worklist (notes but no observation yet), oldest first", false).option("--limit <limit>", "Number of findings to show with --queue", "10").option("--script <text>", "The voice-gated observation script (the spoken text)").option("--script-file <file>", "Read the observation script from a file (e.g. observation.txt)").option("--voice-id <id>", "Override the configured ElevenLabs voice id").option("--model <model>", "TTS model (eleven_multilingual_v2 | eleven_v3)").option("--duration-ms <ms>", "Probed audio duration in ms (the agent runs ffprobe)").option("--duration-target-sec <sec>", "Target observation length in seconds (20\u201345)").option("--context-note <text>", "Pre-fetched factual context (else the Worker firecrawls)").option("--force", "Re-render even if an observation already exists (voice re-tune / fix)", false).option("--json", "Print JSON", false).allowExcessArguments().action(async (idOrLogId, options) => {
5526
5521
  if (options.queue) {
5527
5522
  const { observeQueueCommand: observeQueueCommand2 } = await Promise.resolve().then(() => (init_admin_tracks(), exports_admin_tracks));
5528
5523
  await runAdminObserveQueue(options, observeQueueCommand2);
@@ -5668,10 +5663,6 @@ function addAdminCommands(program2) {
5668
5663
  const { backfillDiscogsCommand: backfillDiscogsCommand2 } = await Promise.resolve().then(() => (init_admin_tracks(), exports_admin_tracks));
5669
5664
  await runBackfillDiscogs(options, backfillDiscogsCommand2);
5670
5665
  });
5671
- backfill.command("alignment").description("Back-fill word-level caption timings for observations rendered before timestamps (no re-render)").option("--dry-run", "Report the eligible set but align nothing", false).option("--limit <limit>", "Max observations to align", "50").option("--json", "Print JSON", false).action(async (options) => {
5672
- const { backfillAlignmentCommand: backfillAlignmentCommand2 } = await Promise.resolve().then(() => (init_admin_tracks(), exports_admin_tracks));
5673
- await runBackfillAlignment(options, backfillAlignmentCommand2);
5674
- });
5675
5666
  }
5676
5667
  async function runTrackPreviewArchive(idOrLogId, options, previewArchiveUploadCommand2) {
5677
5668
  if (!idOrLogId || !options.file || !options.source || !options.mime) {
@@ -5708,6 +5699,7 @@ async function runTrackObserve(idOrLogId, options, trackObserveCommand2) {
5708
5699
  contextNote: options.contextNote,
5709
5700
  durationMs,
5710
5701
  durationTargetSec,
5702
+ force: options.force,
5711
5703
  model: options.model,
5712
5704
  script: script.trim(),
5713
5705
  voiceId: options.voiceId
@@ -5872,51 +5864,6 @@ async function runBackfillDiscogs(options, backfillDiscogsCommand2) {
5872
5864
  console.log(` ${item.logId}: release ${item.releaseId}${master}`);
5873
5865
  }
5874
5866
  }
5875
- async function runBackfillAlignment(options, backfillAlignmentCommand2) {
5876
- const limit = parseListLimit(options.limit);
5877
- const aligned = [];
5878
- const empty = [];
5879
- const failed = [];
5880
- let cursor;
5881
- let dryRun = options.dryRun;
5882
- while (aligned.length + empty.length + failed.length < limit) {
5883
- const remaining = limit - (aligned.length + empty.length + failed.length);
5884
- const result = await backfillAlignmentCommand2(remaining, options.dryRun, cursor);
5885
- dryRun = result.dryRun;
5886
- aligned.push(...result.aligned);
5887
- empty.push(...result.empty);
5888
- failed.push(...result.failed);
5889
- if (!options.json) {
5890
- const verb2 = result.dryRun ? "would align" : "aligned";
5891
- console.log(` \u2026${verb2} ${result.alignedCount}; ${result.emptyCount} empty; ${result.failedCount} failed`);
5892
- }
5893
- if (result.nextCursor === null) {
5894
- break;
5895
- }
5896
- cursor = result.nextCursor;
5897
- }
5898
- if (options.json) {
5899
- printJson({
5900
- aligned,
5901
- alignedCount: aligned.length,
5902
- dryRun,
5903
- empty,
5904
- emptyCount: empty.length,
5905
- failed,
5906
- failedCount: failed.length,
5907
- ok: true
5908
- });
5909
- return;
5910
- }
5911
- const verb = dryRun ? "Would align" : "Aligned";
5912
- console.log(`${verb} ${aligned.length} observation(s); ${empty.length} empty; ${failed.length} failed.`);
5913
- for (const logId of aligned) {
5914
- console.log(` ${logId}`);
5915
- }
5916
- for (const item of failed) {
5917
- console.log(` ${item.logId}: ${item.error}`);
5918
- }
5919
- }
5920
5867
  async function runTrackVideo(idOrLogId, options, trackVideoCommand2) {
5921
5868
  if (!idOrLogId) {
5922
5869
  throw new Error("Missing id. Usage: fluncle admin tracks video <track_id|log_id> (--dir <dir> | --footage <file> [--footage-social <file>] [--footage-silent <file>] [--poster <file>] [--cover <file>] [--note <file>] [--composition <file>] [--props <file>] [--render <file>])");
package/package.json CHANGED
@@ -31,5 +31,5 @@
31
31
  "url": "git+https://github.com/mauricekleine/fluncle.git"
32
32
  },
33
33
  "type": "module",
34
- "version": "0.58.0"
34
+ "version": "0.60.0"
35
35
  }