farming-code 2.2.7 → 2.2.11

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 (102) hide show
  1. package/README.md +110 -199
  2. package/README.zh_cn.md +106 -237
  3. package/THIRD_PARTY_NOTICES.md +11 -2
  4. package/backend/acp-checkpoint-store.js +198 -0
  5. package/backend/acp-runtime.js +306 -83
  6. package/backend/acp-session-state.js +202 -6
  7. package/backend/acp-transcript.js +112 -0
  8. package/backend/agent-activity.js +6 -157
  9. package/backend/agent-manager.js +1496 -737
  10. package/backend/agent-provider-session.js +17 -242
  11. package/backend/agent-runtime-binding.js +219 -0
  12. package/backend/agent-session-history.js +66 -1
  13. package/backend/auth.js +79 -6
  14. package/backend/codex-models.js +81 -84
  15. package/backend/codex-session-archive.js +45 -0
  16. package/backend/codex-terminal-profile.js +500 -0
  17. package/backend/codex-transcript-sanitizer.js +12 -0
  18. package/backend/codex-transcript.js +230 -8
  19. package/backend/config-manager.js +30 -0
  20. package/backend/control-api.js +192 -17
  21. package/backend/farming-net-pass.js +285 -0
  22. package/backend/farming-net-registry.js +112 -0
  23. package/backend/farming-net-server.js +298 -0
  24. package/backend/farming-session-store.js +5 -13
  25. package/backend/git-worktree-info.js +181 -0
  26. package/backend/local-session-engine.js +411 -186
  27. package/backend/main-page-session.js +5 -2
  28. package/backend/native-pty-controller-generation.js +106 -0
  29. package/backend/native-pty-host-client.js +275 -7
  30. package/backend/native-pty-host-identity.js +86 -0
  31. package/backend/native-pty-host.js +813 -114
  32. package/backend/native-session-engine.js +100 -28
  33. package/backend/packaged-node-pty.js +22 -2
  34. package/backend/provider-adapters.js +253 -0
  35. package/backend/provider-session-service.js +241 -0
  36. package/backend/runtime-observation.js +81 -0
  37. package/backend/server.js +294 -86
  38. package/backend/session-engine-bridge.js +21 -2
  39. package/backend/session-engine-router.js +1 -1
  40. package/backend/session-engine.js +1 -1
  41. package/backend/session-stream-protocol.js +185 -0
  42. package/backend/storage-layout.js +55 -0
  43. package/backend/terminal-attach-checkpoint.js +74 -0
  44. package/backend/terminal-exit-quiescence.js +39 -0
  45. package/backend/terminal-reducer-flow-control.js +97 -0
  46. package/backend/terminal-screen-state.js +11 -2
  47. package/backend/terminal-screen-worker-pool.js +59 -6
  48. package/backend/terminal-screen-worker-thread.js +97 -57
  49. package/backend/terminal-screen-worker.js +133 -51
  50. package/backend/terminal-state-serialization.js +127 -0
  51. package/backend/terminal-status.js +23 -4
  52. package/backend/usage-monitor.js +81 -4
  53. package/backend/workspace-directory.js +152 -0
  54. package/backend/workspace-file-router.js +182 -76
  55. package/backend/workspace-file-service.js +319 -4
  56. package/backend/workspace-root-registry.js +164 -0
  57. package/dist/assets/App-CHYpgECZ.js +208 -0
  58. package/dist/assets/{FileEditorMarkdownPreview-elKWc8Im.js → FileEditorMarkdownPreview--Cri80nQ.js} +92 -92
  59. package/dist/assets/FileEditorPane-DGJlEKdf.js +2 -0
  60. package/dist/assets/IconGlyphs-Cc14sepw.js +1 -0
  61. package/dist/assets/ProjectFilesSection-Cz1wG4NT.js +12 -0
  62. package/dist/assets/{ReviewPage-BaXu1ZdX.js → ReviewPage-LonRc6Fz.js} +1 -1
  63. package/dist/assets/code-dark-B1pAtO_P.css +1 -0
  64. package/dist/assets/file-icons-Bw2qd5iT.js +1 -0
  65. package/dist/assets/{index-B8SHldPE.js → index-miO2r9IZ.js} +3 -3
  66. package/dist/assets/main-DNe0jPw-.css +1 -0
  67. package/dist/assets/workspace-editor-model-BQol4qbA.js +1 -0
  68. package/dist/assets/workspace-editor-monaco-5gFbeDPF.js +1 -0
  69. package/dist/assets/workspace-editor-monaco-xPv8JzHH.js +4 -0
  70. package/dist/assets/workspace-view-state-DvYG_9PH.js +7 -0
  71. package/dist/assets/workspace-working-copy-D8-s_Sgh.js +1 -0
  72. package/dist/index.html +1 -1
  73. package/frontend/farming-net/app.css +625 -0
  74. package/frontend/farming-net/app.js +268 -0
  75. package/frontend/farming-net/index.html +86 -0
  76. package/frontend/reading-anchor.js +198 -0
  77. package/frontend/session-bridge.js +12 -3
  78. package/frontend/session-modal-bridge.js +5 -12
  79. package/frontend/skins/crt/app.js +1976 -793
  80. package/frontend/skins/crt/index.html +313 -23
  81. package/frontend/skins/crt/styles/billing.css +294 -223
  82. package/frontend/skins/crt/styles/monochrome-green.css +7 -2
  83. package/frontend/terminal-replay.js +372 -0
  84. package/package.json +10 -3
  85. package/shared/browser-protocol.d.ts +5 -0
  86. package/shared/browser-protocol.js +130 -0
  87. package/dist/assets/App-iA2BU9P6.js +0 -124
  88. package/dist/assets/FileEditorPane-RWiFD2cq.js +0 -5
  89. package/dist/assets/IconGlyphs-DfL0EBnj.js +0 -1
  90. package/dist/assets/ProjectFilesSection-Q4PDsWmM.js +0 -12
  91. package/dist/assets/code-dark-CDkOQAtK.css +0 -1
  92. package/dist/assets/file-icons-EFUGSSwf.js +0 -1
  93. package/dist/assets/main-DpYuBonn.css +0 -1
  94. package/dist/assets/qoder-C9LmmOSf.svg +0 -1
  95. package/dist/assets/qoder-Cf9gl0Y5.svg +0 -1
  96. package/dist/assets/qoder-gHCinseV.svg +0 -1
  97. package/dist/assets/workspace-view-state-CTyDzk2D.js +0 -1
  98. package/dist/assets/zsh-CLpveKlF.svg +0 -1
  99. package/dist/assets/zsh-FxSpMPbz.svg +0 -1
  100. /package/dist/assets/{api-D1lyBYIQ.js → api-D8nyOEbz.js} +0 -0
  101. /package/dist/assets/{core-ZlAPicox.js → core-D0LFJkDt.js} +0 -0
  102. /package/dist/assets/{useWorkspaceMenuKeyboard-CneKAZUJ.js → useWorkspaceMenuKeyboard-Brws6Ar9.js} +0 -0
