fluncle 0.265.0 → 0.266.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 +67 -8
  2. package/package.json +1 -1
package/bin/fluncle.mjs CHANGED
@@ -632,7 +632,7 @@ function parseVersion(version) {
632
632
  var currentVersion;
633
633
  var init_version = __esm(() => {
634
634
  init_output();
635
- currentVersion = "0.265.0".trim() ? "0.265.0".trim() : "0.1.0";
635
+ currentVersion = "0.266.0".trim() ? "0.266.0".trim() : "0.1.0";
636
636
  });
637
637
 
638
638
  // src/update-notifier.ts
@@ -2345,7 +2345,7 @@ function parseVersion2(version) {
2345
2345
  var currentVersion2, latestReleaseUrl = "https://api.github.com/repos/mauricekleine/fluncle/releases/latest";
2346
2346
  var init_version2 = __esm(() => {
2347
2347
  init_output();
2348
- currentVersion2 = "0.265.0".trim() ? "0.265.0".trim() : "0.1.0";
2348
+ currentVersion2 = "0.266.0".trim() ? "0.266.0".trim() : "0.1.0";
2349
2349
  });
2350
2350
 
2351
2351
  // ../../packages/registry/src/index.ts
@@ -3725,13 +3725,15 @@ var init_src = __esm(() => {
3725
3725
  },
3726
3726
  {
3727
3727
  command: "fluncle admin labels list --seed-state undecided",
3728
- exposedContent: ["read the undecided crawl-seed pile and report whether a triage round is due"],
3728
+ exposedContent: [
3729
+ "read the undecided crawl-seed pile and, once a round is due, research it into proposals"
3730
+ ],
3729
3731
  kind: "cron",
3730
3732
  name: "cron.label-triage",
3731
- operatorNotes: "daily. A PURE trigger — zero model tokens, one countless admin read and a sort. Fires only when 40+ NEVER-LOOKED labels have accumulated; stale ones ride along but never trigger a round. It cannot rule: recording a finding is record_label_triage (agent tier) and ruling is update_label (operator tier), which 403s the box token. The batched research leg is deliberately unwired until the gate proves it reports honestly. Source: docs/agents/hermes/scripts/{label-triage-sweep.ts,label-triage-sweep.sh}.",
3733
+ operatorNotes: "daily. The gate is one countless admin read and a sort; it fires only when 40+ NEVER-LOOKED labels with a MusicBrainz identity and no artist rules have accumulated, and stale ones ride along. A fired round runs one claude -p per batch of 10 labels (capped at 3 batches and 30 labels) whose only fetcher is `fluncle admin labels evidence`; the model holds no Fluncle token, and the script records each verdict with record_label_triage (agent tier). It cannot rule: update_label is operator tier and 403s the box token. Labels a round left unfinished (a failed batch, or past the cap) are carried and fire the next day. The model runs --restricted with dontAsk permissions, confined to its batch directory and the skill. A fired round that records zero proposals, or any failed batch, exits non-zero, reads failed on /status and posts to Discord. Source: docs/agents/hermes/scripts/{label-triage-sweep.ts,label-triage-sweep.sh}.",
3732
3734
  probeConfig: { cadenceMs: 24 * 60 * MINUTE_MS, cronName: "fluncle-label-triage", kind: "cron" },
3733
- statusDescription: "reports when the label pile needs a round",
3734
- title: "Label triage gate",
3735
+ statusDescription: "researches the label pile when it needs a round",
3736
+ title: "Label triage",
3735
3737
  weights: { status: "hidden" }
3736
3738
  },
3737
3739
  {
@@ -11190,7 +11192,7 @@ var init_admin_albums = __esm(() => {
11190
11192
  });
11191
11193
 
11192
11194
  // ../../packages/contracts/src/orpc/admin-artifacts.ts
11193
- var ARTIFACT_CHANGE_API_MAX_LIMIT = 500, ARTIFACT_SNAPSHOT_API_MAX_LIMIT = 200, ARTIFACT_COMPACTION_API_MAX_LIMIT = 1000, ARTIFACT_SUPPORTED_CONTRACTS, ArtifactStreamSchema, ArtifactContractSchema, ConsumerIdSchema, DigestSchema, SequenceSchema, ArtifactRebuildCheckpointSchema, ArtifactConsumerStatusSchema, ArtifactChangeEventSchema, ArtifactSnapshotItemSchema, ArtifactSnapshotPageSchema, ArtifactChangePageSchema, ArtifactCompactionResultSchema, registerArtifactConsumer, getArtifactConsumer, listArtifactSnapshot, checkpointArtifactRebuild, activateArtifactConsumer, listArtifactChanges, acknowledgeArtifactChanges, inactivateArtifactConsumer, compactArtifactChanges, adminArtifactsContract;
11195
+ var ARTIFACT_CHANGE_API_MAX_LIMIT = 500, ARTIFACT_SNAPSHOT_API_MAX_LIMIT = 200, ARTIFACT_COMPACTION_API_MAX_LIMIT = 1000, ARTIFACT_SUPPORTED_CONTRACTS, ArtifactStreamSchema, ArtifactContractSchema, ConsumerIdSchema, DigestSchema, SequenceSchema, ArtifactRebuildCheckpointSchema, ArtifactConsumerStatusSchema, ArtifactChangeEventSchema, ArtifactSnapshotItemSchema, ArtifactSnapshotPageSchema, ArtifactChangePageSchema, ArtifactCompactionResultSchema, SonarSourceAfterSchema, SonarSourceLimitSchema, SonarSourceIdsSchema, listSonarTrackDigests, listSonarTracks, listSonarCentroidDigests, listSonarCentroids, registerArtifactConsumer, getArtifactConsumer, listArtifactSnapshot, checkpointArtifactRebuild, activateArtifactConsumer, listArtifactChanges, acknowledgeArtifactChanges, inactivateArtifactConsumer, compactArtifactChanges, adminArtifactsContract;
11194
11196
  var init_admin_artifacts = __esm(() => {
11195
11197
  init_dist3();
11196
11198
  init_zod();
@@ -11304,6 +11306,57 @@ var init_admin_artifacts = __esm(() => {
11304
11306
  ok: literal(true),
11305
11307
  reason: _enum(["compacted", "empty", "no_safe_barrier"])
11306
11308
  });
11309
+ SonarSourceAfterSchema = string2().min(1).max(1024).optional();
11310
+ SonarSourceLimitSchema = number3().int().min(1).max(2000).default(1000);
11311
+ SonarSourceIdsSchema = array(string2().min(1).max(1024)).min(1).max(200).refine((ids) => new Set(ids).size === ids.length);
11312
+ listSonarTrackDigests = oc.route({
11313
+ method: "GET",
11314
+ operationId: "listSonarTrackDigests",
11315
+ path: "/admin/sonar/source/tracks",
11316
+ summary: "List source track digests and revisions",
11317
+ tags: ["Admin"]
11318
+ }).input(strictObject({ after: SonarSourceAfterSchema, limit: SonarSourceLimitSchema })).output(strictObject({
11319
+ items: array(strictObject({
11320
+ payloadDigest: DigestSchema,
11321
+ revision: SequenceSchema,
11322
+ subjectId: string2().min(1).max(1024)
11323
+ })),
11324
+ nextAfter: string2().nullable(),
11325
+ ok: literal(true)
11326
+ }));
11327
+ listSonarTracks = oc.route({
11328
+ method: "POST",
11329
+ operationId: "listSonarTracks",
11330
+ path: "/admin/sonar/source/tracks/items",
11331
+ summary: "Read selected source tracks",
11332
+ tags: ["Admin"]
11333
+ }).input(strictObject({ subjectIds: SonarSourceIdsSchema })).output(strictObject({
11334
+ absentIds: array(string2()),
11335
+ items: array(ArtifactSnapshotItemSchema.extend({ revision: SequenceSchema })),
11336
+ ok: literal(true)
11337
+ }));
11338
+ listSonarCentroidDigests = oc.route({
11339
+ method: "GET",
11340
+ operationId: "listSonarCentroidDigests",
11341
+ path: "/admin/sonar/source/centroids",
11342
+ summary: "List source artist centroid digests",
11343
+ tags: ["Admin"]
11344
+ }).input(strictObject({ after: SonarSourceAfterSchema, limit: SonarSourceLimitSchema })).output(strictObject({
11345
+ items: array(strictObject({ artistId: string2(), digest: DigestSchema })),
11346
+ nextAfter: string2().nullable(),
11347
+ ok: literal(true)
11348
+ }));
11349
+ listSonarCentroids = oc.route({
11350
+ method: "POST",
11351
+ operationId: "listSonarCentroids",
11352
+ path: "/admin/sonar/source/centroids/items",
11353
+ summary: "Read selected artist centroids",
11354
+ tags: ["Admin"]
11355
+ }).input(strictObject({ artistIds: SonarSourceIdsSchema })).output(strictObject({
11356
+ absentIds: array(string2()),
11357
+ items: array(strictObject({ artistId: string2(), blobBase64: string2(), digest: DigestSchema })),
11358
+ ok: literal(true)
11359
+ }));
11307
11360
  registerArtifactConsumer = oc.route({
11308
11361
  method: "POST",
11309
11362
  operationId: "registerArtifactConsumer",
@@ -11404,6 +11457,10 @@ var init_admin_artifacts = __esm(() => {
11404
11457
  inactivate_artifact_consumer: inactivateArtifactConsumer,
11405
11458
  list_artifact_changes: listArtifactChanges,
11406
11459
  list_artifact_snapshot: listArtifactSnapshot,
11460
+ list_sonar_centroid_digests: listSonarCentroidDigests,
11461
+ list_sonar_centroids: listSonarCentroids,
11462
+ list_sonar_track_digests: listSonarTrackDigests,
11463
+ list_sonar_tracks: listSonarTracks,
11407
11464
  register_artifact_consumer: registerArtifactConsumer
11408
11465
  };
11409
11466
  });
@@ -14033,6 +14090,7 @@ var init_admin_labels = __esm(() => {
14033
14090
  LabelSeedStateSchema = _enum(["disabled", "enabled", "undecided"]).meta({ id: "LabelSeedState" });
14034
14091
  LabelTriageVerdictSchema = _enum(["dnb", "dnb_partial", "not_dnb", "unclear"]).meta({ id: "LabelTriageVerdict" });
14035
14092
  LabelAdminItemSchema = object({
14093
+ carriesArtistRules: boolean2().optional(),
14036
14094
  createdAt: string2(),
14037
14095
  disambiguation: string2().nullable().optional(),
14038
14096
  findingCount: number2(),
@@ -25013,7 +25071,8 @@ JSON field reference:
25013
25071
  }
25014
25072
  for (const label of labels) {
25015
25073
  const looked = label.triageCheckedAt ? label.triageVerdict : "never looked";
25016
- console.log(`${label.slug} ${label.seedState} ${looked ?? ""}`.trimEnd());
25074
+ const rules = label.carriesArtistRules ? " artist rules" : "";
25075
+ console.log(`${label.slug} ${label.seedState} ${looked ?? ""}${rules}`.trimEnd());
25017
25076
  }
25018
25077
  });
25019
25078
  labels.command("evidence").description("Gather a label's MusicBrainz, Discogs, Beatport and Apple evidence for triage (cached, rate-limited)").argument("<label>", "The label's MusicBrainz MBID, slug, or lbl_\u2026 id").option("--census", "Also count FIRST credits per recording over the label's releases", false).option("--census-pages <n>", "MusicBrainz pages the census may read, 1-5", "5").option("--sources <list>", "Comma list of musicbrainz,discogs,beatport,apple (default all)").option("--refresh", "Ignore cached responses and fetch fresh", false).option("--json", "Print JSON", false).action(async (input, options) => {
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.265.0"
34
+ "version": "0.266.0"
35
35
  }