fluncle 0.229.0 → 0.231.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 +24 -12
  2. package/package.json +1 -1
package/bin/fluncle.mjs CHANGED
@@ -612,7 +612,7 @@ function parseVersion(version) {
612
612
  var currentVersion;
613
613
  var init_version = __esm(() => {
614
614
  init_output();
615
- currentVersion = "0.229.0".trim() ? "0.229.0".trim() : "0.1.0";
615
+ currentVersion = "0.231.0".trim() ? "0.231.0".trim() : "0.1.0";
616
616
  });
617
617
 
618
618
  // src/update-notifier.ts
@@ -2457,7 +2457,7 @@ function parseVersion2(version) {
2457
2457
  var currentVersion2, latestReleaseUrl = "https://api.github.com/repos/mauricekleine/fluncle/releases/latest";
2458
2458
  var init_version2 = __esm(() => {
2459
2459
  init_output();
2460
- currentVersion2 = "0.229.0".trim() ? "0.229.0".trim() : "0.1.0";
2460
+ currentVersion2 = "0.231.0".trim() ? "0.231.0".trim() : "0.1.0";
2461
2461
  });
2462
2462
 
2463
2463
  // ../../packages/registry/src/index.ts
@@ -3616,7 +3616,7 @@ var init_src = __esm(() => {
3616
3616
  ],
3617
3617
  kind: "cron",
3618
3618
  name: "cron.device-mirror",
3619
- operatorNotes: "hourly, run by a host systemd timer (docs/agents/hermes/device-mirror-timer/). Explicitly synchronizes one restart-safe local embedded replica, materializes the anchored track IDs once, derives and validates one allowlisted generation locally, then stages bounded changes and atomically cuts the complete verified generation into the shared device database. Sync, derivation, upload, validation, or cutover failure leaves the previous generation visible; rebuilding the target database remains forbidden because it would reset the libSQL replication log and force every device to bootstrap again. A schema-version mismatch stops for an operator migration. Zero LLM tokens. Source: docs/agents/hermes/scripts/device-mirror.*. See docs/planning/offline-first-mobile-research.md.",
3619
+ operatorNotes: "hourly, run by a host systemd timer (docs/agents/hermes/device-mirror-timer/). Explicitly synchronizes one restart-safe local embedded replica, materializes the anchored track IDs once, derives and validates one allowlisted generation locally, then stages bounded changes and atomically cuts the complete verified generation into the shared device database. Sync, derivation, upload, validation, or cutover failure leaves the previous generation visible; rebuilding the target database remains forbidden because it would reset the libSQL replication log and force every device to bootstrap again. A schema-version mismatch stops for an operator migration. Zero LLM tokens. Source: docs/agents/hermes/scripts/device-mirror.*.",
3620
3620
  probeConfig: {
3621
3621
  cadenceMs: 60 * MINUTE_MS,
3622
3622
  cronName: "fluncle-device-mirror",
@@ -4009,19 +4009,19 @@ var init_src = __esm(() => {
4009
4009
  weights: { status: "hidden" }
4010
4010
  },
4011
4011
  {
4012
- command: "fluncle admin projections advance --target <public_aggregates|artist_qualification> --action repair --limit 500 --max-steps 4",
4012
+ command: "fluncle admin projections get --json; fluncle admin projections advance --target <track_due_work|crawl_due_work> --action repair --limit 500 --max-steps 20 --no-terminal-status --json; fluncle admin projections advance --target <public_aggregates|artist_qualification> --action repair --limit 500 --max-steps 4 --no-terminal-status --json",
4013
4013
  exposedContent: [
4014
- "keep the two public projection families converged after cutover with status-gated, bounded repair (--no-agent)"
4014
+ "keep all four runtime projection families converged after their cutovers with one-read, serial, bounded repair (--no-agent)"
4015
4015
  ],
4016
4016
  kind: "cron",
4017
4017
  name: "cron.projection-maintenance",
4018
- operatorNotes: "every 5m with per-firing jitter, run by a rave-02 host systemd timer (docs/agents/hermes/projection-maintenance-timer/). Reads bounded projection status first. A dark shared cutover issues zero repair calls; an open idle cutover also writes nothing. Each affected public family gets at most four sequential repair pages of 500 subjects, with independent failure handling. Public aggregate repair also advances the bounded anchor cursor after marker debt drains. Rebuild, audit, track/crawl repair, and every cutover mutation remain operator-only. Zero LLM tokens; no new secret.",
4018
+ operatorNotes: "every 5m with per-firing jitter, run by a rave-02 host systemd timer (docs/agents/hermes/projection-maintenance-timer/). Reads bounded projection status exactly once; the track, crawl, and public cutovers gate their own families independently. Open indebted families run strictly serially: track and crawl get at most twenty pages of 500, then public aggregates and artist qualification get at most four pages of 500. Repair responses omit terminal status so those four commands cannot repeat the global status suite. Public aggregate repair also advances the bounded anchor cursor after marker debt drains. The agent may repair only these four fixed targets; rebuild, audit, and every cutover mutation remain operator-only. Zero LLM tokens; no new secret.",
4019
4019
  probeConfig: {
4020
4020
  cadenceMs: 5 * MINUTE_MS,
4021
4021
  cronName: "fluncle-projection-maintenance",
4022
4022
  kind: "cron"
4023
4023
  },
4024
- statusDescription: "keeps the public catalogue projections caught up",
4024
+ statusDescription: "keeps runtime projections caught up",
4025
4025
  title: "Projection upkeep",
4026
4026
  weights: { status: "hidden" }
4027
4027
  },
@@ -15079,7 +15079,7 @@ var init_admin_telemetry2 = __esm(() => {
15079
15079
  errors: number2().int().nullable(),
15080
15080
  exitCode: number2().int(),
15081
15081
  expectedIntervalMs: number2().int().nullable(),
15082
- gateState: _enum(["active", "disabled", "dry-run", "forced", "locked", "paused"]).nullable(),
15082
+ gateState: _enum(["active", "admission-skipped", "disabled", "dry-run", "forced", "locked", "paused"]).nullable(),
15083
15083
  id: string2(),
15084
15084
  missingFields: array(string2()),
15085
15085
  occurredAt: string2(),
@@ -16630,8 +16630,11 @@ async function getProjectionStatusCommand() {
16630
16630
  return adminApiGet("/api/v1/admin/projections/status");
16631
16631
  }
16632
16632
  async function advanceProjectionCommand(input) {
16633
- const { maxSteps = 1, target, ...body } = input;
16634
- const stepBody = maxSteps > 1 ? { ...body, includeStatus: false } : body;
16633
+ const { includeTerminalStatus = true, maxSteps = 1, target, ...body } = input;
16634
+ if (!includeTerminalStatus && input.action !== "repair") {
16635
+ throw new Error("terminal status may be omitted only for repair automation");
16636
+ }
16637
+ const stepBody = maxSteps > 1 || !includeTerminalStatus ? { ...body, includeStatus: false } : body;
16635
16638
  let response = await adminApiPost(`/api/v1/admin/projections/${target}/advance`, stepBody);
16636
16639
  let steps = 1;
16637
16640
  let processed = response.processed;
@@ -16642,6 +16645,10 @@ async function advanceProjectionCommand(input) {
16642
16645
  processed += response.processed;
16643
16646
  scheduled += response.scheduled;
16644
16647
  }
16648
+ if (!includeTerminalStatus) {
16649
+ const { status: _status, ...withoutStatus } = response;
16650
+ return { ...withoutStatus, processed, scheduled, steps };
16651
+ }
16645
16652
  const status = response.status ?? (await getProjectionStatusCommand()).status;
16646
16653
  return { ...response, processed, scheduled, status, steps };
16647
16654
  }
@@ -22231,10 +22238,15 @@ JSON field reference:
22231
22238
  console.log(projections.projectionStatusLines(result.status).join(`
22232
22239
  `));
22233
22240
  });
22234
- adminProjections.command("advance").description("Run bounded, resumable rebuild, repair, or audit steps").requiredOption("--target <target>", "track_due_work, crawl_due_work, public_aggregates, or artist_qualification").requiredOption("--action <action>", "rebuild, repair, or audit").option("--limit <limit>", "Maximum rows or repairs in this request (1-500)", "100").option("--max-steps <steps>", "Maximum sequential advance calls (1-100)").option("--json", "Print the aggregate result and current readiness as JSON", false).action(async (options) => {
22241
+ adminProjections.command("advance").description("Run bounded, resumable rebuild, repair, or audit steps").requiredOption("--target <target>", "track_due_work, crawl_due_work, public_aggregates, or artist_qualification").requiredOption("--action <action>", "rebuild, repair, or audit").option("--limit <limit>", "Maximum rows or repairs in this request (1-500)", "100").option("--max-steps <steps>", "Maximum sequential advance calls (1-100)").option("--no-terminal-status", "Omit the terminal readiness snapshot (JSON repair automation only)").option("--json", "Print the aggregate result and default readiness as JSON", false).action(async (options) => {
22235
22242
  const projections = await Promise.resolve().then(() => (init_admin_projections2(), exports_admin_projections));
22243
+ const action = projections.parseProjectionAction(options.action);
22244
+ if (!options.terminalStatus && (!options.json || action !== "repair")) {
22245
+ throw new Error("--no-terminal-status requires --action repair and --json");
22246
+ }
22236
22247
  const result = await projections.advanceProjectionCommand({
22237
- action: projections.parseProjectionAction(options.action),
22248
+ action,
22249
+ includeTerminalStatus: options.terminalStatus,
22238
22250
  limit: projections.parseProjectionLimit(options.limit),
22239
22251
  maxSteps: options.maxSteps === undefined ? undefined : projections.parseProjectionMaxSteps(options.maxSteps),
22240
22252
  target: projections.parseProjectionTarget(options.target)
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.229.0"
34
+ "version": "0.231.0"
35
35
  }