opencode-usage-coach 0.1.3 → 0.1.5

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/dist/tui.js +177 -91
  2. package/package.json +1 -1
package/dist/tui.js CHANGED
@@ -49,9 +49,11 @@ var TLABEL = {
49
49
  timed_out: "timeout",
50
50
  halted_quota: "quota-halt"
51
51
  };
52
- function bar(p) {
53
- const n = Math.max(0, Math.min(10, Math.round(p / 10)));
54
- return "\u2588".repeat(n) + "\u2591".repeat(10 - n);
52
+ function barFill(p) {
53
+ return "\u2588".repeat(Math.max(0, Math.min(10, Math.round(p / 10))));
54
+ }
55
+ function barEmpty(p) {
56
+ return "\u2591".repeat(10 - Math.max(0, Math.min(10, Math.round(p / 10))));
55
57
  }
56
58
  function short(s, n) {
57
59
  return s.length <= n ? s : s.slice(0, n - 1) + "\u2026";
@@ -154,90 +156,161 @@ function initializeTui(api, disposeRoot) {
154
156
  _$effect((_$p) => _$setProp(_el$7, "style", st("textMuted"), _$p));
155
157
  return _el$7;
156
158
  })());
157
- const k5 = p.fiveHour >= 70 ? "error" : p.fiveHour >= 40 ? "warning" : "success";
158
- const kw = p.weekly >= 85 ? "error" : p.weekly >= 60 ? "warning" : "success";
159
159
  nodes.push((() => {
160
- var _el$9 = _$createElement("text"), _el$0 = _$createTextNode(` 5h `), _el$1 = _$createTextNode(` `), _el$10 = _$createTextNode(`% `);
160
+ var _el$9 = _$createElement("box"), _el$0 = _$createElement("text"), _el$10 = _$createElement("text"), _el$11 = _$createElement("text"), _el$12 = _$createElement("text"), _el$13 = _$createTextNode(` `), _el$14 = _$createTextNode(`% `);
161
161
  _$insertNode(_el$9, _el$0);
162
- _$insertNode(_el$9, _el$1);
163
162
  _$insertNode(_el$9, _el$10);
164
- _$insert(_el$9, () => bar(p.fiveHour), _el$1);
165
- _$insert(_el$9, () => p.fiveHour, _el$10);
166
- _$insert(_el$9, () => p.fiveHourReset, null);
167
- _$effect((_$p) => _$setProp(_el$9, "style", st(k5), _$p));
163
+ _$insertNode(_el$9, _el$11);
164
+ _$insertNode(_el$9, _el$12);
165
+ _$setProp(_el$9, "flexDirection", "row");
166
+ _$insertNode(_el$0, _$createTextNode(` 5h `));
167
+ _$insert(_el$10, () => barFill(p.fiveHour));
168
+ _$insert(_el$11, () => barEmpty(p.fiveHour));
169
+ _$insertNode(_el$12, _el$13);
170
+ _$insertNode(_el$12, _el$14);
171
+ _$insert(_el$12, () => p.fiveHour, _el$14);
172
+ _$insert(_el$12, () => p.fiveHourReset, null);
173
+ _$effect((_p$) => {
174
+ var _v$ = st("text"), _v$2 = st("textMuted");
175
+ _v$ !== _p$.e && (_p$.e = _$setProp(_el$10, "style", _v$, _p$.e));
176
+ _v$2 !== _p$.t && (_p$.t = _$setProp(_el$11, "style", _v$2, _p$.t));
177
+ return _p$;
178
+ }, {
179
+ e: void 0,
180
+ t: void 0
181
+ });
168
182
  return _el$9;
169
183
  })());
