fluncle 0.240.0 → 0.242.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 +229 -11
  2. package/package.json +1 -1
package/bin/fluncle.mjs CHANGED
@@ -622,7 +622,7 @@ function parseVersion(version) {
622
622
  var currentVersion;
623
623
  var init_version = __esm(() => {
624
624
  init_output();
625
- currentVersion = "0.240.0".trim() ? "0.240.0".trim() : "0.1.0";
625
+ currentVersion = "0.242.0".trim() ? "0.242.0".trim() : "0.1.0";
626
626
  });
627
627
 
628
628
  // src/update-notifier.ts
@@ -2335,7 +2335,7 @@ function parseVersion2(version) {
2335
2335
  var currentVersion2, latestReleaseUrl = "https://api.github.com/repos/mauricekleine/fluncle/releases/latest";
2336
2336
  var init_version2 = __esm(() => {
2337
2337
  init_output();
2338
- currentVersion2 = "0.240.0".trim() ? "0.240.0".trim() : "0.1.0";
2338
+ currentVersion2 = "0.242.0".trim() ? "0.242.0".trim() : "0.1.0";
2339
2339
  });
2340
2340
 
2341
2341
  // ../../packages/registry/src/index.ts
@@ -3967,7 +3967,7 @@ var init_src = __esm(() => {
3967
3967
  ],
3968
3968
  kind: "cron",
3969
3969
  name: "cron.funnel-snapshot",
3970
- operatorNotes: "23:45 UTC daily (end of the UTC day the snapshot is keyed on). A bare trigger (the reach/anchor shape): fires the AGENT-tier record_catalogue_snapshot op once — the Worker computes every stage total + queue depth + frontier count through the SAME predicates the sweeps run (lib/server/funnel.ts) and UPSERTS one idempotent row per UTC day (a same-day re-run overwrites, never doubles a bar). Zero LLM tokens; the box's agent token drives it and calls the oRPC HTTP endpoint directly (no new CLI command the pinned box CLI would lack), so no new secret. Source: docs/agents/hermes/scripts/funnel-snapshot-sweep.*. See docs/admin-shell.md.",
3970
+ operatorNotes: "23:45 UTC daily (end of the UTC day the snapshot is keyed on), with a retry slot at 23:57 UTC still inside that day. A bare trigger (the reach/anchor shape): fires the AGENT-tier record_catalogue_snapshot op once — the Worker computes every stage total + queue depth + frontier count through the SAME predicates the sweeps run (lib/server/funnel.ts) and UPSERTS one idempotent row per UTC day (a same-day re-run overwrites, never doubles a bar). A missed day cannot be recomputed later, so the tick is defended three ways: an in-tick retry ladder for a transient Worker fault, the second timer slot for a database-admission yield, and the Worker's catch-up grace window for a box that slept through the slot (it fills a missing previous day and names it as backfilledDays). Zero LLM tokens; the box's agent token drives it and calls the oRPC HTTP endpoint directly (no new CLI command the pinned box CLI would lack), so no new secret. Source: docs/agents/hermes/scripts/funnel-snapshot-sweep.*. See docs/admin-shell.md.",
3971
3971
  probeConfig: {
3972
3972
  cadenceMs: 24 * 60 * MINUTE_MS,
3973
3973
  cronName: "fluncle-funnel-snapshot",
@@ -11435,7 +11435,7 @@ var init_admin_bios = __esm(() => {
11435
11435
  });
11436
11436
 
11437
11437
  // ../../packages/contracts/src/orpc/admin-catalogue.ts
11438
- var CatalogueLensSchema, CapturePriorityReasonSchema, CatalogueMatchSchema, CatalogueTrackItemSchema, CatalogueSummarySchema, listCatalogueTracks, rankCatalogue, recordDemand, clearWrongAudio, requeueUnmatchedCaptures, requeueAnchor, requeueIsrcRecovery, flagWrongAudio, forceCapture, certifyTrack, setTrackDismissed, CaptureVerifyItemSchema, listUnverifiedCaptures, verifyCapture, CrawlPassSchema, CrawlPhaseInitializationSchema, MAX_CRAWL_PREPARE_LIMIT = 6, CrawlPhaseInputSchema, CrawlPhaseOutputSchema, CrawlStatusSchema, crawlCatalogue, getCrawlStatus, ANCHOR_CANDIDATE_LIMIT = 100, ANCHOR_ARTIST_LIMIT = 20, ANCHOR_TEXT_MAX = 300, ANCHOR_ISRC_MAX = 64, ANCHOR_ID_MAX = 64, ANCHOR_URL_MAX = 2048, AnchorCandidateSchema, anchorTrack, DEEZER_CANDIDATE_LIMIT = 5, DEEZER_TEXT_MAX = 300, DEEZER_ISRC_MAX = 64, DEEZER_TRACK_ID_MAX = 32, DeezerIsrcCandidateSchema, resolveAnchor, resolveAnchorReview, setAnchorSearch, setAnchorApify, CaptureBudgetStateSchema, getCaptureBudget, setCaptureBudget, SpotifyAnchorBreakerStateSchema, AnchorRungFlagsSchema, getSpotifyAnchorBreaker, resetSpotifyAnchorBreaker, AppleBreakerStateSchema, resetAppleBreaker, adminCatalogueContract;
11438
+ var CatalogueLensSchema, CapturePriorityReasonSchema, CatalogueMatchSchema, CatalogueTrackItemSchema, CatalogueSummarySchema, listCatalogueTracks, rankCatalogue, recordDemand, clearWrongAudio, requeueUnmatchedCaptures, requeueAnchor, requeueIsrcRecovery, flagWrongAudio, forceCapture, certifyTrack, setTrackDismissed, CaptureVerifyItemSchema, listUnverifiedCaptures, verifyCapture, CrawlPassSchema, CrawlPhaseInitializationSchema, MAX_CRAWL_PREPARE_LIMIT = 6, CrawlFetchPlanSchema, SuppliedCrawlBodySchema, MAX_CRAWL_COMMIT_BATCH, CRAWL_COMMIT_TOKEN_MAX_BYTES, CRAWL_COMMIT_BATCH_MAX_TOTAL_BYTES, CrawlCommitItemSchema, CrawlCommitReceiptSchema, CrawlPhaseCapabilitiesSchema, CrawlPhaseInputSchema, CrawlPhaseOutputSchema, CrawlStatusSchema, crawlCatalogue, commitCrawlNodes, getCrawlStatus, ANCHOR_CANDIDATE_LIMIT = 100, ANCHOR_ARTIST_LIMIT = 20, ANCHOR_TEXT_MAX = 300, ANCHOR_ISRC_MAX = 64, ANCHOR_ID_MAX = 64, ANCHOR_URL_MAX = 2048, AnchorCandidateSchema, anchorTrack, DEEZER_CANDIDATE_LIMIT = 5, DEEZER_TEXT_MAX = 300, DEEZER_ISRC_MAX = 64, DEEZER_TRACK_ID_MAX = 32, DeezerIsrcCandidateSchema, resolveAnchor, resolveAnchorReview, setAnchorSearch, setAnchorApify, CaptureBudgetStateSchema, getCaptureBudget, setCaptureBudget, SpotifyAnchorBreakerStateSchema, AnchorRungFlagsSchema, getSpotifyAnchorBreaker, resetSpotifyAnchorBreaker, AppleBreakerStateSchema, resetAppleBreaker, adminCatalogueContract;
11439
11439
  var init_admin_catalogue = __esm(() => {
11440
11440
  init_dist3();
11441
11441
  init_zod();
@@ -11677,6 +11677,53 @@ var init_admin_catalogue = __esm(() => {
11677
11677
  seeded: number2(),
11678
11678
  seedsRearmed: number2()
11679
11679
  });
11680
+ CrawlFetchPlanSchema = discriminatedUnion("kind", [
11681
+ object({ kind: literal("none") }),
11682
+ object({ kind: literal("single"), url: string2().max(2048) }),
11683
+ object({
11684
+ countField: literal("release-count"),
11685
+ kind: literal("tail"),
11686
+ pageSize: number2().int().positive(),
11687
+ pageUrlTemplate: string2().max(2048),
11688
+ probeUrl: string2().max(2048)
11689
+ })
11690
+ ]);
11691
+ SuppliedCrawlBodySchema = object({
11692
+ body: json().optional(),
11693
+ outcome: _enum(["body", "empty", "invalid", "oversize", "throttled"]),
11694
+ url: string2().max(2048)
11695
+ });
11696
+ MAX_CRAWL_COMMIT_BATCH = MAX_CRAWL_PREPARE_LIMIT;
11697
+ CRAWL_COMMIT_TOKEN_MAX_BYTES = 2 * 1024 * 1024;
11698
+ CRAWL_COMMIT_BATCH_MAX_TOTAL_BYTES = 8 * 1024 * 1024;
11699
+ CrawlCommitItemSchema = strictObject({
11700
+ commitToken: string2().max(CRAWL_COMMIT_TOKEN_MAX_BYTES),
11701
+ operationId: literal("catalogue.crawl"),
11702
+ operationKey: string2().max(128),
11703
+ requestDigest: string2().regex(/^[0-9a-f]{64}$/)
11704
+ });
11705
+ CrawlCommitReceiptSchema = object({
11706
+ elapsedMs: number2().int().min(0).optional(),
11707
+ error: string2().max(500).optional(),
11708
+ operationKey: string2().max(128),
11709
+ outcome: _enum([
11710
+ "committed",
11711
+ "conflict",
11712
+ "failed",
11713
+ "in-progress",
11714
+ "lookup-failed",
11715
+ "rejected",
11716
+ "safely-retryable"
11717
+ ]),
11718
+ replayed: boolean2(),
11719
+ result: json().optional(),
11720
+ resultIdentity: string2().optional(),
11721
+ state: _enum(["accepted", "committed", "rejected"]).optional()
11722
+ }).meta({ id: "CrawlCommitReceipt" });
11723
+ CrawlPhaseCapabilitiesSchema = strictObject({
11724
+ commitBatchLimit: number2().int().min(1).max(MAX_CRAWL_COMMIT_BATCH),
11725
+ commitBatchMaxTotalBytes: number2().int().min(1)
11726
+ });
11680
11727
  CrawlPhaseInputSchema = discriminatedUnion("phase", [
11681
11728
  object({ phase: literal("initialize") }),
11682
11729
  object({
@@ -11684,7 +11731,11 @@ var init_admin_catalogue = __esm(() => {
11684
11731
  maxHop: number2().int().min(0).max(3).default(2),
11685
11732
  phase: literal("prepare")
11686
11733
  }),
11687
- object({ phase: literal("fetch"), preparedToken: string2().max(2 * 1024 * 1024) }),
11734
+ object({
11735
+ phase: literal("fetch"),
11736
+ preparedToken: string2().max(2 * 1024 * 1024),
11737
+ supplied: array(SuppliedCrawlBodySchema).max(2).optional()
11738
+ }),
11688
11739
  object({
11689
11740
  commitToken: string2().max(2 * 1024 * 1024),
11690
11741
  operationId: literal("catalogue.crawl"),
@@ -11701,9 +11752,15 @@ var init_admin_catalogue = __esm(() => {
11701
11752
  phase: literal("initialize")
11702
11753
  }),
11703
11754
  object({
11755
+ boxFetch: boolean2(),
11756
+ capabilities: CrawlPhaseCapabilitiesSchema.optional(),
11704
11757
  frontierPending: number2(),
11705
11758
  initialization: CrawlPhaseInitializationSchema,
11706
- items: array(object({ nodeId: string2(), preparedToken: string2() })).max(MAX_CRAWL_PREPARE_LIMIT),
11759
+ items: array(object({
11760
+ fetchPlan: CrawlFetchPlanSchema,
11761
+ nodeId: string2(),
11762
+ preparedToken: string2()
11763
+ })).max(MAX_CRAWL_PREPARE_LIMIT),
11707
11764
  kind: _enum(["drained", "prepared", "unavailable"]),
11708
11765
  ok: literal(true),
11709
11766
  phase: literal("prepare")
@@ -11714,6 +11771,7 @@ var init_admin_catalogue = __esm(() => {
11714
11771
  operationId: literal("catalogue.crawl"),
11715
11772
  operationKey: string2(),
11716
11773
  phase: literal("fetch"),
11774
+ rateLimited: boolean2().optional(),
11717
11775
  requestDigest: string2()
11718
11776
  }),
11719
11777
  object({
@@ -11751,7 +11809,9 @@ var init_admin_catalogue = __esm(() => {
11751
11809
  }),
11752
11810
  labelsUndecided: number2(),
11753
11811
  seedLabels: array(string2()),
11754
- storablePending: number2()
11812
+ storablePending: number2(),
11813
+ undecidedLabelsQueued: number2(),
11814
+ unstorablePending: number2()
11755
11815
  }).meta({ id: "CrawlStatus" });
11756
11816
  crawlCatalogue = oc.route({
11757
11817
  inputStructure: "detailed",
@@ -11768,6 +11828,19 @@ var init_admin_catalogue = __esm(() => {
11768
11828
  maxHop: string2().optional()
11769
11829
  })
11770
11830
  })).output(union([CrawlPassSchema.extend({ ok: literal(true) }), CrawlPhaseOutputSchema]));
11831
+ commitCrawlNodes = oc.route({
11832
+ method: "POST",
11833
+ operationId: "commitCrawlNodes",
11834
+ path: "/admin/catalogue/crawl/commits",
11835
+ summary: "Commit one claim's fetched crawl nodes in a single admitted phase",
11836
+ tags: ["Admin"]
11837
+ }).input(strictObject({
11838
+ items: array(CrawlCommitItemSchema).min(1).max(MAX_CRAWL_COMMIT_BATCH)
11839
+ })).output(strictObject({
11840
+ deferred: number2().int().min(0),
11841
+ ok: literal(true),
11842
+ receipts: array(CrawlCommitReceiptSchema).max(MAX_CRAWL_COMMIT_BATCH)
11843
+ }));
11771
11844
  getCrawlStatus = oc.route({
11772
11845
  method: "GET",
11773
11846
  operationId: "getCrawlStatus",
@@ -11947,6 +12020,7 @@ var init_admin_catalogue = __esm(() => {
11947
12020
  anchor_track: anchorTrack,
11948
12021
  certify_track: certifyTrack,
11949
12022
  clear_wrong_audio: clearWrongAudio,
12023
+ commit_crawl_nodes: commitCrawlNodes,
11950
12024
  crawl_catalogue: crawlCatalogue,
11951
12025
  flag_wrong_audio: flagWrongAudio,
11952
12026
  force_capture: forceCapture,
@@ -13118,7 +13192,7 @@ var init_admin_frontier = __esm(() => {
13118
13192
  });
13119
13193
 
13120
13194
  // ../../packages/contracts/src/orpc/admin-funnel.ts
13121
- var FunnelStagesSchema, FunnelQueuesSchema, FunnelLiveQueuesSchema, PublicSurfaceCountsSchema, FunnelMetersSchema, CatalogueSnapshotRowSchema, recordCatalogueSnapshot, getFunnel, adminFunnelContract;
13195
+ var FunnelStagesSchema, FunnelQueuesSchema, FunnelLiveQueuesSchema, PublicSurfaceCountsSchema, CaptureBacklogSchema, FunnelMetersSchema, CatalogueSnapshotRowSchema, recordCatalogueSnapshot, getFunnel, adminFunnelContract;
13122
13196
  var init_admin_funnel = __esm(() => {
13123
13197
  init_dist3();
13124
13198
  init_zod();
@@ -13149,6 +13223,16 @@ var init_admin_funnel = __esm(() => {
13149
13223
  labels: number2().int(),
13150
13224
  tracks: number2().int()
13151
13225
  }).meta({ id: "PublicSurfaceCounts" });
13226
+ CaptureBacklogSchema = object({
13227
+ authorized: number2().int(),
13228
+ authorizedAnchored: number2().int(),
13229
+ budgetOpen: boolean2(),
13230
+ tiers: array(object({
13231
+ anchored: number2().int(),
13232
+ tier: number2().int(),
13233
+ unanchored: number2().int()
13234
+ }))
13235
+ }).meta({ id: "CaptureBacklog" });
13152
13236
  FunnelMetersSchema = object({
13153
13237
  anchorBackoff: number2().int(),
13154
13238
  captureBudget: object({
@@ -13187,7 +13271,11 @@ var init_admin_funnel = __esm(() => {
13187
13271
  path: "/admin/funnel/snapshot",
13188
13272
  summary: "Record today's catalogue-funnel snapshot (idempotent per UTC day)",
13189
13273
  tags: ["Admin"]
13190
- }).input(object({})).output(object({ ok: literal(true), snapshot: CatalogueSnapshotRowSchema }));
13274
+ }).input(object({})).output(object({
13275
+ backfilledDays: array(string2()),
13276
+ ok: literal(true),
13277
+ snapshot: CatalogueSnapshotRowSchema
13278
+ }));
13191
13279
  getFunnel = oc.route({
13192
13280
  method: "GET",
13193
13281
  operationId: "getFunnel",
@@ -13196,6 +13284,7 @@ var init_admin_funnel = __esm(() => {
13196
13284
  tags: ["Admin"]
13197
13285
  }).input(object({ windowDays: string2().optional() })).output(object({
13198
13286
  live: object({
13287
+ captureBacklog: CaptureBacklogSchema,
13199
13288
  meters: FunnelMetersSchema,
13200
13289
  publicSurfaces: PublicSurfaceCountsSchema,
13201
13290
  queues: FunnelLiveQueuesSchema,
@@ -14549,7 +14638,7 @@ var init_admin_tokens = __esm(() => {
14549
14638
  });
14550
14639
 
14551
14640
  // ../../packages/contracts/src/orpc/admin-tracks.ts
14552
- var UpdateTrackBodySchema, ObserveTrackBodySchema, ContextTrackBodySchema, NoteTrackBodySchema, NoteEchoSchema, PresignVideoUploadsBodySchema, FinalizeVideoBodySchema, VideoUploadSchema, updateTrack, CaptureReconciliationKindSchema, CaptureExternalResultSchema, CaptureReceiptCoordinatesSchema, CapturePreparedTrackSchema, CaptureCommittedReceiptResultSchema, CaptureRejectedReceiptResultSchema, prepareTrackCapture, authorizeTrackCapture, commitTrackCapture, observeTrack, contextTrack, noteTrack, presignTrackVideoUploads, finalizeTrackVideo, requeueVideo, purgeVideo, PublishTrackResultSchema, getTrackAdmin, listTracksAdmin, TrackWorkKindSchema, TrackWorkScopeSchema, TrackWorkItemSchema, listTrackWork, publishTrack, MixOrderStopSchema, getMixableOrder, adminTracksContract;
14641
+ var UpdateTrackBodySchema, ObserveTrackBodySchema, ContextTrackBodySchema, NoteTrackBodySchema, NoteEchoSchema, PresignVideoUploadsBodySchema, FinalizeVideoBodySchema, VideoUploadSchema, updateTrack, CaptureReconciliationKindSchema, CaptureExternalResultSchema, CaptureReceiptCoordinatesSchema, CapturePreparedTrackSchema, CaptureCommittedReceiptResultSchema, CaptureRejectedReceiptResultSchema, prepareTrackCapture, authorizeTrackCapture, commitTrackCapture, MAX_CAPTURE_PREPARE_BATCH = 12, MAX_CAPTURE_COMMIT_BATCH = 6, MAX_EMBEDDING_WRITE_BATCH = 6, EMBEDDING_DIMENSIONS = 1024, TrackWorkCapabilitiesSchema, ItemElapsedMsSchema, CapturePreparedItemSchema, prepareTrackCaptures, CaptureCommitReceiptSchema, commitTrackCaptures, updateTrackEmbeddings, observeTrack, contextTrack, noteTrack, presignTrackVideoUploads, finalizeTrackVideo, requeueVideo, purgeVideo, PublishTrackResultSchema, getTrackAdmin, listTracksAdmin, TrackWorkKindSchema, TrackWorkScopeSchema, TrackWorkItemSchema, listTrackWork, publishTrack, MixOrderStopSchema, getMixableOrder, adminTracksContract;
14553
14642
  var init_admin_tracks = __esm(() => {
14554
14643
  init_dist3();
14555
14644
  init_zod();
@@ -14692,6 +14781,7 @@ var init_admin_tracks = __esm(() => {
14692
14781
  });
14693
14782
  CapturePreparedTrackSchema = strictObject({
14694
14783
  analyzedFrom: _enum(["full", "preview"]).optional(),
14784
+ anchored: boolean2().optional(),
14695
14785
  artists: array(string2().max(512)).max(64),
14696
14786
  bpm: number2().optional(),
14697
14787
  certified: boolean2(),
@@ -14790,6 +14880,100 @@ var init_admin_tracks = __esm(() => {
14790
14880
  replayed: boolean2()
14791
14881
  })
14792
14882
  ]));
14883
+ TrackWorkCapabilitiesSchema = strictObject({
14884
+ commitTrackCaptures: number2().int().min(1).max(MAX_CAPTURE_COMMIT_BATCH).optional(),
14885
+ prepareTrackCaptures: number2().int().min(1).max(MAX_CAPTURE_PREPARE_BATCH).optional(),
14886
+ updateTrackEmbeddings: number2().int().min(1).max(MAX_EMBEDDING_WRITE_BATCH).optional()
14887
+ });
14888
+ ItemElapsedMsSchema = number2().int().min(0).optional();
14889
+ CapturePreparedItemSchema = union([
14890
+ strictObject({
14891
+ elapsedMs: ItemElapsedMsSchema,
14892
+ prepared: literal(false),
14893
+ reason: _enum(["deferred", "ineligible", "not-found", "stale"]),
14894
+ trackId: string2().min(1).max(256)
14895
+ }),
14896
+ strictObject({
14897
+ elapsedMs: ItemElapsedMsSchema,
14898
+ prepared: literal(true),
14899
+ snapshotToken: string2().min(1).max(65536),
14900
+ track: CapturePreparedTrackSchema,
14901
+ trackId: string2().min(1).max(256)
14902
+ })
14903
+ ]);
14904
+ prepareTrackCaptures = oc.route({
14905
+ method: "POST",
14906
+ operationId: "prepareTrackCaptures",
14907
+ path: "/admin/tracks/captures/prepare",
14908
+ summary: "Prepare a batch of capture reconciliation snapshots in one admitted phase",
14909
+ tags: ["Admin"]
14910
+ }).input(strictObject({
14911
+ items: array(strictObject({
14912
+ kind: CaptureReconciliationKindSchema,
14913
+ priorSnapshotToken: string2().min(1).max(65536).optional(),
14914
+ trackId: string2().min(1).max(256)
14915
+ })).min(1).max(MAX_CAPTURE_PREPARE_BATCH),
14916
+ reservedThisTick: number2().int().min(0).max(1e4).optional()
14917
+ })).output(strictObject({
14918
+ deferred: number2().int().min(0),
14919
+ ok: literal(true),
14920
+ reserved: number2().int().min(0),
14921
+ results: array(CapturePreparedItemSchema).max(MAX_CAPTURE_PREPARE_BATCH)
14922
+ }));
14923
+ CaptureCommitReceiptSchema = object({
14924
+ elapsedMs: ItemElapsedMsSchema,
14925
+ error: string2().max(500).optional(),
14926
+ outcome: _enum([
14927
+ "committed",
14928
+ "conflict",
14929
+ "failed",
14930
+ "in-progress",
14931
+ "lookup-failed",
14932
+ "rejected",
14933
+ "safely-retryable"
14934
+ ]),
14935
+ replayed: boolean2(),
14936
+ result: union([CaptureCommittedReceiptResultSchema, CaptureRejectedReceiptResultSchema]).optional(),
14937
+ trackId: string2().min(1).max(256)
14938
+ }).meta({ id: "CaptureCommitReceipt" });
14939
+ commitTrackCaptures = oc.route({
14940
+ method: "POST",
14941
+ operationId: "commitTrackCaptures",
14942
+ path: "/admin/tracks/captures/commit",
14943
+ summary: "Commit a batch of prepared capture results in one admitted phase",
14944
+ tags: ["Admin"]
14945
+ }).input(strictObject({
14946
+ items: array(CaptureReceiptCoordinatesSchema.extend({
14947
+ commitToken: string2().min(1).max(65536),
14948
+ trackId: string2().min(1).max(256)
14949
+ })).min(1).max(MAX_CAPTURE_COMMIT_BATCH)
14950
+ })).output(strictObject({
14951
+ deferred: number2().int().min(0),
14952
+ ok: literal(true),
14953
+ receipts: array(CaptureCommitReceiptSchema).max(MAX_CAPTURE_COMMIT_BATCH)
14954
+ }));
14955
+ updateTrackEmbeddings = oc.route({
14956
+ method: "POST",
14957
+ operationId: "updateTrackEmbeddings",
14958
+ path: "/admin/tracks/embeddings",
14959
+ summary: "Write a batch of audio embeddings in one admitted phase",
14960
+ tags: ["Admin"]
14961
+ }).input(strictObject({
14962
+ items: array(strictObject({
14963
+ embedding: array(number2()).length(EMBEDDING_DIMENSIONS),
14964
+ trackId: string2().min(1).max(256)
14965
+ })).min(1).max(MAX_EMBEDDING_WRITE_BATCH)
14966
+ })).output(strictObject({
14967
+ deferred: number2().int().min(0),
14968
+ ok: literal(true),
14969
+ results: array(strictObject({
14970
+ elapsedMs: ItemElapsedMsSchema,
14971
+ error: string2().max(500).optional(),
14972
+ fields: array(string2()).optional(),
14973
+ outcome: _enum(["deferred", "failed", "updated"]),
14974
+ trackId: string2().min(1).max(256)
14975
+ })).max(MAX_EMBEDDING_WRITE_BATCH)
14976
+ }));
14793
14977
  observeTrack = oc.route({
14794
14978
  method: "POST",
14795
14979
  operationId: "observeTrack",
@@ -14987,6 +15171,7 @@ var init_admin_tracks = __esm(() => {
14987
15171
  limit: number3().int().min(1).max(250).default(50),
14988
15172
  scope: TrackWorkScopeSchema.default("all")
14989
15173
  })).output(object({
15174
+ capabilities: TrackWorkCapabilitiesSchema.optional(),
14990
15175
  ok: literal(true),
14991
15176
  queued: number2().optional(),
14992
15177
  tracks: array(TrackWorkItemSchema)
@@ -15027,6 +15212,7 @@ var init_admin_tracks = __esm(() => {
15027
15212
  adminTracksContract = {
15028
15213
  authorize_track_capture: authorizeTrackCapture,
15029
15214
  commit_track_capture: commitTrackCapture,
15215
+ commit_track_captures: commitTrackCaptures,
15030
15216
  context_track: contextTrack,
15031
15217
  finalize_track_video: finalizeTrackVideo,
15032
15218
  get_mixable_order: getMixableOrder,
@@ -15036,11 +15222,13 @@ var init_admin_tracks = __esm(() => {
15036
15222
  note_track: noteTrack,
15037
15223
  observe_track: observeTrack,
15038
15224
  prepare_track_capture: prepareTrackCapture,
15225
+ prepare_track_captures: prepareTrackCaptures,
15039
15226
  presign_track_video_uploads: presignTrackVideoUploads,
15040
15227
  publish_track: publishTrack,
15041
15228
  purge_video: purgeVideo,
15042
15229
  requeue_video: requeueVideo,
15043
- update_track: updateTrack
15230
+ update_track: updateTrack,
15231
+ update_track_embeddings: updateTrackEmbeddings
15044
15232
  };
15045
15233
  });
15046
15234
 
@@ -17140,6 +17328,15 @@ async function mixableOrderCommand(logIds, seed) {
17140
17328
  }
17141
17329
  return adminApiGet(`/api/v1/admin/tracks/mixable-order?${params.toString()}`);
17142
17330
  }
17331
+ async function prepareTrackCapturesCommand(body) {
17332
+ return adminApiPost("/api/v1/admin/tracks/captures/prepare", body);
17333
+ }
17334
+ async function commitTrackCapturesCommand(body) {
17335
+ return adminApiPost("/api/v1/admin/tracks/captures/commit", body);
17336
+ }
17337
+ async function updateTrackEmbeddingsCommand(body) {
17338
+ return adminApiPost("/api/v1/admin/tracks/embeddings", body);
17339
+ }
17143
17340
  var pageSize3 = 48;
17144
17341
  var init_admin_tracks2 = __esm(() => {
17145
17342
  init_api();
@@ -18586,6 +18783,9 @@ async function crawlCatalogueCommand(limit, maxHop, dryRun) {
18586
18783
  async function crawlCataloguePhaseCommand(body) {
18587
18784
  return adminApiPost("/api/v1/admin/catalogue/crawl", body);
18588
18785
  }
18786
+ async function commitCrawlNodesCommand(body) {
18787
+ return adminApiPost("/api/v1/admin/catalogue/crawl/commits", body);
18788
+ }
18589
18789
  async function crawlStatusCommand() {
18590
18790
  return adminApiGet("/api/v1/admin/catalogue/crawl");
18591
18791
  }
@@ -21732,6 +21932,18 @@ JSON field reference:
21732
21932
  await Promise.resolve().then(() => init_admin_tracks2());
21733
21933
  await runAdminTrackWork(options, trackWorkCommand);
21734
21934
  });
21935
+ adminTracks.command("prepare-captures").description("Freeze a batch of capture snapshots in one admitted phase").requiredOption("--file <path>", "JSON file holding the batch body ({ items: [...] })").option("--json", "Print JSON", false).action(async (options) => {
21936
+ await Promise.resolve().then(() => init_admin_tracks2());
21937
+ printJson(await prepareTrackCapturesCommand(JSON.parse(readFileSync6(options.file, "utf8"))));
21938
+ });
21939
+ adminTracks.command("commit-captures").description("Commit a batch of prepared capture results in one admitted phase").requiredOption("--file <path>", "JSON file holding the batch body ({ items: [...] })").option("--json", "Print JSON", false).action(async (options) => {
21940
+ await Promise.resolve().then(() => init_admin_tracks2());
21941
+ printJson(await commitTrackCapturesCommand(JSON.parse(readFileSync6(options.file, "utf8"))));
21942
+ });
21943
+ adminTracks.command("update-embeddings").description("Write a batch of audio embeddings in one admitted phase").requiredOption("--file <path>", "JSON file holding the batch body ({ items: [...] })").option("--json", "Print JSON", false).action(async (options) => {
21944
+ await Promise.resolve().then(() => init_admin_tracks2());
21945
+ printJson(await updateTrackEmbeddingsCommand(JSON.parse(readFileSync6(options.file, "utf8"))));
21946
+ });
21735
21947
  adminTracks.command("requeue-analysis").description("Re-queue findings whose BPM/key are preview-grade (dry-run; --apply to flip)").option("--apply", "Actually flip statuses (default is a dry-run preview)", false).option("--limit <limit>", "Cap the archive walk (default: the whole archive)").option("--json", "Print JSON", false).action(async (options) => {
21736
21948
  await Promise.resolve().then(() => init_admin_tracks2());
21737
21949
  await runAdminRequeueAnalysis(options, requeueAnalysisCommand);
@@ -22322,6 +22534,11 @@ JSON field reference:
22322
22534
  }
22323
22535
  await runCrawlCatalogue(options, crawlCatalogueCommand);
22324
22536
  });
22537
+ catalogue.command("commit-nodes").description("Commit one claim's fetched crawl nodes in a single admitted phase").requiredOption("--file <path>", "JSON file holding the batch body ({ items: [...] })").option("--json", "Print JSON", false).action(async (options) => {
22538
+ await Promise.resolve().then(() => init_admin_catalogue2());
22539
+ const body = JSON.parse(readFileSync6(options.file, "utf8"));
22540
+ printJson(await commitCrawlNodesCommand(body));
22541
+ });
22325
22542
  catalogue.command("status").description("The crawl frontier's state, the catalogue's size, and the seed set").option("--json", "Print JSON", false).action(async (options) => {
22326
22543
  await Promise.resolve().then(() => init_admin_catalogue2());
22327
22544
  await runCrawlStatus(options, crawlStatusCommand);
@@ -22963,6 +23180,7 @@ async function runCrawlStatus(options, crawlStatusCommand) {
22963
23180
  console.log(`Catalogue: ${result.catalogueTracks} uncertified track(s); ${result.anchorsPending} awaiting a Spotify anchor.`);
22964
23181
  console.log(`Frontier: ${frontier.pending} pending, ${frontier.done} done, ${frontier.failed} failed, ${frontier.skipped} skipped (${frontierByKind.label} label, ${frontierByKind.artist} artist, ${frontierByKind.release} release).`);
22965
23182
  console.log(`Ready to write: ${result.storablePending} storable release node(s) claimable now.`);
23183
+ console.log(`Held by the storage gate: ${result.unstorablePending} claimable release node(s) \u2014 ${result.undecidedLabelsQueued} undecided label(s) hold queued work.`);
22966
23184
  console.log(`Seeds (${result.seedLabels.length}): ${result.seedLabels.join(", ") || "none enabled"}.`);
22967
23185
  console.log(`Awaiting your ruling: ${result.labelsUndecided} label(s).`);
22968
23186
  }
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.240.0"
34
+ "version": "0.242.0"
35
35
  }