dsh-harbor-evolution 0.7.2 → 0.8.0

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/lib/client.js CHANGED
@@ -61,6 +61,8 @@ var dictionaries = {
61
61
  refresh: "\u5237\u65B0",
62
62
  jobs: "\u8BC4\u6D4B\u6279\u6B21",
63
63
  jobsHint: "\u70B9\u51FB Job \u540E\uFF0C\u6700\u591A\u518D\u70B9\u4E00\u6B21\u5373\u53EF\u8FDB\u5165\u5BF9\u5E94 Trial \u7684\u8BC1\u636E\u3002",
64
+ workspace: "\u5DE5\u4F5C\u7A7A\u95F4",
65
+ workspaceSelect: "\u9009\u62E9 Harbor \u5DE5\u4F5C\u7A7A\u95F4",
64
66
  empty: "\u8FD8\u6CA1\u6709\u53EF\u8BFB\u53D6\u7684 Harbor Job\u3002\u8BF7\u7528\u5B98\u65B9 Skill \u5B8C\u6210\u9700\u6C42\u6F84\u6E05\u548C\u521D\u59CB\u5316\u3002",
65
67
  completed: "\u5DF2\u5B8C\u6210",
66
68
  partial: "\u5B8C\u6210\u4F46\u6709\u5F02\u5E38",
@@ -77,6 +79,21 @@ var dictionaries = {
77
79
  reporter: "\u8BC4\u6D4B\u62A5\u544A",
78
80
  optimizer: "\u4F18\u5316\u5668",
79
81
  gate: "\u664B\u7EA7\u95E8\u7981",
82
+ historicalTarget: "\u5386\u53F2\u751F\u6210\u8BB0\u5F55",
83
+ generationRecords: "\u4F1A\u8BDD\u8BB0\u5F55",
84
+ generationSource: "\u751F\u6210\u6765\u6E90",
85
+ generatorPopulation: "\u751F\u6210\u5668\u7FA4\u4F53",
86
+ executionMode: "\u6267\u884C\u65B9\u5F0F",
87
+ observationMode: "\u53EA\u89C2\u5BDF\u5DF2\u6709\u7ED3\u679C",
88
+ batch: "\u6279\u6B21",
89
+ scoredTrials: "\u5DF2\u8BC4\u5206 Trials",
90
+ unscoredTrials: "\u672A\u8BC4\u5206 Trials",
91
+ homogeneousPopulation: "\u540C\u6784\u751F\u6210\u5668\u7FA4\u4F53",
92
+ mixedPopulation: "\u6DF7\u5408\u751F\u6210\u5668\u7FA4\u4F53",
93
+ metaNotRun: "\u672A\u8FD0\u884C\uFF08\u672A\u9A8C\u8BC1\uFF09",
94
+ metaNotRunHint: "\u672C Job \u53EA\u8BC4\u6D4B\u5DF2\u6709\u751F\u6210\u8BB0\u5F55\uFF1B\u5B83\u6CA1\u6709\u8BC4\u4F30\u8BC4\u6D4B\u5668\u672C\u8EAB\u662F\u5426\u53EF\u9760\u3002\u4E25\u683C\u7684\u8BC4\u6D4B\u5668\u5143\u8BC4\u6D4B\u9700\u8981\u72EC\u7ACB GT \u548C\u5355\u72EC\u7684\u5143\u8BC4\u6D4B\u6D41\u7A0B\u3002",
95
+ gateNotApplicable: "\u4E0D\u9002\u7528\uFF08N/A\uFF09",
96
+ gateNotApplicableHint: "\u5386\u53F2\u751F\u6210\u8BC4\u6D4B\u662F\u8BCA\u65AD\u8BC1\u636E\uFF0C\u4E0D\u662F Candidate \u5BF9\u6BD4\u6216\u664B\u7EA7\u8F93\u5165\u3002\u8BF7\u5C06\u786E\u8BA4\u7684 badcase \u56FA\u5316\u4E3A\u56DE\u5F52 Dataset\uFF0C\u518D\u8FD0\u884C Candidate Job\u3002",
80
97
  context: "Context v2",
81
98
  trials: "Trials",
82
99
  exceptions: "\u5F02\u5E38",
@@ -122,7 +139,40 @@ var dictionaries = {
122
139
  governanceHint: "\u8BFB\u53D6 Rubric / Evaluator / Judge \u8EAB\u4EFD\u4E0E\u6E90\u7801\u3002\u8BED\u4E49\u6539\u52A8\u5FC5\u987B\u521B\u5EFA\u65B0\u8EAB\u4EFD\uFF0C\u5E76\u5EFA\u7ACB\u65B0 Baseline\u3002",
123
140
  artifacts: "Artifact Registry",
124
141
  setupDoctor: "\u5B89\u88C5\u4E0E\u67B6\u6784\u68C0\u67E5",
125
- setupHint: "\u6D4F\u89C8\u5668\u4EC5\u80FD\u6539\u5199 Evaluator \u58F0\u660E\u4E2D\u660E\u786E\u6388\u6743\u7684\u6587\u4EF6\uFF1B\u4E0D\u4F1A\u6539\u5199 Candidate \u6216\u81EA\u52A8\u53D1\u8D77\u8BC4\u6D4B\u3002",
142
+ setupHint: "\u8FD9\u91CC\u663E\u793A Web \u5DE5\u4F5C\u53F0\u5B9E\u9645\u4F7F\u7528\u7684\u9879\u76EE\u6839\u76EE\u5F55\u3002\u6BCF\u6B21 Harbor Agent Tool \u8C03\u7528\u90FD\u4F1A\u81EA\u52A8\u5207\u5230\u8BE5 Session\uFF1B\u5DE5\u5177\u6267\u884C\u4ECD\u4FDD\u6301 Session \u9694\u79BB\u3002",
143
+ projectRoot: "\u5F53\u524D projectRoot",
144
+ switchProjectRoot: "\u5207\u6362\u5E76\u91CD\u8F7D",
145
+ projectRootHint: "\u8BF7\u8F93\u5165\u5DF2\u5B58\u5728\u7684\u7EDD\u5BF9\u76EE\u5F55\u3002\u672C\u6B21 DSH \u8FD0\u884C\u7ACB\u5373\u751F\u6548\uFF1B\u4E0B\u4E00\u6B21 Harbor Agent Tool \u8C03\u7528\u4F1A\u81EA\u52A8\u8DDF\u968F\u5B83\u7684 Session\u3002",
146
+ switchingProjectRoot: "\u6B63\u5728\u5207\u6362\u2026",
147
+ projectRootUpdated: "\u5DF2\u5207\u6362\u5E76\u91CD\u65B0\u8BFB\u53D6 Harbor Jobs\u3002",
148
+ projectRootConfigured: "\u6765\u6E90\uFF1APlugin \u542F\u52A8\u914D\u7F6E",
149
+ projectRootAgent: "\u6765\u6E90\uFF1A\u6700\u8FD1\u4E00\u6B21 Harbor Agent \u8C03\u7528\uFF08\u81EA\u52A8\u540C\u6B65\uFF09",
150
+ projectRootManual: "\u6765\u6E90\uFF1A\u672C\u6B21\u8FD0\u884C\u624B\u52A8\u5207\u6362",
151
+ pluginVersion: "\u63D2\u4EF6\u7248\u672C",
152
+ checkingUpdate: "\u6B63\u5728\u68C0\u67E5\u66F4\u65B0\u2026",
153
+ updateAvailable: "\u53D1\u73B0\u65B0\u7248\u672C",
154
+ upToDate: "\u5DF2\u662F\u6700\u65B0\u7248",
155
+ updateUnavailable: "\u6682\u65F6\u65E0\u6CD5\u68C0\u67E5\u66F4\u65B0",
156
+ currentVersion: "\u5F53\u524D\u7248\u672C",
157
+ latestVersion: "\u6700\u65B0\u7248\u672C",
158
+ updateHint: "\u5728\u7EC8\u7AEF\u8FD0\u884C\u4E0B\u9762\u7684\u547D\u4EE4\u5373\u53EF\u5347\u7EA7 Plugin\u3001Skill \u548C Harbor Adapter\u3002\u5347\u7EA7\u4E0D\u4F1A\u5728\u6D4F\u89C8\u5668\u4E2D\u9759\u9ED8\u6267\u884C\u3002",
159
+ offlineUpdateHint: "\u8FD9\u4E0D\u4F1A\u5F71\u54CD Harbor \u7684\u4EFB\u4F55\u529F\u80FD\u3002\u8BF7\u68C0\u67E5\u7F51\u7EDC\u540E\u91CD\u8BD5\uFF0C\u6216\u5728\u7EC8\u7AEF\u8FD0\u884C\u5E26 @latest \u7684\u5B89\u88C5\u547D\u4EE4\u3002",
160
+ copyUpdateCommand: "\u590D\u5236\u66F4\u65B0\u547D\u4EE4",
161
+ updateCommandCopied: "\u5DF2\u590D\u5236\u66F4\u65B0\u547D\u4EE4",
162
+ checkAgain: "\u91CD\u65B0\u68C0\u67E5",
163
+ viewRelease: "\u67E5\u770B\u53D1\u5E03\u8BF4\u660E",
164
+ checkedAt: "\u68C0\u67E5\u65F6\u95F4",
165
+ staleVersion: "\u5F53\u524D\u5C55\u793A\u7684\u662F\u6700\u8FD1\u4E00\u6B21\u6210\u529F\u68C0\u67E5\u7684\u7ED3\u679C\u3002",
166
+ credentialPolicy: "Secret \u6301\u4E45\u5316\u7B56\u7565",
167
+ sessionCredential: "\u4EC5\u672C\u6B21\u8FD0\u884C",
168
+ credentialStore: "DSH \u51ED\u636E\u5E93",
169
+ plaintextCredential: "\u660E\u6587 settings",
170
+ supported: "\u5DF2\u652F\u6301",
171
+ hostServiceRequired: "\u7B49\u5F85 Host credential service",
172
+ forbidden: "\u7981\u6B62",
173
+ sessionCredentialHint: "\u9ED8\u8BA4\u3002\u901A\u8FC7\u73AF\u5883\u53D8\u91CF\u6216 Job \u4E34\u65F6 capability \u6CE8\u5165\uFF0C\u4E0D\u8FDB\u5165\u8BC4\u6D4B\u8EAB\u4EFD\u4E0E\u62A5\u544A\u3002",
174
+ credentialStoreHint: "\u53EA\u6709 DSH \u66B4\u9732\u6B63\u5F0F\u51ED\u636E\u670D\u52A1\u540E\u624D\u53EF\u542F\u7528\uFF0C\u5F53\u524D\u4E0D\u4F1A\u7528 settings.yaml \u5192\u5145\u3002",
175
+ plaintextCredentialHint: "Harbor \u4E0D\u628A Authorization\u3001API key \u6216 OAuth token \u5199\u5165\u9879\u76EE\u914D\u7F6E\u3002",
126
176
  stageNav: "\u8BC4\u6D4B\u9636\u6BB5",
127
177
  datasetTasks: "\u8BC4\u6D4B\u4EFB\u52A1",
128
178
  datasetSource: "\u4EFB\u52A1\u6765\u6E90",
@@ -177,8 +227,8 @@ var dictionaries = {
177
227
  statusLabel: "\u72B6\u6001",
178
228
  attempt: "\u5C1D\u8BD5",
179
229
  population: "\u4EFB\u52A1\u6570\u91CF",
180
- experimentIdentity: "\u672C\u6B21\u5B9E\u9A8C\u56FA\u5B9A\u4E86\u4EC0\u4E48",
181
- experimentIdentityHint: "Candidate\u3001Dataset\u3001Evaluation Stack \u4E0E Runtime \u5171\u540C\u5B9A\u4E49\u53EF\u590D\u73B0\u3001\u53EF\u6BD4\u8F83\u7684\u5B9E\u9A8C\u8EAB\u4EFD\u3002",
230
+ experimentIdentity: "\u672C\u6B21\u5B9E\u9A8C\u4F7F\u7528\u4E86\u4EC0\u4E48",
231
+ experimentIdentityHint: "Candidate\u3001Dataset\u3001Evaluation Stack \u4E0E\u6A21\u578B\u8EAB\u4EFD\u5171\u540C\u5B9A\u4E49\u53EF\u6BD4\u8F83\u5B9E\u9A8C\uFF1BDSH \u8FD0\u884C\u65F6\u9ED8\u8BA4\u8FFD\u968F\u6700\u65B0\u7248\uFF0C\u5E76\u5728\u8BC1\u636E\u4E2D\u660E\u786E\u8BB0\u5F55\u8BE5\u7B56\u7565\u3002",
182
232
  immutableCandidateFiles: "\u5019\u9009\u7248\u672C\u5185\u5BB9",
183
233
  file: "\u6587\u4EF6",
184
234
  size: "\u5927\u5C0F",
@@ -248,6 +298,8 @@ var dictionaries = {
248
298
  refresh: "Refresh",
249
299
  jobs: "Evaluation jobs",
250
300
  jobsHint: "Open a Job, then reach Trial evidence in at most one more interaction.",
301
+ workspace: "Workspace",
302
+ workspaceSelect: "Select Harbor workspace",
251
303
  empty: "No readable Harbor Jobs yet. Use the official Skill to clarify and initialize the project.",
252
304
  completed: "Completed",
253
305
  partial: "Completed with errors",
@@ -264,6 +316,21 @@ var dictionaries = {
264
316
  reporter: "Reporter",
265
317
  optimizer: "Optimizer",
266
318
  gate: "Gate",
319
+ historicalTarget: "Historical generation records",
320
+ generationRecords: "Session records",
321
+ generationSource: "Generation source",
322
+ generatorPopulation: "Generator population",
323
+ executionMode: "Execution mode",
324
+ observationMode: "Observe existing results only",
325
+ batch: "Batch",
326
+ scoredTrials: "Scored Trials",
327
+ unscoredTrials: "Unscored Trials",
328
+ homogeneousPopulation: "Homogeneous generator population",
329
+ mixedPopulation: "Mixed generator population",
330
+ metaNotRun: "Not run (unvalidated)",
331
+ metaNotRunHint: "This Job evaluates existing generation records; it does not establish whether the Evaluator itself is reliable. Strict Evaluator meta-evaluation requires independent GT and a separate meta-evaluation flow.",
332
+ gateNotApplicable: "Not applicable (N/A)",
333
+ gateNotApplicableHint: "Historical generation evaluation is diagnostic evidence, not Candidate comparison or promotion input. Convert confirmed badcases into a fixed regression Dataset before running a Candidate Job.",
267
334
  context: "Context v2",
268
335
  trials: "Trials",
269
336
  exceptions: "Exceptions",
@@ -309,7 +376,40 @@ var dictionaries = {
309
376
  governanceHint: "Read Rubric, Evaluator, Judge identity, and source. Semantic edits create a new identity and require a fresh baseline.",
310
377
  artifacts: "Artifact Registry",
311
378
  setupDoctor: "Installation and architecture checks",
312
- setupHint: "The browser may only update files explicitly authorized by the Evaluator descriptor; it never rewrites a Candidate or launches evaluation automatically.",
379
+ setupHint: "This is the project root currently used by the Web Workbench. Every Harbor Agent Tool call follows its Session automatically while tool execution remains Session-isolated.",
380
+ projectRoot: "Current projectRoot",
381
+ switchProjectRoot: "Switch and reload",
382
+ projectRootHint: "Enter an existing absolute directory. It applies now; the next Harbor Agent Tool call will follow its Session automatically.",
383
+ switchingProjectRoot: "Switching\u2026",
384
+ projectRootUpdated: "Switched and reloaded Harbor Jobs.",
385
+ projectRootConfigured: "Source: Plugin startup configuration",
386
+ projectRootAgent: "Source: most recent Harbor Agent call (automatic)",
387
+ projectRootManual: "Source: manually switched for this run",
388
+ pluginVersion: "Plugin version",
389
+ checkingUpdate: "Checking for updates\u2026",
390
+ updateAvailable: "Update available",
391
+ upToDate: "Up to date",
392
+ updateUnavailable: "Update check unavailable",
393
+ currentVersion: "Current version",
394
+ latestVersion: "Latest version",
395
+ updateHint: "Run this command in a terminal to update the Plugin, Skill, and Harbor Adapter. The browser never installs updates silently.",
396
+ offlineUpdateHint: "Harbor remains fully functional. Check the network and retry, or run the installer with @latest in a terminal.",
397
+ copyUpdateCommand: "Copy update command",
398
+ updateCommandCopied: "Update command copied",
399
+ checkAgain: "Check again",
400
+ viewRelease: "View release notes",
401
+ checkedAt: "Checked",
402
+ staleVersion: "Showing the most recent successful check.",
403
+ credentialPolicy: "Secret persistence policy",
404
+ sessionCredential: "This run only",
405
+ credentialStore: "DSH credential store",
406
+ plaintextCredential: "Plaintext settings",
407
+ supported: "Supported",
408
+ hostServiceRequired: "Host credential service required",
409
+ forbidden: "Blocked",
410
+ sessionCredentialHint: "Default. Inject through environment variables or a short-lived Job capability; never include it in evaluation identity or reports.",
411
+ credentialStoreHint: "Enabled only after DSH exposes a formal credential service; settings.yaml is not treated as a credential store.",
412
+ plaintextCredentialHint: "Harbor never writes Authorization, API keys, or OAuth tokens into project settings.",
313
413
  stageNav: "Evaluation stages",
314
414
  datasetTasks: "Evaluation tasks",
315
415
  datasetSource: "Task source",
@@ -364,8 +464,8 @@ var dictionaries = {
364
464
  statusLabel: "Status",
365
465
  attempt: "Attempt",
366
466
  population: "Population",
367
- experimentIdentity: "Fixed experiment identity",
368
- experimentIdentityHint: "Candidate, Dataset, Evaluation Stack, and Runtime jointly define a reproducible and comparable experiment.",
467
+ experimentIdentity: "Experiment identity",
468
+ experimentIdentityHint: "Candidate, Dataset, Evaluation Stack, and model identity define comparability. The DSH runtime follows the latest release by default and records that policy explicitly.",
369
469
  immutableCandidateFiles: "Candidate contents",
370
470
  file: "File",
371
471
  size: "Size",
@@ -429,16 +529,18 @@ var dictionaries = {
429
529
  };
430
530
  var CSS = `
431
531
  .hse-root{--ocean-950:#03152f;--ocean-800:#07366f;--ocean-600:#1464c8;--ocean-300:#75b7ff;--foam-50:#f4fbff;--whale-500:#2875ff;--coral-500:#ee6478;--amber-500:#e4a23b;--kelp-500:#1f9b72;height:100%;min-height:0;overflow:auto;color:var(--dsw-alias-label-primary,#142038);background:var(--dsw-alias-bg-layer-1,#f2f7fc);font-family:inherit}.hse-page{width:min(1320px,calc(100% - 36px));margin:auto;padding:24px 0 56px}
532
+ .hse-root-switch{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;margin:16px 0 8px;padding:14px;border:1px solid #2875ff42;border-radius:12px;background:#2875ff0b}.hse-root-switch label{grid-column:1/-1;font-size:11px;font-weight:700}.hse-root-switch input{min-width:0;padding:10px 12px;border:1px solid #c8d6e7;border-radius:8px;color:inherit;background:var(--dsw-alias-bg-layer-2,#fff);font:11px ui-monospace,SFMono-Regular,Menlo,monospace}.hse-root-switch button{padding:9px 13px;border:0;border-radius:8px;color:#fff;background:var(--ocean-600);cursor:pointer}.hse-root-switch small{grid-column:1/-1;color:var(--dsw-alias-label-secondary,#748096)}
432
533
  .hse-hero{position:relative;isolation:isolate;overflow:hidden;min-height:225px;padding:32px;border-radius:24px;color:#fff;background:var(--ocean-950) var(--ocean-image) center/cover no-repeat;box-shadow:0 22px 65px #03152f38}.hse-hero:before{content:"";position:absolute;inset:0;z-index:-1;background:linear-gradient(90deg,#02132fea,#062b62d6 55%,#0e6dc42e)}.hse-hero:after{content:"";position:absolute;width:220px;height:220px;right:8%;bottom:-170px;border:1px solid #8be9ff66;border-radius:50%;box-shadow:0 0 0 28px #68dfff0b,0 0 0 60px #68dfff08;animation:hse-ripple 5s ease-out infinite}.hse-hero h1{max-width:780px;margin:15px 0 10px;font-size:clamp(28px,4vw,46px);line-height:1.08;letter-spacing:-.04em}.hse-hero p{max-width:760px;margin:0;color:#d9eeff;font-size:14px;line-height:1.75}.hse-eyebrow{color:#86e8ff;font-size:11px;font-weight:800;letter-spacing:.17em}.hse-whale{margin-right:8px;font-size:17px}.hse-refresh{position:absolute;right:22px;top:22px;padding:8px 13px;border:1px solid #ffffff52;border-radius:999px;color:#fff;background:#06245eb8;cursor:pointer}.hse-stats{display:flex;gap:9px;margin-top:24px;flex-wrap:wrap}.hse-stat{min-width:130px;padding:11px 13px;border:1px solid #ffffff29;border-radius:13px;background:#031a41a8;backdrop-filter:blur(8px)}.hse-stat span{display:block;color:#cde7fb;font-size:10px}.hse-stat b{display:block;margin-top:4px;font-size:20px}.hse-head{margin:28px 0 12px}.hse-head h2{margin:0;font-size:18px}.hse-head p{margin:4px 0 0;color:#728097;font-size:12px}
433
534
  .hse-list{display:grid;gap:10px}.hse-job{display:block;width:100%;padding:0;border:1px solid var(--dsw-alias-border-l1,#d7e2ef);border-radius:16px;color:inherit;background:var(--dsw-alias-bg-layer-2,#fff);text-align:left;cursor:pointer;overflow:hidden;box-shadow:0 5px 18px #1736600d;transition:.18s ease}.hse-job:hover,.hse-job:focus-visible{border-color:var(--ocean-300);transform:translateY(-1px);outline:3px solid #2875ff20}.hse-job-body{padding:16px 18px}.hse-job-top{display:flex;justify-content:space-between;gap:14px}.hse-job-title{min-width:0}.hse-job-title strong{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px}.hse-job-title small{display:block;margin-top:4px;color:#7b879c;font-size:10px}.hse-status{flex:none;padding:5px 9px;border-radius:999px;color:#126d50;background:#23ba8318;font-size:10px;font-weight:700}.hse-status:before{content:"\u2713 ";}.hse-status[data-status=running],.hse-status[data-status=pending]{color:#245dcc;background:#2875ff18}.hse-status[data-status=running]:before{content:"\u25CF ";animation:hse-pulse 1.6s ease-in-out infinite}.hse-status[data-status=partial],.hse-status[data-status=attention]{color:#8e5b0c;background:#e4a23b1b}.hse-status[data-status=partial]:before,.hse-status[data-status=attention]:before{content:"\u25B3 "}.hse-status[data-status=failed]{color:#b52f45;background:#ee647818}.hse-status[data-status=failed]:before{content:"\xD7 "}.hse-meta-grid{display:grid;grid-template-columns:1.35fr 1fr .9fr .65fr .75fr .75fr;gap:7px;margin-top:13px}.hse-meta{min-width:0;padding:8px 9px;border-radius:9px;background:var(--dsw-alias-bg-layer-1,#f3f7fb)}.hse-meta span{display:block;color:#7b879c;font-size:9px}.hse-meta b,.hse-meta code{display:block;margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:10px}.hse-progress{height:5px;margin-top:11px;border-radius:99px;background:#dbe8f5;overflow:hidden}.hse-progress i{display:block;height:100%;background:linear-gradient(90deg,var(--ocean-600),#54d7f5);transition:width .3s}.hse-metrics{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px}.hse-pill{padding:5px 7px;border:1px solid var(--dsw-alias-border-l1,#dce4f0);border-radius:7px;font-size:10px}.hse-pill b{margin-left:5px;color:var(--ocean-600)}
434
535
  .hse-empty,.hse-error{padding:34px;border:1px dashed #c4d3e5;border-radius:16px;text-align:center;background:var(--dsw-alias-bg-layer-2,#fff);color:var(--dsw-alias-label-secondary,#728097);font-size:12px}.hse-spin{width:25px;height:25px;margin:0 auto 10px;border:3px solid #2875ff22;border-top-color:var(--whale-500);border-radius:50%;animation:hse-spin .8s linear infinite}.hse-button,.hse-close{border:0;border-radius:9px;padding:8px 11px;color:#fff;background:var(--whale-500);cursor:pointer}.hse-overlay{position:fixed;inset:0;z-index:1000;display:flex;justify-content:flex-end;background:#03152f8c;backdrop-filter:blur(3px)}.hse-drawer{width:min(1180px,96vw);height:100%;overflow:auto;background:var(--dsw-alias-bg-layer-1,#f2f7fc);box-shadow:-24px 0 70px #03152f52}.hse-drawer-head{position:sticky;top:0;z-index:5;display:flex;justify-content:space-between;gap:15px;padding:16px 20px;border-bottom:1px solid var(--dsw-alias-border-l1,#dce4f0);background:color-mix(in srgb,var(--dsw-alias-bg-layer-2,#fff) 94%,transparent);backdrop-filter:blur(12px)}.hse-drawer-head h2{margin:0;font-size:18px}.hse-drawer-head p{margin:5px 0 0;color:var(--dsw-alias-label-secondary,#748096);font-size:10px}.hse-close{align-self:flex-start;background:var(--ocean-950)}.hse-workbench{padding:14px 20px 48px}.hse-stage-nav{position:sticky;top:67px;z-index:4;display:grid;grid-template-columns:repeat(8,minmax(88px,1fr));gap:5px;margin:-1px -1px 14px;padding:8px;border:1px solid var(--dsw-alias-border-l1,#d7e2ef);border-radius:13px;background:color-mix(in srgb,var(--dsw-alias-bg-layer-2,#fff) 94%,transparent);backdrop-filter:blur(10px);overflow:auto}.hse-stage-nav button{padding:9px 7px;border:0;border-radius:8px;color:var(--dsw-alias-label-secondary,#52627b);background:transparent;font:inherit;font-size:10px;cursor:pointer;white-space:nowrap}.hse-stage-nav button[data-active=true]{color:#fff;background:var(--ocean-600)}.hse-stage-nav button:focus-visible{outline:3px solid #2875ff2f}.hse-capability{margin-bottom:12px;padding:10px 12px;border-left:3px solid var(--amber-500);border-radius:8px;background:#e4a23b14;color:var(--dsw-alias-label-primary,#75500f);font-size:11px}.hse-section{margin-bottom:13px;padding:16px;border:1px solid var(--dsw-alias-border-l1,#d7e2ef);border-radius:14px;background:var(--dsw-alias-bg-layer-2,#fff)}.hse-section h3{margin:0 0 11px;font-size:14px}.hse-kpis{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:8px}.hse-kpi{padding:11px;border-radius:10px;background:color-mix(in srgb,var(--dsw-alias-bg-layer-1,#edf7ff) 88%,var(--ocean-600) 12%)}.hse-kpi span{display:block;color:var(--dsw-alias-label-secondary,#748096);font-size:9px}.hse-kpi b{display:block;margin-top:4px;font-size:17px}.hse-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px}.hse-card{min-width:0;padding:11px;border-radius:10px;background:var(--dsw-alias-bg-layer-1,#f3f7fb)}.hse-card span,.hse-card b,.hse-card code{display:block}.hse-card span{color:var(--dsw-alias-label-secondary,#748096);font-size:9px}.hse-card b,.hse-card code{margin-top:4px;overflow-wrap:anywhere;font-size:10px}.hse-valid{color:var(--kelp-500)}.hse-invalid{color:#bd3148}.hse-muted{color:var(--dsw-alias-label-secondary,#75839a)}.hse-findings{display:grid;gap:6px}.hse-finding{padding:9px 10px;border-left:3px solid var(--ocean-300);border-radius:7px;background:#2875ff0c;font-size:10px}.hse-finding[data-level=error]{border-color:var(--coral-500);background:#ee64780d}.hse-finding[data-level=warning]{border-color:var(--amber-500);background:#e4a23b0d}.hse-components{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:7px}.hse-component{padding:10px;border-radius:9px;background:#0b4c9c12}.hse-component span{display:block;color:var(--dsw-alias-label-secondary,#748096);font-size:9px}.hse-component b,.hse-component code{display:block;margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:9px}
435
536
  .hse-trial-layout{display:grid;grid-template-columns:minmax(380px,1fr) minmax(360px,.9fr);gap:10px;align-items:start}.hse-trial-list,.hse-trial-detail{min-width:0}.hse-trial-tools{display:grid;grid-template-columns:minmax(150px,1fr) auto auto auto;gap:6px;margin-bottom:9px}.hse-input,.hse-select{min-width:0;padding:8px 9px;border:1px solid #c8d6e7;border-radius:8px;color:inherit;background:transparent;font:inherit;font-size:10px}.hse-table-wrap{overflow:auto}.hse-table{width:100%;border-collapse:collapse;font-size:10px}.hse-table th,.hse-table td{padding:8px;border-bottom:1px solid #e2eaf3;text-align:left;white-space:nowrap}.hse-table button{border:0;color:var(--ocean-600);background:none;cursor:pointer;font:inherit}.hse-table tr[data-selected=true]{background:#2875ff0c}.hse-pager{display:flex;justify-content:flex-end;align-items:center;gap:8px;margin-top:9px;font-size:10px}.hse-pager button{padding:5px 8px;border:1px solid #c8d6e7;border-radius:7px;background:transparent;color:inherit;cursor:pointer}.hse-trial-detail{position:sticky;top:132px;max-height:calc(100vh - 160px);overflow:auto;padding:14px;border-radius:12px;color:#dcecff;background:var(--ocean-950)}.hse-trial-score{display:flex;justify-content:space-between;gap:12px;padding-bottom:12px;border-bottom:1px solid #ffffff1f}.hse-trial-score b{font-size:25px}.hse-trial-score span{font-size:10px}.hse-detail-group{padding:11px 0;border-bottom:1px solid #ffffff16}.hse-detail-group h4{margin:0 0 7px;color:#8fe8ff;font-size:10px;text-transform:uppercase;letter-spacing:.08em}.hse-detail-group pre{max-height:280px;overflow:auto;margin:0;white-space:pre-wrap;word-break:break-word;font-size:9px;line-height:1.55}.hse-detail-group ul{margin:0;padding-left:17px;font-size:10px;line-height:1.6}.hse-criteria{display:grid;gap:5px}.hse-criterion{display:flex;justify-content:space-between;gap:8px;padding:7px;border-radius:6px;background:#ffffff0b;font-size:10px}.hse-provenance{display:flex;gap:5px;flex-wrap:wrap}.hse-provenance span{padding:5px 7px;border:1px solid #70cfff4a;border-radius:999px;font-size:9px}.hse-audit summary{cursor:pointer;font-size:11px;font-weight:700}.hse-audit pre,.hse-source{max-height:360px;overflow:auto;white-space:pre-wrap;word-break:break-word;font-size:9px;line-height:1.55}.hse-compare-select{display:flex;gap:7px;margin-bottom:10px}.hse-compare-select select{flex:1}.hse-delta{font-variant-numeric:tabular-nums}.hse-delta[data-positive=true]{color:var(--kelp-500)}.hse-delta[data-positive=false]{color:var(--coral-500)}.hse-source{padding:10px;border-radius:8px;color:#d9edff;background:var(--ocean-950)}.hse-settings{width:min(850px,calc(100% - 32px));margin:auto;padding:28px 0}.hse-checks{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px;margin-top:16px}.hse-check{padding:12px;border:1px solid #dce4f0;border-radius:10px;background:var(--dsw-alias-bg-layer-2,#fff)}.hse-check b,.hse-check small{display:block}.hse-check small{margin-top:4px;color:#748096}.hse-tool{border:1px solid #dce4f0;border-radius:11px;background:var(--dsw-alias-bg-layer-2,#fff);overflow:hidden}.hse-tool button{display:flex;gap:8px;width:100%;padding:10px;border:0;color:inherit;background:transparent;text-align:left;cursor:pointer}.hse-tool strong{font-size:11px}.hse-tool small{margin-left:auto}.hse-tool pre{max-height:260px;overflow:auto;margin:0;padding:11px;border-top:1px solid #e3e9f1;white-space:pre-wrap;font-size:9px}
537
+ .hse-version{margin:18px 0;padding:16px;border:1px solid var(--dsw-alias-border-l1,#d7e2ef);border-radius:14px;background:var(--dsw-alias-bg-layer-2,#fff)}.hse-version[data-status=update-available]{border-color:#2875ff75;background:linear-gradient(145deg,#2875ff12,#44d9ff08)}.hse-version-head{display:flex;align-items:center;justify-content:space-between;gap:12px}.hse-version-head h3{margin:0;font-size:16px}.hse-version-badge{padding:6px 10px;border-radius:999px;color:#126d50;background:#23ba8318;font-size:10px;font-weight:800}.hse-version[data-status=update-available] .hse-version-badge{color:#fff;background:var(--whale-500)}.hse-version[data-status=unavailable] .hse-version-badge{color:#8e5b0c;background:#e4a23b1b}.hse-version[data-status=loading] .hse-version-badge{color:#245dcc;background:#2875ff18}.hse-version-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-top:13px}.hse-version-card{padding:11px;border-radius:10px;background:var(--dsw-alias-bg-layer-1,#f3f7fb)}.hse-version-card span,.hse-version-card b{display:block}.hse-version-card span{color:var(--dsw-alias-label-secondary,#748096);font-size:9px}.hse-version-card b{margin-top:4px;font-size:15px}.hse-version-copy{margin:12px 0 0;color:var(--dsw-alias-label-secondary,#748096);font-size:11px;line-height:1.6}.hse-update-command{display:block;box-sizing:border-box;width:100%;margin:10px 0 0;padding:12px;border:1px solid #70cfff3d;border-radius:9px;color:#dcecff;background:var(--ocean-950);white-space:pre-wrap;word-break:break-word;font:10px/1.6 ui-monospace,SFMono-Regular,Menlo,monospace}.hse-version-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:10px}.hse-version-actions a,.hse-version-actions button{padding:7px 10px;border:1px solid var(--dsw-alias-border-l1,#c8d6e7);border-radius:8px;color:inherit;background:transparent;cursor:pointer;font:inherit;font-size:10px;text-decoration:none}.hse-version-actions .hse-primary{border-color:var(--whale-500);color:#fff;background:var(--whale-500)}.hse-version-actions small{margin-left:auto;color:var(--dsw-alias-label-secondary,#748096);font-size:9px}
436
538
  .hse-task-list{display:grid;gap:10px}.hse-task{border:1px solid var(--dsw-alias-border-l1,#d7e2ef);border-radius:12px;background:var(--dsw-alias-bg-layer-1,#f3f7fb);overflow:hidden}.hse-task summary{display:flex;align-items:center;gap:9px;padding:12px 14px;cursor:pointer;font-size:11px;font-weight:700}.hse-task summary span{margin-left:auto;color:var(--dsw-alias-label-secondary,#748096);font-size:9px;font-weight:400}.hse-task-body{padding:0 14px 14px}.hse-instruction{min-height:80px;margin:0;padding:15px;border-radius:10px;color:#e3f3ff;background:linear-gradient(145deg,#03152f,#07366f);white-space:pre-wrap;word-break:break-word;font:inherit;font-size:12px;line-height:1.75}.hse-inline-meta{display:flex;gap:7px;flex-wrap:wrap;margin:10px 0 0;color:var(--dsw-alias-label-secondary,#748096);font-size:9px}.hse-output-layout{display:grid;grid-template-columns:260px minmax(0,1fr);gap:10px;align-items:start}.hse-output-list{display:grid;gap:6px}.hse-output-item{width:100%;padding:10px;border:1px solid var(--dsw-alias-border-l1,#d7e2ef);border-radius:9px;color:inherit;background:var(--dsw-alias-bg-layer-1,#f3f7fb);text-align:left;cursor:pointer}.hse-output-item[data-active=true]{border-color:var(--ocean-300);background:#2875ff16}.hse-output-item b,.hse-output-item span{display:block}.hse-output-item span{margin-top:3px;color:var(--dsw-alias-label-secondary,#748096);font-size:9px}.hse-preview{min-width:0;border:1px solid var(--dsw-alias-border-l1,#d7e2ef);border-radius:12px;overflow:hidden}.hse-preview-head{display:flex;justify-content:space-between;gap:12px;padding:12px 14px;background:var(--dsw-alias-bg-layer-1,#f3f7fb)}.hse-preview-head b,.hse-preview-head span{display:block}.hse-preview-head span{margin-top:3px;color:var(--dsw-alias-label-secondary,#748096);font-size:9px}.hse-document{min-height:210px;padding:22px;background:var(--dsw-alias-bg-layer-2,#fff);font-size:13px;line-height:1.8}.hse-document pre{margin:0;white-space:pre-wrap;word-break:break-word;font:inherit}.hse-document h4{margin:0 0 12px;font-size:17px}.hse-page-frame{display:block;width:100%;height:520px;border:0;background:#fff}.hse-output-structured{max-height:520px;overflow:auto;margin:0;padding:16px;color:#dcecff;background:var(--ocean-950);white-space:pre-wrap;word-break:break-word;font-size:10px}.hse-preview-empty{padding:60px 20px;text-align:center;color:var(--dsw-alias-label-secondary,#748096)}.hse-governance-id{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}.hse-source-details{margin-top:9px;border-top:1px solid var(--dsw-alias-border-l1,#d7e2ef);padding-top:9px}.hse-source-details summary{cursor:pointer;font-size:10px;font-weight:700}.hse-upgrade{border-color:#2875ff55;background:linear-gradient(145deg,#2875ff0f,#44d9ff08)}.hse-upgrade ol{margin:10px 0;padding-left:20px;font-size:11px;line-height:1.75}.hse-prompt{margin-top:10px;padding:12px;border-radius:9px;color:#dcecff;background:var(--ocean-950);white-space:pre-wrap;font-size:10px;line-height:1.6}.hse-prompt-actions{display:flex;justify-content:flex-end;margin-top:8px}.hse-editor-head{display:flex;justify-content:space-between;gap:10px;align-items:start}.hse-editor-tabs{display:flex;gap:6px;flex-wrap:wrap;margin:12px 0 8px}.hse-editor-tab{display:grid;gap:2px;padding:8px 10px;border:1px solid var(--dsw-alias-border-l1,#d7e2ef);border-radius:8px;color:inherit;background:transparent;text-align:left;cursor:pointer}.hse-editor-tab b{font-size:10px}.hse-editor-tab span{color:var(--dsw-alias-label-secondary,#748096);font-size:8px}.hse-editor-tab[data-active=true]{border-color:var(--ocean-600);color:#fff;background:var(--ocean-600)}.hse-editor-tab[data-active=true] span{color:#dcecff}.hse-editor-current{display:grid;gap:3px;margin:8px 0;padding:9px 11px;border-left:3px solid var(--ocean-600);border-radius:8px;background:var(--dsw-alias-bg-layer-1,#f3f7fb)}.hse-editor-current span{color:var(--dsw-alias-label-secondary,#748096);font-size:9px}.hse-editor-current b{font-size:11px}.hse-editor-current code{overflow-wrap:anywhere;font-size:9px}.hse-editor{display:block;width:100%;min-height:360px;box-sizing:border-box;padding:14px;border:1px solid #1f73ca;border-radius:10px;color:#dcecff;background:var(--ocean-950);resize:vertical;font:11px/1.55 ui-monospace,SFMono-Regular,Menlo,monospace}.hse-editor-versions{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:9px}.hse-editor-actions{display:flex;justify-content:space-between;gap:10px;align-items:center;margin-top:9px}.hse-editor-actions p{margin:0;font-size:10px}.hse-editor-actions button:disabled{opacity:.45;cursor:not-allowed}.hse-editor-error{color:#bd3148}.hse-editor-success{color:var(--kelp-500)}
437
539
  .hse-identity-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px}.hse-evidence-table{width:100%;border-collapse:collapse;font-size:10px}.hse-evidence-table th,.hse-evidence-table td{padding:9px;border-bottom:1px solid var(--dsw-alias-border-l1,#dce4f0);text-align:left;vertical-align:top}.hse-evidence-table th{color:var(--dsw-alias-label-secondary,#748096);font-weight:500}.hse-evidence-table code{overflow-wrap:anywhere}.hse-chip-list{display:flex;gap:6px;flex-wrap:wrap}.hse-chip-list span{padding:6px 8px;border-radius:999px;background:#2875ff12;font-size:9px}.hse-hypotheses{display:grid;gap:10px}.hse-hypothesis{padding:14px;border:1px solid #2875ff3d;border-radius:12px;background:linear-gradient(145deg,#2875ff0c,#44d9ff05)}.hse-hypothesis h4{margin:0 0 10px;font-size:13px}.hse-hypothesis dl{display:grid;grid-template-columns:150px minmax(0,1fr);gap:8px 12px;margin:0;font-size:10px}.hse-hypothesis dt{color:var(--dsw-alias-label-secondary,#748096)}.hse-hypothesis dd{margin:0;overflow-wrap:anywhere}.hse-gate-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}.hse-decision{padding:8px 12px;border-radius:999px;color:#126d50;background:#23ba8318;font-weight:800}.hse-decision[data-pass=false]{color:#b52f45;background:#ee647818}
438
540
  .hse-report-table button{border:0;color:var(--ocean-600);background:none;text-align:left;cursor:pointer;font:inherit}.hse-report-table tr[data-selected=true]{background:#2875ff10}.hse-report-score{font-size:15px;font-weight:800}.hse-report-score[data-valid=false]{color:var(--coral-500)}.hse-report-detail{margin-top:12px;border:1px solid #2875ff40;border-radius:13px;overflow:hidden}.hse-report-detail-head{display:flex;justify-content:space-between;gap:12px;padding:14px 16px;background:linear-gradient(145deg,#2875ff14,#44d9ff08)}.hse-report-detail-head h4{margin:0;font-size:14px}.hse-report-detail-head span,.hse-report-detail-head code{display:block;margin-top:4px;color:var(--dsw-alias-label-secondary,#748096);font-size:9px}.hse-report-detail-head b{font-size:25px}.hse-report-criteria{display:grid;gap:9px;padding:14px}.hse-report-criterion{padding:12px;border-radius:10px;background:var(--dsw-alias-bg-layer-1,#f3f7fb)}.hse-report-criterion header{display:flex;justify-content:space-between;gap:10px}.hse-report-criterion header b:last-child{font-size:17px}.hse-report-criterion dl{display:grid;grid-template-columns:92px minmax(0,1fr);gap:8px 10px;margin:10px 0 0;font-size:10px;line-height:1.55}.hse-report-criterion dt{color:var(--dsw-alias-label-secondary,#748096)}.hse-report-criterion dd{margin:0;overflow-wrap:anywhere}.hse-report-recommendation{color:var(--ocean-600)}
439
541
  .hse-stage-nav{grid-template-columns:repeat(9,minmax(88px,1fr))}.hse-report-compare{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px;padding:14px;align-items:start}.hse-report-compare .hse-report-criteria{padding:0}.hse-meta-flow{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px}.hse-meta-flow div{position:relative;padding:13px;border-radius:10px;background:#2875ff0f;font-size:10px}.hse-meta-flow div:not(:last-child):after{content:'\u2192';position:absolute;right:-8px;top:50%;z-index:1;color:var(--ocean-600);font-weight:800}.hse-badcase{color:#b52f45;background:#ee647817!important}.hse-hook-state{margin-bottom:12px;padding:11px 13px;border-left:3px solid var(--ocean-600);border-radius:8px;background:#2875ff0d;font-size:10px}.hse-hook-state[data-executed=false]{border-color:var(--amber-500);background:#e4a23b12}
440
542
  @keyframes hse-spin{to{transform:rotate(360deg)}}@keyframes hse-pulse{50%{opacity:.38}}@keyframes hse-ripple{0%{transform:scale(.75);opacity:.4}70%,100%{transform:scale(1.12);opacity:0}}
441
- @media(max-width:900px){.hse-page{width:calc(100% - 20px)}.hse-meta-grid,.hse-kpis,.hse-identity-grid{grid-template-columns:repeat(2,1fr)}.hse-trial-layout,.hse-output-layout{grid-template-columns:1fr}.hse-trial-detail{position:static;max-height:none}.hse-components,.hse-governance-id{grid-template-columns:repeat(2,1fr)}.hse-drawer{width:100vw}.hse-workbench{padding:12px}.hse-stage-nav{top:62px}.hse-trial-tools{grid-template-columns:1fr 1fr}.hse-grid,.hse-checks{grid-template-columns:1fr}.hse-hypothesis dl{grid-template-columns:1fr}}
543
+ @media(max-width:900px){.hse-page{width:calc(100% - 20px)}.hse-meta-grid,.hse-kpis,.hse-identity-grid{grid-template-columns:repeat(2,1fr)}.hse-trial-layout,.hse-output-layout{grid-template-columns:1fr}.hse-trial-detail{position:static;max-height:none}.hse-components,.hse-governance-id{grid-template-columns:repeat(2,1fr)}.hse-drawer{width:100vw}.hse-workbench{padding:12px}.hse-stage-nav{top:62px}.hse-trial-tools{grid-template-columns:1fr 1fr}.hse-grid,.hse-checks,.hse-version-grid{grid-template-columns:1fr}.hse-hypothesis dl{grid-template-columns:1fr}}
442
544
  @media(prefers-reduced-motion:reduce){.hse-spin,.hse-status:before,.hse-hero:after{animation:none}.hse-job{transition:none}.hse-job:hover{transform:none}}
443
545
  @media(max-width:900px){.hse-report-compare,.hse-meta-flow{grid-template-columns:1fr}.hse-meta-flow div:after{display:none}}
444
546
  `;
@@ -468,6 +570,25 @@ function gateReasonText(value) {
468
570
  if (!isRecord(value)) return String(value ?? "\u2014");
469
571
  return [value.code, value.message].filter(Boolean).join(" \xB7 ") || pretty(value);
470
572
  }
573
+ var HISTORICAL_JOB_KIND = "historical-generation-evaluation";
574
+ function isHistoricalJob(value) {
575
+ return value?.jobKind === HISTORICAL_JOB_KIND || value?.job_kind === HISTORICAL_JOB_KIND || value?.artifacts?.context?.protocol === "historical-generation-evaluation-context/v1" || value?.evaluationContext?.protocol === "historical-generation-evaluation-context/v1";
576
+ }
577
+ function generatorPopulationText(population, t) {
578
+ if (!isRecord(population)) return "\u2014";
579
+ const label = population.homogeneous === false ? t("mixedPopulation") : population.homogeneous === true ? t("homogeneousPopulation") : void 0;
580
+ const agents = population.agent_presets ?? population.agent_ids ?? population.agents ?? [];
581
+ const models = population.model_routes ?? population.models ?? [];
582
+ return [label, ...agents, ...models].filter(Boolean).join(" \xB7 ") || pretty(population);
583
+ }
584
+ function judgeIdentityDetails(judge) {
585
+ return [
586
+ judge?.coupling,
587
+ judge?.reasoning_effort ? `reasoning=${judge.reasoning_effort}` : void 0,
588
+ judge?.transport ? `transport=${judge.transport}` : void 0,
589
+ judge?.version ? `version=${judge.version}` : void 0
590
+ ].filter(Boolean).join(" \xB7 ") || "\u2014";
591
+ }
471
592
  async function api(route, params = {}) {
472
593
  const query = new URLSearchParams(Object.entries(params).filter(([, value]) => value !== void 0 && value !== ""));
473
594
  const response = await fetch(`${API}/${route}${query.size ? `?${query}` : ""}`, { credentials: "same-origin", cache: "no-store" });
@@ -491,16 +612,16 @@ function nextVersion(value) {
491
612
  const match = String(value ?? "").match(/^(\d+)\.(\d+)\.(\d+)$/);
492
613
  return match ? `${match[1]}.${match[2]}.${Number(match[3]) + 1}` : "";
493
614
  }
494
- function useDashboard(poll = true) {
615
+ function useDashboard(poll = true, workspace = "", offset = 0) {
495
616
  const [state, setState] = (0, import_react.useState)({ status: "loading" });
496
617
  const load = (0, import_react.useCallback)(async (quiet = false) => {
497
618
  if (!quiet) setState((current) => ({ ...current, status: current.value ? "refreshing" : "loading" }));
498
619
  try {
499
- setState({ status: "ready", value: await api("dashboard") });
620
+ setState({ status: "ready", value: await api("dashboard", { workspace, offset, limit: 20 }) });
500
621
  } catch (error) {
501
622
  setState((current) => ({ ...current, status: "error", error: error.message }));
502
623
  }
503
- }, []);
624
+ }, [workspace, offset]);
504
625
  (0, import_react.useEffect)(() => {
505
626
  void load();
506
627
  }, [load]);
@@ -511,22 +632,41 @@ function useDashboard(poll = true) {
511
632
  }, [load, poll, state.value]);
512
633
  return { ...state, load };
513
634
  }
635
+ function useVersionCheck() {
636
+ const [state, setState] = (0, import_react.useState)({ status: "loading" });
637
+ const load = (0, import_react.useCallback)(async (refresh = false) => {
638
+ setState((current) => ({ ...current, status: "loading" }));
639
+ try {
640
+ setState({ status: "ready", value: await api("version", refresh ? { refresh: "true" } : {}) });
641
+ } catch {
642
+ setState((current) => ({ ...current, status: "error" }));
643
+ }
644
+ }, []);
645
+ (0, import_react.useEffect)(() => {
646
+ void load();
647
+ }, [load]);
648
+ return { ...state, load };
649
+ }
514
650
  function MetricPills({ metrics }) {
515
651
  return /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-metrics" }, Object.entries(metrics ?? {}).map(([key, value]) => /* @__PURE__ */ import_react.default.createElement("span", { className: "hse-pill", key }, key, /* @__PURE__ */ import_react.default.createElement("b", null, format(value)))));
516
652
  }
517
653
  function JobCard({ job, t, open }) {
518
654
  const candidate = job.candidate ?? {};
519
655
  const progress = job.progress ?? {};
520
- return /* @__PURE__ */ import_react.default.createElement("button", { type: "button", className: "hse-job", onClick: () => open(job.name) }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-job-body" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-job-top" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-job-title" }, /* @__PURE__ */ import_react.default.createElement("strong", null, job.name), /* @__PURE__ */ import_react.default.createElement("small", null, new Date(job.updatedAt).toLocaleString(), " \xB7 ", progress.health ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("span", { className: "hse-status", "data-status": job.status }, t(job.status))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta-grid" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("candidate")), /* @__PURE__ */ import_react.default.createElement("b", null, candidate.candidate_id ?? "\u2014", " \xB7 ", candidate.version ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("dataset")), /* @__PURE__ */ import_react.default.createElement("b", null, job.dataset?.dataset_id ?? "\u2014", " \xB7 ", job.dataset?.version ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("mode")), /* @__PURE__ */ import_react.default.createElement("b", null, job.mode ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("progress")), /* @__PURE__ */ import_react.default.createElement("b", null, progress.completed ?? 0, "/", progress.total ?? job.nTrials ?? 0)), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("validity")), /* @__PURE__ */ import_react.default.createElement("b", null, typeof job.nValidScores === "number" ? `${t("validScores")} ${job.nValidScores}` : t("unavailable"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("exceptions")), /* @__PURE__ */ import_react.default.createElement("b", null, job.nExceptions))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-progress", "aria-label": `${progress.percent ?? 0}%` }, /* @__PURE__ */ import_react.default.createElement("i", { style: { width: `${progress.percent ?? 0}%` } })), /* @__PURE__ */ import_react.default.createElement(MetricPills, { metrics: job.metrics })));
656
+ const historical = isHistoricalJob(job);
657
+ const target = job.evaluationTarget ?? {};
658
+ const coverage = job.coverage ?? {};
659
+ return /* @__PURE__ */ import_react.default.createElement("button", { type: "button", className: "hse-job", onClick: () => open(job.name) }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-job-body" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-job-top" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-job-title" }, /* @__PURE__ */ import_react.default.createElement("strong", null, job.name), /* @__PURE__ */ import_react.default.createElement("small", null, new Date(job.updatedAt).toLocaleString(), " \xB7 ", progress.health ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("span", { className: "hse-status", "data-status": job.status }, t(job.status))), historical ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta-grid" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("historicalTarget")), /* @__PURE__ */ import_react.default.createElement("b", null, target.source_kind ?? job.generationSource?.kind ?? "\u2014", " \xB7 ", target.record_count ?? job.nTrials ?? 0, " ", t("generationRecords"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("generatorPopulation")), /* @__PURE__ */ import_react.default.createElement("b", null, generatorPopulationText(job.generatorPopulation ?? target.generator_population, t))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("executionMode")), /* @__PURE__ */ import_react.default.createElement("b", null, job.executionMode ?? t("observationMode"), " \xB7 ", t("gateNotApplicable"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("progress")), /* @__PURE__ */ import_react.default.createElement("b", null, progress.completed ?? 0, "/", progress.total ?? job.nTrials ?? 0)), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("scoredTrials")), /* @__PURE__ */ import_react.default.createElement("b", null, coverage.scored_trials ?? job.nValidScores ?? "\u2014", " / ", coverage.total_trials ?? job.nTrials ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("unscoredTrials")), /* @__PURE__ */ import_react.default.createElement("b", null, coverage.unscored_trials ?? job.nUnscoredTrials ?? 0, " \xB7 completed-unscored"))) : /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta-grid" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("candidate")), /* @__PURE__ */ import_react.default.createElement("b", null, candidate.candidate_id ?? "\u2014", " \xB7 ", candidate.version ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("dataset")), /* @__PURE__ */ import_react.default.createElement("b", null, job.dataset?.dataset_id ?? "\u2014", " \xB7 ", job.dataset?.version ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("mode")), /* @__PURE__ */ import_react.default.createElement("b", null, job.mode ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("progress")), /* @__PURE__ */ import_react.default.createElement("b", null, progress.completed ?? 0, "/", progress.total ?? job.nTrials ?? 0)), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("validity")), /* @__PURE__ */ import_react.default.createElement("b", null, typeof job.nValidScores === "number" ? `${t("validScores")} ${job.nValidScores}` : t("unavailable"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("exceptions")), /* @__PURE__ */ import_react.default.createElement("b", null, job.nExceptions))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-progress", "aria-label": `${progress.percent ?? 0}%` }, /* @__PURE__ */ import_react.default.createElement("i", { style: { width: `${progress.percent ?? 0}%` } })), /* @__PURE__ */ import_react.default.createElement(MetricPills, { metrics: job.metrics })));
521
660
  }