170
184
  nodes.push((() => {
171
- var _el$11 = _$createElement("text"), _el$12 = _$createTextNode(` wk `), _el$13 = _$createTextNode(` `), _el$14 = _$createTextNode(`% `);
172
- _$insertNode(_el$11, _el$12);
173
- _$insertNode(_el$11, _el$13);
174
- _$insertNode(_el$11, _el$14);
175
- _$insert(_el$11, () => bar(p.weekly), _el$13);
176
- _$insert(_el$11, () => p.weekly, _el$14);
177
- _$insert(_el$11, () => p.weeklyReset, null);
178
- _$effect((_$p) => _$setProp(_el$11, "style", st(kw), _$p));
179
- return _el$11;
180
- })());
181
- nodes.push((() => {
182
- var _el$15 = _$createElement("text"), _el$16 = _$createTextNode(` -> `);
185
+ var _el$15 = _$createElement("box"), _el$16 = _$createElement("text"), _el$18 = _$createElement("text"), _el$19 = _$createElement("text"), _el$20 = _$createElement("text"), _el$21 = _$createTextNode(` `), _el$22 = _$createTextNode(`% `);
183
186
  _$insertNode(_el$15, _el$16);
184
- _$insert(_el$15, () => p.advice, null);
185
- _$effect((_$p) => _$setProp(_el$15, "style", st(dKey), _$p));
187
+ _$insertNode(_el$15, _el$18);
188
+ _$insertNode(_el$15, _el$19);
189
+ _$insertNode(_el$15, _el$20);
190
+ _$setProp(_el$15, "flexDirection", "row");
191
+ _$insertNode(_el$16, _$createTextNode(` wk `));
192
+ _$insert(_el$18, () => barFill(p.weekly));
193
+ _$insert(_el$19, () => barEmpty(p.weekly));
194
+ _$insertNode(_el$20, _el$21);
195
+ _$insertNode(_el$20, _el$22);
196
+ _$insert(_el$20, () => p.weekly, _el$22);
197
+ _$insert(_el$20, () => p.weeklyReset, null);
198
+ _$effect((_p$) => {
199
+ var _v$3 = st("text"), _v$4 = st("textMuted");
200
+ _v$3 !== _p$.e && (_p$.e = _$setProp(_el$18, "style", _v$3, _p$.e));
201
+ _v$4 !== _p$.t && (_p$.t = _$setProp(_el$19, "style", _v$4, _p$.t));
202
+ return _p$;
203
+ }, {
204
+ e: void 0,
205
+ t: void 0
206
+ });
186
207
  return _el$15;
187
208
  })());
209
+ nodes.push((() => {
210
+ var _el$23 = _$createElement("text"), _el$24 = _$createTextNode(` -> `);
211
+ _$insertNode(_el$23, _el$24);
212
+ _$insert(_el$23, () => p.advice, null);
213
+ _$effect((_$p) => _$setProp(_el$23, "style", st(dKey), _$p));
214
+ return _el$23;
215
+ })());
188
216
  }
