fraim-hub 2.0.340 → 2.0.342
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/registry/scripts/learning/completion-state.js +10 -2
- package/dist/src/ai-hub/conversation-store.js +14 -11
- package/dist/src/ai-hub/desktop-main.js +7 -3
- package/dist/src/ai-hub/hosts.js +28 -0
- package/dist/src/ai-hub/manager-turns.js +16 -0
- package/dist/src/ai-hub/server.js +148 -6
- package/dist/src/cli/setup/ide-invocation-surfaces.js +1 -1
- package/dist/src/core/handoff-contracts.js +122 -21
- package/dist/src/core/proposal-set-contract.js +214 -0
- package/dist/src/core/run-recovery-state.js +9 -0
- package/dist/src/core/utils/local-registry-resolver.js +33 -6
- package/dist/src/local-mcp-server/learning-context-builder.js +128 -1
- package/dist/src/local-mcp-server/learning-usage-eligibility.js +59 -0
- package/dist/src/local-mcp-server/learning-usage-projection.js +5 -1
- package/dist/src/local-mcp-server/learning-usage-store.js +163 -38
- package/package.json +5 -2
- package/public/ai-hub/coach-intake-surface.js +415 -0
- package/public/ai-hub/index.html +21 -63
- package/public/ai-hub/pane-surfaces.js +315 -0
- package/public/ai-hub/review.css +46 -3
- package/public/ai-hub/script.js +474 -370
- package/public/ai-hub/styles.css +61 -40
package/public/ai-hub/styles.css
CHANGED
|
@@ -2696,6 +2696,13 @@ button.small { padding: 4px 10px; font-size: 12px; }
|
|
|
2696
2696
|
matches this block's own stated intent ("bound X to keep the coach
|
|
2697
2697
|
reachable at the bottom") for the one element Treatment 3 added. */
|
|
2698
2698
|
#empty { max-height: calc(100vh - 160px); }
|
|
2699
|
+
/* Issue #1911: #pane-surface-host is the same kind of element as #empty - a
|
|
2700
|
+
`flex:1; min-height:0` pane child with nothing to flex-distribute against
|
|
2701
|
+
once .conversation loses its height constraint here. Uncapped, the Coach
|
|
2702
|
+
intake pushed #persistent-composer below the fold at 640px, the exact
|
|
2703
|
+
failure the #empty cap above was added to stop. Any future surface
|
|
2704
|
+
inherits the cap rather than having to rediscover it. */
|
|
2705
|
+
#pane-surface-host { max-height: 45vh; }
|
|
2699
2706
|
#active-conv { flex: initial; overflow-y: visible; }
|
|
2700
2707
|
.conv-stream { flex: initial; }
|
|
2701
2708
|
/* Mobile: thread panel reverts to normal block flow; page scrolls naturally */
|
|
@@ -5767,8 +5774,8 @@ body.hub-shell { display: flex; flex-direction: column; height: 100vh; overflow:
|
|
|
5767
5774
|
/* #1340: block-level so overflow/ellipsis actually applies (a plain inline span never
|
|
5768
5775
|
establishes its own overflow box, so a long title/description used to run on past the
|
|
5769
5776
|
row and visually collide with whatever came after it, including the new viz control
|
|
5770
|
-
below).
|
|
5771
|
-
the default row too. */
|
|
5777
|
+
below). The teach dialog row already carried this same fix locally; this closes
|
|
5778
|
+
the gap for the default row too (.ci-picker-row inherits it now). */
|
|
5772
5779
|
.cp-row-title { display:block; font-weight:600; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
|
|
5773
5780
|
.cp-row-sub { display:block; font-size:11px; color:var(--muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; margin-top:1px; }
|
|
5774
5781
|
.cp-row-tag { font-size:10px; color:var(--muted); background:var(--bg); border:1px solid var(--line); border-radius:4px; padding:1px 5px; flex-shrink:0; }
|
|
@@ -6462,23 +6469,19 @@ img.eh-av { object-fit: cover; background: var(--surface); }
|
|
|
6462
6469
|
padding: 4px 12px 2px;
|
|
6463
6470
|
}
|
|
6464
6471
|
|
|
6465
|
-
/* Issue #976
|
|
6466
|
-
.tjd-card
|
|
6467
|
-
.tjd-
|
|
6468
|
-
|
|
6469
|
-
|
|
6470
|
-
.tjd-form { display:flex; flex-direction:column; gap:10px; min-width:0; }
|
|
6472
|
+
/* Issue #976 intake controls, reused by the Coach pane surface (issue #1911).
|
|
6473
|
+
The dialog itself (.tjd-card/.tjd-hdr/.tjd-body/.tjd-form/.tjd-mimic*/
|
|
6474
|
+
.tjd-actions/.tjd-secondary) is gone with #teach-job-modal; what survives is
|
|
6475
|
+
the set of field, mode and error controls the panel renders instead, so the
|
|
6476
|
+
intake looks and validates exactly as it did before it left the overlay. */
|
|
6471
6477
|
.tjd-modes { display:flex; gap:8px; }
|
|
6472
6478
|
.tjd-mode { flex:1; min-width:0; padding:12px; border:1px solid var(--line); border-radius:10px; text-align:left; background:var(--surface); color:var(--text); font:inherit; cursor:pointer; }
|
|
6473
6479
|
.tjd-mode[aria-pressed="true"] { border-color:var(--teach); background:var(--teach-soft); color:var(--teach); }
|
|
6474
6480
|
.tjd-mode strong { display:block; font-size:13px; margin-bottom:2px; }
|
|
6475
6481
|
.tjd-mode span { display:block; font-size:11.5px; color:var(--muted); }
|
|
6476
6482
|
.tjd-mode[aria-pressed="true"] span { color:inherit; }
|
|
6477
|
-
.tjd-mode:focus-visible
|
|
6478
|
-
.tjd-
|
|
6479
|
-
.tjd-new-fields { display:flex; flex-direction:column; gap:10px; }
|
|
6480
|
-
.tjd-new-fields[hidden], .tjd-hint[hidden], #tjd-mimic-toggle[hidden] { display:none; }
|
|
6481
|
-
.tjd-form .hm-field textarea { min-height:80px; }
|
|
6483
|
+
.tjd-mode:focus-visible { outline:2px solid var(--accent); outline-offset:2px; }
|
|
6484
|
+
.tjd-hint[hidden] { display:none; }
|
|
6482
6485
|
.tjd-hint { margin:0; font-size:12px; line-height:1.45; color:var(--muted); }
|
|
6483
6486
|
.tjd-field-error,
|
|
6484
6487
|
.tjd-submit-error { color:var(--danger); font-size:12px; line-height:1.35; margin-top:4px; }
|
|
@@ -6487,34 +6490,52 @@ img.eh-av { object-fit: cover; background: var(--surface); }
|
|
|
6487
6490
|
.tjd-label { display:block; font-size:12px; font-weight:600; color:var(--muted); margin-bottom:5px; }
|
|
6488
6491
|
.tjd-search { width:100%; border:1px solid var(--line); border-radius:9px; padding:9px 12px; font:inherit; font-size:13px; background:var(--bg); color:var(--text); }
|
|
6489
6492
|
.tjd-search:focus { outline:2px solid var(--accent); border-color:transparent; }
|
|
6490
|
-
.tjd-card input::placeholder, .tjd-card textarea::placeholder { color:var(--muted); opacity:1; }
|
|
6491
|
-
.tjd-mimic { min-width:0; border:1px solid var(--line); border-radius:10px; background:var(--surface); overflow:hidden; }
|
|
6492
|
-
.tjd-mimic summary { padding:10px 12px; font-size:12px; font-weight:600; cursor:pointer; }
|
|
6493
|
-
.tjd-mimic-head { padding:12px; border-bottom:1px solid var(--line); background:var(--surface); }
|
|
6494
|
-
.tjd-mimic-results { overflow-y:auto; overflow-x:hidden; min-height:0; max-height:156px; padding:5px 0; }
|
|
6495
|
-
.tjd-mimic-row { display:flex; align-items:flex-start; gap:10px; padding:9px 12px; cursor:pointer; border:0; background:transparent; width:100%; max-width:100%; min-width:0; overflow:hidden; text-align:left; color:var(--text); font-size:13px; }
|
|
6496
|
-
.tjd-mimic-row:hover,
|
|
6497
|
-
.tjd-mimic-row.selected { background:var(--accent-soft,rgba(0,113,227,.08)); }
|
|
6498
|
-
.tjd-mimic-row:hover .cp-row-sub, .tjd-mimic-row.selected .cp-row-sub { color:var(--text); }
|
|
6499
|
-
.tjd-mimic-row .cp-row-body { display:flex; flex:1 1 auto; flex-direction:column; gap:2px; min-width:0; overflow:hidden; }
|
|
6500
|
-
.tjd-mimic-row .cp-row-title,
|
|
6501
|
-
.tjd-mimic-row .cp-row-sub { display:block; max-width:100%; white-space:normal; overflow:hidden; text-overflow:ellipsis; overflow-wrap:anywhere; }
|
|
6502
|
-
.tjd-mimic-row .cp-row-title { line-height:1.25; }
|
|
6503
|
-
.tjd-mimic-row .cp-row-sub { line-height:1.35; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; }
|
|
6504
|
-
.tjd-mimic-row .cp-row-tag { max-width:72px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; margin-top:1px; }
|
|
6505
|
-
.tjd-mimic-empty { padding:16px 12px; color:var(--muted); font-size:12px; }
|
|
6506
|
-
.tjd-selected-mimic { margin:10px 12px 4px; display:flex; align-items:flex-start; gap:8px; border:1px solid color-mix(in srgb,var(--accent) 42%,var(--line) 58%); background:var(--accent-soft,rgba(0,113,227,.08)); border-radius:8px; padding:8px 10px; font-size:12px; color:var(--text); }
|
|
6507
|
-
.tjd-selected-mimic[hidden] { display:none; }
|
|
6508
|
-
.tjd-selected-mimic span { min-width:0; flex:1; }
|
|
6509
|
-
.tjd-selected-mimic button { border:0; background:transparent; color:var(--accent-strong); font-weight:700; cursor:pointer; padding:0; }
|
|
6510
|
-
.tjd-actions { grid-column:1 / -1; display:flex; justify-content:flex-end; gap:10px; }
|
|
6511
|
-
.tjd-secondary { border:1px solid var(--line); background:var(--surface); color:var(--text); border-radius:8px; padding:9px 14px; font-weight:700; cursor:pointer; }
|
|
6512
|
-
.tjd-secondary:hover { border-color:var(--accent); }
|
|
6513
6493
|
|
|
6514
|
-
|
|
6515
|
-
|
|
6516
|
-
|
|
6517
|
-
|
|
6494
|
+
/* Issue #1911 R16: the reusable main-pane slot. It is a plain flex column that
|
|
6495
|
+
fills the pane above the always-docked composer, so a surface only has to
|
|
6496
|
+
describe its own content, not how to occupy the pane. */
|
|
6497
|
+
.pane-surface-host { flex:1; min-height:0; min-width:0; display:flex; flex-direction:column; overflow:hidden; }
|
|
6498
|
+
.pane-surface-host[hidden] { display:none; }
|
|
6499
|
+
/* Where a surface reports a composer-level validation failure (R10). */
|
|
6500
|
+
.pane-surface-composer-error { color:var(--danger); font-size:12px; line-height:1.35; margin-bottom:6px; }
|
|
6501
|
+
.pane-surface-composer-error:empty { display:none; }
|
|
6502
|
+
|
|
6503
|
+
/* Issue #1911 Treatment B: the Coach intake panel. Every control inside it is
|
|
6504
|
+
an existing one (.tjd-modes/.hm-field/.cp-row); these rules only give the
|
|
6505
|
+
panel the pane's width and keep the picker scrolling inside itself, so the
|
|
6506
|
+
mode control and the scope note stay on screen while jobs are browsed (R9). */
|
|
6507
|
+
.ci-card { flex:1; min-height:0; overflow:hidden; display:flex; flex-direction:column; gap:12px; padding:2px 2px 8px; }
|
|
6508
|
+
.ci-card-hdr { display:flex; align-items:baseline; gap:10px; flex-shrink:0; }
|
|
6509
|
+
.ci-card-hdr h3 { margin:0; font-size:16px; font-weight:700; color:var(--text); }
|
|
6510
|
+
.ci-card-hdr p { margin:0; font-size:12px; color:var(--muted); }
|
|
6511
|
+
.ci-new-fields { flex-shrink:0; }
|
|
6512
|
+
.ci-card .tjd-modes, .ci-card > .tjd-hint, .ci-card > .tjd-submit-error { flex-shrink:0; }
|
|
6513
|
+
/* R9: the picker takes whatever height the pane has left and scrolls inside
|
|
6514
|
+
itself, so the mode control and the scope note never leave the screen. */
|
|
6515
|
+
.ci-picker { min-width:0; border:1px solid var(--line); border-radius:10px; background:var(--surface); overflow:hidden; display:flex; flex-direction:column; flex:1 1 auto; min-height:132px; }
|
|
6516
|
+
.ci-picker-head { padding:10px 12px; border-bottom:1px solid var(--line); background:var(--surface); flex-shrink:0; }
|
|
6517
|
+
.ci-picker-list { flex:1 1 auto; overflow-y:auto; overflow-x:hidden; min-height:0; padding:4px 0; }
|
|
6518
|
+
.ci-picker-row { align-items:flex-start; }
|
|
6519
|
+
.ci-picker-row.selected { background:var(--accent-soft,rgba(0,113,227,.08)); }
|
|
6520
|
+
.ci-picker-row.selected .cp-row-sub { color:var(--text); }
|
|
6521
|
+
.ci-picker-row:focus-visible { outline:2px solid var(--accent); outline-offset:-2px; }
|
|
6522
|
+
.ci-picker-row .cp-row-body { display:flex; flex:1 1 auto; flex-direction:column; gap:2px; min-width:0; overflow:hidden; }
|
|
6523
|
+
.ci-picker-row .cp-row-title,
|
|
6524
|
+
.ci-picker-row .cp-row-sub { display:block; max-width:100%; white-space:normal; overflow:hidden; text-overflow:ellipsis; overflow-wrap:anywhere; }
|
|
6525
|
+
.ci-picker-row .cp-row-title { line-height:1.25; }
|
|
6526
|
+
.ci-picker-row .cp-row-sub { line-height:1.35; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; }
|
|
6527
|
+
.ci-picker-row .cp-row-tag { max-width:72px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; margin-top:1px; }
|
|
6528
|
+
.ci-picker-empty { padding:16px 12px; color:var(--muted); font-size:12px; }
|
|
6529
|
+
.ci-picker-empty[hidden] { display:none; }
|
|
6530
|
+
|
|
6531
|
+
/* Open question 3, resolved: below the breakpoint .composer-footer already
|
|
6532
|
+
targets, Job name and Owner stack and the picker gives up height so the mode
|
|
6533
|
+
control stays reachable without scrolling the panel. */
|
|
6534
|
+
@media (max-width: 650px) {
|
|
6535
|
+
.ci-card { gap:10px; }
|
|
6536
|
+
.ci-new-fields { flex-direction:column; }
|
|
6537
|
+
.ci-picker { flex:0 1 auto; max-height:200px; min-height:104px; }
|
|
6538
|
+
.tjd-modes { flex-direction:column; }
|
|
6518
6539
|
}
|
|
6519
6540
|
/* ─── End Issue #945 ─────────────────────────────────────────────────────── */
|
|
6520
6541
|
|