522
661
  function TrialDetail({ detail, t }) {
523
662
  if (!detail) return /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-trial-detail hse-muted" }, t("evidence"), " \u2014");
524
663
  const assessment = detail.assessment;
525
664
  if (!assessment) return /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-trial-detail" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-trial-score" }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("span", null, detail.lifecycle?.name ?? detail.trial), /* @__PURE__ */ import_react.default.createElement("b", null, "\u2014")), /* @__PURE__ */ import_react.default.createElement("span", null, detail.status)), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-detail-group" }, /* @__PURE__ */ import_react.default.createElement("h4", null, t("currentStatus")), /* @__PURE__ */ import_react.default.createElement("pre", null, pretty(detail.lifecycle))));
526
665
  const score = assessment.score ?? { value: assessment.rewards?.reward, valid: assessment.status === "assessed" };
527
- return /* @__PURE__ */ import_react.default.createElement("article", { className: "hse-trial-detail", "aria-live": "polite" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-trial-score" }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("span", null, t("score")), /* @__PURE__ */ import_react.default.createElement("b", null, score.valid ? format(score.value) : "\u2014")), /* @__PURE__ */ import_react.default.createElement("span", { className: score.valid ? "hse-valid" : "hse-invalid" }, score.valid ? `\u2713 ${t("valid")}` : `\xD7 ${t("invalid")}`)), !score.valid ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-detail-group" }, /* @__PURE__ */ import_react.default.createElement("h4", null, t("validity")), /* @__PURE__ */ import_react.default.createElement("ul", null, (score.invalid_reasons ?? []).map((reason) => /* @__PURE__ */ import_react.default.createElement("li", { key: reason }, reason)))) : null, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-detail-group" }, /* @__PURE__ */ import_react.default.createElement("h4", null, t("findings")), /* @__PURE__ */ import_react.default.createElement("ul", null, (assessment.findings ?? []).length ? assessment.findings.map((item, index) => /* @__PURE__ */ import_react.default.createElement("li", { key: index }, item.code ? `${item.code}: ` : "", item.message ?? String(item))) : /* @__PURE__ */ import_react.default.createElement("li", null, "\u2014"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-detail-group" }, /* @__PURE__ */ import_react.default.createElement("h4", null, t("recommendations")), /* @__PURE__ */ import_react.default.createElement("ul", null, (assessment.recommendations ?? []).length ? assessment.recommendations.map((item, index) => /* @__PURE__ */ import_react.default.createElement("li", { key: index }, item.message ?? String(item))) : /* @__PURE__ */ import_react.default.createElement("li", null, "\u2014"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-detail-group" }, /* @__PURE__ */ import_react.default.createElement("h4", null, t("output")), /* @__PURE__ */ import_react.default.createElement("pre", null, pretty(assessment.output))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-detail-group" }, /* @__PURE__ */ import_react.default.createElement("h4", null, t("criteria")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-criteria" }, (assessment.criteria ?? Object.entries(assessment.rewards ?? {}).map(([id, value]) => ({ id, score: value }))).map((item) => /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-criterion", key: item.id }, /* @__PURE__ */ import_react.default.createElement("span", null, item.label ?? item.id), /* @__PURE__ */ import_react.default.createElement("b", null, format(item.score)))))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-detail-group" }, /* @__PURE__ */ import_react.default.createElement("h4", null, t("provenance")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-provenance" }, (assessment.evidence_provenance ?? assessment.evidence ?? []).map((item, index) => /* @__PURE__ */ import_react.default.createElement("span", { key: item.id ?? index, title: item.artifact_ref }, item.label ?? item.kind ?? "Evidence")))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-detail-group" }, /* @__PURE__ */ import_react.default.createElement("h4", null, t("timing")), /* @__PURE__ */ import_react.default.createElement("pre", null, pretty(assessment.process))), /* @__PURE__ */ import_react.default.createElement("details", { className: "hse-detail-group" }, /* @__PURE__ */ import_react.default.createElement("summary", null, t("audit")), /* @__PURE__ */ import_react.default.createElement("pre", null, pretty(assessment))));
666
+ const unscored = detail.status === "completed-unscored" || detail.lifecycle?.status === "completed-unscored";
667
+ return /* @__PURE__ */ import_react.default.createElement("article", { className: "hse-trial-detail", "aria-live": "polite" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-trial-score" }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("span", null, t("score")), /* @__PURE__ */ import_react.default.createElement("b", null, score.valid ? format(score.value) : "\u2014")), /* @__PURE__ */ import_react.default.createElement("span", { className: unscored ? "hse-muted" : score.valid ? "hse-valid" : "hse-invalid" }, unscored ? "completed-unscored" : score.valid ? `\u2713 ${t("valid")}` : `\xD7 ${t("invalid")}`)), !score.valid ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-detail-group" }, /* @__PURE__ */ import_react.default.createElement("h4", null, t("validity")), /* @__PURE__ */ import_react.default.createElement("ul", null, (score.invalid_reasons ?? []).map((reason) => /* @__PURE__ */ import_react.default.createElement("li", { key: reason }, reason)))) : null, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-detail-group" }, /* @__PURE__ */ import_react.default.createElement("h4", null, t("findings")), /* @__PURE__ */ import_react.default.createElement("ul", null, (assessment.findings ?? []).length ? assessment.findings.map((item, index) => /* @__PURE__ */ import_react.default.createElement("li", { key: index }, item.code ? `${item.code}: ` : "", item.message ?? String(item))) : /* @__PURE__ */ import_react.default.createElement("li", null, "\u2014"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-detail-group" }, /* @__PURE__ */ import_react.default.createElement("h4", null, t("recommendations")), /* @__PURE__ */ import_react.default.createElement("ul", null, (assessment.recommendations ?? []).length ? assessment.recommendations.map((item, index) => /* @__PURE__ */ import_react.default.createElement("li", { key: index }, item.message ?? String(item))) : /* @__PURE__ */ import_react.default.createElement("li", null, "\u2014"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-detail-group" }, /* @__PURE__ */ import_react.default.createElement("h4", null, t("output")), /* @__PURE__ */ import_react.default.createElement("pre", null, pretty(assessment.output))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-detail-group" }, /* @__PURE__ */ import_react.default.createElement("h4", null, t("criteria")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-criteria" }, (assessment.criteria ?? Object.entries(assessment.rewards ?? {}).map(([id, value]) => ({ id, score: value }))).map((item) => /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-criterion", key: item.id }, /* @__PURE__ */ import_react.default.createElement("span", null, item.label ?? item.id), /* @__PURE__ */ import_react.default.createElement("b", null, format(item.score)))))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-detail-group" }, /* @__PURE__ */ import_react.default.createElement("h4", null, t("provenance")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-provenance" }, (assessment.evidence_provenance ?? assessment.evidence ?? []).map((item, index) => /* @__PURE__ */ import_react.default.createElement("span", { key: item.id ?? index, title: item.artifact_ref }, item.label ?? item.kind ?? "Evidence")))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-detail-group" }, /* @__PURE__ */ import_react.default.createElement("h4", null, t("timing")), /* @__PURE__ */ import_react.default.createElement("pre", null, pretty(assessment.process))), /* @__PURE__ */ import_react.default.createElement("details", { className: "hse-detail-group" }, /* @__PURE__ */ import_react.default.createElement("summary", null, t("audit")), /* @__PURE__ */ import_react.default.createElement("pre", null, pretty(assessment))));
528
668
  }
