obsidian-agent-fleet 0.7.1 → 0.9.2

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "agent-fleet",
3
3
  "name": "Agent Fleet",
4
- "version": "0.7.1",
4
+ "version": "0.9.2",
5
5
  "minAppVersion": "1.6.0",
6
6
  "description": "File-backed AI agents, task scheduling, and inbox monitoring inside Obsidian.",
7
7
  "author": "Denis Berekchiyan",
package/plugin/styles.css CHANGED
@@ -1301,6 +1301,20 @@
1301
1301
  gap: 8px 16px;
1302
1302
  }
1303
1303
 
1304
+ .af-form-checkbox-row {
1305
+ display: flex;
1306
+ align-items: center;
1307
+ gap: 6px;
1308
+ margin: 2px 0;
1309
+ font-size: 12px;
1310
+ color: var(--af-text-primary);
1311
+ cursor: pointer;
1312
+ }
1313
+
1314
+ .af-form-checkbox-row input[type="checkbox"] {
1315
+ margin: 0;
1316
+ }
1317
+
1304
1318
  .af-form-checkbox-label {
1305
1319
  display: flex;
1306
1320
  align-items: center;
@@ -3054,8 +3068,9 @@
3054
3068
 
3055
3069
  .af-chat-bubble-user {
3056
3070
  align-self: flex-end;
3057
- background: var(--af-accent);
3058
- color: #fff;
3071
+ background: transparent;
3072
+ color: var(--af-text-primary);
3073
+ border: 1px solid var(--af-accent);
3059
3074
  border-bottom-right-radius: var(--af-radius-sm);
3060
3075
  }
3061
3076
 
@@ -4027,3 +4042,487 @@
4027
4042
  opacity: 0.6;
4028
4043
  font-style: italic;
4029
4044
  }