189
217
  } else {
190
218
  nodes.push((() => {
191
- var _el$19 = _$createElement("text"), _el$20 = _$createTextNode(` 5h `), _el$21 = _$createTextNode(` `), _el$22 = _$createTextNode(`%`);
192
- _$insertNode(_el$19, _el$20);
193
- _$insertNode(_el$19, _el$21);
194
- _$insertNode(_el$19, _el$22);
195
- _$insert(_el$19, () => bar(s.fiveHour), _el$21);
196
- _$insert(_el$19, () => s.fiveHour, _el$22);
197
- return _el$19;
219
+ var _el$27 = _$createElement("box"), _el$28 = _$createElement("text"), _el$30 = _$createElement("text"), _el$31 = _$createElement("text"), _el$32 = _$createElement("text"), _el$33 = _$createTextNode(` `), _el$34 = _$createTextNode(`%`);
220
+ _$insertNode(_el$27, _el$28);
221
+ _$insertNode(_el$27, _el$30);
222
+ _$insertNode(_el$27, _el$31);
223
+ _$insertNode(_el$27, _el$32);
224
+ _$setProp(_el$27, "flexDirection", "row");
225
+ _$insertNode(_el$28, _$createTextNode(` 5h `));
226
+ _$insert(_el$30, () => barFill(s.fiveHour));
227
+ _$insert(_el$31, () => barEmpty(s.fiveHour));
228
+ _$insertNode(_el$32, _el$33);
229
+ _$insertNode(_el$32, _el$34);
230
+ _$insert(_el$32, () => s.fiveHour, _el$34);
231
+ _$effect((_p$) => {
232
+ var _v$5 = st("text"), _v$6 = st("textMuted");
233
+ _v$5 !== _p$.e && (_p$.e = _$setProp(_el$30, "style", _v$5, _p$.e));
234
+ _v$6 !== _p$.t && (_p$.t = _$setProp(_el$31, "style", _v$6, _p$.t));
235
+ return _p$;
236
+ }, {
237
+ e: void 0,
238
+ t: void 0
239
+ });
240
+ return _el$27;
198
241
  })());
199
242
  nodes.push((() => {
200
- var _el$23 = _$createElement("text"), _el$24 = _$createTextNode(` wk `), _el$25 = _$createTextNode(` `), _el$26 = _$createTextNode(`%`);
201
- _$insertNode(_el$23, _el$24);
202
- _$insertNode(_el$23, _el$25);
203
- _$insertNode(_el$23, _el$26);
204
- _$insert(_el$23, () => bar(s.weekly), _el$25);
205
- _$insert(_el$23, () => s.weekly, _el$26);
206
- return _el$23;
243
+ var _el$35 = _$createElement("box"), _el$36 = _$createElement("text"), _el$38 = _$createElement("text"), _el$39 = _$createElement("text"), _el$40 = _$createElement("text"), _el$41 = _$createTextNode(` `), _el$42 = _$createTextNode(`%`);
244
+ _$insertNode(_el$35, _el$36);
245
+ _$insertNode(_el$35, _el$38);
246
+ _$insertNode(_el$35, _el$39);
247
+ _$insertNode(_el$35, _el$40);
248
+ _$setProp(_el$35, "flexDirection", "row");
249
+ _$insertNode(_el$36, _$createTextNode(` wk `));
250
+ _$insert(_el$38, () => barFill(s.weekly));
251
+ _$insert(_el$39, () => barEmpty(s.weekly));
252
+ _$insertNode(_el$40, _el$41);
253
+ _$insertNode(_el$40, _el$42);
254
+ _$insert(_el$40, () => s.weekly, _el$42);
255
+ _$effect((_p$) => {
256
+ var _v$7 = st("text"), _v$8 = st("textMuted");
257
+ _v$7 !== _p$.e && (_p$.e = _$setProp(_el$38, "style", _v$7, _p$.e));
258
+ _v$8 !== _p$.t && (_p$.t = _$setProp(_el$39, "style", _v$8, _p$.t));
259
+ return _p$;
260
+ }, {
261
+ e: void 0,
262
+ t: void 0
263
+ });
264
+ return _el$35;
207
265
  })());
208
266
  nodes.push((() => {
209
- var _el$27 = _$createElement("text"), _el$28 = _$createTextNode(` mo `), _el$29 = _$createTextNode(` `), _el$30 = _$createTextNode(`%`);
210
- _$insertNode(_el$27, _el$28);
211
- _$insertNode(_el$27, _el$29);
212
- _$insertNode(_el$27, _el$30);
213
- _$insert(_el$27, () => bar(s.monthly), _el$29);
214
- _$insert(_el$27, () => s.monthly, _el$30);
215
- return _el$27;
267
+ var _el$43 = _$createElement("box"), _el$44 = _$createElement("text"), _el$46 = _$createElement("text"), _el$47 = _$createElement("text"), _el$48 = _$createElement("text"), _el$49 = _$createTextNode(` `), _el$50 = _$createTextNode(`%`);
268
+ _$insertNode(_el$43, _el$44);
269
+ _$insertNode(_el$43, _el$46);
270
+ _$insertNode(_el$43, _el$47);
271
+ _$insertNode(_el$43, _el$48);
272
+ _$setProp(_el$43, "flexDirection", "row");
273
+ _$insertNode(_el$44, _$createTextNode(` mo `));
274
+ _$insert(_el$46, () => barFill(s.monthly));
275
+ _$insert(_el$47, () => barEmpty(s.monthly));
276
+ _$insertNode(_el$48, _el$49);
277
+ _$insertNode(_el$48, _el$50);
278
+ _$insert(_el$48, () => s.monthly, _el$50);
279
+ _$effect((_p$) => {
280
+ var _v$9 = st("text"), _v$0 = st("textMuted");
281
+ _v$9 !== _p$.e && (_p$.e = _$setProp(_el$46, "style", _v$9, _p$.e));
282
+ _v$0 !== _p$.t && (_p$.t = _$setProp(_el$47, "style", _v$0, _p$.t));
283
+ return _p$;
284
+ }, {
285
+ e: void 0,
286
+ t: void 0
287
+ });
288
+ return _el$43;
216
289
  })());
217
290
  }