529
- function TrialExplorer({ job, active, t }) {
669
+ function TrialExplorer({ job, workspace, active, t }) {
530
670
  const [query, setQuery] = (0, import_react.useState)("");
531
671
  const [status, setStatus] = (0, import_react.useState)("");
532
672
  const [validity, setValidity] = (0, import_react.useState)("");
@@ -537,7 +677,7 @@ function TrialExplorer({ job, active, t }) {
537
677
  const [detail, setDetail] = (0, import_react.useState)();
538
678
  (0, import_react.useEffect)(() => {
539
679
  let cancelled = false;
540
- const load = () => api("trials", { job, offset, limit: 100, query, status, validity, sort }).then((value) => {
680
+ const load = () => api("trials", { workspace, job, offset, limit: 100, query, status, validity, sort }).then((value) => {
541
681
  if (!cancelled) setPage(value);
542
682
  });
543
683
  const debounce = window.setTimeout(() => void load(), 120);
@@ -547,10 +687,10 @@ function TrialExplorer({ job, active, t }) {
547
687
  window.clearTimeout(debounce);
548
688
  if (poll) window.clearInterval(poll);
549
689
  };
550
- }, [job, offset, query, status, validity, sort, active]);
690
+ }, [workspace, job, offset, query, status, validity, sort, active]);
551
691
  const choose = async (trial) => {
552
692
  setSelected(trial);
553
- setDetail(await api("trial", { job, trial }));
693
+ setDetail(await api("trial", { workspace, job, trial }));
554
694
  };
555
695
  return /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-trial-layout" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-trial-list" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-trial-tools" }, /* @__PURE__ */ import_react.default.createElement("input", { className: "hse-input", value: query, placeholder: t("search"), onChange: (event) => {
556
696
  setQuery(event.target.value);
@@ -558,20 +698,20 @@ function TrialExplorer({ job, active, t }) {
558
698
  } }), /* @__PURE__ */ import_react.default.createElement("select", { className: "hse-select", value: status, onChange: (event) => {
559
699
  setStatus(event.target.value);
560
700
  setOffset(0);
561
- } }, /* @__PURE__ */ import_react.default.createElement("option", { value: "" }, t("all")), /* @__PURE__ */ import_react.default.createElement("option", { value: "completed" }, "completed"), /* @__PURE__ */ import_react.default.createElement("option", { value: "candidate-quality-failed" }, "candidate-quality-failed"), /* @__PURE__ */ import_react.default.createElement("option", { value: "infrastructure-error" }, "infrastructure-error"), /* @__PURE__ */ import_react.default.createElement("option", { value: "evaluation-error" }, "evaluation-error"), /* @__PURE__ */ import_react.default.createElement("option", { value: "running-agent" }, "running-agent"), /* @__PURE__ */ import_react.default.createElement("option", { value: "evaluating" }, "evaluating")), /* @__PURE__ */ import_react.default.createElement("select", { className: "hse-select", value: validity, onChange: (event) => {
701
+ } }, /* @__PURE__ */ import_react.default.createElement("option", { value: "" }, t("all")), /* @__PURE__ */ import_react.default.createElement("option", { value: "completed" }, "completed"), /* @__PURE__ */ import_react.default.createElement("option", { value: "completed-unscored" }, "completed-unscored"), /* @__PURE__ */ import_react.default.createElement("option", { value: "candidate-quality-failed" }, "candidate-quality-failed"), /* @__PURE__ */ import_react.default.createElement("option", { value: "infrastructure-error" }, "infrastructure-error"), /* @__PURE__ */ import_react.default.createElement("option", { value: "evaluation-error" }, "evaluation-error"), /* @__PURE__ */ import_react.default.createElement("option", { value: "running-agent" }, "running-agent"), /* @__PURE__ */ import_react.default.createElement("option", { value: "evaluating" }, "evaluating")), /* @__PURE__ */ import_react.default.createElement("select", { className: "hse-select", value: validity, onChange: (event) => {
562
702
  setValidity(event.target.value);
563
703
  setOffset(0);
564
704
  } }, /* @__PURE__ */ import_react.default.createElement("option", { value: "" }, t("validity")), /* @__PURE__ */ import_react.default.createElement("option", { value: "true" }, t("valid")), /* @__PURE__ */ import_react.default.createElement("option", { value: "false" }, t("invalid"))), /* @__PURE__ */ import_react.default.createElement("select", { className: "hse-select", value: sort, onChange: (event) => setSort(event.target.value) }, /* @__PURE__ */ import_react.default.createElement("option", { value: "dataset-order" }, t("datasetOrder")), /* @__PURE__ */ import_react.default.createElement("option", { value: "latest-completed" }, t("latest")), /* @__PURE__ */ import_react.default.createElement("option", { value: "lowest-score" }, t("lowest")), /* @__PURE__ */ import_react.default.createElement("option", { value: "errors" }, t("errorsFirst")))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-table-wrap" }, /* @__PURE__ */ import_react.default.createElement("table", { className: "hse-table" }, /* @__PURE__ */ import_react.default.createElement("thead", null, /* @__PURE__ */ import_react.default.createElement("tr", null, /* @__PURE__ */ import_react.default.createElement("th", null, "#"), /* @__PURE__ */ import_react.default.createElement("th", null, t("queryTrial")), /* @__PURE__ */ import_react.default.createElement("th", null, t("statusLabel")), /* @__PURE__ */ import_react.default.createElement("th", null, t("score")), /* @__PURE__ */ import_react.default.createElement("th", null, t("attempt")))), /* @__PURE__ */ import_react.default.createElement("tbody", null, page?.items?.map((trial) => /* @__PURE__ */ import_react.default.createElement("tr", { key: `${trial.id}-${trial.attempt}`, "data-selected": String(selected) === String(trial.id) }, /* @__PURE__ */ import_react.default.createElement("td", null, trial.datasetOrder + 1), /* @__PURE__ */ import_react.default.createElement("td", null, /* @__PURE__ */ import_react.default.createElement("button", { onClick: () => void choose(trial.id ?? trial.datasetTrial) }, trial.displayName ?? trial.datasetTrial ?? trial.name)), /* @__PURE__ */ import_react.default.createElement("td", null, trial.status), /* @__PURE__ */ import_react.default.createElement("td", null, trial.score?.valid ? format(trial.score.value ?? trial.rewards?.reward) : "\u2014"), /* @__PURE__ */ import_react.default.createElement("td", null, trial.attempt)))))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-pager" }, /* @__PURE__ */ import_react.default.createElement("span", null, page?.total ? `${offset + 1}\u2013${Math.min(offset + (page.items?.length ?? 0), page.total)} / ${page.total}` : "0 / 0"), /* @__PURE__ */ import_react.default.createElement("button", { disabled: !offset, onClick: () => setOffset(Math.max(0, offset - 100)) }, t("previous")), /* @__PURE__ */ import_react.default.createElement("button", { disabled: !page?.hasMore, onClick: () => setOffset(offset + 100) }, t("next")))), /* @__PURE__ */ import_react.default.createElement(TrialDetail, { detail, t }));
565
705
  }