@@ -170,7 +170,7 @@
170
170
  }
171
171
 
172
172
  #farming-crt .billing-daily-chart-panel {
173
- min-height: 280px;
173
+ min-height: 190px;
174
174
  padding: 10px 12px 9px;
175
175
  }
176
176
 
@@ -178,7 +178,7 @@
178
178
  margin-top: 6px;
179
179
  display: flex;
180
180
  justify-content: flex-end;
181
- gap: 13px;
181
+ gap: 8px;
182
182
  color: var(--crt-phosphor-muted);
183
183
  font-size: 8px;
184
184
  letter-spacing: 0.06em;
@@ -190,276 +190,246 @@
190
190
  gap: 4px;
191
191
  }
192
192
 
193
- #farming-crt .billing-daily-legend i {
194
- width: 9px;
195
- height: 7px;
196
- border: 1px solid rgba(96, 255, 151, 0.42);
193
+ #farming-crt .billing-heat-scale {
194
+ gap: 3px;
197
195
  }
198
196
 
199
- #farming-crt .billing-daily-legend .is-cache {
200
- background: rgba(39, 157, 83, 0.52);
197
+ #farming-crt .billing-overrange-scale {
198
+ gap: 3px;
201
199
  }
202
200
 
203
- #farming-crt .billing-daily-legend .is-direct {
204
- background: rgba(166, 255, 195, 0.96);
205
- }
206
-
207
- #farming-crt .billing-daily-legend .is-billion {
208
- height: 2px;
209
- border: 0;
210
- background: var(--crt-phosphor-bright);
211
- box-shadow: 0 0 5px rgba(112, 255, 166, 0.8);
212
- }
213
-
214
- #farming-crt .billing-daily-scroll {
215
- min-width: 0;
216
- overflow-x: auto;
217
- overflow-y: hidden;
218
- scrollbar-width: thin;
219
- scrollbar-color: var(--crt-border) transparent;
201
+ #farming-crt .billing-overrange-scale em {
202
+ margin-right: 3px;
203
+ color: var(--crt-phosphor-muted);
204
+ font-style: normal;
220
205
  }