4045
+
4046
+ /* ── Model picker ── */
4047
+
4048
+ .af-model-picker {
4049
+ display: flex;
4050
+ flex-direction: column;
4051
+ gap: 6px;
4052
+ width: 100%;
4053
+ }
4054
+
4055
+ .af-mp-select {
4056
+ width: 100%;
4057
+ }
4058
+
4059
+ .af-mp-custom-input {
4060
+ font-family: var(--font-monospace, ui-monospace, SFMono-Regular, Menlo, monospace);
4061
+ font-size: 12px;
4062
+ }
4063
+
4064
+ /* ── Chat stats strip (terminal-style) ── */
4065
+
4066
+ .af-chat-stats {
4067
+ display: flex;
4068
+ align-items: center;
4069
+ /* Align with input: attach btn (18px) + gap (8px), plus a small inset so
4070
+ * the model name breathes rather than hugging the textarea edge. */
4071
+ padding: 6px 12px 0 calc(18px + 8px + 10px);
4072
+ min-height: 12px;
4073
+ font-family: var(--font-monospace, ui-monospace, SFMono-Regular, Menlo, monospace);
4074
+ font-size: 10px;
4075
+ line-height: 1;
4076
+ color: var(--af-text-faint);
4077
+ }
4078
+
4079
+ .af-chat-stats-muted {
4080
+ color: transparent;
4081
+ }
4082
+
4083
+ /* One-line row: `<model> <bar> <pct>` — space-between for nice separation. */
4084
+ .af-chat-stats-line {
4085
+ display: flex;
4086
+ align-items: center;
4087
+ justify-content: space-between;
4088
+ width: 100%;
4089
+ gap: 12px;
4090
+ }
4091
+
4092
+ .af-chat-stats-model {
4093
+ color: var(--af-text-secondary);
4094
+ white-space: nowrap;
4095
+ overflow: hidden;
4096
+ text-overflow: ellipsis;
4097
+ }
4098
+
4099
+ .af-chat-stats-ctx {
4100
+ display: inline-flex;
4101
+ align-items: baseline;
4102
+ gap: 6px;
4103
+ color: var(--af-text-faint);
4104
+ flex-shrink: 0;
4105
+ }
4106
+
4107
+ .af-chat-stats-bar {
4108
+ /* Render the blocks at a reduced size so the bar reads as a thin rule
4109
+ * rather than competing vertically with the model name. */
4110
+ font-size: 8px;
4111
+ line-height: 1;
4112
+ letter-spacing: 0;
4113
+ color: var(--af-text-secondary);
4114
+ }
4115
+
4116
+ .af-chat-stats-pct {
4117
+ color: var(--af-text-secondary);
4118
+ min-width: 28px;
4119
+ text-align: right;
4120
+ }
4121
+
4122
+ .af-chat-stats-ctx.warn .af-chat-stats-bar,
4123
+ .af-chat-stats-ctx.warn .af-chat-stats-pct {
4124
+ color: var(--color-orange, #e8a23a);
4125
+ }
4126
+
4127
+ /* Transient compact notice in the stats strip. Intentionally muted — it's
4128
+ * informational ("we just summarized to free up context"), not an error. */
4129
+ .af-chat-stats-compact {
4130
+ color: var(--af-text-secondary);
4131
+ font-size: 0.85em;
4132
+ opacity: 0.85;
4133
+ white-space: nowrap;
4134
+ overflow: hidden;
4135
+ text-overflow: ellipsis;
4136
+ }
4137
+
4138
+ /* ── Chat threading ── */
4139
+
4140
+ /* Thread badge: mirrors the `.af-chat-tool-summary summary` treatment —
4141
+ * bordered rounded pill, surface bg, muted text, darker-bg on hover. Keeps
4142
+ * thread and tool-calls affordances visually consistent. */
4143
+ /* Affordances row — a horizontal flex container that hosts the thread
4144
+ * badge and the tool-calls summary side-by-side under an assistant bubble.
4145
+ * `flex-start` alignment keeps the two buttons flush at the top even when
4146
+ * the tool-calls <details> is expanded and its block height grows below. */
4147
+ .af-chat-affordances {
4148
+ align-self: flex-start;
4149
+ display: flex;
4150
+ align-items: flex-start;
4151
+ flex-wrap: wrap;
4152
+ gap: 8px;
4153
+ }
4154
+
4155
+ /* The tool-summary already sets `align-self: flex-start` for its messages-list
4156
+ * position, but inside the affordances row we want it to sit on the
4157
+ * baseline next to the thread badge — reset. */
4158
+ .af-chat-affordances .af-chat-tool-summary {
4159
+ align-self: auto;
4160
+ }
4161
+
4162
+ /* Inside the affordances row, keep the original `<details>` + `<summary>` +
4163
+ * `.af-chat-tool-list` structure so that expanding the tool-calls pill
4164
+ * reads as ONE bordered component (summary on top, list below, single
4165
+ * border wraps both). Height matching is done by sizing the inner summary
4166
+ * so that summary+border == thread-badge total height. */
4167
+ .af-thread-badge,
4168
+ .af-chat-affordances .af-chat-tool-summary,
4169
+ .af-chat-affordances .af-chat-tool-summary details,
4170
+ .af-chat-affordances .af-chat-tool-summary summary {
4171
+ font-size: 11px;
4172
+ line-height: 1.4;
4173
+ box-sizing: border-box;
4174
+ margin: 0;
4175
+ }
4176
+
4177
+ /* Border lives on <details> (wraps summary + list). `overflow: hidden`
4178
+ * clips the list's corners to the details radius. */
4179
+ .af-chat-affordances .af-chat-tool-summary details {
4180
+ border: 1px solid var(--af-border);
4181
+ border-radius: var(--af-radius-sm);
4182
+ background: var(--af-bg-surface);
4183
+ overflow: hidden;
4184
+ }
4185
+
4186
+ /* Summary is the button surface — no border of its own (its parent
4187
+ * details provides one). Height 26px + details' 2px border = 28px total,
4188
+ * matching the thread badge exactly. */
4189
+ .af-chat-affordances .af-chat-tool-summary summary {
4190
+ height: 26px;
4191
+ padding: 0 10px;
4192
+ display: flex;
4193
+ align-items: center;
4194
+ gap: 4px;
4195
+ color: var(--af-text-muted);
4196
+ list-style: none;
4197
+ cursor: pointer;
4198
+ user-select: none;
4199
+ }
4200
+
4201
+ .af-chat-affordances .af-chat-tool-summary summary:hover {
4202
+ color: var(--af-text-primary);
4203
+ background: var(--af-bg-secondary);
4204
+ }
4205
+
4206
+ /* Thread badge keeps its own border because it has no details wrapper —
4207
+ * full 28px with border+padding baked in. */
4208
+ .af-thread-badge {
4209
+ height: 28px;
4210
+ }
4211
+
4212
+ .af-chat-affordances .af-chat-tool-summary summary::-webkit-details-marker {
4213
+ display: none;
4214
+ }
4215
+
4216
+ .af-chat-affordances .af-chat-tool-summary summary::marker {
4217
+ content: "";
4218
+ }
4219
+
4220
+ /* When open, a subtle separator line sits between summary and list —
4221
+ * both wrapped by the outer details border, so the whole thing reads as a
4222
+ * single component. */
4223
+ .af-chat-affordances .af-chat-tool-summary details[open] summary {
4224
+ border-bottom: 1px solid var(--af-border);
4225
+ }
4226
+
4227
+ .af-chat-affordances .af-chat-tool-summary .af-chat-tool-list {
4228
+ border: none;
4229
+ background: transparent;
4230
+ padding: 6px 10px 8px 10px;
4231
+ }
4232
+
4233
+ /* Mirrors `.af-chat-tool-summary summary` one-for-one. Rendered as a
4234
+ * `<div role="button">` rather than `<button>` to avoid Obsidian's global
4235
+ * button styling (`--interactive-normal` bg, etc.) bleeding through. */
4236
+ .af-thread-badge {
4237
+ display: inline-flex;
4238
+ align-items: center;
4239
+ gap: 4px;
4240
+ padding: 6px 10px;
4241
+ border: 1px solid var(--af-border);
4242
+ border-radius: var(--af-radius-sm);
4243
+ background: var(--af-bg-surface);
4244
+ color: var(--af-text-muted);
4245
+ font-size: 11px;
4246
+ cursor: pointer;
4247
+ user-select: none;
4248
+ box-shadow: none;
4249
+ outline: none;
4250
+ }
4251
+
4252
+ .af-thread-badge:hover {
4253
+ color: var(--af-text-primary);
4254
+ background: var(--af-bg-secondary);
4255
+ }
4256
+
4257
+ .af-thread-badge:active,
4258
+ .af-thread-badge:focus {
4259
+ box-shadow: none;
4260
+ outline: none;
4261
+ }
4262
+
4263
+ .af-thread-badge svg {
4264
+ width: 12px;
4265
+ height: 12px;
4266
+ }
4267
+
4268
+ .af-thread-badge.expanded {
4269
+ color: var(--af-text-primary);
4270
+ background: var(--af-bg-secondary);
4271
+ border-color: var(--af-accent);
4272
+ }
4273
+
4274
+ .af-thread-badge-label {
4275
+ line-height: 1;
4276
+ }
4277
+
4278
+ /* Thread container: nested region under the anchor bubble, read as an
4279
+ * indented sidebar-style subconversation. */
4280
+ .af-thread-container {
4281
+ margin: 2px 0 14px 0;
4282
+ padding: 10px 12px 10px 14px;
4283
+ border-left: 2px solid var(--af-accent);
4284
+ background: var(--af-bg-surface);
4285
+ border-radius: 0 var(--af-radius-md) var(--af-radius-md) 0;
4286
+ align-self: stretch;
4287
+ }
4288
+
4289
+ .af-thread-wrap {
4290
+ display: flex;
4291
+ flex-direction: column;
4292
+ gap: 10px;
4293
+ }
4294
+
4295
+ .af-thread-messages {
4296
+ display: flex;
4297
+ flex-direction: column;
4298
+ gap: 8px;
4299
+ }
4300
+
4301
+ /* Thread bubbles: same visual language as main chat (accent-fill for user,
4302
+ * surface-fill with border for assistant, asymmetric tail corner) but
4303
+ * denser — smaller font, tighter padding, lower max-width — to read as a
4304
+ * compact subconversation. */
4305
+ .af-thread-bubble {
4306
+ max-width: 82%;
4307
+ padding: 7px 11px;
4308
+ border-radius: var(--af-radius-md);
4309
+ font-size: 12px;
4310
+ line-height: 1.5;
4311
+ white-space: pre-wrap;
4312
+ word-break: break-word;
4313
+ position: relative;
4314
+ }
4315
+
4316
+ .af-thread-bubble-user {
4317
+ align-self: flex-end;
4318
+ background: transparent;
4319
+ color: var(--af-text-primary);
4320
+ border: 1px solid var(--af-accent);
4321
+ border-bottom-right-radius: var(--af-radius-sm);
4322
+ }
4323
+
4324
+ .af-thread-bubble-assistant {
4325
+ align-self: flex-start;
4326
+ background: var(--background-primary);
4327
+ color: var(--af-text-primary);
4328
+ border: 1px solid var(--af-border);
4329
+ border-bottom-left-radius: var(--af-radius-sm);
4330
+ }
4331
+
4332
+ /* Compact markdown tweaks so assistant thread bubbles stay tight. */
4333
+ .af-thread-bubble-assistant.af-compact-md {
4334
+ font-size: 12px;
4335
+ }
4336
+
4337
+ /* Thread composer reuses the main .af-chat-input-row so attach/input/send
4338
+ * styles are inherited verbatim — the one knob is a slightly smaller input
4339
+ * height to match the thread's density. */
4340
+ .af-thread-composer {
4341
+ padding-top: 2px;
4342
+ }
4343
+
4344
+ .af-thread-input {
4345
+ font-size: 12px;
4346
+ min-height: 28px;
4347
+ max-height: 120px;
4348
+ }
4349
+
4350
+ .af-thread-error {
4351
+ padding: 6px 10px;
4352
+ border-radius: var(--af-radius-sm);
4353
+ background: rgba(243, 139, 168, 0.12);
4354
+ color: var(--af-red);
4355
+ border: 1px solid var(--af-red);
4356
+ font-size: 11px;
4357
+ align-self: stretch;
4358
+ }
4359
+
4360
+ /* ── Wiki Keepers settings section ── */
4361
+ .af-wk-list {
4362
+ margin: 8px 0 16px 0;
4363
+ display: flex;
4364
+ flex-direction: column;
4365
+ gap: 6px;
4366
+ }
4367
+
4368
+ .af-wk-row {
4369
+ display: flex;
4370
+ align-items: center;
4371
+ justify-content: space-between;
4372
+ padding: 8px 12px;
4373
+ border: 1px solid var(--af-border);
4374
+ border-radius: var(--af-radius-sm);
4375
+ background: var(--af-bg-surface);
4376
+ }
4377
+
4378
+ .af-wk-row-left {
4379
+ display: flex;
4380
+ align-items: baseline;
4381
+ gap: 12px;
4382
+ }
4383
+
4384
+ .af-wk-name {
4385
+ font-weight: 500;
4386
+ color: var(--af-text-primary);
4387
+ }
4388
+
4389
+ .af-wk-scope {
4390
+ font-size: 11px;
4391
+ color: var(--af-text-secondary);
4392
+ font-family: var(--font-monospace, ui-monospace, SFMono-Regular, Menlo, monospace);
4393
+ }
4394
+
4395
+ .af-wk-empty {
4396
+ padding: 10px 12px;
4397
+ color: var(--af-text-muted);
4398
+ font-style: italic;
4399
+ font-size: 12px;
4400
+ }
4401
+
4402
+ .af-wk-row-actions {
4403
+ display: flex;
4404
+ gap: 6px;
4405
+ }
4406
+
4407
+ .af-wk-row-btn {
4408
+ font-size: 11px;
4409
+ padding: 4px 10px;
4410
+ border: 1px solid var(--af-border);
4411
+ border-radius: var(--af-radius-sm);
4412
+ background: var(--af-bg-card);
4413
+ color: var(--af-text-secondary);
4414
+ cursor: pointer;
4415
+ }
4416
+
4417
+ .af-wk-row-btn:hover {
4418
+ background: var(--af-bg-secondary);
4419
+ color: var(--af-text-primary);
4420
+ }
4421
+
4422
+ .af-wk-row-btn-danger:hover {
4423
+ color: var(--af-red);
4424
+ border-color: var(--af-red);
4425
+ }
4426
+
4427
+ /* ── Add / Edit Wiki Keeper modal ── */
4428
+
4429
+ .af-wk-modal .af-wk-banner {
4430
+ padding: 10px 12px;
4431
+ background: var(--af-bg-surface);
4432
+ border: 1px solid var(--af-border);
4433
+ border-radius: var(--af-radius-sm);
4434
+ color: var(--af-text-secondary);
4435
+ font-size: 12px;
4436
+ line-height: 1.5;
4437
+ margin-bottom: 16px;
4438
+ }
4439
+
4440
+ .af-wk-modal .af-wk-banner strong {
4441
+ color: var(--af-text-primary);
4442
+ }
4443
+
4444
+ .af-wk-modal .af-wk-section-h {
4445
+ margin: 18px 0 8px 0;
4446
+ font-size: 12px;
4447
+ font-weight: 600;
4448
+ text-transform: uppercase;
4449
+ letter-spacing: 0.06em;
4450
+ color: var(--af-text-secondary);
4451
+ border-bottom: 1px solid var(--af-border);
4452
+ padding-bottom: 4px;
4453
+ }
4454
+
4455
+ .af-wk-modal .af-wk-name-preview {
4456
+ color: var(--af-text-secondary);
4457
+ font-size: 12px;
4458
+ margin: 4px 0 16px 0;
4459
+ font-family: var(--font-monospace, ui-monospace, SFMono-Regular, Menlo, monospace);
4460
+ }
4461
+
4462
+ .af-wk-modal-footer {
4463
+ display: flex;
4464
+ justify-content: flex-end;
4465
+ gap: 8px;
4466
+ margin-top: 20px;
4467
+ padding-top: 12px;
4468
+ border-top: 1px solid var(--af-border);
4469
+ }
4470
+
4471
+ .af-wk-schedule-block {
4472
+ margin-bottom: 12px;
4473
+ }
4474
+
4475
+ /* ── Run-detail transcript disclosure ── */
4476
+
4477
+ .af-run-transcript {
4478
+ margin-top: 12px;
4479
+ border-top: 1px solid var(--af-border);
4480
+ padding-top: 10px;
4481
+ }
4482
+
4483
+ .af-run-transcript > summary {
4484
+ display: inline-flex;
4485
+ align-items: center;
4486
+ gap: 6px;
4487
+ list-style: none;
4488
+ cursor: pointer;
4489
+ font-size: 11px;
4490
+ color: var(--af-text-muted);
4491
+ padding: 4px 8px;
4492
+ border: 1px solid var(--af-border);
4493
+ border-radius: var(--af-radius-sm);
4494
+ background: var(--af-bg-surface);
4495
+ user-select: none;
4496
+ }
4497
+
4498
+ .af-run-transcript > summary:hover {
4499
+ color: var(--af-text-primary);
4500
+ background: var(--af-bg-secondary);
4501
+ }
4502
+
4503
+ .af-run-transcript > summary::-webkit-details-marker { display: none; }
4504
+ .af-run-transcript > summary::marker { content: ""; }
4505
+
4506
+ .af-run-transcript-icon svg {
4507
+ width: 12px;
4508
+ height: 12px;
4509
+ }
4510
+
4511
+ .af-run-transcript-meta {
4512
+ color: var(--af-text-faint);
4513
+ font-size: 10px;
4514
+ margin-left: 4px;
4515
+ }
4516
+
4517
+ .af-run-transcript-body {
4518
+ margin-top: 10px;
4519
+ padding-top: 10px;
4520
+ border-top: 1px dashed var(--af-border);
4521
+ opacity: 0.92;
4522
+ }
4523
+
4524
+ .af-wk-schedule-block .af-form-hint {
4525
+ font-size: 12px;
4526
+ color: var(--af-text-secondary);
4527
+ margin-bottom: 6px;
4528
+ }