566
- function DatasetPanel({ job, artifacts, t }) {
706
+ function DatasetPanel({ job, workspace, artifacts, t }) {
567
707
  const [state, setState] = (0, import_react.useState)({ status: "loading" });
568
708
  (0, import_react.useEffect)(() => {
569
709
  let alive = true;
570
- void api("dataset", { job }).then((value) => alive && setState({ status: "ready", value }), (error) => alive && setState({ status: "error", error: error.message }));
710
+ void api("dataset", { workspace, job }).then((value) => alive && setState({ status: "ready", value }), (error) => alive && setState({ status: "error", error: error.message }));
571
711
  return () => {
572
712
  alive = false;
573
713
  };
574
- }, [job]);
714
+ }, [workspace, job]);
575
715
  const dataset = state.value ?? artifacts.datasetPreview ?? artifacts.dataset;
576
716
  const badcases = (dataset?.tasks ?? []).filter((task) => task.metadata?.badcase).length;
577
717
  return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-grid" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, "ID / version"), /* @__PURE__ */ import_react.default.createElement("b", null, artifacts.dataset?.dataset_id ?? "\u2014", " \xB7 ", artifacts.dataset?.version ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, short(artifacts.dataset?.source_digest))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("population")), /* @__PURE__ */ import_react.default.createElement("b", null, artifacts.dataset?.task_count ?? dataset?.task_count ?? 0), /* @__PURE__ */ import_react.default.createElement("code", null, badcases, " ", t("badcase"), " \xB7 ", dataset?.source === "job-snapshot" ? t("snapshot") : dataset?.source === "historical-source-fallback" ? t("historicalFallback") : "\u2014")))), /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("datasetTasks")), state.status === "loading" ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-empty" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-spin" }), t("loading")) : state.status === "error" ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-capability" }, state.error) : /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-task-list" }, (dataset?.tasks ?? []).map((task, index) => /* @__PURE__ */ import_react.default.createElement("details", { className: "hse-task", key: task.id ?? index, open: index === 0 }, /* @__PURE__ */ import_react.default.createElement("summary", null, index + 1, ". ", task.query || task.id || `task-${index + 1}`, /* @__PURE__ */ import_react.default.createElement("span", { className: task.metadata?.badcase ? "hse-badcase" : void 0 }, task.metadata?.badcase ? `${t("badcase")} \xB7 ${task.metadata?.case_type}` : task.metadata?.topic ?? task.id ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-task-body" }, /* @__PURE__ */ import_react.default.createElement("h4", null, t("taskInstruction")), task.instruction ? /* @__PURE__ */ import_react.default.createElement("pre", { className: "hse-instruction" }, task.instruction) : /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-capability" }, task.instruction_error ?? t("noData")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-inline-meta" }, /* @__PURE__ */ import_react.default.createElement("span", null, "ID: ", task.id ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("span", null, t("instructionFile"), ": ", task.instruction_file ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("span", null, t("datasetSource"), ": ", dataset.source === "job-snapshot" ? t("snapshot") : t("historicalFallback")), task.instruction_truncated ? /* @__PURE__ */ import_react.default.createElement("span", null, t("attention")) : null)))))));
@@ -587,6 +727,16 @@ function CandidatePanel({ artifacts, t }) {
587
727
  const runtime = context.runtime ?? candidate.runtime ?? {};
588
728
  return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("experimentIdentity")), /* @__PURE__ */ import_react.default.createElement("p", { className: "hse-muted" }, t("experimentIdentityHint")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-identity-grid" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("candidate")), /* @__PURE__ */ import_react.default.createElement("b", null, candidate.candidate_id ?? "\u2014", " \xB7 ", candidate.version ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, short(candidate.digest))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("dataset")), /* @__PURE__ */ import_react.default.createElement("b", null, dataset.dataset_id ?? "\u2014", " \xB7 ", dataset.version ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, dataset.task_count ?? "\u2014", " Tasks \xB7 ", short(dataset.source_digest))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("evaluationStack")), /* @__PURE__ */ import_react.default.createElement("b", null, stack.stack_id ?? "\u2014", " \xB7 ", stack.version ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, short(stack.comparison_digest ?? stack.digest))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("runtime")), /* @__PURE__ */ import_react.default.createElement("b", null, "Harbor ", runtime.harbor_version ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, candidate.runtime?.kind ?? "\u2014", " \xB7 ", candidate.runtime?.version ?? "\u2014", " \xB7 ", context.mode ?? "\u2014")))), /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("immutableCandidateFiles")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-table-wrap" }, /* @__PURE__ */ import_react.default.createElement("table", { className: "hse-evidence-table" }, /* @__PURE__ */ import_react.default.createElement("thead", null, /* @__PURE__ */ import_react.default.createElement("tr", null, /* @__PURE__ */ import_react.default.createElement("th", null, t("file")), /* @__PURE__ */ import_react.default.createElement("th", null, t("size")), /* @__PURE__ */ import_react.default.createElement("th", null, t("digest")))), /* @__PURE__ */ import_react.default.createElement("tbody", null, (candidate.files ?? []).map((file) => /* @__PURE__ */ import_react.default.createElement("tr", { key: file.path }, /* @__PURE__ */ import_react.default.createElement("td", null, file.path), /* @__PURE__ */ import_react.default.createElement("td", null, file.size), /* @__PURE__ */ import_react.default.createElement("td", null, /* @__PURE__ */ import_react.default.createElement("code", null, short(file.sha256))))))))));
589
729
  }
730
+ function HistoricalTargetPanel({ detail, artifacts, t }) {
731
+ const summary = artifacts.summary ?? {};
732
+ const context = artifacts.context ?? {};
733
+ const target = detail?.evaluationTarget ?? summary.evaluation_target ?? context.evaluation_target ?? {};
734
+ const source = detail?.generationSource ?? summary.generation_source ?? context.generation_source ?? {};
735
+ const population = detail?.generatorPopulation ?? target.generator_population;
736
+ const coverage = detail?.coverage ?? summary.coverage ?? {};
737
+ const adapter = context.execution_adapter ?? {};
738
+ return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("historicalTarget")), /* @__PURE__ */ import_react.default.createElement("p", { className: "hse-muted" }, t("observationMode")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-identity-grid" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("batch")), /* @__PURE__ */ import_react.default.createElement("b", null, target.batch_id ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, short(target.digest))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("generationRecords")), /* @__PURE__ */ import_react.default.createElement("b", null, target.record_count ?? coverage.total_trials ?? "\u2014", " Trials"), /* @__PURE__ */ import_react.default.createElement("code", null, target.kind ?? "\u2014", " \xB7 ", target.source_kind ?? source.kind ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("generationSource")), /* @__PURE__ */ import_react.default.createElement("b", null, source.kind ?? target.source_kind ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, source.adapter_id ?? adapter.adapter_id ?? adapter.id ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("executionMode")), /* @__PURE__ */ import_react.default.createElement("b", null, detail?.executionMode ?? summary.execution_mode ?? context.execution_mode ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, context.protocol ?? "\u2014")))), /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("generatorPopulation")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-grid" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, population?.homogeneous === false ? t("mixedPopulation") : population?.homogeneous === true ? t("homogeneousPopulation") : t("generatorPopulation")), /* @__PURE__ */ import_react.default.createElement("b", null, generatorPopulationText(population, t)), /* @__PURE__ */ import_react.default.createElement("code", null, population ? short(population.digest) : "\u2014")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("coverage")), /* @__PURE__ */ import_react.default.createElement("b", null, coverage.scored_trials ?? "\u2014", " / ", coverage.total_trials ?? target.record_count ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, t("unscoredTrials"), ": ", coverage.unscored_trials ?? 0, " \xB7 completed-unscored")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, "Trial coverage"), /* @__PURE__ */ import_react.default.createElement("b", null, typeof coverage.trial_rate === "number" ? `${format(coverage.trial_rate * 100)}%` : "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, t("scoredTrials"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, "Criterion coverage"), /* @__PURE__ */ import_react.default.createElement("b", null, coverage.criterion_scored ?? "\u2014", " / ", coverage.criterion_total ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, typeof coverage.criterion_rate === "number" ? `${format(coverage.criterion_rate * 100)}%` : "\u2014")))));
739
+ }
590
740
  function ContractPanel({ artifacts, component, t }) {
591
741
  const contract = artifacts.contract ?? {};
592
742
  return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("integrationBoundary")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-grid" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("integration")), /* @__PURE__ */ import_react.default.createElement("b", null, component?.id ?? "\u2014", " \xB7 ", component?.version ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, short(component?.digest))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("scoringContract")), /* @__PURE__ */ import_react.default.createElement("b", null, contract.contract_id ?? "\u2014", " \xB7 ", contract.version ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, t("primaryMetric"), ": ", contract.primary_metric ?? "\u2014")))), /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("hardRequirements")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-chip-list" }, (contract.hard_requirements ?? []).map((item) => /* @__PURE__ */ import_react.default.createElement("span", { key: item.id ?? item }, item.id ?? item)))));