221
206
 
222
- #farming-crt .billing-daily-plot,
223
- #farming-crt .billing-daily-x-axis {
224
- position: relative;
225
- min-width: 760px;
207
+ #farming-crt .billing-daily-legend i,
208
+ #farming-crt .billing-day-hour-cell,
209
+ #farming-crt .billing-calendar-day {
210
+ border: 1px solid rgba(61, 238, 139, 0.12);
211
+ background: rgba(0, 9, 4, 0.82);
212
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.34);
226
213
  }
227
214
 
228
- #farming-crt .billing-axis-meta {
229
- margin-top: 5px;
230
- display: flex;
231
- justify-content: space-between;
232
- color: rgba(129, 255, 168, 0.5);
233
- font-size: 7px;
234
- letter-spacing: 0.06em;
215
+ #farming-crt .billing-daily-legend i {
216
+ width: 9px;
217
+ height: 9px;
235
218
  }
236
219
 
237
- #farming-crt .billing-daily-chart-frame {
238
- margin-top: 3px;
239
- display: grid;
240
- grid-template-columns: 46px minmax(0, 1fr);
241
- gap: 5px;
220
+ #farming-crt .billing-daily-legend i[data-level="1"],
221
+ #farming-crt .billing-day-hour-cell[data-level="1"],
222
+ #farming-crt .billing-calendar-day[data-level="1"] {
223
+ background: rgba(76, 93, 224, 0.32);
224
+ border-color: rgba(117, 131, 245, 0.38);
225
+ box-shadow: inset 0 0 1px rgba(159, 168, 255, 0.16);
242
226
  }
243
227
 
244
- #farming-crt .billing-y-axis {
245
- position: relative;
246
- height: 178px;
247
- border-right: 1px solid rgba(12, 204, 104, 0.34);
248
- color: rgba(129, 255, 168, 0.68);
249
- font-size: 7px;
250
- letter-spacing: 0.03em;
228
+ #farming-crt .billing-daily-legend i[data-level="2"],
229
+ #farming-crt .billing-day-hour-cell[data-level="2"],
230
+ #farming-crt .billing-calendar-day[data-level="2"] {
231
+ background: rgba(30, 177, 214, 0.44);
232
+ border-color: rgba(79, 207, 238, 0.48);
233
+ box-shadow: inset 0 0 1px rgba(104, 226, 255, 0.16);
251
234
  }
252
235
 
253
- #farming-crt .billing-y-axis-label {
254
- position: absolute;
255
- right: 6px;
256
- transform: translateY(50%);
257
- white-space: nowrap;
236
+ #farming-crt .billing-daily-legend i[data-level="3"],
237
+ #farming-crt .billing-day-hour-cell[data-level="3"],
238
+ #farming-crt .billing-calendar-day[data-level="3"] {
239
+ background: rgba(44, 210, 114, 0.58);
240
+ border-color: rgba(92, 235, 147, 0.58);
241
+ box-shadow: 0 0 2px rgba(80, 255, 143, 0.18);
258
242
  }
259
243
 
260
- #farming-crt .billing-y-axis-label::after {
261
- content: "";
262
- position: absolute;
263
- top: 50%;
264
- left: calc(100% + 3px);
265
- width: 4px;
266
- border-top: 1px solid rgba(12, 204, 104, 0.52);
244
+ #farming-crt .billing-daily-legend i[data-level="4"],
245
+ #farming-crt .billing-day-hour-cell[data-level="4"],
246
+ #farming-crt .billing-calendar-day[data-level="4"] {
247
+ background: rgba(244, 195, 64, 0.72);
248
+ border-color: rgba(255, 219, 112, 0.7);
249
+ box-shadow: 0 0 3px rgba(255, 203, 76, 0.24);
267
250
  }
268
251
 
269
- #farming-crt .billing-y-axis-label.is-floor {
270
- color: rgba(129, 255, 168, 0.46);
252
+ #farming-crt .billing-daily-legend i[data-level="5"],
253
+ #farming-crt .billing-day-hour-cell[data-level="5"],
254
+ #farming-crt .billing-calendar-day[data-level="5"] {
255
+ background: rgba(255, 92, 72, 0.88);
256
+ border-color: rgba(255, 174, 145, 0.86);
257
+ box-shadow: 0 0 4px rgba(255, 103, 76, 0.34);
271
258
  }