218
291
  } else {
219
292
  nodes.push((() => {
220
- var _el$31 = _$createElement("text");
221
- _$insertNode(_el$31, _$createTextNode(`usage-coach: ...`));
222
- return _el$31;
293
+ var _el$51 = _$createElement("text");
294
+ _$insertNode(_el$51, _$createTextNode(`usage-coach: ...`));
295
+ return _el$51;
223
296
  })());
224
297
  }
225
298
  if (h && h.active !== false && h.tasks.length > 0) {
226
299
  nodes.push((() => {
227
- var _el$33 = _$createElement("text");
228
- _$insertNode(_el$33, _$createTextNode(` `));
229
- return _el$33;
300
+ var _el$53 = _$createElement("text");
301
+ _$insertNode(_el$53, _$createTextNode(` `));
302
+ return _el$53;
230
303
  })());
231
304
  nodes.push((() => {
232
- var _el$35 = _$createElement("text"), _el$36 = _$createTextNode(`harness: `), _el$37 = _$createTextNode(` `), _el$38 = _$createTextNode(`/`);
233
- _$insertNode(_el$35, _el$36);
234
- _$insertNode(_el$35, _el$37);
235
- _$insertNode(_el$35, _el$38);
236
- _$insert(_el$35, () => h.name, _el$37);
237
- _$insert(_el$35, () => h.current, _el$38);
238
- _$insert(_el$35, () => h.total, null);
239
- _$effect((_$p) => _$setProp(_el$35, "style", st("textMuted"), _$p));
240
- return _el$35;
305
+ var _el$55 = _$createElement("text"), _el$56 = _$createTextNode(`harness: `), _el$57 = _$createTextNode(` `), _el$58 = _$createTextNode(`/`);
306
+ _$insertNode(_el$55, _el$56);
307
+ _$insertNode(_el$55, _el$57);
308
+ _$insertNode(_el$55, _el$58);
309
+ _$insert(_el$55, () => h.name, _el$57);
310
+ _$insert(_el$55, () => h.current, _el$58);
311
+ _$insert(_el$55, () => h.total, null);
312
+ _$effect((_$p) => _$setProp(_el$55, "style", st("textMuted"), _$p));
313
+ return _el$55;
241
314
  })());
242
315
  for (const t of h.tasks) {
243
316
  const sKey = statusKey[t.status] ?? "text";
@@ -245,39 +318,52 @@ function initializeTui(api, disposeRoot) {
245
318
  const rev = t.revisions > 0 && t.status === "revising" ? `(${t.revisions})` : "";
246
319
  const mdl = t.model ? ` ${t.model.split("/").pop() ?? t.model}` : "";
247
320
  nodes.push((() => {
248
- var _el$39 = _$createElement("text"), _el$40 = _$createTextNode(` \u25CF `), _el$41 = _$createTextNode(` `), _el$42 = _$createTextNode(` `);
249
- _$insertNode(_el$39, _el$40);
250
- _$insertNode(_el$39, _el$41);
251
- _$insertNode(_el$39, _el$42);
252
- _$insert(_el$39, () => t.id, _el$41);
253
- _$insert(_el$39, mdl, _el$41);
254
- _$insert(_el$39, lbl, _el$42);
255
- _$insert(_el$39, rev, _el$42);
256
- _$insert(_el$39, () => short(t.title, 12), null);
257
- _$effect((_$p) => _$setProp(_el$39, "style", st(sKey), _$p));
258
- return _el$39;
321
+ var _el$59 = _$createElement("text"), _el$60 = _$createTextNode(` \u25CF `), _el$61 = _$createTextNode(` `), _el$62 = _$createTextNode(` `);
322
+ _$insertNode(_el$59, _el$60);
323
+ _$insertNode(_el$59, _el$61);
324
+ _$insertNode(_el$59, _el$62);
325
+ _$insert(_el$59, () => t.id, _el$61);
326
+ _$insert(_el$59, mdl, _el$61);
327
+ _$insert(_el$59, lbl, _el$62);
328
+ _$insert(_el$59, rev, _el$62);
329
+ _$insert(_el$59, () => short(t.title, 12), null);
330
+ _$effect((_$p) => _$setProp(_el$59, "style", st(sKey), _$p));
331
+ return _el$59;
259
332
  })());
260
333
  const pv = t.model ? t.model.startsWith("zai") ? "zai" : (t.model.split("/")[0] ?? "").split("-")[0] : "";
261
334
  const q = pv && h.quotas?.[pv] ? h.quotas[pv] : null;
262
335
  const pct = q ? q.fiveHour : 0;
263
- const qKey = pct >= 70 ? "error" : pct >= 40 ? "warning" : "success";
264
336
  nodes.push((() => {
265
- var _el$43 = _$createElement("text"), _el$44 = _$createTextNode(` 5h `), _el$45 = _$createTextNode(` `), _el$46 = _$createTextNode(`%`);
266
- _$insertNode(_el$43, _el$44);
267
- _$insertNode(_el$43, _el$45);
268
- _$insertNode(_el$43, _el$46);
269
- _$insert(_el$43, () => bar(pct), _el$45);
270
- _$insert(_el$43, pct, _el$46);
271
- _$effect((_$p) => _$setProp(_el$43, "style", st(qKey), _$p));
272
- return _el$43;
337
+ var _el$63 = _$createElement("box"), _el$64 = _$createElement("text"), _el$66 = _$createElement("text"), _el$67 = _$createElement("text"), _el$68 = _$createElement("text"), _el$69 = _$createTextNode(` `), _el$70 = _$createTextNode(`%`);
338
+ _$insertNode(_el$63, _el$64);
339
+ _$insertNode(_el$63, _el$66);
340
+ _$insertNode(_el$63, _el$67);
341
+ _$insertNode(_el$63, _el$68);
342
+ _$setProp(_el$63, "flexDirection", "row");
343
+ _$insertNode(_el$64, _$createTextNode(` 5h `));
344
+ _$insert(_el$66, () => barFill(pct));
345
+ _$insert(_el$67, () => barEmpty(pct));
346
+ _$insertNode(_el$68, _el$69);
347
+ _$insertNode(_el$68, _el$70);
348
+ _$insert(_el$68, pct, _el$70);
349
+ _$effect((_p$) => {
350
+ var _v$1 = st("text"), _v$10 = st("textMuted");
351
+ _v$1 !== _p$.e && (_p$.e = _$setProp(_el$66, "style", _v$1, _p$.e));
352
+ _v$10 !== _p$.t && (_p$.t = _$setProp(_el$67, "style", _v$10, _p$.t));
353
+ return _p$;
354
+ }, {
355
+ e: void 0,
356
+ t: void 0
357
+ });
358
+ return _el$63;
273
359
  })());
274
360
  }
275
361
  }
276
362
  return (() => {
277
- var _el$47 = _$createElement("box");
278
- _$setProp(_el$47, "flexDirection", "column");
279
- _$insert(_el$47, nodes);
280
- return _el$47;
363
+ var _el$71 = _$createElement("box");
364
+ _$setProp(_el$71, "flexDirection", "column");
365
+ _$insert(_el$71, nodes);
366
+ return _el$71;
281
367
  })();
282
368
  };
283
369
  api.slots.register({
@@ -288,9 +374,9 @@ function initializeTui(api, disposeRoot) {
288
374
  return panel(ctx);
289
375
  } catch {
290
376
  return (() => {
291
- var _el$48 = _$createElement("text");
292
- _$insertNode(_el$48, _$createTextNode(`usage-coach`));
293
- return _el$48;
377
+ var _el$72 = _$createElement("text");
378
+ _$insertNode(_el$72, _$createTextNode(`usage-coach`));
379
+ return _el$72;
294
380
  })();
295
381
  }
296
382
  },
@@ -299,9 +385,9 @@ function initializeTui(api, disposeRoot) {
299
385
  return panel(ctx);
300
386
  } catch {
301
387
  return (() => {
302
- var _el$50 = _$createElement("text");
303
- _$insertNode(_el$50, _$createTextNode(`usage-coach`));
304
- return _el$50;
388
+ var _el$74 = _$createElement("text");
389
+ _$insertNode(_el$74, _$createTextNode(`usage-coach`));
390
+ return _el$74;
305
391
  })();
306
392
  }
307
393
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-usage-coach",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "opencode closed-loop usage coach \u2014 quota SENSE -> coaching DECIDE -> loop ACT + TUI integration",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",