@@ -606,13 +756,13 @@ function ArtifactPreview({ detail, t }) {
606
756
  } else body = /* @__PURE__ */ import_react.default.createElement("pre", { className: "hse-output-structured" }, pretty(content));
607
757
  return /* @__PURE__ */ import_react.default.createElement("article", { className: "hse-preview" }, /* @__PURE__ */ import_react.default.createElement("header", { className: "hse-preview-head" }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("b", null, preview.title ?? t("generatedOutput")), /* @__PURE__ */ import_react.default.createElement("span", null, preview.kind, " \xB7 ", preview.format)), /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("b", null, t("previewSource")), /* @__PURE__ */ import_react.default.createElement("span", null, provenance.map((item) => item.label ?? item.kind).join(" \xB7 ") || preview.source || "\u2014"))), body);
608
758
  }
609
- function RendererPanel({ job, active, component, t }) {
759
+ function RendererPanel({ job, workspace, active, component, t }) {
610
760
  const [page, setPage] = (0, import_react.useState)();
611
761
  const [selected, setSelected] = (0, import_react.useState)();
612
762
  const [detail, setDetail] = (0, import_react.useState)();
613
763
  (0, import_react.useEffect)(() => {
614
764
  let alive = true;
615
- const load = () => api("trials", { job, offset: 0, limit: 100, sort: "dataset-order" }).then((value) => {
765
+ const load = () => api("trials", { workspace, job, offset: 0, limit: 100, sort: "dataset-order" }).then((value) => {
616
766
  if (!alive) return;
617
767
  setPage(value);
618
768
  if (value.items?.length) setSelected((current) => current ?? value.items[0].id ?? value.items[0].datasetTrial);
@@ -623,25 +773,25 @@ function RendererPanel({ job, active, component, t }) {
623
773
  alive = false;
624
774
  if (poll) window.clearInterval(poll);
625
775
  };
626
- }, [job, active]);
776
+ }, [workspace, job, active]);
627
777
  (0, import_react.useEffect)(() => {
628
778
  if (!selected) return;
629
779
  let alive = true;
630
- void api("trial", { job, trial: selected }).then((value) => alive && setDetail(value));
780
+ void api("trial", { workspace, job, trial: selected }).then((value) => alive && setDetail(value));
631
781
  return () => {
632
782
  alive = false;
633
783
  };
634
- }, [job, selected]);
784
+ }, [workspace, job, selected]);
635
785
  return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-grid" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("renderer")), /* @__PURE__ */ import_react.default.createElement("b", null, component?.id ?? "\u2014", " \xB7 ", component?.version ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, short(component?.digest))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("generatedOutput")), /* @__PURE__ */ import_react.default.createElement("b", null, page?.items?.length ?? 0, " Trials"), /* @__PURE__ */ import_react.default.createElement("code", null, t("previewSource"), ": ", detail?.preview?.provenance?.map((item) => item.label ?? item.kind).join(" \xB7 ") || "\u2014")))), /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("generatedOutput")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-output-layout" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-output-list" }, (page?.items ?? []).map((trial, index) => /* @__PURE__ */ import_react.default.createElement("button", { type: "button", className: "hse-output-item", "data-active": String(selected) === String(trial.id ?? trial.datasetTrial), key: `${trial.id}-${trial.attempt}`, onClick: () => setSelected(trial.id ?? trial.datasetTrial) }, /* @__PURE__ */ import_react.default.createElement("b", null, index + 1, ". ", trial.displayName ?? trial.datasetTrial ?? trial.name), /* @__PURE__ */ import_react.default.createElement("span", null, trial.status, " \xB7 attempt ", trial.attempt)))), /* @__PURE__ */ import_react.default.createElement(ArtifactPreview, { detail, t }))));
636
786
  }
637
- function TrialAssessmentReport({ job, active, artifacts, t }) {
787
+ function TrialAssessmentReport({ job, workspace, active, artifacts, historical = false, t }) {
638
788
  const [offset, setOffset] = (0, import_react.useState)(0);
639
789
  const [page, setPage] = (0, import_react.useState)();
640
790
  const [selected, setSelected] = (0, import_react.useState)();
641
791
  const [detailState, setDetailState] = (0, import_react.useState)({ status: "idle" });
642
792
  (0, import_react.useEffect)(() => {
643
793
  let alive = true;
644
- const load = () => api("trials", { job, offset, limit: REPORT_PAGE_SIZE, sort: "dataset-order" }).then((value) => {
794
+ const load = () => api("trials", { workspace, job, offset, limit: REPORT_PAGE_SIZE, sort: "dataset-order" }).then((value) => {
645
795
  if (!alive) return;
646
796
  setPage(value);
647
797
  if (value.items?.length) setSelected((current) => value.items.some((item) => String(item.id ?? item.datasetTrial) === String(current)) ? current : value.items[0].id ?? value.items[0].datasetTrial);
@@ -653,7 +803,7 @@ function TrialAssessmentReport({ job, active, artifacts, t }) {
653
803
  alive = false;
654
804
  if (poll) window.clearInterval(poll);
655
805
  };
656
- }, [job, active, offset]);
806
+ }, [workspace, job, active, offset]);
657
807
  (0, import_react.useEffect)(() => {
658
808
  setOffset(0);
659
809
  }, [job]);
@@ -661,11 +811,11 @@ function TrialAssessmentReport({ job, active, artifacts, t }) {
661
811
  if (!selected) return;
662
812
  let alive = true;
663
813
  setDetailState({ status: "loading" });
664
- void api("trial", { job, trial: selected }).then((value) => alive && setDetailState({ status: "ready", value }), (error) => alive && setDetailState({ status: "error", error: error.message }));
814
+ void api("trial", { workspace, job, trial: selected }).then((value) => alive && setDetailState({ status: "ready", value }), (error) => alive && setDetailState({ status: "error", error: error.message }));
665
815
  return () => {
666
816
  alive = false;
667
817
  };
668
- }, [job, selected]);
818
+ }, [workspace, job, selected]);
669
819
  const labels = metricLabelMap(artifacts);
670
820
  const primary = artifacts.contract?.primary_metric ?? "reward";
671
821
  const declared = (artifacts.contract?.metrics ?? []).map((item) => item.id).filter((id) => id !== primary);
@@ -675,23 +825,27 @@ function TrialAssessmentReport({ job, active, artifacts, t }) {
675
825
  const assessment = detail?.assessment;
676
826
  const score = assessment?.score;
677
827
  const artifactTitle = assessment?.output?.title ?? detail?.preview?.title ?? "\u2014";
678
- return /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("trialAssessments")), /* @__PURE__ */ import_react.default.createElement("p", { className: "hse-muted" }, t("trialAssessmentsHint")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-table-wrap" }, /* @__PURE__ */ import_react.default.createElement("table", { className: "hse-evidence-table hse-report-table" }, /* @__PURE__ */ import_react.default.createElement("thead", null, /* @__PURE__ */ import_react.default.createElement("tr", null, /* @__PURE__ */ import_react.default.createElement("th", null, "#"), /* @__PURE__ */ import_react.default.createElement("th", null, t("queryTrial")), /* @__PURE__ */ import_react.default.createElement("th", null, t("overallScore")), metricIds.map((id) => /* @__PURE__ */ import_react.default.createElement("th", { key: id }, labels[id] ?? id)))), /* @__PURE__ */ import_react.default.createElement("tbody", null, (page?.items ?? []).map((trial) => /* @__PURE__ */ import_react.default.createElement("tr", { key: `${trial.id}-${trial.attempt}`, "data-selected": String(selected) === String(trial.id ?? trial.datasetTrial) }, /* @__PURE__ */ import_react.default.createElement("td", null, trial.datasetOrder + 1), /* @__PURE__ */ import_react.default.createElement("td", null, /* @__PURE__ */ import_react.default.createElement("button", { type: "button", onClick: () => setSelected(trial.id ?? trial.datasetTrial) }, trial.displayName ?? trial.datasetTrial ?? trial.name)), /* @__PURE__ */ import_react.default.createElement("td", null, /* @__PURE__ */ import_react.default.createElement("span", { className: "hse-report-score", "data-valid": trial.score?.valid }, trial.score?.valid ? format(trial.score.value ?? trial.rewards?.[primary]) : "\u2014")), metricIds.map((id) => /* @__PURE__ */ import_react.default.createElement("td", { key: id }, format(trial.rewards?.[id])))))))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-pager" }, /* @__PURE__ */ import_react.default.createElement("span", null, page?.total ? `${offset + 1}\u2013${Math.min(offset + (page.items?.length ?? 0), page.total)} / ${page.total}` : "0 / 0"), /* @__PURE__ */ import_react.default.createElement("button", { disabled: !offset, onClick: () => setOffset(Math.max(0, offset - REPORT_PAGE_SIZE)) }, t("previous")), /* @__PURE__ */ import_react.default.createElement("button", { disabled: !page?.hasMore, onClick: () => setOffset(offset + REPORT_PAGE_SIZE) }, t("next"))), detailState.status === "loading" ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-empty" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-spin" }), t("loading")) : detailState.status === "error" ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-error" }, detailState.error) : assessment ? /* @__PURE__ */ import_react.default.createElement("article", { className: "hse-report-detail" }, /* @__PURE__ */ import_react.default.createElement("header", { className: "hse-report-detail-head" }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("h4", null, selectedTrial?.displayName ?? assessment.query ?? assessment.trial_name), /* @__PURE__ */ import_react.default.createElement("span", null, t("artifact"), ": ", artifactTitle), /* @__PURE__ */ import_react.default.createElement("code", null, assessment.dataset_trial ?? selectedTrial?.datasetTrial)), /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("span", null, t("overallScore")), /* @__PURE__ */ import_react.default.createElement("b", { className: score?.valid ? "hse-valid" : "hse-invalid" }, score?.valid ? format(score.value) : "\u2014"))), !score?.valid ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-capability" }, (score?.invalid_reasons ?? []).join(" \xB7 ")) : null, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-report-compare" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-report-criteria" }, (assessment.criteria ?? []).map((criterion) => /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-report-criterion", key: criterion.id }, /* @__PURE__ */ import_react.default.createElement("header", null, /* @__PURE__ */ import_react.default.createElement("b", null, criterion.label ?? labels[criterion.id] ?? criterion.id), /* @__PURE__ */ import_react.default.createElement("b", null, format(criterion.score))), /* @__PURE__ */ import_react.default.createElement("dl", null, /* @__PURE__ */ import_react.default.createElement("dt", null, t("assessmentReason")), /* @__PURE__ */ import_react.default.createElement("dd", null, criterion.reason || t("noAssessmentReason")), /* @__PURE__ */ import_react.default.createElement("dt", null, t("assessmentRecommendation")), /* @__PURE__ */ import_react.default.createElement("dd", { className: "hse-report-recommendation" }, criterion.recommendation || t("noAssessmentRecommendation")))))), /* @__PURE__ */ import_react.default.createElement(ArtifactPreview, { detail, t }))) : null);
828
+ return /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("trialAssessments")), /* @__PURE__ */ import_react.default.createElement("p", { className: "hse-muted" }, t("trialAssessmentsHint")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-table-wrap" }, /* @__PURE__ */ import_react.default.createElement("table", { className: "hse-evidence-table hse-report-table" }, /* @__PURE__ */ import_react.default.createElement("thead", null, /* @__PURE__ */ import_react.default.createElement("tr", null, /* @__PURE__ */ import_react.default.createElement("th", null, "#"), /* @__PURE__ */ import_react.default.createElement("th", null, t("queryTrial")), /* @__PURE__ */ import_react.default.createElement("th", null, t("overallScore")), metricIds.map((id) => /* @__PURE__ */ import_react.default.createElement("th", { key: id }, labels[id] ?? id)))), /* @__PURE__ */ import_react.default.createElement("tbody", null, (page?.items ?? []).map((trial) => /* @__PURE__ */ import_react.default.createElement("tr", { key: `${trial.id}-${trial.attempt}`, "data-selected": String(selected) === String(trial.id ?? trial.datasetTrial) }, /* @__PURE__ */ import_react.default.createElement("td", null, trial.datasetOrder + 1), /* @__PURE__ */ import_react.default.createElement("td", null, /* @__PURE__ */ import_react.default.createElement("button", { type: "button", onClick: () => setSelected(trial.id ?? trial.datasetTrial) }, trial.displayName ?? trial.datasetTrial ?? trial.name)), /* @__PURE__ */ import_react.default.createElement("td", null, /* @__PURE__ */ import_react.default.createElement("span", { className: "hse-report-score", "data-valid": trial.scoringStatus === "unscored" ? void 0 : trial.score?.valid }, trial.scoringStatus === "unscored" ? "completed-unscored" : trial.score?.valid ? format(trial.score.value ?? trial.rewards?.[primary]) : "\u2014")), metricIds.map((id) => /* @__PURE__ */ import_react.default.createElement("td", { key: id }, format(trial.rewards?.[id])))))))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-pager" }, /* @__PURE__ */ import_react.default.createElement("span", null, page?.total ? `${offset + 1}\u2013${Math.min(offset + (page.items?.length ?? 0), page.total)} / ${page.total}` : "0 / 0"), /* @__PURE__ */ import_react.default.createElement("button", { disabled: !offset, onClick: () => setOffset(Math.max(0, offset - REPORT_PAGE_SIZE)) }, t("previous")), /* @__PURE__ */ import_react.default.createElement("button", { disabled: !page?.hasMore, onClick: () => setOffset(offset + REPORT_PAGE_SIZE) }, t("next"))), detailState.status === "loading" ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-empty" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-spin" }), t("loading")) : detailState.status === "error" ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-error" }, detailState.error) : assessment ? /* @__PURE__ */ import_react.default.createElement("article", { className: "hse-report-detail" }, /* @__PURE__ */ import_react.default.createElement("header", { className: "hse-report-detail-head" }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("h4", null, selectedTrial?.displayName ?? assessment.query ?? assessment.trial_name), /* @__PURE__ */ import_react.default.createElement("span", null, t("artifact"), ": ", artifactTitle), /* @__PURE__ */ import_react.default.createElement("code", null, assessment.dataset_trial ?? selectedTrial?.datasetTrial)), /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("span", null, t("overallScore")), /* @__PURE__ */ import_react.default.createElement("b", { className: selectedTrial?.scoringStatus === "unscored" ? "hse-muted" : score?.valid ? "hse-valid" : "hse-invalid" }, selectedTrial?.scoringStatus === "unscored" ? "completed-unscored" : score?.valid ? format(score.value) : "\u2014"))), !score?.valid ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-capability" }, selectedTrial?.scoringStatus === "unscored" && historical ? `${t("unscoredTrials")} \xB7 ` : "", (score?.invalid_reasons ?? []).join(" \xB7 ")) : null, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-report-compare" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-report-criteria" }, (assessment.criteria ?? []).map((criterion) => /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-report-criterion", key: criterion.id }, /* @__PURE__ */ import_react.default.createElement("header", null, /* @__PURE__ */ import_react.default.createElement("b", null, criterion.label ?? labels[criterion.id] ?? criterion.id), /* @__PURE__ */ import_react.default.createElement("b", null, format(criterion.score))), /* @__PURE__ */ import_react.default.createElement("dl", null, /* @__PURE__ */ import_react.default.createElement("dt", null, t("assessmentReason")), /* @__PURE__ */ import_react.default.createElement("dd", null, criterion.reason || t("noAssessmentReason")), /* @__PURE__ */ import_react.default.createElement("dt", null, t("assessmentRecommendation")), /* @__PURE__ */ import_react.default.createElement("dd", { className: "hse-report-recommendation" }, criterion.recommendation || t("noAssessmentRecommendation")))))), /* @__PURE__ */ import_react.default.createElement(ArtifactPreview, { detail, t }))) : null);
679
829
  }
680
- function ReporterPanel({ job, active, artifacts, t }) {
830
+ function ReporterPanel({ job, workspace, active, artifacts, jobKind, t }) {
681
831
  const summary = artifacts.summary ?? {};
682
832
  const population = artifacts.population ?? {};
683
833
  const metrics = population.metrics ?? summary.metrics ?? {};
684
834
  const labels = metricLabelMap(artifacts);
685
- const total = summary.n_trials ?? population.population_size ?? 0;
686
- const valid = summary.n_valid_scores ?? population.valid_population_size;
687
- const groups = Array.isArray(population.groups) ? population.groups : Object.entries(population.groups ?? {}).map(([id, count]) => ({ id, count }));
835
+ const historical = jobKind === HISTORICAL_JOB_KIND;
836
+ const coverage = summary.coverage ?? {};
837
+ const total = historical ? coverage.total_trials ?? summary.n_trials ?? 0 : summary.n_trials ?? population.population_size ?? 0;
838
+ const valid = historical ? coverage.scored_trials ?? summary.n_valid_scores : summary.n_valid_scores ?? population.valid_population_size;
839
+ const unscored = historical ? coverage.unscored_trials ?? summary.status_counts?.["completed-unscored"] ?? 0 : void 0;
840
+ const rawGroups = population.groups ?? (historical ? summary.status_counts : {});
841
+ const groups = Array.isArray(rawGroups) ? rawGroups : Object.entries(rawGroups ?? {}).map(([id, count]) => ({ id, count }));
688
842
  const configured = population.hook?.configured_component;
689
- return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("populationEvidence")), configured ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-hook-state", "data-executed": Boolean(configured.executed) }, /* @__PURE__ */ import_react.default.createElement("b", null, t("hookExecution"), ": ", configured.id ?? "\u2014", " \xB7 ", configured.version ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("br", null), configured.executed ? t("configuredHookRun") : t("configuredHookNotRun")) : null, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpis" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("trials")), /* @__PURE__ */ import_react.default.createElement("b", null, total)), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("valid")), /* @__PURE__ */ import_react.default.createElement("b", { className: "hse-valid" }, valid ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("invalid")), /* @__PURE__ */ import_react.default.createElement("b", { className: "hse-invalid" }, summary.n_invalid_scores ?? population.invalid_population_size ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("exceptions")), /* @__PURE__ */ import_react.default.createElement("b", null, summary.n_exceptions ?? 0)), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("health")), /* @__PURE__ */ import_react.default.createElement("b", null, summary.artifact_validation?.valid ? "VALID" : "CHECK")))), /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-table-wrap" }, /* @__PURE__ */ import_react.default.createElement("table", { className: "hse-evidence-table" }, /* @__PURE__ */ import_react.default.createElement("thead", null, /* @__PURE__ */ import_react.default.createElement("tr", null, /* @__PURE__ */ import_react.default.createElement("th", null, t("metric")), /* @__PURE__ */ import_react.default.createElement("th", null, t("aggregate")), /* @__PURE__ */ import_react.default.createElement("th", null, t("coverage")))), /* @__PURE__ */ import_react.default.createElement("tbody", null, Object.entries(metrics).map(([id, value]) => /* @__PURE__ */ import_react.default.createElement("tr", { key: id }, /* @__PURE__ */ import_react.default.createElement("td", null, /* @__PURE__ */ import_react.default.createElement("b", null, labels[id] ?? id), /* @__PURE__ */ import_react.default.createElement("br", null), /* @__PURE__ */ import_react.default.createElement("code", null, id)), /* @__PURE__ */ import_react.default.createElement("td", null, format(value)), /* @__PURE__ */ import_react.default.createElement("td", null, valid ?? "\u2014", " / ", total))))))), /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("trialGroups")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-chip-list" }, groups.map((group) => /* @__PURE__ */ import_react.default.createElement("span", { key: group.id }, group.id, ": ", group.count)))), /* @__PURE__ */ import_react.default.createElement(TrialAssessmentReport, { job, active, artifacts, t }));
843
+ return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("populationEvidence")), configured ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-hook-state", "data-executed": Boolean(configured.executed) }, /* @__PURE__ */ import_react.default.createElement("b", null, t("hookExecution"), ": ", configured.id ?? "\u2014", " \xB7 ", configured.version ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("br", null), configured.executed ? t("configuredHookRun") : t("configuredHookNotRun")) : null, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpis" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("trials")), /* @__PURE__ */ import_react.default.createElement("b", null, total)), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, historical ? t("scoredTrials") : t("valid")), /* @__PURE__ */ import_react.default.createElement("b", { className: "hse-valid" }, valid ?? "\u2014")), historical ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("unscoredTrials")), /* @__PURE__ */ import_react.default.createElement("b", null, unscored)) : /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("invalid")), /* @__PURE__ */ import_react.default.createElement("b", { className: "hse-invalid" }, summary.n_invalid_scores ?? population.invalid_population_size ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("exceptions")), /* @__PURE__ */ import_react.default.createElement("b", null, summary.n_exceptions ?? 0)), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("coverage")), /* @__PURE__ */ import_react.default.createElement("b", null, historical && typeof coverage.trial_rate === "number" ? `${format(coverage.trial_rate * 100)}%` : summary.artifact_validation?.valid ? "VALID" : "CHECK")))), /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-table-wrap" }, /* @__PURE__ */ import_react.default.createElement("table", { className: "hse-evidence-table" }, /* @__PURE__ */ import_react.default.createElement("thead", null, /* @__PURE__ */ import_react.default.createElement("tr", null, /* @__PURE__ */ import_react.default.createElement("th", null, t("metric")), /* @__PURE__ */ import_react.default.createElement("th", null, t("aggregate")), /* @__PURE__ */ import_react.default.createElement("th", null, t("coverage")))), /* @__PURE__ */ import_react.default.createElement("tbody", null, Object.entries(metrics).map(([id, value]) => /* @__PURE__ */ import_react.default.createElement("tr", { key: id }, /* @__PURE__ */ import_react.default.createElement("td", null, /* @__PURE__ */ import_react.default.createElement("b", null, labels[id] ?? id), /* @__PURE__ */ import_react.default.createElement("br", null), /* @__PURE__ */ import_react.default.createElement("code", null, id)), /* @__PURE__ */ import_react.default.createElement("td", null, format(value)), /* @__PURE__ */ import_react.default.createElement("td", null, valid ?? "\u2014", " / ", total))))))), /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("trialGroups")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-chip-list" }, groups.map((group) => /* @__PURE__ */ import_react.default.createElement("span", { key: group.id }, group.id, ": ", group.count)))), /* @__PURE__ */ import_react.default.createElement(TrialAssessmentReport, { job, workspace, active, artifacts, historical, t }));
690
844
  }