272
259
 
273
- #farming-crt .billing-daily-plot {
274
- height: 178px;
275
- border-bottom: 1px solid rgba(12, 204, 104, 0.25);
276
- background: rgba(0, 8, 4, 0.55);
260
+ #farming-crt .billing-daily-legend i[data-overrange],
261
+ #farming-crt .billing-day-hour-cell[data-overrange],
262
+ #farming-crt .billing-calendar-day[data-overrange] {
263
+ position: relative;
264
+ overflow: visible;
277
265
  }
278
266
 
279
- #farming-crt .billing-log-guides {
267
+ #farming-crt .billing-daily-legend i[data-overrange]::after,
268
+ #farming-crt .billing-day-hour-cell[data-overrange]::after,
269
+ #farming-crt .billing-calendar-day[data-overrange]::after {
270
+ content: "";
280
271
  position: absolute;
281
- inset: 0;
272
+ top: 50%;
273
+ left: 50%;
274
+ box-sizing: border-box;
275
+ width: var(--billing-overrange-symbol-size);
276
+ height: var(--billing-overrange-symbol-size);
277
+ background: rgba(255, 255, 255, 0.98);
278
+ filter: drop-shadow(0 0 2px rgba(255, 255, 255, 0.78));
279
+ transform: translate(-50%, -50%);
282
280
  pointer-events: none;
283
281
  }
284
282
 
285
- #farming-crt .billing-log-guide {
286
- position: absolute;
287
- right: 0;
288
- left: 0;
289
- height: 1px;
290
- border-top: 1px dashed rgba(12, 204, 104, 0.16);
283
+ #farming-crt .billing-daily-legend i[data-overrange="1"],
284
+ #farming-crt .billing-day-hour-cell[data-overrange="1"],
285
+ #farming-crt .billing-calendar-day[data-overrange="1"] {
286
+ background: rgba(91, 42, 146, 0.96);
287
+ border-color: rgba(188, 133, 255, 0.92);
288
+ box-shadow: 0 0 3px rgba(166, 94, 255, 0.46);
291
289
  }
292
290
 
293
- #farming-crt .billing-log-guide span {
294
- display: none;
291
+ #farming-crt [data-overrange="1"]::after {
292
+ --billing-overrange-symbol-size: 3px;
293
+ border-radius: 50%;
295
294
  }
296
295
 
297
- #farming-crt .billing-daily-bars,
298
- #farming-crt .billing-daily-x-axis {
299
- display: grid;
300
- grid-template-columns: repeat(var(--billing-chart-days, 120), minmax(3px, 1fr));
301
- gap: 2px;
296
+ #farming-crt .billing-daily-legend i[data-overrange="2"],
297
+ #farming-crt .billing-day-hour-cell[data-overrange="2"],
298
+ #farming-crt .billing-calendar-day[data-overrange="2"] {
299
+ background: rgba(106, 53, 178, 0.98);
300
+ border-color: rgba(210, 174, 255, 0.96);
301
+ box-shadow: 0 0 4px rgba(177, 112, 255, 0.58);
302
302
  }
303
303
 
304
- #farming-crt .billing-daily-bars {
305
- position: absolute;
306
- inset: 0;
307
- padding: 0 3px;
308
- }
309
-
310
- #farming-crt .billing-daily-column {
311
- position: relative;
312
- min-width: 0;
313
- height: 100%;
314
- padding: 0;
315
- border: 0;
304
+ #farming-crt [data-overrange="2"]::after {
305
+ --billing-overrange-symbol-size: 6px;
306
+ border: 1px solid rgba(255, 255, 255, 0.98);
307
+ border-radius: 50%;
316
308
  background: transparent;
317
- cursor: pointer;
318
309
  }
319
310
 
320
- #farming-crt .billing-daily-column::after {
321
- content: "";
322
- position: absolute;
323
- right: 0;
324
- bottom: 0;
325
- left: 0;
326
- height: 2px;
327
- background: rgba(12, 204, 104, 0.09);
328
- }
329
-
330
- #farming-crt .billing-daily-bar {
331
- position: absolute;
332
- right: 0;
333
- bottom: 0;
334
- left: 0;
335
- min-height: 2px;
336
- display: flex;
337
- flex-direction: column;
338
- justify-content: flex-end;
339
- overflow: visible;
340
- border: 1px solid rgba(61, 238, 139, 0.3);
341
- background: rgba(12, 204, 104, 0.12);
311
+ #farming-crt .billing-daily-legend i[data-overrange="3"],
312
+ #farming-crt .billing-day-hour-cell[data-overrange="3"],
313
+ #farming-crt .billing-calendar-day[data-overrange="3"] {
314
+ background: rgba(126, 72, 204, 0.98);
315
+ border-color: rgba(229, 206, 255, 0.98);
316
+ box-shadow: 0 0 5px rgba(198, 151, 255, 0.7);
342
317
  }
