mnemospark 0.5.0 → 0.6.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.
package/dist/cli.js CHANGED
@@ -2890,7 +2890,14 @@ import { CronExpressionParser } from "cron-parser";
2890
2890
  var LS_NAME_DISPLAY_MAX = 72;
2891
2891
  var LS_PAY_DISPLAY_MAX = 28;
2892
2892
  var LS_CRON_ID_MAX = 14;
2893
- var LS_TIME_FIELD_WIDTH = 12;
2893
+ var LS_S3_COL_WIDTH = 12;
2894
+ var LS_NEXT_COL_WIDTH = Math.max(LS_S3_COL_WIDTH, "NEXT PAYMENT DATE".length);
2895
+ var HDR_SIZE = "SIZE";
2896
+ var HDR_S3_TIME = "S3_TIME";
2897
+ var HDR_CRON_JOB = "CRON JOB";
2898
+ var HDR_NEXT_PAYMENT = "NEXT PAYMENT DATE";
2899
+ var HDR_AMOUNT_DUE = "AMOUNT DUE";
2900
+ var HDR_FILE_OR_KEY = "FILE NAME OR OBJECT-KEY";
2894
2901
  var MONTHS_SHORT = [
2895
2902
  "Jan",
2896
2903
  "Feb",
@@ -2905,14 +2912,14 @@ var MONTHS_SHORT = [
2905
2912
  "Nov",
2906
2913
  "Dec"
2907
2914
  ];
2908
- function formatLsTimeFieldUtc(iso, now) {
2909
- const placeholder = " - ".slice(0, LS_TIME_FIELD_WIDTH);
2915
+ function formatLsTimeFieldUtc(iso, now, fieldWidth = LS_S3_COL_WIDTH) {
2916
+ const placeholder = " - ".slice(0, fieldWidth);
2910
2917
  if (!iso) {
2911
- return placeholder.padEnd(LS_TIME_FIELD_WIDTH, " ");
2918
+ return placeholder.padEnd(fieldWidth, " ");
2912
2919
  }
2913
2920
  const d = new Date(iso);
2914
2921
  if (Number.isNaN(d.getTime())) {
2915
- return placeholder.padEnd(LS_TIME_FIELD_WIDTH, " ");
2922
+ return placeholder.padEnd(fieldWidth, " ");
2916
2923
  }
2917
2924
  const mon = MONTHS_SHORT[d.getUTCMonth()] ?? "???";
2918
2925
  const day = String(d.getUTCDate()).padStart(2, " ");
@@ -2926,7 +2933,7 @@ function formatLsTimeFieldUtc(iso, now) {
2926
2933
  } else {
2927
2934
  core = `${mon} ${day} ${y}`;
2928
2935
  }
2929
- return core.padEnd(LS_TIME_FIELD_WIDTH, " ");
2936
+ return core.padEnd(fieldWidth, " ");
2930
2937
  }
2931
2938
  function truncateEnd(value, max) {
2932
2939
  if (value.length <= max) {
@@ -2966,18 +2973,26 @@ function formatPaymentCell(amount, network, maxWidth) {
2966
2973
  return truncateEnd(s, maxWidth).padStart(maxWidth, " ");
2967
2974
  }
2968
2975
  function formatNextCronUtc(schedule, cronStatus, now) {
2969
- const blank = " - ".slice(0, LS_TIME_FIELD_WIDTH).padEnd(LS_TIME_FIELD_WIDTH, " ");
2976
+ const blank = " - ".slice(0, LS_NEXT_COL_WIDTH).padEnd(LS_NEXT_COL_WIDTH, " ");
2970
2977
  if (cronStatus !== "active") {
2971
2978
  return blank;
2972
2979
  }
2973
2980
  try {
2974
2981
  const expr = CronExpressionParser.parse(schedule, { tz: "UTC", currentDate: now });
2975
2982
  const next = expr.next().toDate();
2976
- return formatLsTimeFieldUtc(next.toISOString(), now);
2983
+ return formatLsTimeFieldUtc(next.toISOString(), now, LS_NEXT_COL_WIDTH);
2977
2984
  } catch {
2978
- return "?".padEnd(LS_TIME_FIELD_WIDTH, " ");
2985
+ return "?".padEnd(LS_NEXT_COL_WIDTH, " ");
2979
2986
  }
2980
2987
  }
2988
+ function buildLsProseIntro(bucket) {
2989
+ return [
2990
+ "\u2601\uFE0F mnemospark cloud files",
2991
+ `S3 bucket: ${bucket}`,
2992
+ "The columns: CRON JOB, NEXT PAYMENT DATE, AMOUNT DUE, FILE NAME are from this host's mnemospark SQLite catalog",
2993
+ "mnemospark cloud only stores the OBJECT-KEY for privacy"
2994
+ ];
2995
+ }
2981
2996
  async function prepareRows(objects, walletAddress, datastore, now) {
2982
2997
  const sorted = [...objects].sort((a, b) => {
2983
2998
  const ta = a.last_modified ? Date.parse(a.last_modified) : Number.NaN;
@@ -3000,9 +3015,9 @@ async function prepareRows(objects, walletAddress, datastore, now) {
3000
3015
  const friendly = await datastore.findLatestFriendlyNameForObjectKey(walletAddress, obj.key);
3001
3016
  const cp = await datastore.findCronAndPaymentForObjectKey(walletAddress, obj.key);
3002
3017
  const sizeStr = formatBytesForDisplay(obj.size_bytes);
3003
- const s3time = formatLsTimeFieldUtc(obj.last_modified, now);
3018
+ const s3time = formatLsTimeFieldUtc(obj.last_modified, now, LS_S3_COL_WIDTH);
3004
3019
  let cronIdDisp = null;
3005
- let nextRun = " - ".slice(0, LS_TIME_FIELD_WIDTH).padEnd(LS_TIME_FIELD_WIDTH, " ");
3020
+ let nextRun = " - ".slice(0, LS_NEXT_COL_WIDTH).padEnd(LS_NEXT_COL_WIDTH, " ");
3006
3021
  let payCell = "";
3007
3022
  if (cp) {
3008
3023
  cronIdDisp = cp.cronId;
@@ -3013,10 +3028,6 @@ async function prepareRows(objects, walletAddress, datastore, now) {
3013
3028
  }
3014
3029
  const nameRaw = friendly ? `${friendly} (${obj.key})` : obj.key;
3015
3030
  rows.push({
3016
- perm: "----------",
3017
- ln: " 1",
3018
- user: "- ",
3019
- grp: "- ",
3020
3031
  sizeStr,
3021
3032
  s3time,
3022
3033
  cronIdRaw: cronIdDisp,
@@ -3028,68 +3039,57 @@ async function prepareRows(objects, walletAddress, datastore, now) {
3028
3039
  return rows;
3029
3040
  }
3030
3041
  function columnWidths(rows) {
3031
- let sizeW = 4;
3032
- let cronW = 4;
3033
- let payW = 3;
3042
+ let sizeW = HDR_SIZE.length;
3043
+ let s3W = Math.max(LS_S3_COL_WIDTH, HDR_S3_TIME.length);
3044
+ let nextW = LS_NEXT_COL_WIDTH;
3045
+ let cronW = HDR_CRON_JOB.length;
3046
+ let payW = HDR_AMOUNT_DUE.length;
3034
3047
  for (const r of rows) {
3035
3048
  sizeW = Math.max(sizeW, r.sizeStr.length);
3049
+ s3W = Math.max(s3W, r.s3time.length);
3050
+ nextW = Math.max(nextW, r.nextRun.length);
3036
3051
  const cid = r.cronIdRaw ? truncateEnd(r.cronIdRaw, LS_CRON_ID_MAX) : "";
3037
3052
  cronW = Math.max(cronW, cid.length || 1);
3038
3053
  payW = Math.max(payW, r.payRaw.length);
3039
3054
  }
3040
- cronW = Math.min(Math.max(cronW, 4), LS_CRON_ID_MAX);
3041
- payW = Math.min(Math.max(payW, 3), LS_PAY_DISPLAY_MAX);
3042
- return { sizeW, cronW, payW };
3055
+ cronW = Math.min(Math.max(cronW, HDR_CRON_JOB.length), LS_CRON_ID_MAX);
3056
+ payW = Math.min(Math.max(payW, HDR_AMOUNT_DUE.length), LS_PAY_DISPLAY_MAX);
3057
+ return { sizeW, s3W, cronW, nextW, payW };
3043
3058
  }
3044
3059
  function renderRow(r, w) {
3045
3060
  const cronPadded = formatCronIdCell(r.cronIdRaw, w.cronW);
3046
- const sizePadded = r.sizeStr.padStart(w.sizeW, " ");
3047
- const payPadded = r.payRaw.padStart(w.payW, " ");
3048
3061
  return [
3049
- r.perm,
3050
- r.ln,
3051
- r.user,
3052
- r.grp,
3053
- sizePadded,
3054
- r.s3time,
3062
+ r.sizeStr.padStart(w.sizeW, " "),
3063
+ r.s3time.padEnd(w.s3W, " "),
3055
3064
  cronPadded,
3056
- r.nextRun,
3057
- payPadded,
3065
+ r.nextRun.padEnd(w.nextW, " "),
3066
+ r.payRaw.padStart(w.payW, " "),
3058
3067
  r.nameRaw
3059
3068
  ].join(" ");
3060
3069
  }
3061
3070
  function renderHeader(w) {
3062
3071
  return [
3063
- "PERM ",
3064
- "LN",
3065
- "USER ",
3066
- "GRP ",
3067
- "SIZE".padStart(w.sizeW, " "),
3068
- "S3_TIME ".slice(0, LS_TIME_FIELD_WIDTH).padEnd(LS_TIME_FIELD_WIDTH, " "),
3069
- "CRON".padStart(w.cronW, " "),
3070
- "NEXT ".slice(0, LS_TIME_FIELD_WIDTH).padEnd(LS_TIME_FIELD_WIDTH, " "),
3071
- "PAY".padStart(w.payW, " "),
3072
- "NAME"
3072
+ HDR_SIZE.padStart(w.sizeW, " "),
3073
+ HDR_S3_TIME.padEnd(w.s3W, " "),
3074
+ HDR_CRON_JOB.padStart(w.cronW, " "),
3075
+ HDR_NEXT_PAYMENT.padEnd(w.nextW, " "),
3076
+ HDR_AMOUNT_DUE.padStart(w.payW, " "),
3077
+ HDR_FILE_OR_KEY
3073
3078
  ].join(" ");
3074
3079
  }
3075
3080
  async function buildMnemosparkLsMessage(result, ctx) {
3076
3081
  const now = ctx.now ?? /* @__PURE__ */ new Date();
3077
3082
  if (isStorageLsListResponse(result)) {
3078
- const disclaimer2 = "Names, cron, and payment columns come from this machine's SQLite catalog when available; `-` means unknown locally. S3 is authoritative for which keys exist.";
3079
- const legend2 = "Legend: S3_TIME and NEXT are UTC. NEXT is the next cron fire from the stored expression.";
3080
- const bucketLine = `bucket: ${result.bucket}`;
3081
- const sortLine = "sorted by: S3 last_modified descending (missing dates last), then key ascending.";
3083
+ const intro = buildLsProseIntro(result.bucket);
3082
3084
  if (result.objects.length === 0) {
3083
- const lines = [disclaimer2, "", bucketLine, "", "No objects in this bucket."];
3084
- return lines.join("\n");
3085
+ return [...intro, "", "No objects in this bucket."].join("\n");
3085
3086
  }
3086
3087
  const rows = await prepareRows(result.objects, ctx.walletAddress, ctx.datastore, now);
3087
3088
  const w2 = columnWidths(rows);
3088
3089
  const header2 = renderHeader(w2);
3089
3090
  const bodyLines = rows.map((r) => renderRow(r, w2));
3090
- const totalLine = `total ${String(result.objects.length)}`;
3091
3091
  const truncLine = result.is_truncated ? "List truncated; more objects in bucket." : null;
3092
- const prose2 = [disclaimer2, legend2, bucketLine, sortLine, totalLine, truncLine].filter((x) => Boolean(x)).join("\n");
3092
+ const prose2 = [...intro, ...truncLine ? [truncLine] : []].join("\n");
3093
3093
  const fence2 = ["```", [header2, ...bodyLines].join("\n"), "```"].join("\n");
3094
3094
  return `${prose2}
3095
3095
 
@@ -3101,10 +3101,10 @@ ${fence2}`;
3101
3101
  );
3102
3102
  const cp = await ctx.datastore.findCronAndPaymentForObjectKey(ctx.walletAddress, result.key);
3103
3103
  const sizeStr = formatBytesForDisplay(result.size_bytes);
3104
- const s3time = formatLsTimeFieldUtc(void 0, now);
3104
+ const s3time = formatLsTimeFieldUtc(void 0, now, LS_S3_COL_WIDTH);
3105
3105
  let payCell = formatPaymentCell(null, null, LS_PAY_DISPLAY_MAX);
3106
3106
  let cronIdDisp = null;
3107
- let nextRun = " - ".slice(0, LS_TIME_FIELD_WIDTH).padEnd(LS_TIME_FIELD_WIDTH, " ");
3107
+ let nextRun = " - ".slice(0, LS_NEXT_COL_WIDTH).padEnd(LS_NEXT_COL_WIDTH, " ");
3108
3108
  if (cp) {
3109
3109
  cronIdDisp = cp.cronId;
3110
3110
  nextRun = formatNextCronUtc(cp.schedule, cp.cronStatus, now);
@@ -3116,10 +3116,6 @@ ${fence2}`;
3116
3116
  8
3117
3117
  );
3118
3118
  const prep = {
3119
- perm: "----------",
3120
- ln: " 1",
3121
- user: "- ",
3122
- grp: "- ",
3123
3119
  sizeStr,
3124
3120
  s3time,
3125
3121
  cronIdRaw: cronIdDisp,
@@ -3130,11 +3126,10 @@ ${fence2}`;
3130
3126
  const w = columnWidths([prep]);
3131
3127
  const header = renderHeader(w);
3132
3128
  const line = renderRow(prep, w);
3133
- const disclaimer = "Names, cron, and payment columns come from this machine's SQLite catalog when available; `-` means unknown locally.";
3134
- const legend = "Legend: S3_TIME and NEXT are UTC.";
3135
- const prose = [disclaimer, legend, `bucket: ${result.bucket}`, ""].join("\n");
3129
+ const prose = buildLsProseIntro(result.bucket).join("\n");
3136
3130
  const fence = ["```", [header, line].join("\n"), "```"].join("\n");
3137
3131
  return `${prose}
3132
+
3138
3133
  ${fence}`;
3139
3134
  }
3140
3135