691
845
  function TrialDeltaTable({ title, items }) {
692
846
  return /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, title, " \xB7 ", items?.length ?? 0), items?.length ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-table-wrap" }, /* @__PURE__ */ import_react.default.createElement("table", { className: "hse-evidence-table" }, /* @__PURE__ */ import_react.default.createElement("thead", null, /* @__PURE__ */ import_react.default.createElement("tr", null, /* @__PURE__ */ import_react.default.createElement("th", null, "Trial"), /* @__PURE__ */ import_react.default.createElement("th", null, "Baseline"), /* @__PURE__ */ import_react.default.createElement("th", null, "Candidate"), /* @__PURE__ */ import_react.default.createElement("th", null, "Delta"))), /* @__PURE__ */ import_react.default.createElement("tbody", null, items.map((item) => /* @__PURE__ */ import_react.default.createElement("tr", { key: item.trial }, /* @__PURE__ */ import_react.default.createElement("td", null, item.trial), /* @__PURE__ */ import_react.default.createElement("td", null, format(item.baseline)), /* @__PURE__ */ import_react.default.createElement("td", null, format(item.candidate)), /* @__PURE__ */ import_react.default.createElement("td", { className: "hse-delta", "data-positive": (item.delta ?? 0) >= 0 }, item.delta >= 0 ? "+" : "", format(item.delta))))))) : /* @__PURE__ */ import_react.default.createElement("span", { className: "hse-muted" }, "0"));
693
847
  }
694
- function ComparePanel({ job, jobs, artifacts, t }) {
848
+ function ComparePanel({ job, workspace, jobs, artifacts, t }) {
695
849
  const current = jobs.find((item) => item.name === job);
696
850
  const all = jobs.filter((item) => item.name !== job);
697
851
  const matched = all.filter((item) => item.candidate?.candidate_id === current?.candidate?.candidate_id && item.dataset?.dataset_id === current?.dataset?.dataset_id && item.dataset?.version === current?.dataset?.version && item.mode === current?.mode);
@@ -701,11 +855,11 @@ function ComparePanel({ job, jobs, artifacts, t }) {
701
855
  (0, import_react.useEffect)(() => {
702
856
  if (!baseline) return;
703
857
  let alive = true;
704
- void api("compare", { baseline, candidate: job }).then((value) => alive && setState({ value }), (error) => alive && setState({ error: error.message }));
858
+ void api("compare", { workspace, baseline, candidate: job }).then((value) => alive && setState({ value }), (error) => alive && setState({ error: error.message }));
705
859
  return () => {
706
860
  alive = false;
707
861
  };
708
- }, [baseline, job]);
862
+ }, [workspace, baseline, job]);
709
863
  const labels = metricLabelMap(artifacts);
710
864
  return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("compare")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-compare-select" }, /* @__PURE__ */ import_react.default.createElement("select", { className: "hse-select", value: baseline, onChange: (event) => setBaseline(event.target.value) }, /* @__PURE__ */ import_react.default.createElement("option", { value: "" }, t("baseline")), candidates.map((item) => /* @__PURE__ */ import_react.default.createElement("option", { key: item.name, value: item.name }, item.name)))), state?.error ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-error" }, state.error) : state?.value ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("div", { className: state.value.comparable ? "hse-valid" : "hse-invalid" }, state.value.comparable ? `\u2713 ${t("comparable")}` : `\xD7 ${t("notComparable")}`), /* @__PURE__ */ import_react.default.createElement("p", { className: "hse-muted" }, state.value.note), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-grid" }, Object.entries(state.value.metrics ?? {}).map(([metric, values]) => /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card", key: metric }, /* @__PURE__ */ import_react.default.createElement("span", null, labels[metric] ?? metric, " \xB7 ", values.direction), /* @__PURE__ */ import_react.default.createElement("b", null, format(values.baseline), " \u2192 ", format(values.candidate)), /* @__PURE__ */ import_react.default.createElement("code", { className: "hse-delta", "data-positive": (values.improvement ?? values.delta ?? 0) >= 0 }, typeof values.delta === "number" ? `${values.delta >= 0 ? "+" : ""}${format(values.delta)}` : "\u2014"))))) : /* @__PURE__ */ import_react.default.createElement("span", { className: "hse-muted" }, t("noData"))), state?.value ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(TrialDeltaTable, { title: t("improved"), items: state.value.improvedTrials }), /* @__PURE__ */ import_react.default.createElement(TrialDeltaTable, { title: t("regressed"), items: state.value.regressedTrials })) : null, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-capability" }, t("explicitGate")));
711
865
  }
@@ -725,7 +879,10 @@ function GateEvidencePanel({ artifacts, t }) {
725
879
  const population = report.population ?? {};
726
880
  return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-gate-head" }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("h3", null, t("gateEvidence")), /* @__PURE__ */ import_react.default.createElement("p", { className: "hse-muted" }, report.baseline_job ?? "\u2014", " \u2192 ", report.candidate_job ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("span", { className: "hse-decision", "data-pass": pass }, report.decision ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-grid" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("comparable")), /* @__PURE__ */ import_react.default.createElement("b", { className: report.comparable ? "hse-valid" : "hse-invalid" }, report.comparable ? "\u2713 TRUE" : "\xD7 FALSE"), /* @__PURE__ */ import_react.default.createElement("code", null, short(report.baseline_evaluation_context?.digest), " = ", short(report.candidate_evaluation_context?.digest))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, report.gate_eligible ? t("eligible") : t("notEligible")), /* @__PURE__ */ import_react.default.createElement("b", { className: report.gate_eligible ? "hse-valid" : "hse-invalid" }, population.baseline_valid ?? "\u2014", " / ", population.baseline ?? "\u2014", " \u2192 ", population.candidate_valid ?? "\u2014", " / ", population.candidate ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, t("policy"), ": ", report.policy?.policy_id ?? "\u2014", " \xB7 ", report.policy?.version ?? "\u2014")))), /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("metricDeltas")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-table-wrap" }, /* @__PURE__ */ import_react.default.createElement("table", { className: "hse-evidence-table" }, /* @__PURE__ */ import_react.default.createElement("thead", null, /* @__PURE__ */ import_react.default.createElement("tr", null, /* @__PURE__ */ import_react.default.createElement("th", null, t("metric")), /* @__PURE__ */ import_react.default.createElement("th", null, "Baseline"), /* @__PURE__ */ import_react.default.createElement("th", null, "Candidate"), /* @__PURE__ */ import_react.default.createElement("th", null, "Delta"))), /* @__PURE__ */ import_react.default.createElement("tbody", null, Object.entries(report.metric_deltas ?? {}).map(([id, delta]) => /* @__PURE__ */ import_react.default.createElement("tr", { key: id }, /* @__PURE__ */ import_react.default.createElement("td", null, labels[id] ?? id), /* @__PURE__ */ import_react.default.createElement("td", null, format(report.baseline_metrics?.[id])), /* @__PURE__ */ import_react.default.createElement("td", null, format(report.candidate_metrics?.[id])), /* @__PURE__ */ import_react.default.createElement("td", { className: "hse-delta", "data-positive": delta >= 0 }, delta >= 0 ? "+" : "", format(delta)))))))), /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpis" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("improved")), /* @__PURE__ */ import_react.default.createElement("b", null, report.improved_trials?.length ?? 0)), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("regressed")), /* @__PURE__ */ import_react.default.createElement("b", null, report.regressed_trials?.length ?? 0)), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("newExceptions")), /* @__PURE__ */ import_react.default.createElement("b", null, report.new_exceptions?.length ?? 0)), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("artifactRegressions")), /* @__PURE__ */ import_react.default.createElement("b", null, report.artifact_regressions?.length ?? 0)), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("reasons")), /* @__PURE__ */ import_react.default.createElement("b", null, report.reasons?.length ?? 0))), report.reasons?.length ? /* @__PURE__ */ import_react.default.createElement("ul", null, report.reasons.map((reason, index) => /* @__PURE__ */ import_react.default.createElement("li", { key: `${gateReasonText(reason)}-${index}` }, gateReasonText(reason)))) : null));
727
881
  }
728
- function EvaluatorEditor({ value, reload, t }) {
882
+ function HistoricalGatePanel({ t }) {
883
+ return /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-gate-head" }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("h3", null, t("gateEvidence")), /* @__PURE__ */ import_react.default.createElement("p", { className: "hse-muted" }, t("gateNotApplicableHint"))), /* @__PURE__ */ import_react.default.createElement("span", { className: "hse-decision" }, t("gateNotApplicable"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-capability" }, /* @__PURE__ */ import_react.default.createElement("b", null, "UNSUPPORTED_JOB_KIND_FOR_PROMOTION"), /* @__PURE__ */ import_react.default.createElement("br", null), "historical-generation-evaluation \xB7 diagnostic \xB7 observe-existing"));
884
+ }
885
+ function EvaluatorEditor({ value, workspace, reload, t }) {
729
886
  const active = value.evaluatorInterface;
730
887
  const evaluator = active?.evaluator;
731
888
  const files = evaluator?.editable_files ?? [];
@@ -751,6 +908,7 @@ function EvaluatorEditor({ value, reload, t }) {
751
908
  setSaveState({ status: "saving" });
752
909
  try {
753
910
  await mutate("evaluator", {
911
+ workspace,
754
912
  stackPath: active.stack.path,
755
913
  filePath: selected.path,
756
914
  content: draft,
@@ -766,16 +924,16 @@ function EvaluatorEditor({ value, reload, t }) {
766
924
  };
767
925
  return /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-editor-head" }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("h3", null, t("evaluatorImplementation")), /* @__PURE__ */ import_react.default.createElement("p", { className: "hse-muted" }, evaluator.evaluator_id, " \xB7 ", evaluator.version)), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("evaluatorKind")), /* @__PURE__ */ import_react.default.createElement("b", null, evaluator.kind), /* @__PURE__ */ import_react.default.createElement("code", null, evaluator.interface))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-grid" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("evaluatorProtocol")), /* @__PURE__ */ import_react.default.createElement("b", null, evaluator.protocol?.input, " \u2192 ", evaluator.protocol?.output), /* @__PURE__ */ import_react.default.createElement("code", null, evaluator.implementation?.language, " \xB7 ", evaluator.implementation?.callable)), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("criteria")), /* @__PURE__ */ import_react.default.createElement("b", null, (evaluator.criteria ?? []).map((item) => item.label).join(" \xB7 ")), /* @__PURE__ */ import_react.default.createElement("code", null, "0 \xB7 0.5 \xB7 1"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-editor-tabs", "aria-label": t("editableFiles") }, files.map((file) => /* @__PURE__ */ import_react.default.createElement("button", { type: "button", className: "hse-editor-tab", "data-active": file.path === selected?.path, key: file.path, onClick: () => setSelectedPath(file.path) }, /* @__PURE__ */ import_react.default.createElement("b", null, t("openFile"), " ", file.path.split("/").at(-1)), /* @__PURE__ */ import_react.default.createElement("span", null, file.role, " \xB7 ", file.path)))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-editor-current" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("editingFile")), /* @__PURE__ */ import_react.default.createElement("b", null, selected?.path.split("/").at(-1)), /* @__PURE__ */ import_react.default.createElement("code", null, selected?.path)), /* @__PURE__ */ import_react.default.createElement("textarea", { className: "hse-editor", "aria-label": t("editSource"), spellCheck: "false", value: draft, onChange: (event) => setDraft(event.target.value) }), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-editor-versions" }, /* @__PURE__ */ import_react.default.createElement("label", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("evaluatorVersion")), /* @__PURE__ */ import_react.default.createElement("input", { className: "hse-input", value: evaluatorVersion, onChange: (event) => setEvaluatorVersion(event.target.value) })), /* @__PURE__ */ import_react.default.createElement("label", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("stackVersion")), /* @__PURE__ */ import_react.default.createElement("input", { className: "hse-input", value: stackVersion, onChange: (event) => setStackVersion(event.target.value) }))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-editor-actions" }, /* @__PURE__ */ import_react.default.createElement("p", { className: saveState.status === "error" ? "hse-editor-error" : saveState.status === "saved" ? "hse-editor-success" : "hse-muted" }, saveState.status === "error" ? saveState.message : saveState.status === "saved" ? t("saved") : t("editWarning")), /* @__PURE__ */ import_react.default.createElement("button", { type: "button", className: "hse-button", disabled: !changed || !evaluatorVersion || !stackVersion || saveState.status === "saving", onClick: () => void save() }, saveState.status === "saving" ? t("saving") : t("saveEvaluator"))));
768
926
  }
769
- function GovernancePanel({ job, t }) {
927
+ function GovernancePanel({ job, workspace, t }) {
770
928
  const [state, setState] = (0, import_react.useState)({ status: "loading" });
771
929
  const [copied, setCopied] = (0, import_react.useState)(false);
772
930
  const load = (0, import_react.useCallback)(async () => {
773
931
  try {
774
- setState({ status: "ready", value: await api("governance", { job }) });
932
+ setState({ status: "ready", value: await api("governance", { workspace, job }) });
775
933
  } catch (error) {
776
934
  setState({ status: "error", error: error.message });
777
935
  }
778
- }, [job]);
936
+ }, [workspace, job]);
779
937
  (0, import_react.useEffect)(() => {
780
938
  void load();
781
939
  }, [load]);
@@ -795,36 +953,48 @@ function GovernancePanel({ job, t }) {
795
953
  setCopied(false);
796
954
  }
797
955
  };