343
318
 
344
- #farming-crt .billing-daily-bar span {
345
- display: block;
346
- min-height: 1px;
319
+ #farming-crt [data-overrange="3"]::after {
320
+ --billing-overrange-symbol-size: 5px;
321
+ border: 1px solid rgba(255, 255, 255, 0.98);
322
+ background: transparent;
323
+ transform: translate(-50%, -50%) rotate(45deg);
347
324
  }
348
325
 
349
- #farming-crt .billing-daily-cache {
350
- order: 2;
351
- background: rgba(39, 157, 83, 0.58);
326
+ #farming-crt .billing-daily-legend i[data-overrange="4"],
327
+ #farming-crt .billing-day-hour-cell[data-overrange="4"],
328
+ #farming-crt .billing-calendar-day[data-overrange="4"] {
329
+ background: rgba(20, 55, 34, 0.98);
330
+ border-color: rgba(255, 255, 244, 1);
331
+ box-shadow: 0 0 7px rgba(225, 255, 225, 0.84);
352
332
  }
353
333
 
354
- #farming-crt .billing-daily-direct {
355
- order: 1;
356
- background: rgba(166, 255, 195, 0.94);
357
- box-shadow: 0 0 4px rgba(112, 255, 166, 0.34);
334
+ #farming-crt [data-overrange="4"]::after {
335
+ --billing-overrange-symbol-size: 8px;
336
+ clip-path: polygon(50% 0, 61% 39%, 100% 50%, 61% 61%, 50% 100%, 39% 61%, 0 50%, 39% 39%);
337
+ filter: drop-shadow(0 0 2px rgba(225, 255, 225, 0.9));
358
338
  }
359
339
 
360
- #farming-crt .billing-daily-column[data-billion="true"] .billing-daily-bar::before {
361
- content: "";
362
- position: absolute;
363
- top: -4px;
364
- right: -1px;
365
- left: -1px;
366
- height: 2px;
367
- background: var(--crt-phosphor-bright);
368
- box-shadow: 0 0 7px rgba(112, 255, 166, 0.85);
340
+ #farming-crt .billing-daily-scroll {
341
+ min-width: 0;
342
+ overflow-x: auto;
343
+ overflow-y: hidden;
344
+ scrollbar-width: thin;
345
+ scrollbar-color: var(--crt-border) transparent;
369
346
  }
370
347
 
371
- #farming-crt .billing-daily-column:hover,
372
- #farming-crt .billing-daily-column:focus-visible,
373
- #farming-crt .billing-daily-column.selected {
374
- outline: 1px solid rgba(183, 255, 207, 0.7);
375
- outline-offset: 0;
348
+ #farming-crt .billing-calendar-frame {
349
+ margin-top: 6px;
350
+ display: grid;
351
+ grid-template-columns: 29px minmax(0, 1fr);
352
+ gap: 7px;
376
353
  }
377
354
 
378
- #farming-crt .billing-daily-column.selected {
379
- background: rgba(116, 255, 167, 0.08);
355
+ #farming-crt .billing-calendar-weekdays {
356
+ height: 112px;
357
+ margin-top: 16px;
358
+ padding-block: 2px;
359
+ box-sizing: border-box;
360
+ display: grid;
361
+ grid-template-rows: repeat(7, 12px);
362
+ gap: 4px;
363
+ align-items: center;
364
+ justify-items: end;
365
+ color: rgba(129, 255, 168, 0.68);
366
+ font-size: 7px;
367
+ line-height: 1;
380
368
  }
381
369
 
382
- #farming-crt .billing-daily-column.selected::before {
383
- content: "";
384
- position: absolute;
385
- z-index: 2;
386
- top: 0;
387
- bottom: 0;
388
- left: 50%;
389
- border-left: 1px dashed rgba(183, 255, 207, 0.72);
390
- box-shadow: 0 0 4px rgba(112, 255, 166, 0.42);
391
- pointer-events: none;
370
+ #farming-crt .billing-calendar-months,
371
+ #farming-crt .billing-calendar-grid {
372
+ min-width: 720px;
373
+ padding-inline: 2px;
374
+ box-sizing: border-box;
375
+ display: grid;
376
+ grid-template-columns: repeat(var(--billing-calendar-weeks, 53), minmax(9px, 1fr));
377
+ gap: 4px;
392
378
  }
