arc-1 0.9.18 → 0.9.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/README.md +33 -30
  2. package/dist/adt/config.d.ts +1 -1
  3. package/dist/adt/config.d.ts.map +1 -1
  4. package/dist/adt/errors.d.ts.map +1 -1
  5. package/dist/adt/errors.js +186 -25
  6. package/dist/adt/errors.js.map +1 -1
  7. package/dist/adt/http.d.ts +1 -1
  8. package/dist/adt/http.d.ts.map +1 -1
  9. package/dist/adt/http.js.map +1 -1
  10. package/dist/authz/policy.d.ts +6 -0
  11. package/dist/authz/policy.d.ts.map +1 -1
  12. package/dist/authz/policy.js +20 -0
  13. package/dist/authz/policy.js.map +1 -1
  14. package/dist/cache/cache.d.ts +25 -0
  15. package/dist/cache/cache.d.ts.map +1 -1
  16. package/dist/cache/cache.js.map +1 -1
  17. package/dist/cache/caching-layer.d.ts +31 -2
  18. package/dist/cache/caching-layer.d.ts.map +1 -1
  19. package/dist/cache/caching-layer.js +102 -2
  20. package/dist/cache/caching-layer.js.map +1 -1
  21. package/dist/cache/memory.d.ts +2 -1
  22. package/dist/cache/memory.d.ts.map +1 -1
  23. package/dist/cache/memory.js +46 -0
  24. package/dist/cache/memory.js.map +1 -1
  25. package/dist/cache/sqlite.d.ts +2 -1
  26. package/dist/cache/sqlite.d.ts.map +1 -1
  27. package/dist/cache/sqlite.js +54 -0
  28. package/dist/cache/sqlite.js.map +1 -1
  29. package/dist/cli.js +21 -3
  30. package/dist/cli.js.map +1 -1
  31. package/dist/handlers/context.d.ts.map +1 -1
  32. package/dist/handlers/context.js +27 -4
  33. package/dist/handlers/context.js.map +1 -1
  34. package/dist/handlers/dispatch.d.ts +3 -0
  35. package/dist/handlers/dispatch.d.ts.map +1 -1
  36. package/dist/handlers/dispatch.js +71 -53
  37. package/dist/handlers/dispatch.js.map +1 -1
  38. package/dist/handlers/object-types.d.ts +1 -1
  39. package/dist/handlers/object-types.d.ts.map +1 -1
  40. package/dist/handlers/object-types.js +10 -2
  41. package/dist/handlers/object-types.js.map +1 -1
  42. package/dist/handlers/read.d.ts.map +1 -1
  43. package/dist/handlers/read.js +4 -1
  44. package/dist/handlers/read.js.map +1 -1
  45. package/dist/handlers/schemas.d.ts +8 -0
  46. package/dist/handlers/schemas.d.ts.map +1 -1
  47. package/dist/handlers/schemas.js +2 -0
  48. package/dist/handlers/schemas.js.map +1 -1
  49. package/dist/handlers/tool-registry.d.ts +4 -4
  50. package/dist/handlers/tool-registry.d.ts.map +1 -1
  51. package/dist/handlers/tool-registry.js +4 -0
  52. package/dist/handlers/tool-registry.js.map +1 -1
  53. package/dist/handlers/tools.d.ts.map +1 -1
  54. package/dist/handlers/tools.js +29 -23
  55. package/dist/handlers/tools.js.map +1 -1
  56. package/dist/handlers/write/create.d.ts.map +1 -1
  57. package/dist/handlers/write/create.js +89 -4
  58. package/dist/handlers/write/create.js.map +1 -1
  59. package/dist/plugins/manifest-interpreter.d.ts +25 -0
  60. package/dist/plugins/manifest-interpreter.d.ts.map +1 -0
  61. package/dist/plugins/manifest-interpreter.js +126 -0
  62. package/dist/plugins/manifest-interpreter.js.map +1 -0
  63. package/dist/public/define-tool.d.ts +9 -0
  64. package/dist/public/define-tool.d.ts.map +1 -0
  65. package/dist/public/define-tool.js +25 -0
  66. package/dist/public/define-tool.js.map +1 -0
  67. package/dist/public/index.d.ts +9 -0
  68. package/dist/public/index.d.ts.map +1 -0
  69. package/dist/public/index.js +10 -0
  70. package/dist/public/index.js.map +1 -0
  71. package/dist/public/testing.d.ts +27 -0
  72. package/dist/public/testing.d.ts.map +1 -0
  73. package/dist/public/testing.js +52 -0
  74. package/dist/public/testing.js.map +1 -0
  75. package/dist/public/types.d.ts +87 -0
  76. package/dist/public/types.d.ts.map +1 -0
  77. package/dist/public/types.js +4 -0
  78. package/dist/public/types.js.map +1 -0
  79. package/dist/public/ui/app.js +1044 -0
  80. package/dist/public/ui/arc-mark.svg +5 -0
  81. package/dist/public/ui/index.html +43 -0
  82. package/dist/public/ui/styles.css +563 -0
  83. package/dist/registry/tool-registry.d.ts +74 -0
  84. package/dist/registry/tool-registry.d.ts.map +1 -0
  85. package/dist/registry/tool-registry.js +59 -0
  86. package/dist/registry/tool-registry.js.map +1 -0
  87. package/dist/server/app-url.d.ts +31 -0
  88. package/dist/server/app-url.d.ts.map +1 -0
  89. package/dist/server/app-url.js +50 -0
  90. package/dist/server/app-url.js.map +1 -0
  91. package/dist/server/audit.d.ts +4 -0
  92. package/dist/server/audit.d.ts.map +1 -1
  93. package/dist/server/audit.js.map +1 -1
  94. package/dist/server/config.d.ts.map +1 -1
  95. package/dist/server/config.js +92 -0
  96. package/dist/server/config.js.map +1 -1
  97. package/dist/server/http.d.ts +17 -47
  98. package/dist/server/http.d.ts.map +1 -1
  99. package/dist/server/http.js +127 -376
  100. package/dist/server/http.js.map +1 -1
  101. package/dist/server/logger.d.ts +22 -0
  102. package/dist/server/logger.d.ts.map +1 -1
  103. package/dist/server/logger.js +22 -0
  104. package/dist/server/logger.js.map +1 -1
  105. package/dist/server/plugin-loader.d.ts +19 -0
  106. package/dist/server/plugin-loader.d.ts.map +1 -0
  107. package/dist/server/plugin-loader.js +162 -0
  108. package/dist/server/plugin-loader.js.map +1 -0
  109. package/dist/server/safe-http-client.d.ts +44 -0
  110. package/dist/server/safe-http-client.d.ts.map +1 -0
  111. package/dist/server/safe-http-client.js +198 -0
  112. package/dist/server/safe-http-client.js.map +1 -0
  113. package/dist/server/server.d.ts +2 -2
  114. package/dist/server/server.d.ts.map +1 -1
  115. package/dist/server/server.js +63 -9
  116. package/dist/server/server.js.map +1 -1
  117. package/dist/server/types.d.ts +24 -0
  118. package/dist/server/types.d.ts.map +1 -1
  119. package/dist/server/types.js +6 -0
  120. package/dist/server/types.js.map +1 -1
  121. package/dist/server/ui-log-buffer.d.ts +29 -0
  122. package/dist/server/ui-log-buffer.d.ts.map +1 -0
  123. package/dist/server/ui-log-buffer.js +72 -0
  124. package/dist/server/ui-log-buffer.js.map +1 -0
  125. package/dist/server/ui-state.d.ts +32 -0
  126. package/dist/server/ui-state.d.ts.map +1 -0
  127. package/dist/server/ui-state.js +230 -0
  128. package/dist/server/ui-state.js.map +1 -0
  129. package/dist/server/ui.d.ts +20 -0
  130. package/dist/server/ui.d.ts.map +1 -0
  131. package/dist/server/ui.js +275 -0
  132. package/dist/server/ui.js.map +1 -0
  133. package/package.json +34 -14
  134. package/dist/adt/btp.d.ts +0 -140
  135. package/dist/adt/btp.d.ts.map +0 -1
  136. package/dist/adt/btp.js +0 -427
  137. package/dist/adt/btp.js.map +0 -1
  138. package/dist/server/oauth-state.d.ts +0 -92
  139. package/dist/server/oauth-state.d.ts.map +0 -1
  140. package/dist/server/oauth-state.js +0 -163
  141. package/dist/server/oauth-state.js.map +0 -1
  142. package/dist/server/stateless-client-store.d.ts +0 -173
  143. package/dist/server/stateless-client-store.d.ts.map +0 -1
  144. package/dist/server/stateless-client-store.js +0 -503
  145. package/dist/server/stateless-client-store.js.map +0 -1
  146. package/dist/server/xsuaa.d.ts +0 -188
  147. package/dist/server/xsuaa.d.ts.map +0 -1
  148. package/dist/server/xsuaa.js +0 -464
  149. package/dist/server/xsuaa.js.map +0 -1
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="ARC-1">
2
+ <rect width="64" height="64" rx="12" fill="#111827"/>
3
+ <path d="M16 44 28 18h8l12 26h-8l-2.4-5.8H26.3L24 44h-8Zm13-12.3h6l-3-7.5-3 7.5Z" fill="#f8fafc"/>
4
+ <path d="M47 18h5v26h-5V18Z" fill="#38bdf8"/>
5
+ </svg>
@@ -0,0 +1,43 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>ARC-1 Console</title>
7
+ <link rel="icon" href="./arc-mark.svg" type="image/svg+xml" />
8
+ <link rel="stylesheet" href="./styles.css" />
9
+ </head>
10
+ <body>
11
+ <header class="topbar">
12
+ <div class="brand">
13
+ <img src="./arc-mark.svg" alt="" width="32" height="32" />
14
+ <div>
15
+ <h1>ARC-1 Console</h1>
16
+ <p id="subtitle">Read-only runtime view</p>
17
+ </div>
18
+ </div>
19
+ <div class="auth">
20
+ <input id="token" type="password" autocomplete="off" spellcheck="false" placeholder="Admin bearer token" />
21
+ <button id="save-token" type="button">Set</button>
22
+ <button id="clear-token" type="button" class="ghost">Clear</button>
23
+ </div>
24
+ </header>
25
+
26
+ <main>
27
+ <nav class="tabs" aria-label="Console views">
28
+ <button type="button" data-tab="overview" class="active">Overview</button>
29
+ <button type="button" data-tab="config">Config</button>
30
+ <button type="button" data-tab="safety">Safety</button>
31
+ <button type="button" data-tab="features">Features</button>
32
+ <button type="button" data-tab="cache">Cache</button>
33
+ <button type="button" data-tab="logs">Logs</button>
34
+ <button type="button" data-tab="docs">Docs</button>
35
+ </nav>
36
+
37
+ <section id="status" class="status" hidden></section>
38
+ <section id="content" class="content" aria-live="polite"></section>
39
+ </main>
40
+
41
+ <script src="./app.js" type="module"></script>
42
+ </body>
43
+ </html>
@@ -0,0 +1,563 @@
1
+ :root {
2
+ color-scheme: light;
3
+ --bg: #f6f7f9;
4
+ --surface: #ffffff;
5
+ --surface-2: #eef2f6;
6
+ --text: #1f2937;
7
+ --muted: #64748b;
8
+ --line: #d8dee6;
9
+ --accent: #0f766e;
10
+ --accent-2: #2563eb;
11
+ --accent-3: #7c3aed;
12
+ --info: #0369a1;
13
+ --danger: #b91c1c;
14
+ --warn: #b45309;
15
+ --ok: #047857;
16
+ --mono: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
17
+ --sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
18
+ }
19
+
20
+ * {
21
+ box-sizing: border-box;
22
+ }
23
+
24
+ body {
25
+ margin: 0;
26
+ background: var(--bg);
27
+ color: var(--text);
28
+ font-family: var(--sans);
29
+ font-size: 14px;
30
+ }
31
+
32
+ .topbar {
33
+ min-height: 64px;
34
+ display: flex;
35
+ align-items: center;
36
+ justify-content: space-between;
37
+ gap: 16px;
38
+ padding: 12px 20px;
39
+ background: var(--surface);
40
+ border-bottom: 1px solid var(--line);
41
+ }
42
+
43
+ .brand {
44
+ display: flex;
45
+ align-items: center;
46
+ gap: 12px;
47
+ min-width: 220px;
48
+ }
49
+
50
+ .brand img {
51
+ flex: 0 0 auto;
52
+ }
53
+
54
+ h1 {
55
+ margin: 0;
56
+ font-size: 18px;
57
+ line-height: 1.2;
58
+ font-weight: 700;
59
+ }
60
+
61
+ h2 {
62
+ margin: 0 0 12px;
63
+ font-size: 16px;
64
+ line-height: 1.3;
65
+ }
66
+
67
+ h3 {
68
+ margin: 16px 0 8px;
69
+ font-size: 14px;
70
+ }
71
+
72
+ p {
73
+ margin: 0;
74
+ color: var(--muted);
75
+ }
76
+
77
+ main {
78
+ width: min(1380px, 100%);
79
+ margin: 0 auto;
80
+ padding: 16px 20px 28px;
81
+ }
82
+
83
+ .auth {
84
+ display: grid;
85
+ grid-template-columns: minmax(180px, 320px) 54px 64px;
86
+ gap: 8px;
87
+ align-items: center;
88
+ }
89
+
90
+ button,
91
+ input,
92
+ select {
93
+ min-height: 34px;
94
+ border: 1px solid var(--line);
95
+ background: var(--surface);
96
+ color: var(--text);
97
+ border-radius: 6px;
98
+ font: inherit;
99
+ }
100
+
101
+ button {
102
+ padding: 0 12px;
103
+ cursor: pointer;
104
+ background: #12312f;
105
+ color: #ffffff;
106
+ border-color: #12312f;
107
+ font-weight: 600;
108
+ }
109
+
110
+ button.ghost,
111
+ .tabs button {
112
+ color: var(--text);
113
+ background: var(--surface);
114
+ border-color: var(--line);
115
+ }
116
+
117
+ button:hover,
118
+ button:focus-visible {
119
+ outline: 2px solid color-mix(in srgb, var(--accent-2) 35%, transparent);
120
+ outline-offset: 1px;
121
+ }
122
+
123
+ input,
124
+ select {
125
+ padding: 0 10px;
126
+ }
127
+
128
+ .tabs {
129
+ display: flex;
130
+ gap: 6px;
131
+ flex-wrap: wrap;
132
+ margin-bottom: 12px;
133
+ }
134
+
135
+ .tabs button {
136
+ min-width: 92px;
137
+ }
138
+
139
+ .tabs button.active {
140
+ color: #ffffff;
141
+ background: var(--accent);
142
+ border-color: var(--accent);
143
+ }
144
+
145
+ .status {
146
+ margin-bottom: 12px;
147
+ padding: 10px 12px;
148
+ border: 1px solid var(--line);
149
+ border-left: 4px solid var(--warn);
150
+ background: #fff7ed;
151
+ border-radius: 6px;
152
+ }
153
+
154
+ .content {
155
+ display: grid;
156
+ gap: 14px;
157
+ min-width: 0;
158
+ }
159
+
160
+ .panel {
161
+ min-width: 0;
162
+ overflow: hidden;
163
+ background: var(--surface);
164
+ border: 1px solid var(--line);
165
+ border-radius: 8px;
166
+ padding: 14px;
167
+ }
168
+
169
+ .grid {
170
+ display: grid;
171
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
172
+ gap: 10px;
173
+ min-width: 0;
174
+ }
175
+
176
+ .metric {
177
+ min-height: 78px;
178
+ display: grid;
179
+ align-content: center;
180
+ gap: 4px;
181
+ background: var(--surface-2);
182
+ border: 1px solid var(--line);
183
+ border-left-width: 4px;
184
+ border-radius: 6px;
185
+ min-width: 0;
186
+ padding: 10px 12px;
187
+ }
188
+
189
+ .metric.ok {
190
+ border-color: #a7f3d0;
191
+ border-left-color: var(--ok);
192
+ background: #ecfdf5;
193
+ }
194
+
195
+ .metric.info {
196
+ border-color: #bae6fd;
197
+ border-left-color: var(--info);
198
+ background: #f0f9ff;
199
+ }
200
+
201
+ .metric.accent {
202
+ border-color: #c4b5fd;
203
+ border-left-color: var(--accent-3);
204
+ background: #f5f3ff;
205
+ }
206
+
207
+ .metric.warn {
208
+ border-color: #fed7aa;
209
+ border-left-color: var(--warn);
210
+ background: #fff7ed;
211
+ }
212
+
213
+ .metric.error {
214
+ border-color: #fecaca;
215
+ border-left-color: var(--danger);
216
+ background: #fef2f2;
217
+ }
218
+
219
+ .metric strong {
220
+ font-size: 20px;
221
+ line-height: 1.2;
222
+ overflow-wrap: anywhere;
223
+ }
224
+
225
+ .metric span {
226
+ min-width: 0;
227
+ overflow-wrap: anywhere;
228
+ color: var(--muted);
229
+ }
230
+
231
+ .chart-grid {
232
+ display: grid;
233
+ grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
234
+ gap: 12px;
235
+ min-width: 0;
236
+ margin-top: 12px;
237
+ }
238
+
239
+ .chart {
240
+ min-width: 0;
241
+ padding: 10px;
242
+ border: 1px solid var(--line);
243
+ border-radius: 6px;
244
+ background: #fbfcfe;
245
+ }
246
+
247
+ .chart h3 {
248
+ margin-top: 0;
249
+ }
250
+
251
+ .bar-row {
252
+ display: grid;
253
+ grid-template-columns: minmax(94px, 34%) minmax(80px, 1fr) 42px;
254
+ gap: 8px;
255
+ align-items: center;
256
+ min-height: 26px;
257
+ }
258
+
259
+ .bar-label,
260
+ .bar-value {
261
+ min-width: 0;
262
+ overflow: hidden;
263
+ color: var(--muted);
264
+ font-size: 12px;
265
+ text-overflow: ellipsis;
266
+ white-space: nowrap;
267
+ }
268
+
269
+ .bar-value {
270
+ color: var(--text);
271
+ font-variant-numeric: tabular-nums;
272
+ text-align: right;
273
+ }
274
+
275
+ .bar-track {
276
+ height: 10px;
277
+ overflow: hidden;
278
+ border-radius: 999px;
279
+ background: var(--surface-2);
280
+ }
281
+
282
+ .bar-fill {
283
+ height: 100%;
284
+ min-width: 4px;
285
+ border-radius: inherit;
286
+ background: var(--info);
287
+ }
288
+
289
+ .bar-fill.ok {
290
+ background: var(--ok);
291
+ }
292
+
293
+ .bar-fill.info {
294
+ background: var(--accent-2);
295
+ }
296
+
297
+ .bar-fill.accent {
298
+ background: var(--accent-3);
299
+ }
300
+
301
+ .bar-fill.warn {
302
+ background: var(--warn);
303
+ }
304
+
305
+ .bar-fill.error {
306
+ background: var(--danger);
307
+ }
308
+
309
+ .status-grid {
310
+ display: grid;
311
+ grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
312
+ gap: 8px;
313
+ margin-bottom: 12px;
314
+ }
315
+
316
+ .status-item {
317
+ display: flex;
318
+ min-width: 0;
319
+ align-items: center;
320
+ justify-content: space-between;
321
+ gap: 8px;
322
+ padding: 9px 10px;
323
+ border: 1px solid var(--line);
324
+ border-left-width: 4px;
325
+ border-radius: 6px;
326
+ background: #fbfcfe;
327
+ }
328
+
329
+ .status-item.ok {
330
+ border-color: #bbf7d0;
331
+ border-left-color: var(--ok);
332
+ background: #f0fdf4;
333
+ }
334
+
335
+ .status-item.info {
336
+ border-color: #bae6fd;
337
+ border-left-color: var(--info);
338
+ background: #f0f9ff;
339
+ }
340
+
341
+ .status-item.warn {
342
+ border-color: #fed7aa;
343
+ border-left-color: var(--warn);
344
+ background: #fff7ed;
345
+ }
346
+
347
+ .status-item.error {
348
+ border-color: #fecaca;
349
+ border-left-color: var(--danger);
350
+ background: #fef2f2;
351
+ }
352
+
353
+ .status-item > span:first-child {
354
+ min-width: 0;
355
+ overflow: hidden;
356
+ color: var(--muted);
357
+ text-overflow: ellipsis;
358
+ white-space: nowrap;
359
+ }
360
+
361
+ .filters {
362
+ display: grid;
363
+ grid-template-columns: repeat(5, minmax(120px, 1fr));
364
+ gap: 8px;
365
+ align-items: end;
366
+ min-width: 0;
367
+ }
368
+
369
+ label {
370
+ display: grid;
371
+ gap: 4px;
372
+ color: var(--muted);
373
+ font-size: 12px;
374
+ }
375
+
376
+ .table-wrap {
377
+ max-width: 100%;
378
+ min-width: 0;
379
+ overflow-x: auto;
380
+ border: 1px solid var(--line);
381
+ border-radius: 6px;
382
+ }
383
+
384
+ table {
385
+ width: 100%;
386
+ border-collapse: collapse;
387
+ min-width: 720px;
388
+ }
389
+
390
+ th,
391
+ td {
392
+ padding: 8px 10px;
393
+ border-bottom: 1px solid var(--line);
394
+ overflow-wrap: anywhere;
395
+ text-align: left;
396
+ vertical-align: top;
397
+ }
398
+
399
+ th {
400
+ background: var(--surface-2);
401
+ color: #334155;
402
+ font-weight: 700;
403
+ }
404
+
405
+ tr:last-child td {
406
+ border-bottom: 0;
407
+ }
408
+
409
+ code,
410
+ .mono {
411
+ font-family: var(--mono);
412
+ font-size: 12px;
413
+ }
414
+
415
+ .pill {
416
+ display: inline-flex;
417
+ align-items: center;
418
+ min-height: 22px;
419
+ padding: 0 8px;
420
+ border-radius: 999px;
421
+ background: var(--surface-2);
422
+ border: 1px solid var(--line);
423
+ font-size: 12px;
424
+ }
425
+
426
+ .pill.ok {
427
+ color: var(--ok);
428
+ background: #ecfdf5;
429
+ border-color: #bbf7d0;
430
+ }
431
+
432
+ .pill.warn {
433
+ color: var(--warn);
434
+ background: #fff7ed;
435
+ border-color: #fed7aa;
436
+ }
437
+
438
+ .pill.info {
439
+ color: var(--info);
440
+ background: #f0f9ff;
441
+ border-color: #bae6fd;
442
+ }
443
+
444
+ .pill.accent {
445
+ color: var(--accent-3);
446
+ background: #f5f3ff;
447
+ border-color: #ddd6fe;
448
+ }
449
+
450
+ .pill.error {
451
+ color: var(--danger);
452
+ background: #fef2f2;
453
+ border-color: #fecaca;
454
+ }
455
+
456
+ .detail-chips {
457
+ display: flex;
458
+ flex-wrap: wrap;
459
+ gap: 6px;
460
+ max-width: 100%;
461
+ min-width: 0;
462
+ }
463
+
464
+ .detail-chip {
465
+ display: inline-flex;
466
+ flex: 0 1 auto;
467
+ min-width: 0;
468
+ max-width: 100%;
469
+ align-items: center;
470
+ gap: 5px;
471
+ padding: 3px 7px;
472
+ border: 1px solid var(--line);
473
+ border-radius: 999px;
474
+ background: #f8fafc;
475
+ color: var(--text);
476
+ font-size: 12px;
477
+ }
478
+
479
+ .detail-chip span {
480
+ flex: 0 0 auto;
481
+ color: var(--muted);
482
+ }
483
+
484
+ .detail-chip strong {
485
+ flex: 1 1 auto;
486
+ min-width: 0;
487
+ overflow-wrap: anywhere;
488
+ font-weight: 600;
489
+ white-space: normal;
490
+ }
491
+
492
+ .detail-chip.ok {
493
+ border-color: #bbf7d0;
494
+ background: #ecfdf5;
495
+ }
496
+
497
+ .detail-chip.info {
498
+ border-color: #bae6fd;
499
+ background: #f0f9ff;
500
+ }
501
+
502
+ .detail-chip.warn {
503
+ border-color: #fed7aa;
504
+ background: #fff7ed;
505
+ }
506
+
507
+ .detail-chip.error {
508
+ border-color: #fecaca;
509
+ background: #fef2f2;
510
+ }
511
+
512
+ .kv {
513
+ display: grid;
514
+ grid-template-columns: minmax(140px, 260px) minmax(0, 1fr);
515
+ border-top: 1px solid var(--line);
516
+ }
517
+
518
+ .kv div {
519
+ padding: 7px 8px;
520
+ border-bottom: 1px solid var(--line);
521
+ }
522
+
523
+ .kv div:nth-child(odd) {
524
+ color: var(--muted);
525
+ background: #fafafa;
526
+ }
527
+
528
+ pre {
529
+ margin: 0;
530
+ white-space: pre-wrap;
531
+ word-break: break-word;
532
+ font: 12px/1.45 var(--mono);
533
+ }
534
+
535
+ a {
536
+ color: var(--accent-2);
537
+ text-decoration: none;
538
+ }
539
+
540
+ a:hover {
541
+ text-decoration: underline;
542
+ }
543
+
544
+ @media (max-width: 760px) {
545
+ .topbar {
546
+ align-items: stretch;
547
+ flex-direction: column;
548
+ }
549
+
550
+ .auth,
551
+ .filters {
552
+ grid-template-columns: 1fr;
553
+ }
554
+
555
+ main {
556
+ padding: 12px;
557
+ }
558
+
559
+ .tabs button {
560
+ min-width: 0;
561
+ flex: 1 1 96px;
562
+ }
563
+ }
@@ -0,0 +1,74 @@
1
+ import type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';
2
+ import type { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import type { AdtClient } from '../adt/client.js';
4
+ import type { OperationTypeCode } from '../adt/safety.js';
5
+ import { type Scope } from '../authz/policy.js';
6
+ import type { CachingLayer } from '../cache/caching-layer.js';
7
+ import type { CacheSecurityContext } from '../handlers/cache-security.js';
8
+ import type { ServerConfig } from '../server/types.js';
9
+ /**
10
+ * The MCP tool result shape. Defined locally to keep the registry free of any runtime
11
+ * dependency on the handler module (which imports the registry). It is structurally identical
12
+ * to `ToolResult` in src/handlers/shared.ts; both unify on the public `arc-1/public` type in PR2.
13
+ */
14
+ export interface ToolResult {
15
+ content: Array<{
16
+ type: 'text';
17
+ text: string;
18
+ }>;
19
+ isError?: boolean;
20
+ }
21
+ /**
22
+ * Per-request context handed to a tool's `invoke`. Built fresh in `handleToolCall` for each
23
+ * call (carrying the per-user `effectiveClient` from `withSafety()`), NEVER bound at registration.
24
+ * PR2 narrows the plugin-facing surface (ReadOnlyAdtClient + a gated SafeHttpClient); built-in
25
+ * adapters use this internal bundle directly.
26
+ */
27
+ export interface ToolDispatchContext {
28
+ readonly client: AdtClient;
29
+ readonly config: ServerConfig;
30
+ readonly args: Record<string, unknown>;
31
+ readonly cache?: CachingLayer;
32
+ readonly authInfo?: AuthInfo;
33
+ readonly isPerUserClient?: boolean;
34
+ readonly cacheSecurity: CacheSecurityContext;
35
+ readonly server?: Server;
36
+ readonly requestId: string;
37
+ }
38
+ /** A registered tool — a built-in or a plugin-contributed `Custom_*` tool. */
39
+ export interface RegistryEntry {
40
+ readonly name: string;
41
+ readonly source: 'builtin' | 'plugin';
42
+ /** Identifies the contributing plugin (plugin tools only) — used for audit + diagnostics. */
43
+ readonly pluginName?: string;
44
+ /** Authorization metadata — the SAME shape ACTION_POLICY uses; gated identically to a built-in. */
45
+ readonly policy: {
46
+ scope: Scope;
47
+ opType: OperationTypeCode;
48
+ featureGate?: string;
49
+ };
50
+ /** Plugin tools only: system-type visibility hint, enforced in `tools/list` (default `all`). */
51
+ readonly availableOn?: 'all' | 'onprem' | 'btp';
52
+ /** For plugin tools: the pre-computed MCP `tools/list` shape (built-ins list via getToolDefinitions). */
53
+ readonly listing?: {
54
+ description: string;
55
+ inputSchema: Record<string, unknown>;
56
+ };
57
+ invoke(ctx: ToolDispatchContext): Promise<ToolResult>;
58
+ }
59
+ /**
60
+ * In-memory registry of tools. One instance per server. Built-ins are registered first (at
61
+ * startup); plugins are registered after (by the loader). Registration is fail-fast: a malformed
62
+ * entry or a name collision throws, so a bad plugin refuses server start rather than shadowing a
63
+ * built-in or silently dropping a tool.
64
+ */
65
+ export declare class ToolRegistry {
66
+ private readonly entries;
67
+ register(entry: RegistryEntry): void;
68
+ get(name: string): RegistryEntry | undefined;
69
+ has(name: string): boolean;
70
+ /** Built-ins first (registration order), then plugins (registration order). Deterministic for `tools/list`. */
71
+ list(): RegistryEntry[];
72
+ size(): number;
73
+ }
74
+ //# sourceMappingURL=tool-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../../src/registry/tool-registry.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAC;AAC/E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAkC,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAC7C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,8EAA8E;AAC9E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IACtC,6FAA6F;IAC7F,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,mGAAmG;IACnG,QAAQ,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,iBAAiB,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnF,gGAAgG;IAChG,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,CAAC;IAChD,yGAAyG;IACzG,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IACjF,MAAM,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACvD;AAID;;;;;GAKG;AACH,qBAAa,YAAY;IAEvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAE5D,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IA+BpC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI5C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,+GAA+G;IAC/G,IAAI,IAAI,aAAa,EAAE;IAKvB,IAAI,IAAI,MAAM;CAGf"}