798
- return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("currentEvaluator")), /* @__PURE__ */ import_react.default.createElement("p", { className: "hse-muted" }, t("governanceHint")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-governance-id" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("evaluator")), /* @__PURE__ */ import_react.default.createElement("b", null, evaluator?.id ?? "\u2014", " \xB7 ", evaluator?.version ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, evaluator?.entry ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("rubric")), /* @__PURE__ */ import_react.default.createElement("b", null, rubric?.id ?? "\u2014", " \xB7 ", rubric?.version ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, rubric?.entry ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, "Judge"), /* @__PURE__ */ import_react.default.createElement("b", null, value.judge?.provider ?? "\u2014", " / ", value.judge?.model ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, value.judge?.version ?? "\u2014")))), /* @__PURE__ */ import_react.default.createElement(EvaluatorEditor, { value, reload: load, t }), [["evaluator", evaluator], ["rubric", rubric]].map(([role, component]) => /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section", key: role }, /* @__PURE__ */ import_react.default.createElement("h3", null, role === "evaluator" ? t("evaluator") : t("rubric"), " \xB7 ", component?.id ?? "\u2014", " \xB7 ", component?.version ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-grid" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("sourceCode")), /* @__PURE__ */ import_react.default.createElement("b", null, component?.entry ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, short(component?.digest))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, "Reward semantics"), /* @__PURE__ */ import_react.default.createElement("b", null, component?.reward_affecting ? "reward-affecting" : "non-reward"), /* @__PURE__ */ import_react.default.createElement("code", null, component?.source?.error ?? "read-only"))), component?.source?.text ? /* @__PURE__ */ import_react.default.createElement("details", { className: "hse-source-details" }, /* @__PURE__ */ import_react.default.createElement("summary", null, t("sourceCode")), /* @__PURE__ */ import_react.default.createElement("pre", { className: "hse-source" }, component.source.text)) : /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-capability" }, component?.source?.error))), /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section hse-upgrade" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("upgradeEvaluator")), /* @__PURE__ */ import_react.default.createElement("p", { className: "hse-muted" }, t("upgradeHint")), /* @__PURE__ */ import_react.default.createElement("ol", null, [1, 2, 3, 4, 5].map((index) => /* @__PURE__ */ import_react.default.createElement("li", { key: index }, t(`upgradeStep${index}`)))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-grid" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("freshBaseline")), /* @__PURE__ */ import_react.default.createElement("b", null, "Evaluator / Rubric / Judge identity"), /* @__PURE__ */ import_react.default.createElement("code", null, (workflow.freshBaselineRequiredWhen ?? []).join(" \xB7 "))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("metaEvaluation")), /* @__PURE__ */ import_react.default.createElement("b", null, "Independent GT \xB7 ESF \xB7 SCE \xB7 RCR"), /* @__PURE__ */ import_react.default.createElement("code", null, "No automatic evaluation or Gate"))), /* @__PURE__ */ import_react.default.createElement("pre", { className: "hse-prompt" }, prompt), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-prompt-actions" }, /* @__PURE__ */ import_react.default.createElement("button", { className: "hse-button", type: "button", onClick: () => void copy() }, copied ? t("copied") : t("copyPrompt")))));
956
+ return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("currentEvaluator")), /* @__PURE__ */ import_react.default.createElement("p", { className: "hse-muted" }, t("governanceHint")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-governance-id" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("evaluator")), /* @__PURE__ */ import_react.default.createElement("b", null, evaluator?.id ?? "\u2014", " \xB7 ", evaluator?.version ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, evaluator?.entry ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("rubric")), /* @__PURE__ */ import_react.default.createElement("b", null, rubric?.id ?? "\u2014", " \xB7 ", rubric?.version ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, rubric?.entry ?? "\u2014")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, "Judge"), /* @__PURE__ */ import_react.default.createElement("b", null, value.judge?.provider ?? "\u2014", " / ", value.judge?.model ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, judgeIdentityDetails(value.judge))))), /* @__PURE__ */ import_react.default.createElement(EvaluatorEditor, { value, workspace, reload: load, t }), [["evaluator", evaluator], ["rubric", rubric]].map(([role, component]) => /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section", key: role }, /* @__PURE__ */ import_react.default.createElement("h3", null, role === "evaluator" ? t("evaluator") : t("rubric"), " \xB7 ", component?.id ?? "\u2014", " \xB7 ", component?.version ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-grid" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("sourceCode")), /* @__PURE__ */ import_react.default.createElement("b", null, component?.entry ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, short(component?.digest))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, "Reward semantics"), /* @__PURE__ */ import_react.default.createElement("b", null, component?.reward_affecting ? "reward-affecting" : "non-reward"), /* @__PURE__ */ import_react.default.createElement("code", null, component?.source?.error ?? "read-only"))), component?.source?.text ? /* @__PURE__ */ import_react.default.createElement("details", { className: "hse-source-details" }, /* @__PURE__ */ import_react.default.createElement("summary", null, t("sourceCode")), /* @__PURE__ */ import_react.default.createElement("pre", { className: "hse-source" }, component.source.text)) : /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-capability" }, component?.source?.error))), /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section hse-upgrade" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("upgradeEvaluator")), /* @__PURE__ */ import_react.default.createElement("p", { className: "hse-muted" }, t("upgradeHint")), /* @__PURE__ */ import_react.default.createElement("ol", null, [1, 2, 3, 4, 5].map((index) => /* @__PURE__ */ import_react.default.createElement("li", { key: index }, t(`upgradeStep${index}`)))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-grid" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("freshBaseline")), /* @__PURE__ */ import_react.default.createElement("b", null, "Evaluator / Rubric / Judge identity"), /* @__PURE__ */ import_react.default.createElement("code", null, (workflow.freshBaselineRequiredWhen ?? []).join(" \xB7 "))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("metaEvaluation")), /* @__PURE__ */ import_react.default.createElement("b", null, "Independent GT \xB7 ESF \xB7 SCE \xB7 RCR"), /* @__PURE__ */ import_react.default.createElement("code", null, "No automatic evaluation or Gate"))), /* @__PURE__ */ import_react.default.createElement("pre", { className: "hse-prompt" }, prompt), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-prompt-actions" }, /* @__PURE__ */ import_react.default.createElement("button", { className: "hse-button", type: "button", onClick: () => void copy() }, copied ? t("copied") : t("copyPrompt")))));
799
957
  }
800
- function MetaEvaluationPanel({ job, t }) {
958
+ function MetaEvaluationPanel({ job, workspace, t }) {
801
959
  const [state, setState] = (0, import_react.useState)({ status: "loading" });
960
+ const [offset, setOffset] = (0, import_react.useState)(0);
961
+ const pageSize = 20;
802
962
  (0, import_react.useEffect)(() => {
803
963
  let alive = true;
804
- void api("meta", { job }).then((value2) => alive && setState({ status: "ready", value: value2 }), (error) => alive && setState({ status: "error", error: error.message }));
964
+ void api("meta", { workspace, job, offset, limit: pageSize }).then((value2) => alive && setState({ status: "ready", value: value2 }), (error) => alive && setState({ status: "error", error: error.message }));
805
965
  return () => {
806
966
  alive = false;
807
967
  };
808
- }, [job]);
968
+ }, [workspace, job, offset]);
969
+ (0, import_react.useEffect)(() => {
970
+ setOffset(0);
971
+ }, [workspace, job]);
809
972
  if (state.status === "loading") return /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-empty" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-spin" }), t("loading"));
810
973
  if (state.status === "error") return /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-error" }, state.error);
811
974
  const value = state.value ?? {};
812
975
  const groundTruth = value.groundTruth;
813
976
  const report = value.report;
814
977
  const metrics = report?.metrics ?? {};
815
- return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("metaWorkflow")), /* @__PURE__ */ import_react.default.createElement("p", { className: "hse-muted" }, t("metaWorkflowHint")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta-flow" }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("b", null, "1. Evaluator Candidate"), /* @__PURE__ */ import_react.default.createElement("br", null), value.workflow?.candidate), /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("b", null, "2. Fixed artifacts + GT"), /* @__PURE__ */ import_react.default.createElement("br", null), value.workflow?.dataset), /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("b", null, "3. Repeated observations"), /* @__PURE__ */ import_react.default.createElement("br", null), value.workflow?.output), /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("b", null, "4. ESF / SCE / RCR"), /* @__PURE__ */ import_react.default.createElement("br", null), value.workflow?.verifier))), /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("groundTruth")), groundTruth ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-grid" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, "ID / version"), /* @__PURE__ */ import_react.default.createElement("b", null, groundTruth.id, " \xB7 ", groundTruth.version), /* @__PURE__ */ import_react.default.createElement("code", null, groundTruth.path)), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("gtSource")), /* @__PURE__ */ import_react.default.createElement("b", null, groundTruth.source?.kind), /* @__PURE__ */ import_react.default.createElement("code", null, groundTruth.source?.description)), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("gtCases")), /* @__PURE__ */ import_react.default.createElement("b", null, groundTruth.caseCount), /* @__PURE__ */ import_react.default.createElement("code", null, groundTruth.criteria?.map((item) => item.label ?? item.id).join(" \xB7 "))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("gtBadcases")), /* @__PURE__ */ import_react.default.createElement("b", null, groundTruth.badcaseCount), /* @__PURE__ */ import_react.default.createElement("code", null, t("gtProvenance"), ": ", groundTruth.source?.provenance)))) : /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-capability" }, /* @__PURE__ */ import_react.default.createElement("b", null, t("groundTruthRequired")), /* @__PURE__ */ import_react.default.createElement("br", null), t("gtKinds")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-hook-state", "data-executed": Boolean(report) }, /* @__PURE__ */ import_react.default.createElement("b", null, t("metaNext")), /* @__PURE__ */ import_react.default.createElement("br", null), value.workflow?.nextAction)), report ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, "Evaluator \xB7 ", report.evaluator?.id, " \xB7 ", report.evaluator?.version), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpis" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, "ESF \u2191"), /* @__PURE__ */ import_react.default.createElement("b", null, format(metrics.esf))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, "SCE \u2193"), /* @__PURE__ */ import_react.default.createElement("b", null, format(metrics.sce))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, "RCR \u2191"), /* @__PURE__ */ import_react.default.createElement("b", null, format(metrics.rcr))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("coverage")), /* @__PURE__ */ import_react.default.createElement("b", null, format(report.coverage?.rate))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("disagreements")), /* @__PURE__ */ import_react.default.createElement("b", null, report.disagreements?.length ?? 0)))), report.disagreements?.length ? /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("disagreements")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-table-wrap" }, /* @__PURE__ */ import_react.default.createElement("table", { className: "hse-evidence-table" }, /* @__PURE__ */ import_react.default.createElement("thead", null, /* @__PURE__ */ import_react.default.createElement("tr", null, /* @__PURE__ */ import_react.default.createElement("th", null, "Case"), /* @__PURE__ */ import_react.default.createElement("th", null, "Criterion"), /* @__PURE__ */ import_react.default.createElement("th", null, "GT"), /* @__PURE__ */ import_react.default.createElement("th", null, "Observed"))), /* @__PURE__ */ import_react.default.createElement("tbody", null, report.disagreements.slice(0, 20).map((item, index) => /* @__PURE__ */ import_react.default.createElement("tr", { key: `${item.case_id}-${item.repeat}-${item.criterion_id}-${index}` }, /* @__PURE__ */ import_react.default.createElement("td", null, item.case_id), /* @__PURE__ */ import_react.default.createElement("td", null, item.criterion_id), /* @__PURE__ */ import_react.default.createElement("td", null, format(item.ground_truth)), /* @__PURE__ */ import_react.default.createElement("td", null, format(item.observed)))))))) : null) : null);
978
+ const pagination = value.disagreementPagination ?? {};
979
+ return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("metaWorkflow")), /* @__PURE__ */ import_react.default.createElement("p", { className: "hse-muted" }, t("metaWorkflowHint")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-meta-flow" }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("b", null, "1. Evaluator Candidate"), /* @__PURE__ */ import_react.default.createElement("br", null), value.workflow?.candidate), /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("b", null, "2. Fixed artifacts + GT"), /* @__PURE__ */ import_react.default.createElement("br", null), value.workflow?.dataset), /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("b", null, "3. Repeated observations"), /* @__PURE__ */ import_react.default.createElement("br", null), value.workflow?.output), /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("b", null, "4. ESF / SCE / RCR"), /* @__PURE__ */ import_react.default.createElement("br", null), value.workflow?.verifier))), /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("groundTruth")), groundTruth ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-grid" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, "ID / version"), /* @__PURE__ */ import_react.default.createElement("b", null, groundTruth.id, " \xB7 ", groundTruth.version), /* @__PURE__ */ import_react.default.createElement("code", null, groundTruth.path)), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("gtSource")), /* @__PURE__ */ import_react.default.createElement("b", null, groundTruth.source?.kind), /* @__PURE__ */ import_react.default.createElement("code", null, groundTruth.source?.description)), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("gtCases")), /* @__PURE__ */ import_react.default.createElement("b", null, groundTruth.caseCount), /* @__PURE__ */ import_react.default.createElement("code", null, groundTruth.criteria?.map((item) => item.label ?? item.id).join(" \xB7 "))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("gtBadcases")), /* @__PURE__ */ import_react.default.createElement("b", null, groundTruth.badcaseCount), /* @__PURE__ */ import_react.default.createElement("code", null, t("gtProvenance"), ": ", groundTruth.source?.provenance)))) : /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-capability" }, /* @__PURE__ */ import_react.default.createElement("b", null, t("groundTruthRequired")), /* @__PURE__ */ import_react.default.createElement("br", null), t("gtKinds")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-hook-state", "data-executed": Boolean(report) }, /* @__PURE__ */ import_react.default.createElement("b", null, t("metaNext")), /* @__PURE__ */ import_react.default.createElement("br", null), value.workflow?.nextAction)), report ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, "Evaluator \xB7 ", report.evaluator?.id, " \xB7 ", report.evaluator?.version), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpis" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, "ESF \u2191"), /* @__PURE__ */ import_react.default.createElement("b", null, format(metrics.esf))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, "SCE \u2193"), /* @__PURE__ */ import_react.default.createElement("b", null, format(metrics.sce))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, "RCR \u2191"), /* @__PURE__ */ import_react.default.createElement("b", null, format(metrics.rcr))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("coverage")), /* @__PURE__ */ import_react.default.createElement("b", null, format(report.coverage?.rate))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-kpi" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("disagreements")), /* @__PURE__ */ import_react.default.createElement("b", null, pagination.total ?? report.disagreements?.length ?? 0)))), pagination.total ? /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("disagreements")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-table-wrap" }, /* @__PURE__ */ import_react.default.createElement("table", { className: "hse-evidence-table" }, /* @__PURE__ */ import_react.default.createElement("thead", null, /* @__PURE__ */ import_react.default.createElement("tr", null, /* @__PURE__ */ import_react.default.createElement("th", null, "Case"), /* @__PURE__ */ import_react.default.createElement("th", null, "Criterion"), /* @__PURE__ */ import_react.default.createElement("th", null, "GT"), /* @__PURE__ */ import_react.default.createElement("th", null, "Observed"))), /* @__PURE__ */ import_react.default.createElement("tbody", null, (report.disagreements ?? []).map((item, index) => /* @__PURE__ */ import_react.default.createElement("tr", { key: `${item.case_id}-${item.repeat}-${item.criterion_id}-${index}` }, /* @__PURE__ */ import_react.default.createElement("td", null, item.case_id), /* @__PURE__ */ import_react.default.createElement("td", null, item.criterion_id), /* @__PURE__ */ import_react.default.createElement("td", null, format(item.ground_truth)), /* @__PURE__ */ import_react.default.createElement("td", null, format(item.observed))))))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-pager" }, /* @__PURE__ */ import_react.default.createElement("span", null, pagination.total ? `${offset + 1}\u2013${Math.min(offset + (report.disagreements?.length ?? 0), pagination.total)} / ${pagination.total}` : "0 / 0"), /* @__PURE__ */ import_react.default.createElement("button", { disabled: !offset, onClick: () => setOffset(Math.max(0, offset - pageSize)) }, t("previous")), /* @__PURE__ */ import_react.default.createElement("button", { disabled: !pagination.hasMore, onClick: () => setOffset(offset + pageSize) }, t("next")))) : null) : null);
816
980
  }
817
- function Workbench({ job, jobs, close, t }) {
981
+ function HistoricalMetaEvaluationPanel({ detail, artifacts, t }) {
982
+ const context = artifacts.context ?? {};
983
+ const metaEvaluation = context.downstream_analysis?.evaluator_meta_evaluation ?? detail?.evaluatorMetaEvaluation ?? artifacts.summary?.evaluator_meta_evaluation ?? { status: "not-run", validation_report_ref: null };
984
+ const notRun = metaEvaluation.status === "not-run";
985
+ return /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("meta")), /* @__PURE__ */ import_react.default.createElement("p", { className: "hse-muted" }, t("metaNotRunHint")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-grid" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("currentStatus")), /* @__PURE__ */ import_react.default.createElement("b", null, notRun ? t("metaNotRun") : metaEvaluation.status ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, context.protocol ?? "historical-generation-evaluation-context/v1")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, "Validation report"), /* @__PURE__ */ import_react.default.createElement("b", null, metaEvaluation.validation_report_ref ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, notRun ? "Evaluator reliability remains unvalidated" : short(metaEvaluation.digest)))));
986
+ }
987
+ function Workbench({ job, workspace, jobs, close, t }) {
818
988
  const [state, setState] = (0, import_react.useState)({ status: "loading" });
819
989
  const [stage, setStage] = (0, import_react.useState)("candidate");
820
990
  const activeJob = jobs.find((item) => item.name === job);
821
991
  const load = (0, import_react.useCallback)(async () => {
822
992
  try {
823
- setState({ status: "ready", value: await api("job", { job }) });
993
+ setState({ status: "ready", value: await api("job", { workspace, job }) });
824
994
  } catch (error) {
825
995
  setState({ status: "error", error: error.message });
826
996
  }
827
- }, [job]);
997
+ }, [workspace, job]);
828
998
  (0, import_react.useEffect)(() => {
829
999
  void load();
830
1000
  }, [load]);
@@ -840,29 +1010,79 @@ function Workbench({ job, jobs, close, t }) {
840
1010
  }, [close]);
841
1011
  const detail = state.value;
842
1012
  const artifacts = detail?.artifacts ?? {};
1013
+ const historical = isHistoricalJob(detail) || isHistoricalJob(activeJob);
1014
+ const target = detail?.evaluationTarget ?? activeJob?.evaluationTarget ?? artifacts.summary?.evaluation_target ?? artifacts.context?.evaluation_target ?? {};
1015
+ const contextSupported = detail?.capabilities?.contextSupported ?? detail?.capabilities?.contextV2;
843
1016
  const component = artifacts.stack?.components?.[stage];
844
1017
  let content;
845
- if (stage === "candidate") content = /* @__PURE__ */ import_react.default.createElement(CandidatePanel, { artifacts, t });
846
- else if (stage === "dataset") content = /* @__PURE__ */ import_react.default.createElement(DatasetPanel, { job, artifacts, t });
847
- else if (stage === "renderer") content = /* @__PURE__ */ import_react.default.createElement(RendererPanel, { job, active: Boolean(activeJob?.progress?.active), component, t });
848
- else if (stage === "judge") content = /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(GovernancePanel, { job, t }), /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("trials"), " / ", t("evidence")), /* @__PURE__ */ import_react.default.createElement(TrialExplorer, { job, active: Boolean(activeJob?.progress?.active), t })));
849
- else if (stage === "meta") content = /* @__PURE__ */ import_react.default.createElement(MetaEvaluationPanel, { job, t });
850
- else if (stage === "reporter") content = /* @__PURE__ */ import_react.default.createElement(ReporterPanel, { job, active: Boolean(activeJob?.progress?.active), artifacts, t });
1018
+ if (stage === "candidate") content = historical ? /* @__PURE__ */ import_react.default.createElement(HistoricalTargetPanel, { detail, artifacts, t }) : /* @__PURE__ */ import_react.default.createElement(CandidatePanel, { artifacts, t });
1019
+ else if (stage === "dataset") content = /* @__PURE__ */ import_react.default.createElement(DatasetPanel, { job, workspace, artifacts, t });
1020
+ else if (stage === "renderer") content = /* @__PURE__ */ import_react.default.createElement(RendererPanel, { job, workspace, active: Boolean(activeJob?.progress?.active), component, t });
1021
+ else if (stage === "judge") content = /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(GovernancePanel, { job, workspace, t }), /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("h3", null, t("trials"), " / ", t("evidence")), /* @__PURE__ */ import_react.default.createElement(TrialExplorer, { job, workspace, active: Boolean(activeJob?.progress?.active), t })));
1022
+ else if (stage === "meta") content = historical ? /* @__PURE__ */ import_react.default.createElement(HistoricalMetaEvaluationPanel, { detail, artifacts, t }) : /* @__PURE__ */ import_react.default.createElement(MetaEvaluationPanel, { job, workspace, t });
1023
+ else if (stage === "reporter") content = /* @__PURE__ */ import_react.default.createElement(ReporterPanel, { job, workspace, active: Boolean(activeJob?.progress?.active), artifacts, jobKind: detail?.jobKind ?? activeJob?.jobKind, t });
851
1024
  else if (stage === "optimizer") content = /* @__PURE__ */ import_react.default.createElement(OptimizerPanel, { artifacts, t });
852
- else if (stage === "gate") content = /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(ComparePanel, { job, jobs, artifacts, t }), /* @__PURE__ */ import_react.default.createElement(GateEvidencePanel, { artifacts, t }));
1025
+ else if (stage === "gate") content = historical ? /* @__PURE__ */ import_react.default.createElement(HistoricalGatePanel, { t }) : /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(ComparePanel, { job, workspace, jobs, artifacts, t }), /* @__PURE__ */ import_react.default.createElement(GateEvidencePanel, { artifacts, t }));
853
1026
  else content = stage === "integration" ? /* @__PURE__ */ import_react.default.createElement(ContractPanel, { artifacts, component, t }) : /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-section" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-components" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-component" }, /* @__PURE__ */ import_react.default.createElement("span", null, stage, component?.reward_affecting ? " \xB7 reward-affecting" : ""), /* @__PURE__ */ import_react.default.createElement("b", null, component?.id ?? "\u2014", " \xB7 ", component?.version ?? "\u2014"), /* @__PURE__ */ import_react.default.createElement("code", null, short(component?.digest)))));