393
379
 
394
- #farming-crt .billing-daily-x-axis {
395
- min-height: 23px;
396
- padding: 0 3px;
397
- border-top: 1px solid rgba(12, 204, 104, 0.34);
398
- color: var(--crt-phosphor-muted);
399
- font-size: 7px;
400
- line-height: 9px;
380
+ #farming-crt .billing-calendar-months {
381
+ height: 16px;
382
+ color: rgba(149, 255, 181, 0.72);
383
+ font-size: 8px;
384
+ line-height: 11px;
385
+ letter-spacing: 0.03em;
401
386
  }
402
387
 
403
- #farming-crt .billing-daily-x-axis span {
404
- position: relative;
405
- padding-top: 5px;
388
+ #farming-crt .billing-calendar-months span {
406
389
  overflow: visible;
407
390
  white-space: nowrap;
408
391
  }
409
392
 
410
- #farming-crt .billing-daily-x-axis span.has-label::before {
411
- content: "";
412
- position: absolute;
413
- top: 0;
414
- left: 0;
415
- height: 4px;
416
- border-left: 1px solid rgba(12, 204, 104, 0.52);
393
+ #farming-crt .billing-calendar-grid {
394
+ grid-template-rows: repeat(7, 12px);
395
+ grid-auto-flow: column;
396
+ height: 112px;
397
+ padding-block: 2px;
417
398
  }
418
399
 
419
- #farming-crt .billing-daily-x-axis span.is-end {
420
- width: 34px;
421
- transform: translateX(-30px);
422
- text-align: right;
400
+ #farming-crt .billing-calendar-day {
401
+ position: relative;
402
+ min-width: 0;
403
+ height: 12px;
404
+ padding: 0;
405
+ border-radius: 2px;
406
+ cursor: pointer;
423
407
  }
424
408
 
425
- #farming-crt .billing-daily-x-axis span.is-end::before {
426
- right: 0;
427
- left: auto;
409
+ #farming-crt .billing-calendar-day:hover,
410
+ #farming-crt .billing-calendar-day:focus-visible {
411
+ border-color: rgba(220, 255, 232, 0.94);
412
+ outline: none;
428
413
  }
429
414
 
430
- #farming-crt .billing-activity-row {
431
- margin-top: 6px;
432
- display: grid;
433
- grid-template-columns: auto minmax(120px, 1fr) auto;
434
- align-items: center;
435
- gap: 8px;
415
+ #farming-crt .billing-calendar-day.selected {
416
+ outline: 1px solid rgba(244, 255, 248, 0.96);
417
+ outline-offset: 2px;
418
+ box-shadow: 0 0 7px rgba(202, 255, 220, 0.48);
419
+ }
420
+
421
+ #farming-crt .billing-calendar-footer {
422
+ margin-top: 8px;
423
+ display: flex;
424
+ justify-content: space-between;
425
+ gap: 12px;
436
426
  color: var(--crt-phosphor-muted);
437
427
  font-size: 7px;
438
428
  letter-spacing: 0.05em;
439
429
  }
440
430
 
441
- #farming-crt .billing-activity-strip {
442
- height: 8px;
443
- display: grid;
444
- grid-template-columns: repeat(var(--billing-activity-days, 364), minmax(1px, 1fr));
445
- align-items: end;
446
- gap: 1px;
447
- }
448
-
449
- #farming-crt .billing-activity-tick {
450
- height: 2px;
451
- background: rgba(12, 204, 104, 0.12);
452
- }
453
-
454
- #farming-crt .billing-activity-tick.is-active {
455
- height: 5px;
456
- background: rgba(61, 238, 139, 0.58);
457
- }
458
-
459
- #farming-crt .billing-activity-tick.is-billion {
460
- height: 8px;
461
- background: var(--crt-phosphor-bright);
462
- box-shadow: 0 0 4px rgba(112, 255, 166, 0.62);
431
+ #farming-crt .billing-calendar-spacer {
432
+ height: 12px;
463
433
  }
464
434
 
465
435
  #farming-crt .billing-day-panel {
@@ -469,7 +439,7 @@
469
439
  #farming-crt .billing-day-details {
470
440
  margin-top: 8px;
