forkit-connect 0.1.15 → 0.1.16

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/launcher.js +188 -22
  2. package/package.json +1 -1
package/dist/launcher.js CHANGED
@@ -1889,13 +1889,13 @@ function renderLauncherHtml(launcherToken) {
1889
1889
  color: #f7efe4;
1890
1890
  }
1891
1891
 
1892
- .quick-review-summary-grid {
1892
+ .review-summary-grid {
1893
1893
  display: grid;
1894
1894
  grid-template-columns: repeat(2, minmax(0, 1fr));
1895
1895
  gap: 10px;
1896
1896
  }
1897
1897
 
1898
- .quick-review-summary-pill {
1898
+ .review-summary-pill {
1899
1899
  display: grid;
1900
1900
  gap: 4px;
1901
1901
  padding: 11px 12px;
@@ -1904,7 +1904,7 @@ function renderLauncherHtml(launcherToken) {
1904
1904
  background: rgba(255,255,255,0.045);
1905
1905
  }
1906
1906
 
1907
- .quick-review-summary-label {
1907
+ .review-summary-label {
1908
1908
  font-size: 0.68rem;
1909
1909
  text-transform: uppercase;
1910
1910
  letter-spacing: 0.12em;
@@ -1912,13 +1912,50 @@ function renderLauncherHtml(launcherToken) {
1912
1912
  color: rgba(241, 235, 223, 0.55);
1913
1913
  }
1914
1914
 
1915
- .quick-review-summary-value {
1915
+ .review-summary-value {
1916
1916
  font-size: 0.86rem;
1917
1917
  line-height: 1.35;
1918
1918
  color: #fff7ea;
1919
1919
  font-weight: 600;
1920
1920
  }
1921
1921
 
1922
+ .review-recommendation-card {
1923
+ display: grid;
1924
+ gap: 6px;
1925
+ padding: 14px 15px;
1926
+ border-radius: 18px;
1927
+ border: 1px solid rgba(157, 238, 245, 0.14);
1928
+ background:
1929
+ linear-gradient(180deg, rgba(39, 51, 69, 0.52), rgba(22, 18, 47, 0.72)),
1930
+ radial-gradient(circle at top right, rgba(244, 147, 85, 0.12), transparent 52%);
1931
+ box-shadow: inset 0 1px 0 rgba(255,255,255,0.06);
1932
+ }
1933
+
1934
+ .review-recommendation-kicker {
1935
+ margin: 0;
1936
+ font-size: 0.68rem;
1937
+ text-transform: uppercase;
1938
+ letter-spacing: 0.13em;
1939
+ font-weight: 700;
1940
+ color: rgba(157, 238, 245, 0.82);
1941
+ }
1942
+
1943
+ .review-recommendation-title {
1944
+ margin: 0;
1945
+ font-family: "Sora", sans-serif;
1946
+ font-size: 1rem;
1947
+ line-height: 1.2;
1948
+ color: #fff8ef;
1949
+ font-weight: 700;
1950
+ }
1951
+
1952
+ .review-recommendation-detail {
1953
+ margin: 0;
1954
+ font-size: 0.86rem;
1955
+ line-height: 1.5;
1956
+ color: rgba(241, 235, 223, 0.74);
1957
+ }
1958
+
1922
1959
  .quick-review-topline {
1923
1960
  display: flex;
1924
1961
  align-items: flex-start;
@@ -2101,6 +2138,35 @@ function renderLauncherHtml(launcherToken) {
2101
2138
  gap: 10px;
2102
2139
  }
2103
2140
 
2141
+ .review-resolution-shell {
2142
+ display: grid;
2143
+ gap: 10px;
2144
+ padding: 12px 13px;
2145
+ border-radius: 16px;
2146
+ border: 1px solid rgba(244, 147, 85, 0.16);
2147
+ background: rgba(255,255,255,0.038);
2148
+ }
2149
+
2150
+ .review-resolution-shell[hidden] {
2151
+ display: none;
2152
+ }
2153
+
2154
+ .review-resolution-kicker {
2155
+ margin: 0;
2156
+ font-size: 0.68rem;
2157
+ text-transform: uppercase;
2158
+ letter-spacing: 0.12em;
2159
+ font-weight: 700;
2160
+ color: rgba(255, 211, 178, 0.82);
2161
+ }
2162
+
2163
+ .review-resolution-copy {
2164
+ margin: 0;
2165
+ font-size: 0.84rem;
2166
+ line-height: 1.45;
2167
+ color: rgba(241, 235, 223, 0.72);
2168
+ }
2169
+
2104
2170
  .review-resolution-actions[hidden] {
2105
2171
  display: none;
2106
2172
  }
@@ -6488,16 +6554,21 @@ function renderLauncherHtml(launcherToken) {
6488
6554
  </div>
6489
6555
  <p class="quick-review-meta" id="quick-review-meta">Open Connect to approve or defer this item.</p>
6490
6556
  <p class="quick-review-detail" id="quick-review-detail">Nothing is registered automatically.</p>
6491
- <div class="quick-review-summary-grid">
6492
- <div class="quick-review-summary-pill">
6493
- <span class="quick-review-summary-label">Action</span>
6494
- <span class="quick-review-summary-value" id="quick-review-action-summary">Register on this account now</span>
6557
+ <div class="review-summary-grid">
6558
+ <div class="review-summary-pill">
6559
+ <span class="review-summary-label">Action</span>
6560
+ <span class="review-summary-value" id="quick-review-action-summary">Register on this account now</span>
6495
6561
  </div>
6496
- <div class="quick-review-summary-pill">
6497
- <span class="quick-review-summary-label">Scope</span>
6498
- <span class="quick-review-summary-value" id="quick-review-scope-summary">Account scope</span>
6562
+ <div class="review-summary-pill">
6563
+ <span class="review-summary-label">Scope</span>
6564
+ <span class="review-summary-value" id="quick-review-scope-summary">Account scope</span>
6499
6565
  </div>
6500
6566
  </div>
6567
+ <div class="review-recommendation-card">
6568
+ <p class="review-recommendation-kicker">Recommended next step</p>
6569
+ <h4 class="review-recommendation-title" id="quick-review-recommendation-title">Register solo</h4>
6570
+ <p class="review-recommendation-detail" id="quick-review-recommendation-detail">Register this item on your account now.</p>
6571
+ </div>
6501
6572
  <div class="quick-review-status" id="quick-review-status">Waiting for review.</div>
6502
6573
  <div class="quick-review-scope" id="quick-review-scope" hidden>
6503
6574
  <div class="review-mode-group" id="quick-review-mode">
@@ -6526,9 +6597,13 @@ function renderLauncherHtml(launcherToken) {
6526
6597
  </div>
6527
6598
  <button class="quick-review-tertiary" id="quick-review-open-discovery" type="button" disabled>Open full review</button>
6528
6599
  </div>
6529
- <div class="review-resolution-actions" id="quick-review-resolution" hidden>
6530
- <button class="review-resolution-button" id="quick-review-resolution-primary" type="button" hidden></button>
6531
- <button class="review-resolution-button" id="quick-review-resolution-secondary" type="button" hidden></button>
6600
+ <div class="review-resolution-shell" id="quick-review-resolution-shell" hidden>
6601
+ <p class="review-resolution-kicker">Recovery path</p>
6602
+ <p class="review-resolution-copy" id="quick-review-resolution-copy">Choose the safest next step when registration cannot finish here.</p>
6603
+ <div class="review-resolution-actions" id="quick-review-resolution" hidden>
6604
+ <button class="review-resolution-button" id="quick-review-resolution-primary" type="button" hidden></button>
6605
+ <button class="review-resolution-button" id="quick-review-resolution-secondary" type="button" hidden></button>
6606
+ </div>
6532
6607
  </div>
6533
6608
  </section>
6534
6609
  </div>
@@ -6891,6 +6966,21 @@ function renderLauncherHtml(launcherToken) {
6891
6966
  <h4 class="discovery-review-title" id="discovery-review-title">Select a discovery item</h4>
6892
6967
  <p class="discovery-review-meta" id="discovery-review-meta">Choose a model, agent, or runtime to review it here.</p>
6893
6968
  <p class="discovery-review-detail" id="discovery-review-detail">Registering creates or updates a Forkit Passport. Nothing is published automatically.</p>
6969
+ <div class="review-summary-grid">
6970
+ <div class="review-summary-pill">
6971
+ <span class="review-summary-label">Action</span>
6972
+ <span class="review-summary-value" id="discovery-review-action-summary">Select an item</span>
6973
+ </div>
6974
+ <div class="review-summary-pill">
6975
+ <span class="review-summary-label">Scope</span>
6976
+ <span class="review-summary-value" id="discovery-review-scope-summary">Review</span>
6977
+ </div>
6978
+ </div>
6979
+ <div class="review-recommendation-card">
6980
+ <p class="review-recommendation-kicker">Recommended next step</p>
6981
+ <h4 class="review-recommendation-title" id="discovery-review-recommendation-title">Select an item</h4>
6982
+ <p class="review-recommendation-detail" id="discovery-review-recommendation-detail">Connect will show the best next step after you choose a model, agent, or runtime.</p>
6983
+ </div>
6894
6984
  <div class="discovery-review-status" id="discovery-review-status">Select an item to continue.</div>
6895
6985
  <div class="discovery-review-scope" id="discovery-review-scope" hidden>
6896
6986
  <div class="review-mode-group" id="discovery-review-mode">
@@ -6916,9 +7006,13 @@ function renderLauncherHtml(launcherToken) {
6916
7006
  <button class="secondary" id="discovery-review-defer" type="button" disabled>Not now</button>
6917
7007
  <button class="danger" id="discovery-review-ignore" type="button" disabled>Deny on this device</button>
6918
7008
  </div>
6919
- <div class="review-resolution-actions" id="discovery-review-resolution" hidden>
6920
- <button class="review-resolution-button" id="discovery-review-resolution-primary" type="button" hidden></button>
6921
- <button class="review-resolution-button" id="discovery-review-resolution-secondary" type="button" hidden></button>
7009
+ <div class="review-resolution-shell" id="discovery-review-resolution-shell" hidden>
7010
+ <p class="review-resolution-kicker">Recovery path</p>
7011
+ <p class="review-resolution-copy" id="discovery-review-resolution-copy">Choose the safest next step when registration cannot finish here.</p>
7012
+ <div class="review-resolution-actions" id="discovery-review-resolution" hidden>
7013
+ <button class="review-resolution-button" id="discovery-review-resolution-primary" type="button" hidden></button>
7014
+ <button class="review-resolution-button" id="discovery-review-resolution-secondary" type="button" hidden></button>
7015
+ </div>
6922
7016
  </div>
6923
7017
  </section>
6924
7018
 
@@ -7633,7 +7727,7 @@ function renderLauncherHtml(launcherToken) {
7633
7727
  }
7634
7728
 
7635
7729
  function resetReviewResolutionActions(prefix) {
7636
- setReviewResolutionActions(prefix, []);
7730
+ setReviewResolutionActions(prefix, [], '');
7637
7731
  }
7638
7732
 
7639
7733
  function derivePassportResolutionQuery(item) {
@@ -7696,6 +7790,15 @@ function renderLauncherHtml(launcherToken) {
7696
7790
  : 'Register this item on your account now';
7697
7791
  }
7698
7792
 
7793
+ function updateReviewRecommendation(prefix, item, scopeMode) {
7794
+ const title = document.getElementById(prefix + '-recommendation-title');
7795
+ const detail = document.getElementById(prefix + '-recommendation-detail');
7796
+ if (!title || !detail) return;
7797
+ const effectiveScopeMode = scopeMode === 'workspace' ? 'workspace' : 'solo';
7798
+ title.textContent = getReviewPrimaryLabel(item, effectiveScopeMode);
7799
+ detail.textContent = getReviewActionSummary(item, effectiveScopeMode) + '.';
7800
+ }
7801
+
7699
7802
  function getReviewDetailText(item) {
7700
7803
  if (!item) return 'Review local metadata, then decide what happens next.';
7701
7804
  if (item.kind === 'runtime') {
@@ -7751,16 +7854,32 @@ function renderLauncherHtml(launcherToken) {
7751
7854
  : result && (result.code === 'WORKSPACE_PROJECT_BINDING_REQUIRED' || result.code === 'DRAFT_CREATION_NOT_ALLOWED_BY_BINDING')
7752
7855
  ? 'Scope required · choose workspace and project'
7753
7856
  : null,
7857
+ resolutionCopy: nextActions.length
7858
+ ? nextActions[0]
7859
+ : result && result.code === 'GOVERNED_PASSPORT_CAPACITY_REACHED'
7860
+ ? 'Reuse an existing passport before creating another governed record.'
7861
+ : result && result.code === 'DRAFT_LIMIT_REACHED'
7862
+ ? 'Use an existing passport or clear an older draft before continuing.'
7863
+ : result && result.code === 'SIMILAR_PASSPORT_EXISTS'
7864
+ ? 'Open the matching passport instead of creating another record.'
7865
+ : result && (result.code === 'WORKSPACE_PROJECT_BINDING_REQUIRED' || result.code === 'DRAFT_CREATION_NOT_ALLOWED_BY_BINDING')
7866
+ ? 'Set workspace and project scope before governed registration continues.'
7867
+ : null,
7754
7868
  resolutionActions,
7755
7869
  };
7756
7870
  }
7757
7871
 
7758
- function setReviewResolutionActions(prefix, actions) {
7872
+ function setReviewResolutionActions(prefix, actions, copy) {
7873
+ const shell = document.getElementById(prefix + '-resolution-shell');
7759
7874
  const wrapper = document.getElementById(prefix + '-resolution');
7875
+ const detail = document.getElementById(prefix + '-resolution-copy');
7760
7876
  const primary = document.getElementById(prefix + '-resolution-primary');
7761
7877
  const secondary = document.getElementById(prefix + '-resolution-secondary');
7762
7878
  if (!wrapper || !primary || !secondary) return;
7763
7879
  const normalized = Array.isArray(actions) ? actions.slice(0, 2) : [];
7880
+ if (detail) {
7881
+ detail.textContent = copy || 'Choose the safest next step when registration cannot finish here.';
7882
+ }
7764
7883
  [primary, secondary].forEach((button, index) => {
7765
7884
  const action = normalized[index];
7766
7885
  if (!action) {
@@ -7774,6 +7893,9 @@ function renderLauncherHtml(launcherToken) {
7774
7893
  button.textContent = String(action.label || '').trim();
7775
7894
  });
7776
7895
  wrapper.hidden = normalized.length === 0;
7896
+ if (shell) {
7897
+ shell.hidden = normalized.length === 0;
7898
+ }
7777
7899
  }
7778
7900
 
7779
7901
  async function handleReviewResolutionAction(prefix, action) {
@@ -7895,6 +8017,7 @@ function renderLauncherHtml(launcherToken) {
7895
8017
  }
7896
8018
  if (item) {
7897
8019
  setText('quick-review-action-summary', getReviewActionSummary(item, reviewScopeMode));
8020
+ updateReviewRecommendation('quick-review', item, reviewScopeMode);
7898
8021
  }
7899
8022
  updateQuickReviewScopeSummary(reviewScopeMode);
7900
8023
  return reviewScopeMode;
@@ -7967,7 +8090,12 @@ function renderLauncherHtml(launcherToken) {
7967
8090
  anchor.hidden = false;
7968
8091
  setText('quick-review-count', String(total));
7969
8092
  setText('quick-review-chip-title', item.name);
7970
- setText('quick-review-chip-meta', total > 1 ? (String(total) + ' items need review') : (item.statusMeta || item.statusLabel));
8093
+ setText(
8094
+ 'quick-review-chip-meta',
8095
+ total > 1
8096
+ ? (getReviewPrimaryLabel(item, 'solo') + ' · ' + String(total) + ' items need review')
8097
+ : getReviewActionSummary(item, 'solo'),
8098
+ );
7971
8099
  setText('quick-review-kicker', item.typeLabel || item.kind);
7972
8100
  setText('quick-review-title', item.name);
7973
8101
  setText('quick-review-badge', item.kind === 'runtime' ? 'Runtime' : item.kind === 'agent' ? 'Agent' : 'Model');
@@ -7981,6 +8109,7 @@ function renderLauncherHtml(launcherToken) {
7981
8109
  'quick-review-action-summary',
7982
8110
  getReviewActionSummary(item, 'solo'),
7983
8111
  );
8112
+ updateReviewRecommendation('quick-review', item, 'solo');
7984
8113
  if (primaryButton) {
7985
8114
  primaryButton.textContent = primaryLabel;
7986
8115
  primaryButton.disabled = item.inboxGroup === 'ignored';
@@ -8003,6 +8132,7 @@ function renderLauncherHtml(launcherToken) {
8003
8132
  setReviewRegistrationMode('quick-review', 'solo');
8004
8133
  quickReviewScopeCacheKey = null;
8005
8134
  setText('quick-review-scope-summary', getPassiveReviewScopeSummary(item));
8135
+ updateReviewRecommendation('quick-review', item, 'solo');
8006
8136
  return;
8007
8137
  }
8008
8138
 
@@ -8102,7 +8232,7 @@ function renderLauncherHtml(launcherToken) {
8102
8232
  if (feedback.actionSummary) {
8103
8233
  setText('quick-review-action-summary', feedback.actionSummary);
8104
8234
  }
8105
- setReviewResolutionActions('quick-review', feedback.resolutionActions || []);
8235
+ setReviewResolutionActions('quick-review', feedback.resolutionActions || [], feedback.resolutionCopy || feedback.actionSummary || feedback.message);
8106
8236
  return;
8107
8237
  }
8108
8238
  resetReviewResolutionActions('quick-review');
@@ -8159,6 +8289,28 @@ function renderLauncherHtml(launcherToken) {
8159
8289
  }
8160
8290
  }
8161
8291
 
8292
+ function updateDiscoveryReviewScopeSummary(scopeMode) {
8293
+ const workspaceSelect = document.getElementById('discovery-review-workspace');
8294
+ const projectSelect = document.getElementById('discovery-review-project');
8295
+ const workspaceId = workspaceSelect ? String(workspaceSelect.value || '').trim() : '';
8296
+ const projectId = projectSelect ? String(projectSelect.value || '').trim() : '';
8297
+ const workspaceLabel = readSelectedOptionLabel(workspaceSelect);
8298
+ const projectLabel = readSelectedOptionLabel(projectSelect);
8299
+ if (scopeMode !== 'workspace') {
8300
+ setText('discovery-review-scope-summary', 'Account scope');
8301
+ return;
8302
+ }
8303
+ if (!workspaceId) {
8304
+ setText('discovery-review-scope-summary', 'Choose governed workspace');
8305
+ return;
8306
+ }
8307
+ if (!projectId) {
8308
+ setText('discovery-review-scope-summary', workspaceLabel ? (workspaceLabel + ' · choose project') : 'Choose project');
8309
+ return;
8310
+ }
8311
+ setText('discovery-review-scope-summary', [workspaceLabel, projectLabel].filter(Boolean).join(' · ') || 'Governed project');
8312
+ }
8313
+
8162
8314
  function syncDiscoveryReviewRegistrationMode(item, mode) {
8163
8315
  const reviewScopeMode = setReviewRegistrationMode('discovery-review', mode);
8164
8316
  const workspaceSelect = document.getElementById('discovery-review-workspace');
@@ -8176,7 +8328,10 @@ function renderLauncherHtml(launcherToken) {
8176
8328
  deferEnabled: canReviewDefer(item),
8177
8329
  ignoreEnabled: canReviewIgnore(item),
8178
8330
  });
8331
+ setText('discovery-review-action-summary', getReviewActionSummary(item, reviewScopeMode));
8332
+ updateReviewRecommendation('discovery-review', item, reviewScopeMode);
8179
8333
  }
8334
+ updateDiscoveryReviewScopeSummary(reviewScopeMode);
8180
8335
  return reviewScopeMode;
8181
8336
  }
8182
8337
 
@@ -8192,6 +8347,7 @@ function renderLauncherHtml(launcherToken) {
8192
8347
  setScopeOptions(projectSelect, [{ id: '', label: 'Solo registration / no project' }], '');
8193
8348
  if (primaryButton) primaryButton.disabled = false;
8194
8349
  }
8350
+ updateDiscoveryReviewScopeSummary(scopeMode);
8195
8351
  return;
8196
8352
  }
8197
8353
  setScopeOptions(projectSelect, [{ id: '', label: 'Loading projects...' }], '');
@@ -8211,12 +8367,14 @@ function renderLauncherHtml(launcherToken) {
8211
8367
  if (primaryButton) {
8212
8368
  primaryButton.disabled = !projects.length;
8213
8369
  }
8370
+ updateDiscoveryReviewScopeSummary(scopeMode);
8214
8371
  } catch {
8215
8372
  setScopeOptions(projectSelect, [{ id: '', label: 'Project list unavailable' }], '');
8216
8373
  setDiscoveryReviewStatus('Project list is unavailable right now.', 'warn');
8217
8374
  if (primaryButton) {
8218
8375
  primaryButton.disabled = true;
8219
8376
  }
8377
+ updateDiscoveryReviewScopeSummary(scopeMode);
8220
8378
  }
8221
8379
  }
8222
8380
 
@@ -8231,6 +8389,10 @@ function renderLauncherHtml(launcherToken) {
8231
8389
  setText('discovery-review-title', 'Select a discovery item');
8232
8390
  setText('discovery-review-meta', 'Choose a model, agent, or runtime to review it here.');
8233
8391
  setText('discovery-review-detail', 'Registering creates or updates a Forkit Passport. Nothing is published automatically.');
8392
+ setText('discovery-review-action-summary', 'Select an item');
8393
+ setText('discovery-review-scope-summary', 'Review');
8394
+ setText('discovery-review-recommendation-title', 'Select an item');
8395
+ setText('discovery-review-recommendation-detail', 'Connect will show the best next step after you choose a model, agent, or runtime.');
8234
8396
  if (scopeWrap) scopeWrap.hidden = true;
8235
8397
  setReviewRegistrationMode('discovery-review', 'solo');
8236
8398
  setDiscoveryReviewStatus('Select an item to continue.', '');
@@ -8246,6 +8408,8 @@ function renderLauncherHtml(launcherToken) {
8246
8408
  setText('discovery-review-title', item.name);
8247
8409
  setText('discovery-review-meta', item.subtitle + ' · ' + item.source);
8248
8410
  setText('discovery-review-detail', getReviewDetailText(item));
8411
+ setText('discovery-review-action-summary', getReviewActionSummary(item, 'solo'));
8412
+ updateReviewRecommendation('discovery-review', item, 'solo');
8249
8413
  setDiscoveryReviewStatus(item.statusLabel + (item.statusMeta ? ' · ' + item.statusMeta : ''), item.statusTone === 'muted' ? '' : item.statusTone);
8250
8414
  resetReviewResolutionActions('discovery-review');
8251
8415
  setDiscoveryReviewButtons({
@@ -8259,6 +8423,8 @@ function renderLauncherHtml(launcherToken) {
8259
8423
  if (scopeWrap) scopeWrap.hidden = true;
8260
8424
  setReviewRegistrationMode('discovery-review', 'solo');
8261
8425
  reviewScopeCacheKey = null;
8426
+ setText('discovery-review-scope-summary', getPassiveReviewScopeSummary(item));
8427
+ updateReviewRecommendation('discovery-review', item, 'solo');
8262
8428
  return;
8263
8429
  }
8264
8430
 
@@ -8352,7 +8518,7 @@ function renderLauncherHtml(launcherToken) {
8352
8518
  const feedback = formatLauncherActionFeedback(result, 'Registration failed.');
8353
8519
  setDiscoveryReviewStatus(feedback.message, 'warn');
8354
8520
  setActivityMessage(feedback.activity, 'warn');
8355
- setReviewResolutionActions('discovery-review', feedback.resolutionActions || []);
8521
+ setReviewResolutionActions('discovery-review', feedback.resolutionActions || [], feedback.resolutionCopy || feedback.actionSummary || feedback.message);
8356
8522
  return;
8357
8523
  }
8358
8524
  resetReviewResolutionActions('discovery-review');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forkit-connect",
3
- "version": "0.1.15",
3
+ "version": "0.1.16",
4
4
  "description": "Forkit Connect Local Engine - The Global AI Governance Fabric",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",