854
- return /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-overlay", role: "presentation", onMouseDown: (event) => event.target === event.currentTarget && close() }, /* @__PURE__ */ import_react.default.createElement("aside", { className: "hse-drawer", role: "dialog", "aria-modal": "true", "aria-label": job }, /* @__PURE__ */ import_react.default.createElement("header", { className: "hse-drawer-head" }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("h2", null, job), /* @__PURE__ */ import_react.default.createElement("p", null, activeJob?.candidate?.candidate_id ?? "\u2014", " \xB7 ", activeJob?.candidate?.version ?? "\u2014", " \xB7 ", activeJob?.mode ?? "\u2014", " \xB7 ", activeJob?.progress?.completed ?? 0, "/", activeJob?.progress?.total ?? 0)), /* @__PURE__ */ import_react.default.createElement("button", { type: "button", className: "hse-close", onClick: close }, t("close"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-workbench" }, /* @__PURE__ */ import_react.default.createElement("nav", { className: "hse-stage-nav", "aria-label": t("stageNav") }, STAGES.map((item) => /* @__PURE__ */ import_react.default.createElement("button", { type: "button", key: item, "data-active": stage === item, "aria-current": stage === item ? "step" : void 0, onClick: () => setStage(item) }, STAGES.indexOf(item) + 1, ". ", t(item)))), state.status === "loading" ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-empty" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-spin" }), t("loading")) : state.status === "error" ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-error" }, state.error, /* @__PURE__ */ import_react.default.createElement("br", null), /* @__PURE__ */ import_react.default.createElement("button", { className: "hse-button", onClick: () => void load() }, t("retry"))) : /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, !detail.capabilities?.contextV2 ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-capability" }, t("capabilityUnavailable")) : null, content, /* @__PURE__ */ import_react.default.createElement("details", { className: "hse-section hse-audit" }, /* @__PURE__ */ import_react.default.createElement("summary", null, t("audit"), " / ", t("artifacts")), /* @__PURE__ */ import_react.default.createElement("pre", null, pretty({ validation: detail.validation, registry: artifacts.registry, context: artifacts.context, doctor: artifacts.doctor })))))));
1027
+ return /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-overlay", role: "presentation", onMouseDown: (event) => event.target === event.currentTarget && close() }, /* @__PURE__ */ import_react.default.createElement("aside", { className: "hse-drawer", role: "dialog", "aria-modal": "true", "aria-label": job }, /* @__PURE__ */ import_react.default.createElement("header", { className: "hse-drawer-head" }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("h2", null, job), /* @__PURE__ */ import_react.default.createElement("p", null, historical ? `${t("historicalTarget")} \xB7 ${target.source_kind ?? activeJob?.generationSource?.kind ?? "\u2014"} \xB7 ${target.record_count ?? activeJob?.nTrials ?? 0} ${t("generationRecords")}` : `${activeJob?.candidate?.candidate_id ?? "\u2014"} \xB7 ${activeJob?.candidate?.version ?? "\u2014"}`, " \xB7 ", activeJob?.mode ?? "\u2014", " \xB7 ", activeJob?.progress?.completed ?? 0, "/", activeJob?.progress?.total ?? 0)), /* @__PURE__ */ import_react.default.createElement("button", { type: "button", className: "hse-close", onClick: close }, t("close"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-workbench" }, /* @__PURE__ */ import_react.default.createElement("nav", { className: "hse-stage-nav", "aria-label": t("stageNav") }, STAGES.map((item) => /* @__PURE__ */ import_react.default.createElement("button", { type: "button", key: item, "data-active": stage === item, "aria-current": stage === item ? "step" : void 0, onClick: () => setStage(item) }, STAGES.indexOf(item) + 1, ". ", historical && item === "candidate" ? t("historicalTarget") : historical && item === "dataset" ? t("generationRecords") : t(item)))), state.status === "loading" ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-empty" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-spin" }), t("loading")) : state.status === "error" ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-error" }, state.error, /* @__PURE__ */ import_react.default.createElement("br", null), /* @__PURE__ */ import_react.default.createElement("button", { className: "hse-button", onClick: () => void load() }, t("retry"))) : /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, !contextSupported ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-capability" }, t("capabilityUnavailable")) : null, content, /* @__PURE__ */ import_react.default.createElement("details", { className: "hse-section hse-audit" }, /* @__PURE__ */ import_react.default.createElement("summary", null, t("audit"), " / ", t("artifacts")), /* @__PURE__ */ import_react.default.createElement("pre", null, pretty({ validation: detail.validation, registry: artifacts.registry, context: artifacts.context, doctor: artifacts.doctor })))))));
855
1028
  }
856
1029
  function DashboardView({ t }) {
857
- const state = useDashboard(true);
1030
+ const [workspace, setWorkspace] = (0, import_react.useState)("");
1031
+ const [offset, setOffset] = (0, import_react.useState)(0);
1032
+ const state = useDashboard(true, workspace, offset);
858
1033
  const [selected, setSelected] = (0, import_react.useState)();
859
1034
  const snapshot = state.value;
860
1035
  const stats = [[t("jobs"), snapshot?.overview?.totalJobs ?? "\u2014"], [t("completed"), snapshot?.overview?.completedJobs ?? "\u2014"], [t("running"), snapshot?.overview?.activeJobs ?? "\u2014"], [snapshot?.overview?.latestMetric?.name ?? t("score"), format(snapshot?.overview?.latestMetric?.value)]];
861
- return /* @__PURE__ */ import_react.default.createElement("main", { className: "hse-root" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-page" }, /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-hero", style: { "--ocean-image": `url(${harbor_ocean_default})` } }, /* @__PURE__ */ import_react.default.createElement("button", { className: "hse-refresh", onClick: () => void state.load() }, t("refresh")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-eyebrow" }, /* @__PURE__ */ import_react.default.createElement("span", { className: "hse-whale", "aria-hidden": "true" }, "\u{1F433}"), t("eyebrow")), /* @__PURE__ */ import_react.default.createElement("h1", null, t("heroTitle")), /* @__PURE__ */ import_react.default.createElement("p", null, t("heroBody")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-stats" }, stats.map(([label, value]) => /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-stat", key: label }, /* @__PURE__ */ import_react.default.createElement("span", null, label), /* @__PURE__ */ import_react.default.createElement("b", null, value))))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-head" }, /* @__PURE__ */ import_react.default.createElement("h2", null, t("jobs")), /* @__PURE__ */ import_react.default.createElement("p", null, t("jobsHint"))), state.status === "loading" ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-empty" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-spin" }), t("loading")) : state.status === "error" && !snapshot ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-error" }, state.error, /* @__PURE__ */ import_react.default.createElement("br", null), /* @__PURE__ */ import_react.default.createElement("button", { className: "hse-button", onClick: () => void state.load() }, t("retry"))) : !snapshot?.jobs?.length ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-empty" }, t("empty")) : /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-list" }, snapshot.jobs.map((job) => /* @__PURE__ */ import_react.default.createElement(JobCard, { job, t, open: setSelected, key: job.name })))), selected ? /* @__PURE__ */ import_react.default.createElement(Workbench, { job: selected, jobs: snapshot.jobs, close: () => setSelected(void 0), t }) : null);
1036
+ const pagination = snapshot?.jobPagination ?? {};
1037
+ const switchWorkspace = (event) => {
1038
+ setWorkspace(event.target.value);
1039
+ setOffset(0);
1040
+ setSelected(void 0);
1041
+ };
1042
+ const openJob = (job) => {
1043
+ setWorkspace(snapshot.workspace.id);
1044
+ setSelected({ job, workspace: snapshot.workspace.id });
1045
+ };
1046
+ return /* @__PURE__ */ import_react.default.createElement("main", { className: "hse-root" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-page" }, /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-hero", style: { "--ocean-image": `url(${harbor_ocean_default})` } }, /* @__PURE__ */ import_react.default.createElement("button", { className: "hse-refresh", onClick: () => void state.load() }, t("refresh")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-eyebrow" }, /* @__PURE__ */ import_react.default.createElement("span", { className: "hse-whale", "aria-hidden": "true" }, "\u{1F433}"), t("eyebrow")), /* @__PURE__ */ import_react.default.createElement("h1", null, t("heroTitle")), /* @__PURE__ */ import_react.default.createElement("p", null, t("heroBody")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-stats" }, stats.map(([label, value]) => /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-stat", key: label }, /* @__PURE__ */ import_react.default.createElement("span", null, label), /* @__PURE__ */ import_react.default.createElement("b", null, value))))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-head" }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("h2", null, t("jobs")), /* @__PURE__ */ import_react.default.createElement("p", null, t("jobsHint"))), snapshot?.workspaces?.length ? /* @__PURE__ */ import_react.default.createElement("select", { className: "hse-select", "aria-label": t("workspaceSelect"), value: snapshot.workspace?.id ?? "", onChange: switchWorkspace }, snapshot.workspaces.map((item) => /* @__PURE__ */ import_react.default.createElement("option", { value: item.id, key: item.id }, item.label, " \xB7 ", item.root))) : null), snapshot?.workspace ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-hook-state" }, /* @__PURE__ */ import_react.default.createElement("b", null, t("workspace"), ": ", snapshot.workspace.label), /* @__PURE__ */ import_react.default.createElement("br", null), snapshot.config.projectRoot, " \xB7 ", snapshot.config.jobsDir) : null, state.status === "loading" ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-empty" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-spin" }), t("loading")) : state.status === "error" && !snapshot ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-error" }, state.error, /* @__PURE__ */ import_react.default.createElement("br", null), /* @__PURE__ */ import_react.default.createElement("button", { className: "hse-button", onClick: () => void state.load() }, t("retry"))) : !snapshot?.jobs?.length ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-empty" }, t("empty")) : /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-list" }, snapshot.jobs.map((job) => /* @__PURE__ */ import_react.default.createElement(JobCard, { job, t, open: openJob, key: job.name }))), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-pager" }, /* @__PURE__ */ import_react.default.createElement("span", null, pagination.total ? `${offset + 1}\u2013${Math.min(offset + (snapshot.jobs?.length ?? 0), pagination.total)} / ${pagination.total}` : "0 / 0"), /* @__PURE__ */ import_react.default.createElement("button", { disabled: !offset, onClick: () => setOffset(Math.max(0, offset - (pagination.limit ?? 20))) }, t("previous")), /* @__PURE__ */ import_react.default.createElement("button", { disabled: !pagination.hasMore, onClick: () => setOffset(offset + (pagination.limit ?? 20)) }, t("next"))))), selected ? /* @__PURE__ */ import_react.default.createElement(Workbench, { job: selected.job, workspace: selected.workspace, jobs: snapshot.jobs, close: () => setSelected(void 0), t }) : null);
1047
+ }
1048
+ function VersionPanel({ t }) {
1049
+ const state = useVersionCheck();
1050
+ const [copied, setCopied] = (0, import_react.useState)(false);
1051
+ const value = state.value;
1052
+ const status = state.status === "loading" ? "loading" : state.status === "error" ? "unavailable" : value?.status ?? "unavailable";
1053
+ const statusLabel = status === "loading" ? t("checkingUpdate") : status === "update-available" ? t("updateAvailable") : status === "up-to-date" ? t("upToDate") : t("updateUnavailable");
1054
+ const copy = async () => {
1055
+ if (!value?.command) return;
1056
+ try {
1057
+ await navigator.clipboard.writeText(value.command);
1058
+ setCopied(true);
1059
+ window.setTimeout(() => setCopied(false), 1500);
1060
+ } catch {
1061
+ setCopied(false);
1062
+ }
1063
+ };
1064
+ return /* @__PURE__ */ import_react.default.createElement("section", { className: "hse-version", "data-status": status, "aria-live": "polite" }, /* @__PURE__ */ import_react.default.createElement("header", { className: "hse-version-head" }, /* @__PURE__ */ import_react.default.createElement("h3", null, "\u{1F433} ", t("pluginVersion")), /* @__PURE__ */ import_react.default.createElement("span", { className: "hse-version-badge" }, statusLabel)), value ? /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-version-grid" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-version-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("currentVersion")), /* @__PURE__ */ import_react.default.createElement("b", null, value.currentVersion)), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-version-card" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("latestVersion")), /* @__PURE__ */ import_react.default.createElement("b", null, value.latestVersion ?? "\u2014"))) : null, status === "update-available" ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("p", { className: "hse-version-copy" }, t("updateHint")), /* @__PURE__ */ import_react.default.createElement("code", { className: "hse-update-command" }, value.command)) : null, status === "unavailable" ? /* @__PURE__ */ import_react.default.createElement("p", { className: "hse-version-copy" }, t("offlineUpdateHint")) : null, value?.stale ? /* @__PURE__ */ import_react.default.createElement("p", { className: "hse-version-copy" }, t("staleVersion")) : null, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-version-actions" }, value?.command ? /* @__PURE__ */ import_react.default.createElement("button", { className: "hse-primary", type: "button", onClick: () => void copy() }, copied ? t("updateCommandCopied") : t("copyUpdateCommand")) : null, value?.releaseUrl ? /* @__PURE__ */ import_react.default.createElement("a", { href: value.releaseUrl, target: "_blank", rel: "noreferrer" }, t("viewRelease")) : null, status !== "loading" ? /* @__PURE__ */ import_react.default.createElement("button", { type: "button", onClick: () => void state.load(true) }, t("checkAgain")) : null, value?.checkedAt ? /* @__PURE__ */ import_react.default.createElement("small", null, t("checkedAt"), ": ", new Date(value.checkedAt).toLocaleString()) : null));
862
1065
  }
863
1066
  function DoctorView({ t }) {
864
1067
  const state = useDashboard(false);
865
- return /* @__PURE__ */ import_react.default.createElement("main", { className: "hse-root" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-settings" }, /* @__PURE__ */ import_react.default.createElement("h2", null, t("setupDoctor")), /* @__PURE__ */ import_react.default.createElement("p", null, t("setupHint")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-checks" }, Object.entries(state.value?.checks ?? {}).map(([key, check]) => /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-check", key }, /* @__PURE__ */ import_react.default.createElement("b", { className: check.status === "ok" ? "hse-valid" : "hse-invalid" }, key, " \xB7 ", check.status), /* @__PURE__ */ import_react.default.createElement("small", null, check.detail))))));
1068
+ const [projectRoot, setProjectRoot] = (0, import_react.useState)("");
1069
+ const [mutation, setMutation] = (0, import_react.useState)({ status: "idle" });
1070
+ (0, import_react.useEffect)(() => {
1071
+ if (state.value?.config?.projectRoot) setProjectRoot(state.value.config.projectRoot);
1072
+ }, [state.value?.config?.projectRoot]);
1073
+ const switchRoot = async () => {
1074
+ setMutation({ status: "saving" });
1075
+ try {
1076
+ await mutate("project-root", { projectRoot });
1077
+ await state.load();
1078
+ setMutation({ status: "saved" });
1079
+ } catch (error) {
1080
+ setMutation({ status: "error", error: error.message });
1081
+ }
1082
+ };
1083
+ const credentialTiers = [[t("sessionCredential"), t("supported"), t("sessionCredentialHint"), true], [t("credentialStore"), t("hostServiceRequired"), t("credentialStoreHint"), false], [t("plaintextCredential"), t("forbidden"), t("plaintextCredentialHint"), false]];
1084
+ const rootSource = state.value?.config?.projectRootSource === "agent-session" ? t("projectRootAgent") : state.value?.config?.projectRootSource === "manual" ? t("projectRootManual") : t("projectRootConfigured");
1085
+ return /* @__PURE__ */ import_react.default.createElement("main", { className: "hse-root" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-settings" }, /* @__PURE__ */ import_react.default.createElement("h2", null, t("setupDoctor")), /* @__PURE__ */ import_react.default.createElement("p", null, t("setupHint")), /* @__PURE__ */ import_react.default.createElement(VersionPanel, { t }), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-root-switch" }, /* @__PURE__ */ import_react.default.createElement("label", { htmlFor: "hse-project-root" }, t("projectRoot")), /* @__PURE__ */ import_react.default.createElement("input", { id: "hse-project-root", value: projectRoot, onChange: (event) => setProjectRoot(event.target.value), spellCheck: false }), /* @__PURE__ */ import_react.default.createElement("button", { type: "button", disabled: mutation.status === "saving" || !projectRoot, onClick: () => void switchRoot() }, mutation.status === "saving" ? t("switchingProjectRoot") : t("switchProjectRoot")), /* @__PURE__ */ import_react.default.createElement("small", null, mutation.status === "error" ? mutation.error : mutation.status === "saved" ? t("projectRootUpdated") : t("projectRootHint")), /* @__PURE__ */ import_react.default.createElement("small", null, rootSource)), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-checks" }, Object.entries(state.value?.checks ?? {}).map(([key, check]) => /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-check", key }, /* @__PURE__ */ import_react.default.createElement("b", { className: check.status === "ok" ? "hse-valid" : "hse-invalid" }, key, " \xB7 ", check.status), /* @__PURE__ */ import_react.default.createElement("small", null, check.detail)))), /* @__PURE__ */ import_react.default.createElement("h3", null, t("credentialPolicy")), /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-checks" }, credentialTiers.map(([label, status, hint, active]) => /* @__PURE__ */ import_react.default.createElement("div", { className: "hse-check", key: label }, /* @__PURE__ */ import_react.default.createElement("b", { className: active ? "hse-valid" : "hse-invalid" }, label, " \xB7 ", status), /* @__PURE__ */ import_react.default.createElement("small", null, hint))))));
866
1086
  }
867
1087
  function blockText(block) {
868
1088
  return isRecord(block) && Array.isArray(block.content) ? block.content.filter((item) => item?.type === "text").map((item) => item.text).join("\n") : "";
@@ -893,7 +1113,7 @@ function apply(ctx) {
893
1113
  ctx.slots.inject("conversation.view", () => ctx.slots.register({ name: "conversation.view", id: "harbor-evolution", order: 30, locale: NS, label: () => t("tab"), inject: injected }, DashboardView));
894
1114
  ctx.slots.inject("settings.section", () => ctx.slots.register({ name: "settings.section", id: "harbor-evolution", order: 35, label: () => t("settings"), inject: injected }, DoctorView));
895
1115
  ctx.slots.inject("tool.call.toolview", function* registerTools() {
896
- for (const key of ["harbor_candidate_snapshot", "harbor_evolution_init", "harbor_evolution_doctor", "harbor_dataset_validate", "harbor_context_preview", "harbor_eval_run", "harbor_eval_result", "harbor_evaluator_inspect", "harbor_evaluator_update", "harbor_ground_truth_init", "harbor_evaluator_meta_evaluate", "harbor_candidate_compare"]) yield ctx.slots.register({ name: "tool.call.toolview", key, inject: injected }, HarborToolView);
1116
+ for (const key of ["harbor_candidate_snapshot", "harbor_model_binding", "harbor_evolution_init", "harbor_evolution_doctor", "harbor_quick_diagnostic_init", "harbor_session_diagnostic_preview", "harbor_session_diagnostic_run", "harbor_dataset_validate", "harbor_context_preview", "harbor_eval_run", "harbor_eval_result", "harbor_evaluator_inspect", "harbor_evaluator_update", "harbor_ground_truth_init", "harbor_evaluator_meta_evaluate", "harbor_candidate_compare"]) yield ctx.slots.register({ name: "tool.call.toolview", key, inject: injected }, HarborToolView);
897
1117
  });
898
1118
  }
899
1119
  module.exports = { name, inject, apply };