471
441
  display: grid;
472
- grid-template-columns: minmax(130px, 1.3fr) repeat(4, minmax(80px, 0.8fr)) minmax(170px, 1.4fr);
442
+ grid-template-columns: minmax(210px, 1.65fr) repeat(4, minmax(76px, 0.72fr)) minmax(160px, 1.25fr);
473
443
  gap: 8px;
474
444
  }
475
445
 
@@ -484,7 +454,7 @@
484
454
  }
485
455
 
486
456
  #farming-crt .billing-day-details small,
487
- #farming-crt .billing-day-total span {
457
+ #farming-crt .billing-day-total-compact-wrap em {
488
458
  color: var(--crt-phosphor-muted);
489
459
  font-size: 8px;
490
460
  letter-spacing: 0.07em;
@@ -492,8 +462,46 @@
492
462
 
493
463
  #farming-crt .billing-day-total .billing-day-total-compact {
494
464
  color: var(--crt-phosphor-bright);
495
- font-size: inherit;
496
- letter-spacing: inherit;
465
+ font-size: 23px;
466
+ line-height: 1;
467
+ letter-spacing: 0.02em;
468
+ text-shadow: 0 0 9px rgba(112, 255, 166, 0.55);
469
+ }
470
+
471
+ #farming-crt .billing-day-total-values {
472
+ min-width: 0;
473
+ display: flex;
474
+ align-items: baseline;
475
+ justify-content: space-between;
476
+ gap: 12px;
477
+ }
478
+
479
+ #farming-crt .billing-day-total-compact-wrap {
480
+ display: inline-flex;
481
+ align-items: baseline;
482
+ justify-content: flex-end;
483
+ gap: 4px;
484
+ white-space: nowrap;
485
+ }
486
+
487
+ #farming-crt .billing-day-total-compact-wrap em {
488
+ font-style: normal;
489
+ }
490
+
491
+ #farming-crt .billing-day-total.is-live .billing-day-total-compact::after {
492
+ content: "";
493
+ width: 3px;
494
+ height: 3px;
495
+ margin-left: 5px;
496
+ display: inline-block;
497
+ vertical-align: middle;
498
+ background: var(--crt-phosphor-bright);
499
+ box-shadow: 0 0 6px rgba(112, 255, 166, 0.9);
500
+ animation: crt-billing-live-pulse 1.2s steps(2, end) infinite;
501
+ }
502
+
503
+ @keyframes crt-billing-live-pulse {
504
+ 50% { opacity: 0.18; }
497
505
  }
498
506
 
499
507
  #farming-crt .billing-day-details strong {
@@ -506,7 +514,7 @@
506
514
  }
507
515
 
508
516
  #farming-crt .billing-day-total strong {
509
- font-size: 16px;
517
+ font-size: 14px;
510
518
  text-shadow: 0 0 8px rgba(12, 204, 104, 0.36);
511
519
  }
512
520
 
@@ -562,6 +570,7 @@
562
570
  width: 100%;
563
571
  height: 100%;
564
572
  overflow: visible;
573
+ pointer-events: none;
565
574
  border-left: 1px solid rgba(12, 204, 104, 0.23);
566
575
  border-bottom: 1px solid rgba(12, 204, 104, 0.23);
567
576
  background: rgba(0, 8, 4, 0.72);
@@ -594,12 +603,82 @@
594
603
  stroke-dasharray: 4 3;
595
604
  }
596
605
 
597
- #farming-crt .billing-day-curve-x-axis {
598
- margin: 4px 0 0 46px;
606
+ #farming-crt .billing-day-hour-strip {
607
+ margin: 5px 0 0 46px;
608
+ display: grid;
609
+ grid-template-columns: repeat(24, minmax(5px, 1fr));
610
+ gap: 2px;
611
+ }
612
+
613
+ #farming-crt .billing-day-hour-cell {
614
+ min-width: 0;
615
+ height: 11px;
616
+ padding: 0;
617
+ border-radius: 1px;
618
+ cursor: pointer;
619
+ }
620
+
621
+ #farming-crt .billing-day-hour-cell:hover,
622
+ #farming-crt .billing-day-hour-cell:focus-visible,
623
+ #farming-crt .billing-day-hour-cell.selected {
624
+ border-color: var(--crt-phosphor-bright);
625
+ outline: none;
626
+ }
627
+
628
+ #farming-crt .billing-day-hour-cell.selected {
629
+ outline: 1px solid rgba(193, 255, 214, 0.86);
630
+ outline-offset: 1px;
631
+ box-shadow: 0 0 5px rgba(112, 255, 166, 0.56);
632
+ }
633
+
634
+ #farming-crt .billing-day-hour-axis {
635
+ min-height: 15px;
636
+ margin: 6px 0 0 46px;
599
637
  display: flex;
600
638
  justify-content: space-between;
601
- color: var(--crt-phosphor-muted);
602
- font-size: 7px;
639
+ border-top: 1px solid rgba(12, 204, 104, 0.24);
640
+ color: rgba(166, 255, 195, 0.84);
641
+ font-size: 8px;
642
+ letter-spacing: 0.02em;
643
+ }
644
+
645
+ #farming-crt .billing-day-hour-axis span {
646
+ position: relative;
647
+ padding-top: 5px;
648
+ }
649
+
650
+ #farming-crt .billing-day-hour-axis span::before {
651
+ content: "";
652
+ position: absolute;
653
+ top: 0;
654
+ left: 50%;
655
+ height: 3px;
656
+ border-left: 1px solid rgba(112, 255, 166, 0.62);
657
+ }
658
+
659
+ #farming-crt .billing-day-hour-axis span:first-child::before {
660
+ left: 0;
661
+ }
662
+
663
+ #farming-crt .billing-day-hour-axis span:last-child {
664
+ text-align: right;
665
+ }
666
+
667
+ #farming-crt .billing-day-hour-axis span:last-child::before {
668
+ right: 0;
669
+ left: auto;
670
+ }
671
+
672
+ #farming-crt .billing-day-hour-readout {
673
+ min-height: 18px;
674
+ margin: 5px 0 0 46px;
675
+ padding: 4px 7px 3px;
676
+ border-left: 2px solid rgba(112, 255, 166, 0.72);
677
+ background: rgba(12, 204, 104, 0.09);
678
+ color: var(--crt-phosphor-bright);
679
+ font-size: 9px;
680
+ letter-spacing: 0.06em;
681
+ text-shadow: 0 0 5px rgba(112, 255, 166, 0.32);
603
682
  }
604
683
 
605
684
  #farming-crt .billing-day-curve-footer {
@@ -945,18 +1024,10 @@
945
1024
  }
946
1025
 
947
1026
  #farming-crt .billing-daily-chart-panel {
948
- min-height: 260px;
949
- }
950
-
951
- #farming-crt .billing-daily-plot {
952
- height: 160px;
953
- }
954
-
955
- #farming-crt .billing-activity-row {
956
- grid-template-columns: auto minmax(100px, 1fr);
1027
+ min-height: 190px;
957
1028
  }
958
1029
 
959
- #farming-crt .billing-activity-row #billing-daily-range {
1030
+ #farming-crt .billing-calendar-footer #billing-daily-range {
960
1031
  display: none;
961
1032
  }
962
1033
 
@@ -343,14 +343,14 @@
343
343
  0 0 3px rgba(12, 204, 104, 0.22);
344
344
  }
345
345
 
346
- #farming-crt :where(.key-hint, .agent-item .key-hint, .workspace-history-badge, .input-dialog-content button:not(.workspace-history-item), .close-btn) {
346
+ #farming-crt :where(.key-hint, .agent-item .key-hint, .workspace-history-badge, .input-dialog-content button:not(.workspace-history-item):not(.secondary), .close-btn) {
347
347
  color: #001409;
348
348
  background: var(--crt-phosphor);
349
349
  box-shadow: 0 0 8px rgba(12, 204, 104, 0.4);
350
350
  text-shadow: none;
351
351
  }
352
352
 
353
- #farming-crt :where(.input-dialog-content button:not(.workspace-history-item):hover, .close-btn:hover) {
353
+ #farming-crt :where(.input-dialog-content button:not(.workspace-history-item):not(.secondary):hover, .close-btn:hover) {
354
354
  background: var(--crt-phosphor-bright);
355
355
  }
356
356
 
@@ -474,9 +474,14 @@
474
474
  }
475
475
 
476
476
  #farming-crt #session-modal .terminal {
477
+ position: relative;
477
478
  background: var(--crt-background);
478
479
  }
479
480
 
481
+ #farming-crt #terminal-output.crt-terminal-checkpoint-installing .xterm {
482
+ visibility: hidden;
483
+ }
484
+
480
485
  #farming-crt .terminal canvas {
481
486
  filter: drop-shadow(0 0 3px rgba(12, 204, 104, 0.3));
482
487
  }