@portel/photon 1.22.0 → 1.23.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.
Files changed (211) hide show
  1. package/README.md +19 -8
  2. package/dist/a2ui/mapper.d.ts +40 -0
  3. package/dist/a2ui/mapper.d.ts.map +1 -0
  4. package/dist/a2ui/mapper.js +286 -0
  5. package/dist/a2ui/mapper.js.map +1 -0
  6. package/dist/a2ui/types.d.ts +129 -0
  7. package/dist/a2ui/types.d.ts.map +1 -0
  8. package/dist/a2ui/types.js +20 -0
  9. package/dist/a2ui/types.js.map +1 -0
  10. package/dist/ag-ui/adapter.d.ts +9 -1
  11. package/dist/ag-ui/adapter.d.ts.map +1 -1
  12. package/dist/ag-ui/adapter.js +33 -16
  13. package/dist/ag-ui/adapter.js.map +1 -1
  14. package/dist/auto-ui/beam/routes/api-daemon.d.ts +18 -0
  15. package/dist/auto-ui/beam/routes/api-daemon.d.ts.map +1 -0
  16. package/dist/auto-ui/beam/routes/api-daemon.js +118 -0
  17. package/dist/auto-ui/beam/routes/api-daemon.js.map +1 -0
  18. package/dist/auto-ui/beam.d.ts.map +1 -1
  19. package/dist/auto-ui/beam.js +34 -34
  20. package/dist/auto-ui/beam.js.map +1 -1
  21. package/dist/auto-ui/bridge/renderers.d.ts.map +1 -1
  22. package/dist/auto-ui/bridge/renderers.js +371 -0
  23. package/dist/auto-ui/bridge/renderers.js.map +1 -1
  24. package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
  25. package/dist/auto-ui/streamable-http-transport.js +38 -1
  26. package/dist/auto-ui/streamable-http-transport.js.map +1 -1
  27. package/dist/auto-ui/types.d.ts +19 -0
  28. package/dist/auto-ui/types.d.ts.map +1 -1
  29. package/dist/auto-ui/types.js.map +1 -1
  30. package/dist/beam.bundle.js +757 -107
  31. package/dist/beam.bundle.js.map +4 -4
  32. package/dist/cli/commands/beam.d.ts.map +1 -1
  33. package/dist/cli/commands/beam.js +2 -0
  34. package/dist/cli/commands/beam.js.map +1 -1
  35. package/dist/cli/commands/build.d.ts.map +1 -1
  36. package/dist/cli/commands/build.js +2 -0
  37. package/dist/cli/commands/build.js.map +1 -1
  38. package/dist/cli/commands/doctor.d.ts.map +1 -1
  39. package/dist/cli/commands/doctor.js +92 -3
  40. package/dist/cli/commands/doctor.js.map +1 -1
  41. package/dist/cli/commands/host.d.ts.map +1 -1
  42. package/dist/cli/commands/host.js +9 -1
  43. package/dist/cli/commands/host.js.map +1 -1
  44. package/dist/cli/commands/info.d.ts.map +1 -1
  45. package/dist/cli/commands/info.js +7 -3
  46. package/dist/cli/commands/info.js.map +1 -1
  47. package/dist/cli/commands/init.d.ts.map +1 -1
  48. package/dist/cli/commands/init.js +4 -0
  49. package/dist/cli/commands/init.js.map +1 -1
  50. package/dist/cli/commands/maker.d.ts +8 -0
  51. package/dist/cli/commands/maker.d.ts.map +1 -1
  52. package/dist/cli/commands/maker.js +113 -46
  53. package/dist/cli/commands/maker.js.map +1 -1
  54. package/dist/cli/commands/marketplace.d.ts.map +1 -1
  55. package/dist/cli/commands/marketplace.js +7 -1
  56. package/dist/cli/commands/marketplace.js.map +1 -1
  57. package/dist/cli/commands/mcp.d.ts +10 -0
  58. package/dist/cli/commands/mcp.d.ts.map +1 -1
  59. package/dist/cli/commands/mcp.js +215 -4
  60. package/dist/cli/commands/mcp.js.map +1 -1
  61. package/dist/cli/commands/package.d.ts.map +1 -1
  62. package/dist/cli/commands/package.js +33 -15
  63. package/dist/cli/commands/package.js.map +1 -1
  64. package/dist/cli/commands/ps.d.ts +16 -0
  65. package/dist/cli/commands/ps.d.ts.map +1 -0
  66. package/dist/cli/commands/ps.js +267 -0
  67. package/dist/cli/commands/ps.js.map +1 -0
  68. package/dist/cli/commands/run.d.ts.map +1 -1
  69. package/dist/cli/commands/run.js +7 -0
  70. package/dist/cli/commands/run.js.map +1 -1
  71. package/dist/cli/commands/update.d.ts.map +1 -1
  72. package/dist/cli/commands/update.js +14 -4
  73. package/dist/cli/commands/update.js.map +1 -1
  74. package/dist/cli/index.d.ts.map +1 -1
  75. package/dist/cli/index.js +9 -4
  76. package/dist/cli/index.js.map +1 -1
  77. package/dist/context-store.d.ts +4 -4
  78. package/dist/context-store.d.ts.map +1 -1
  79. package/dist/context-store.js +20 -17
  80. package/dist/context-store.js.map +1 -1
  81. package/dist/context.d.ts +5 -4
  82. package/dist/context.d.ts.map +1 -1
  83. package/dist/context.js +68 -14
  84. package/dist/context.js.map +1 -1
  85. package/dist/daemon/client.d.ts +60 -0
  86. package/dist/daemon/client.d.ts.map +1 -1
  87. package/dist/daemon/client.js +76 -0
  88. package/dist/daemon/client.js.map +1 -1
  89. package/dist/daemon/execution-history-sqlite.d.ts +50 -0
  90. package/dist/daemon/execution-history-sqlite.d.ts.map +1 -0
  91. package/dist/daemon/execution-history-sqlite.js +165 -0
  92. package/dist/daemon/execution-history-sqlite.js.map +1 -0
  93. package/dist/daemon/execution-history.d.ts +78 -0
  94. package/dist/daemon/execution-history.d.ts.map +1 -0
  95. package/dist/daemon/execution-history.js +246 -0
  96. package/dist/daemon/execution-history.js.map +1 -0
  97. package/dist/daemon/hot-reload-state.d.ts +27 -0
  98. package/dist/daemon/hot-reload-state.d.ts.map +1 -0
  99. package/dist/daemon/hot-reload-state.js +48 -0
  100. package/dist/daemon/hot-reload-state.js.map +1 -0
  101. package/dist/daemon/protocol.d.ts +5 -1
  102. package/dist/daemon/protocol.d.ts.map +1 -1
  103. package/dist/daemon/protocol.js +13 -0
  104. package/dist/daemon/protocol.js.map +1 -1
  105. package/dist/daemon/registry-keys.d.ts +88 -0
  106. package/dist/daemon/registry-keys.d.ts.map +1 -0
  107. package/dist/daemon/registry-keys.js +91 -0
  108. package/dist/daemon/registry-keys.js.map +1 -0
  109. package/dist/daemon/server.js +1521 -186
  110. package/dist/daemon/server.js.map +1 -1
  111. package/dist/daemon/session-resolver.d.ts +28 -0
  112. package/dist/daemon/session-resolver.d.ts.map +1 -0
  113. package/dist/daemon/session-resolver.js +41 -0
  114. package/dist/daemon/session-resolver.js.map +1 -0
  115. package/dist/data-migration.js +20 -9
  116. package/dist/data-migration.js.map +1 -1
  117. package/dist/loader.d.ts +22 -8
  118. package/dist/loader.d.ts.map +1 -1
  119. package/dist/loader.js +214 -94
  120. package/dist/loader.js.map +1 -1
  121. package/dist/marketplace-manager.d.ts.map +1 -1
  122. package/dist/marketplace-manager.js +9 -5
  123. package/dist/marketplace-manager.js.map +1 -1
  124. package/dist/namespace-migration.d.ts.map +1 -1
  125. package/dist/namespace-migration.js +28 -23
  126. package/dist/namespace-migration.js.map +1 -1
  127. package/dist/photon-cli-runner.d.ts.map +1 -1
  128. package/dist/photon-cli-runner.js +57 -8
  129. package/dist/photon-cli-runner.js.map +1 -1
  130. package/dist/serv/auth/auth-store.d.ts +155 -0
  131. package/dist/serv/auth/auth-store.d.ts.map +1 -0
  132. package/dist/serv/auth/auth-store.js +240 -0
  133. package/dist/serv/auth/auth-store.js.map +1 -0
  134. package/dist/serv/auth/endpoints.d.ts +113 -0
  135. package/dist/serv/auth/endpoints.d.ts.map +1 -0
  136. package/dist/serv/auth/endpoints.js +1005 -0
  137. package/dist/serv/auth/endpoints.js.map +1 -0
  138. package/dist/serv/auth/http-adapter.d.ts +60 -0
  139. package/dist/serv/auth/http-adapter.d.ts.map +1 -0
  140. package/dist/serv/auth/http-adapter.js +235 -0
  141. package/dist/serv/auth/http-adapter.js.map +1 -0
  142. package/dist/serv/auth/jwt.d.ts +92 -6
  143. package/dist/serv/auth/jwt.d.ts.map +1 -1
  144. package/dist/serv/auth/jwt.js +226 -24
  145. package/dist/serv/auth/jwt.js.map +1 -1
  146. package/dist/serv/auth/oauth-sqlite-stores.d.ts +48 -0
  147. package/dist/serv/auth/oauth-sqlite-stores.d.ts.map +1 -0
  148. package/dist/serv/auth/oauth-sqlite-stores.js +212 -0
  149. package/dist/serv/auth/oauth-sqlite-stores.js.map +1 -0
  150. package/dist/serv/auth/sqlite-stores.d.ts +85 -0
  151. package/dist/serv/auth/sqlite-stores.d.ts.map +1 -0
  152. package/dist/serv/auth/sqlite-stores.js +446 -0
  153. package/dist/serv/auth/sqlite-stores.js.map +1 -0
  154. package/dist/serv/auth/well-known.d.ts +54 -1
  155. package/dist/serv/auth/well-known.d.ts.map +1 -1
  156. package/dist/serv/auth/well-known.js +166 -17
  157. package/dist/serv/auth/well-known.js.map +1 -1
  158. package/dist/serv/index.d.ts +45 -2
  159. package/dist/serv/index.d.ts.map +1 -1
  160. package/dist/serv/index.js +65 -1
  161. package/dist/serv/index.js.map +1 -1
  162. package/dist/serv/types/index.d.ts +80 -0
  163. package/dist/serv/types/index.d.ts.map +1 -1
  164. package/dist/serv/types/index.js.map +1 -1
  165. package/dist/server.d.ts.map +1 -1
  166. package/dist/server.js +61 -6
  167. package/dist/server.js.map +1 -1
  168. package/dist/shared/announce-context.d.ts +51 -0
  169. package/dist/shared/announce-context.d.ts.map +1 -0
  170. package/dist/shared/announce-context.js +73 -0
  171. package/dist/shared/announce-context.js.map +1 -0
  172. package/dist/shared/audit-sqlite.d.ts +63 -0
  173. package/dist/shared/audit-sqlite.d.ts.map +1 -0
  174. package/dist/shared/audit-sqlite.js +187 -0
  175. package/dist/shared/audit-sqlite.js.map +1 -0
  176. package/dist/shared/audit.d.ts +25 -3
  177. package/dist/shared/audit.d.ts.map +1 -1
  178. package/dist/shared/audit.js +97 -3
  179. package/dist/shared/audit.js.map +1 -1
  180. package/dist/shared/error-handler.d.ts +10 -1
  181. package/dist/shared/error-handler.d.ts.map +1 -1
  182. package/dist/shared/error-handler.js +17 -2
  183. package/dist/shared/error-handler.js.map +1 -1
  184. package/dist/shared/security.d.ts +12 -0
  185. package/dist/shared/security.d.ts.map +1 -1
  186. package/dist/shared/security.js +80 -0
  187. package/dist/shared/security.js.map +1 -1
  188. package/dist/shared/sqlite-runtime.d.ts +46 -0
  189. package/dist/shared/sqlite-runtime.d.ts.map +1 -0
  190. package/dist/shared/sqlite-runtime.js +110 -0
  191. package/dist/shared/sqlite-runtime.js.map +1 -0
  192. package/dist/tasks/store.d.ts +1 -1
  193. package/dist/tasks/store.d.ts.map +1 -1
  194. package/dist/tasks/store.js +29 -15
  195. package/dist/tasks/store.js.map +1 -1
  196. package/dist/telemetry/metrics.d.ts +26 -0
  197. package/dist/telemetry/metrics.d.ts.map +1 -1
  198. package/dist/telemetry/metrics.js +31 -0
  199. package/dist/telemetry/metrics.js.map +1 -1
  200. package/dist/test-runner.d.ts.map +1 -1
  201. package/dist/test-runner.js +3 -3
  202. package/dist/test-runner.js.map +1 -1
  203. package/dist/version-checker.d.ts.map +1 -1
  204. package/dist/version-checker.js +7 -14
  205. package/dist/version-checker.js.map +1 -1
  206. package/dist/version.d.ts +12 -0
  207. package/dist/version.d.ts.map +1 -1
  208. package/dist/version.js +103 -1
  209. package/dist/version.js.map +1 -1
  210. package/package.json +6 -2
  211. package/templates/photon.template.ts +7 -13
@@ -404,6 +404,353 @@ export function generateRenderersScript() {
404
404
  container.innerHTML = '<pre style="font-size:12px;line-height:1.5;color:' + colors.text + ';background:' + colors.bgAlt + ';padding:12px;border-radius:6px;overflow:auto;max-height:400px;margin:0">' + esc(text) + '</pre>';
405
405
  };
406
406
 
407
+ // ─── A2UI v0.9 ───
408
+ // Renders Google A2UI v0.9 "Basic catalog" surfaces. Accepts either:
409
+ // (a) a v0.9 JSONL message array (createSurface/updateComponents/updateDataModel)
410
+ // (b) a raw method result, auto-mapped via the same heuristics as src/a2ui/mapper.ts
411
+ // Kept inline (no external runtime) so it stays consistent with the other
412
+ // @format renderers served from /api/photon-renderers.js.
413
+ renderers.a2ui = function(container, data) {
414
+ // ── 1. Normalize input to { components, dataModel } ──
415
+ var surface = a2uiExtractSurface(data) || a2uiMapResult(data);
416
+ var byId = {};
417
+ (surface.components || []).forEach(function(c) { byId[c.id] = c; });
418
+ if (!byId.root) {
419
+ container.innerHTML = '<pre style="color:' + colors.text + ';background:' + colors.bgAlt + ';padding:12px;border-radius:6px;margin:0">A2UI error: missing root component</pre>';
420
+ return;
421
+ }
422
+ // ── 2. Render from root ──
423
+ var html = '<div class="a2ui-surface" style="color:' + colors.text + ';font-size:14px;line-height:1.5">'
424
+ + a2uiRender('root', byId, surface.data, null)
425
+ + '</div>';
426
+ container.innerHTML = html;
427
+
428
+ // ── 3. Local data-model snapshot. Starts as a clone of the data the
429
+ // server seeded the surface with, then absorbs every TextField edit so
430
+ // the snapshot the action carries reflects current user input.
431
+ var localData = a2uiCloneData(surface.data);
432
+ container.querySelectorAll('input[data-a2ui-input]').forEach(function(input) {
433
+ input.addEventListener('input', function() {
434
+ var ptr = input.getAttribute('data-a2ui-input') || '';
435
+ a2uiSetByPath(localData, ptr, input.value);
436
+ });
437
+ });
438
+
439
+ // ── 4. Button clicks dispatch a bubbling CustomEvent. The host (Beam
440
+ // result-viewer) catches it and routes to <photon>/<actionName>. If
441
+ // nothing handles it (preventDefault), fall back to a toast so the
442
+ // renderer is still useful in standalone iframes.
443
+ container.querySelectorAll('[data-a2ui-action]').forEach(function(btn) {
444
+ btn.addEventListener('click', function(ev) {
445
+ ev.preventDefault();
446
+ var name = btn.getAttribute('data-a2ui-action') || '';
447
+ var detail = { name: name, context: localData, surfaceId: surface.surfaceId || null };
448
+ var dispatched = container.dispatchEvent(new CustomEvent('a2ui:action', {
449
+ detail: detail,
450
+ bubbles: true,
451
+ composed: true,
452
+ cancelable: true
453
+ }));
454
+ if (dispatched) {
455
+ // No host caught it — show the toast so dev still sees the click
456
+ a2uiToast(container, 'A2UI action: ' + name);
457
+ }
458
+ });
459
+ });
460
+ };
461
+
462
+ // Cheap structured clone — covers what the mapper produces (plain objects,
463
+ // arrays, primitives). Avoids structuredClone() so we don't depend on a
464
+ // newer DOM API in iframe contexts that might not have it.
465
+ function a2uiCloneData(value) {
466
+ if (value == null || typeof value !== 'object') return value;
467
+ if (Array.isArray(value)) return value.map(a2uiCloneData);
468
+ var out = {};
469
+ for (var k in value) if (Object.prototype.hasOwnProperty.call(value, k)) out[k] = a2uiCloneData(value[k]);
470
+ return out;
471
+ }
472
+
473
+ // Mirror of looksLikeA2UIStream in src/a2ui/mapper.ts — keep the Beam
474
+ // renderer consistent with CLI/AG-UI. Requires: non-empty array whose
475
+ // elements all have (version:string) + exactly one wrapper key whose
476
+ // value is an object with a string surfaceId. Without this guard, row
477
+ // data that happens to include an updateDataModel column is silently
478
+ // treated as a pre-built A2UI stream and renders empty in Beam.
479
+ function a2uiLooksLikeStream(arr) {
480
+ if (!Array.isArray(arr) || arr.length === 0) return false;
481
+ var wrapperKeys = ['createSurface','updateComponents','updateDataModel','deleteSurface'];
482
+ for (var i = 0; i < arr.length; i++) {
483
+ var m = arr[i];
484
+ if (!m || typeof m !== 'object') return false;
485
+ if (typeof m.version !== 'string') return false;
486
+ var count = 0;
487
+ for (var k = 0; k < wrapperKeys.length; k++) {
488
+ var key = wrapperKeys[k];
489
+ if (!(key in m)) continue;
490
+ count++;
491
+ var wrapped = m[key];
492
+ if (!wrapped || typeof wrapped !== 'object' || Array.isArray(wrapped)) return false;
493
+ if (typeof wrapped.surfaceId !== 'string') return false;
494
+ }
495
+ if (count !== 1) return false;
496
+ }
497
+ return true;
498
+ }
499
+
500
+ // Extract {components, data} from a v0.9 JSONL message array if the caller
501
+ // passed one (e.g. the AG-UI CUSTOM event stream replayed as data).
502
+ function a2uiExtractSurface(data) {
503
+ if (!a2uiLooksLikeStream(data)) return null;
504
+ var components = null;
505
+ var dataModel = {};
506
+ var surfaceId = null;
507
+ for (var i = 0; i < data.length; i++) {
508
+ var m = data[i];
509
+ if (!m || typeof m !== 'object') continue;
510
+ if (m.createSurface && m.createSurface.surfaceId) {
511
+ surfaceId = m.createSurface.surfaceId;
512
+ }
513
+ if (m.updateComponents && m.updateComponents.components) {
514
+ components = m.updateComponents.components;
515
+ } else if (m.updateDataModel) {
516
+ var path = m.updateDataModel.path || '/';
517
+ if (path === '/' || path === '') {
518
+ dataModel = m.updateDataModel.value;
519
+ } else {
520
+ a2uiSetByPath(dataModel, path, m.updateDataModel.value);
521
+ }
522
+ }
523
+ }
524
+ return components ? { components: components, data: dataModel, surfaceId: surfaceId } : null;
525
+ }
526
+
527
+ // Client-side mapper — mirrors src/a2ui/mapper.ts heuristics. Kept in sync
528
+ // by intent; see tests/a2ui-mapper.test.ts for the contract.
529
+ function a2uiMapResult(result) {
530
+ if (result && typeof result === 'object' && result.__a2ui === true && Array.isArray(result.components)) {
531
+ return { components: result.components, data: result.data || {} };
532
+ }
533
+ if (result == null || result === '') {
534
+ return { components: [{id:'root', component:'Text', text:''}], data: { value: '' } };
535
+ }
536
+ if (typeof result !== 'object') {
537
+ return { components: [{id:'root', component:'Text', text: String(result)}], data: { value: String(result) } };
538
+ }
539
+ if (Array.isArray(result)) {
540
+ if (result.length === 0) {
541
+ return { components: [{id:'root', component:'Text', text:'(empty list)'}], data: { value:'(empty list)' } };
542
+ }
543
+ var first = result[0];
544
+ if (first == null || typeof first !== 'object' || Array.isArray(first)) {
545
+ var items = result.map(function(v, i) { return { label: String(v), index: i }; });
546
+ return {
547
+ components: [
548
+ {id:'root', component:'List', list:{template:{id:'rowCard'}, data:{path:'/items'}}},
549
+ {id:'rowCard', component:'Card', child:'rowText'},
550
+ {id:'rowText', component:'Text', text:{path:'label'}}
551
+ ],
552
+ data: { items: items }
553
+ };
554
+ }
555
+ var keys = Object.keys(first);
556
+ var titleKey = ['title','name','label','subject'].filter(function(k){return keys.indexOf(k)>=0;})[0] || keys[0] || 'value';
557
+ return {
558
+ components: [
559
+ {id:'root', component:'List', list:{template:{id:'rowCard'}, data:{path:'/items'}}},
560
+ {id:'rowCard', component:'Card', child:'rowText'},
561
+ {id:'rowText', component:'Text', text:{path:titleKey}}
562
+ ],
563
+ data: { items: result }
564
+ };
565
+ }
566
+ // Card-shaped: {title, description?, actions?}. Must mirror the server
567
+ // mapper's stricter rule (src/a2ui/mapper.ts): the object's keys have to
568
+ // be a subset of {title, description, actions}. Otherwise a result with
569
+ // a title plus non-card fields would render as a Card on the Beam
570
+ // preview while CLI/AG-UI render a key/value column, and the non-title
571
+ // fields would silently disappear in Beam.
572
+ var cardKeys = ['title','description','actions'];
573
+ var isCardShape = typeof result.title === 'string'
574
+ && (result.actions === undefined || Array.isArray(result.actions))
575
+ && Object.keys(result).every(function(k) { return cardKeys.indexOf(k) !== -1; });
576
+ if (isCardShape) {
577
+ var contentIds = ['cardTitle'];
578
+ var cardComponents = [
579
+ {id:'root', component:'Card', child:'cardBody'},
580
+ {id:'cardTitle', component:'Text', text:{path:'/title'}, variant:'h2'}
581
+ ];
582
+ if (result.description) {
583
+ cardComponents.push({id:'cardDesc', component:'Text', text:{path:'/description'}});
584
+ contentIds.push('cardDesc');
585
+ }
586
+ (result.actions || []).forEach(function(a, i) {
587
+ var btnId = 'cardBtn' + i;
588
+ cardComponents.push({id: btnId, component:'Button', text: a.label, variant: i===0 ? 'primary' : 'borderless', action: {event:{name: a.name || a.label}}});
589
+ contentIds.push(btnId);
590
+ });
591
+ cardComponents.push({id:'cardBody', component:'Column', children: contentIds});
592
+ return { components: cardComponents, data: result };
593
+ }
594
+ // Plain object → Column of markdown-style key rows
595
+ var objKeys = Object.keys(result);
596
+ if (objKeys.length === 0) {
597
+ return { components: [{id:'root', component:'Text', text:'(empty object)'}], data: { value:'(empty object)' } };
598
+ }
599
+ var childIds = [];
600
+ var objComponents = [];
601
+ objKeys.forEach(function(k, i) {
602
+ var rowId = 'row' + i;
603
+ objComponents.push({id: rowId, component:'Text', text: {call:'formatString', args:{value:'**'+k+':** \${/'+k+'}'}}});
604
+ childIds.push(rowId);
605
+ });
606
+ objComponents.unshift({id:'root', component:'Column', children: childIds});
607
+ return { components: objComponents, data: result };
608
+ }
609
+
610
+ // JSON Pointer (RFC 6901) resolve, with a "relative" fallback used inside
611
+ // List template scopes. Leading '/' ⇒ absolute; anything else ⇒ resolved
612
+ // against the current scope (current list item).
613
+ function a2uiResolvePath(dataModel, ptr, scope) {
614
+ if (!ptr && ptr !== '') return undefined;
615
+ var absolute = typeof ptr === 'string' && ptr.indexOf('/') === 0;
616
+ var parts = absolute ? ptr.slice(1).split('/') : String(ptr).split('/');
617
+ var cur = absolute ? dataModel : (scope != null ? scope : dataModel);
618
+ for (var i = 0; i < parts.length; i++) {
619
+ var key = parts[i];
620
+ if (key === '') continue;
621
+ if (cur == null) return undefined;
622
+ // RFC 6901 escape unescape
623
+ key = key.replace(/~1/g, '/').replace(/~0/g, '~');
624
+ cur = cur[key];
625
+ }
626
+ return cur;
627
+ }
628
+
629
+ function a2uiSetByPath(root, ptr, value) {
630
+ var parts = ptr.replace(/^\\//,'').split('/').filter(Boolean);
631
+ if (parts.length === 0) return;
632
+ var cur = root;
633
+ for (var i = 0; i < parts.length - 1; i++) {
634
+ // RFC 6901: decode ~1 -> "/" and ~0 -> "~" (in that order, ~1 first).
635
+ // a2uiResolvePath decodes these — the write path must match or keys
636
+ // with slashes in their name land under the wrong property.
637
+ var k = parts[i].replace(/~1/g, '/').replace(/~0/g, '~');
638
+ if (typeof cur[k] !== 'object' || cur[k] == null) cur[k] = {};
639
+ cur = cur[k];
640
+ }
641
+ var last = parts[parts.length - 1].replace(/~1/g, '/').replace(/~0/g, '~');
642
+ cur[last] = value;
643
+ }
644
+
645
+ // DynamicString / DynamicNumber / DynamicBoolean resolver: literal | {path} | {call: formatString, ...}
646
+ function a2uiResolveDynamic(v, dataModel, scope) {
647
+ if (v == null) return '';
648
+ if (typeof v !== 'object') return v;
649
+ if ('path' in v) return a2uiResolvePath(dataModel, v.path, scope);
650
+ if ('call' in v && v.call === 'formatString') {
651
+ var tpl = String((v.args && v.args.value) || '');
652
+ return tpl.replace(/\\\$\\\{([^}]+)\\\}/g, function(_, p) {
653
+ var val = a2uiResolvePath(dataModel, p, scope);
654
+ return val == null ? '' : String(val);
655
+ });
656
+ }
657
+ return '';
658
+ }
659
+
660
+ // Minimal markdown: **bold**, *italic*, \`code\` — safe because esc() ran first.
661
+ function a2uiLightMarkdown(str) {
662
+ return String(str)
663
+ .replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>')
664
+ .replace(/\\*([^*]+)\\*/g, '<em>$1</em>')
665
+ .replace(/\`([^\`]+)\`/g, '<code style="background:' + colors.bgAlt + ';padding:1px 4px;border-radius:3px;font-size:12px">$1</code>');
666
+ }
667
+
668
+ // Render a component by id. Recursive.
669
+ function a2uiRender(id, byId, dataModel, scope) {
670
+ var c = byId[id];
671
+ if (!c) return '<span style="color:' + colors.textMuted + ';font-size:12px">[missing: ' + esc(String(id)) + ']</span>';
672
+ var kind = c.component;
673
+ switch (kind) {
674
+ case 'Text': {
675
+ var text = a2uiResolveDynamic(c.text, dataModel, scope);
676
+ var safe = esc(String(text == null ? '' : text));
677
+ var rendered = a2uiLightMarkdown(safe);
678
+ var v = c.variant || '';
679
+ if (v === 'h1') return '<h1 style="font-size:22px;font-weight:700;margin:0 0 8px;color:' + colors.text + '">' + rendered + '</h1>';
680
+ if (v === 'h2') return '<h2 style="font-size:18px;font-weight:600;margin:0 0 6px;color:' + colors.text + '">' + rendered + '</h2>';
681
+ if (v === 'h3') return '<h3 style="font-size:15px;font-weight:600;margin:0 0 4px;color:' + colors.text + '">' + rendered + '</h3>';
682
+ if (v === 'caption') return '<span style="font-size:12px;color:' + colors.textMuted + '">' + rendered + '</span>';
683
+ return '<div style="margin:2px 0">' + rendered + '</div>';
684
+ }
685
+ case 'Column': {
686
+ var colKids = (c.children || []).map(function(k) { return a2uiRender(k, byId, dataModel, scope); }).join('');
687
+ return '<div style="display:flex;flex-direction:column;gap:8px">' + colKids + '</div>';
688
+ }
689
+ case 'Row': {
690
+ var rowKids = (c.children || []).map(function(k) { return a2uiRender(k, byId, dataModel, scope); }).join('');
691
+ return '<div style="display:flex;flex-direction:row;gap:8px;align-items:center">' + rowKids + '</div>';
692
+ }
693
+ case 'Card': {
694
+ var inner = c.child ? a2uiRender(c.child, byId, dataModel, scope) : '';
695
+ return '<div style="border:1px solid ' + colors.border + ';border-radius:8px;padding:12px;background:' + colors.bg + '">' + inner + '</div>';
696
+ }
697
+ case 'Divider': {
698
+ return '<hr style="border:0;border-top:1px solid ' + colors.border + ';margin:8px 0" />';
699
+ }
700
+ case 'Image': {
701
+ var url = a2uiResolveDynamic(c.url, dataModel, scope);
702
+ var alt = a2uiResolveDynamic(c.alt, dataModel, scope);
703
+ return '<img src="' + esc(String(url || '')) + '" alt="' + esc(String(alt || '')) + '" style="max-width:100%;border-radius:6px" />';
704
+ }
705
+ case 'List': {
706
+ var list = c.list || {};
707
+ var tplId = list.template && list.template.id;
708
+ var pathObj = list.data && list.data.path ? list.data.path : '';
709
+ var items = a2uiResolvePath(dataModel, pathObj, scope);
710
+ if (!tplId || !Array.isArray(items)) return '';
711
+ return '<div style="display:flex;flex-direction:column;gap:8px">' +
712
+ items.map(function(item, i) {
713
+ return '<div data-a2ui-list-index="' + i + '">' + a2uiRender(tplId, byId, dataModel, item) + '</div>';
714
+ }).join('') +
715
+ '</div>';
716
+ }
717
+ case 'Button': {
718
+ var label = a2uiResolveDynamic(c.text, dataModel, scope);
719
+ var variant = c.variant || 'primary';
720
+ var actionName = (c.action && c.action.event && c.action.event.name) ||
721
+ (c.action && c.action.functionCall && c.action.functionCall.call) || '';
722
+ var style = variant === 'primary'
723
+ ? 'background:' + colors.accent + ';color:#fff;border:0;padding:8px 14px;border-radius:6px;font-weight:500;cursor:pointer'
724
+ : 'background:transparent;color:' + colors.accent + ';border:0;padding:8px 14px;border-radius:6px;font-weight:500;cursor:pointer';
725
+ return '<button data-a2ui-action="' + esc(String(actionName)) + '" style="' + style + '">' + esc(String(label || '')) + '</button>';
726
+ }
727
+ case 'TextField': {
728
+ var fieldLabel = a2uiResolveDynamic(c.label, dataModel, scope);
729
+ var valuePath = c.value && c.value.path;
730
+ var val = valuePath ? a2uiResolvePath(dataModel, valuePath, scope) : '';
731
+ // data-a2ui-input carries the JSON Pointer to write user edits back
732
+ // into the local data-model snapshot so the next button click ships
733
+ // current input values in its action context.
734
+ var inputAttr = valuePath ? ' data-a2ui-input="' + esc(String(valuePath)) + '"' : '';
735
+ return '<label style="display:flex;flex-direction:column;gap:4px;font-size:13px">' +
736
+ (fieldLabel ? '<span style="color:' + colors.textMuted + '">' + esc(String(fieldLabel)) + '</span>' : '') +
737
+ '<input type="text" value="' + esc(String(val == null ? '' : val)) + '"' + inputAttr + ' style="padding:8px;border:1px solid ' + colors.border + ';border-radius:6px;background:' + colors.bg + ';color:' + colors.text + '" />' +
738
+ '</label>';
739
+ }
740
+ default: {
741
+ return '<div style="font-size:12px;color:' + colors.textMuted + ';padding:8px;border:1px dashed ' + colors.border + ';border-radius:6px">[A2UI: unsupported \\u201C' + esc(String(kind)) + '\\u201D component in Basic catalog]</div>';
742
+ }
743
+ }
744
+ }
745
+
746
+ function a2uiToast(container, message) {
747
+ var el = document.createElement('div');
748
+ el.textContent = message;
749
+ el.style.cssText = 'position:fixed;bottom:16px;right:16px;background:' + colors.accent + ';color:#fff;padding:10px 14px;border-radius:8px;font-size:13px;z-index:9999;box-shadow:0 4px 12px rgba(0,0,0,0.15)';
750
+ document.body.appendChild(el);
751
+ setTimeout(function() { el.remove(); }, 2500);
752
+ }
753
+
407
754
  // ─── Code (syntax-highlighted) ───
408
755
  renderers.code = function(container, data) {
409
756
  var text = typeof data === 'string' ? data : JSON.stringify(data, null, 2);
@@ -2078,6 +2425,30 @@ export const FORMAT_CATALOG = {
2078
2425
  data: '{ title?, description?, icon? }',
2079
2426
  example: { title: 'No results', description: 'Try a different query', icon: '🔍' },
2080
2427
  },
2428
+ // ── Declarative UI (A2UI v0.9 draft) ──
2429
+ a2ui: {
2430
+ data: 'Array<A2UIMessage> | { __a2ui: true, components, data }',
2431
+ example: [
2432
+ {
2433
+ version: 'v0.9',
2434
+ createSurface: {
2435
+ surfaceId: 's-1',
2436
+ catalogId: 'https://a2ui.org/specification/v0_9/basic_catalog.json',
2437
+ },
2438
+ },
2439
+ {
2440
+ version: 'v0.9',
2441
+ updateComponents: {
2442
+ surfaceId: 's-1',
2443
+ components: [{ id: 'root', component: 'Text', text: 'Hello' }],
2444
+ },
2445
+ },
2446
+ {
2447
+ version: 'v0.9',
2448
+ updateDataModel: { surfaceId: 's-1', path: '/', value: {} },
2449
+ },
2450
+ ],
2451
+ },
2081
2452
  };
2082
2453
  /** Flat list of supported format names */
2083
2454
  export const SUPPORTED_FORMATS = Object.keys(FORMAT_CATALOG);
@@ -1 +1 @@
1
- {"version":3,"file":"renderers.js","sourceRoot":"","sources":["../../../src/auto-ui/bridge/renderers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renderers.js","sourceRoot":"","sources":["../../../src/auto-ui/bridge/renderers.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"streamable-http-transport.d.ts","sourceRoot":"","sources":["../../src/auto-ui/streamable-http-transport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"streamable-http-transport.d.ts","sourceRoot":"","sources":["../../src/auto-ui/streamable-http-transport.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,12 @@ import { join, dirname, extname, resolve, normalize } from 'path';
22
22
  import { homedir } from 'os';
23
23
  import { PHOTON_VERSION } from '../version.js';
24
24
  import { formatToolError } from '../shared/error-handler.js';
25
+ import { SimpleRateLimiter } from '../shared/security.js';
26
+ // Default rate limit: 60 requests/min per source IP. Override via
27
+ // PHOTON_MCP_RATE_LIMIT (count) and PHOTON_MCP_RATE_WINDOW_MS (window).
28
+ const MCP_RATE_LIMIT = Math.max(1, parseInt(process.env.PHOTON_MCP_RATE_LIMIT || '60', 10) || 60);
29
+ const MCP_RATE_WINDOW_MS = Math.max(1_000, parseInt(process.env.PHOTON_MCP_RATE_WINDOW_MS || '60000', 10) || 60_000);
30
+ const mcpRateLimiter = new SimpleRateLimiter(MCP_RATE_LIMIT, MCP_RATE_WINDOW_MS);
25
31
  import { AGUIEventType } from '../ag-ui/types.js';
26
32
  import { proxyExternalAgent, createAGUIOutputHandler } from '../ag-ui/adapter.js';
27
33
  import { buildToolMetadataExtensions } from './types.js';
@@ -576,7 +582,16 @@ const handlers = {
576
582
  });
577
583
  return { jsonrpc: '2.0', id: req.id, result: { success: false } };
578
584
  }
579
- const agui = createAGUIOutputHandler(photonName, methodName, runId, broadcast);
585
+ // Look up the method's declared @format so the adapter can emit A2UI
586
+ // messages as CUSTOM events when format === 'a2ui'. ctx.photons is the
587
+ // same registry used to resolve UI metadata elsewhere in this transport.
588
+ const aguiPhotonInfo = ctx.photons?.find((p) => p.name === photonName);
589
+ const aguiMethodInfo = aguiPhotonInfo?.configured
590
+ ? aguiPhotonInfo.methods?.find((m) => m.name === methodName)
591
+ : undefined;
592
+ const agui = createAGUIOutputHandler(photonName, methodName, runId, broadcast, {
593
+ outputFormat: aguiMethodInfo?.outputFormat,
594
+ });
580
595
  try {
581
596
  // Build args from input messages (last user message content) or forwarded props
582
597
  const args = params.input.forwardedProps ||
@@ -783,6 +798,10 @@ const handlers = {
783
798
  'x-photon-internal': photon.internal,
784
799
  'x-photon-stateful': photon.stateful || false,
785
800
  'x-photon-has-settings': photon.hasSettings || false,
801
+ // Constructor params for the Beam Settings → Setup tab. Empty
802
+ // array (or missing) means the photon takes no env-injected
803
+ // setup. Server already masks secret-named values.
804
+ 'x-photon-required-params': photon.requiredParams || [],
786
805
  'x-photon-short-name': photon.shortName,
787
806
  'x-photon-namespace': photon.namespace,
788
807
  'x-photon-qualified-name': photon.qualifiedName,
@@ -3297,6 +3316,24 @@ export async function handleStreamableHTTP(req, res, options) {
3297
3316
  res.end();
3298
3317
  return true;
3299
3318
  }
3319
+ // Default rate limit: per source IP, before any session or auth work.
3320
+ const clientKey = req.socket?.remoteAddress || 'unknown';
3321
+ if (!mcpRateLimiter.isAllowed(clientKey)) {
3322
+ const retryAfter = Math.ceil(MCP_RATE_WINDOW_MS / 1000);
3323
+ res.writeHead(429, {
3324
+ 'Content-Type': 'application/json',
3325
+ 'Retry-After': String(retryAfter),
3326
+ });
3327
+ res.end(JSON.stringify({
3328
+ jsonrpc: '2.0',
3329
+ error: {
3330
+ code: -32000,
3331
+ message: 'Too many requests',
3332
+ data: { limit: MCP_RATE_LIMIT, windowMs: MCP_RATE_WINDOW_MS },
3333
+ },
3334
+ }));
3335
+ return true;
3336
+ }
3300
3337
  // MCP OAuth: extract token if present (used for per-photon auth checks at tool call time)
3301
3338
  // Accept token from Authorization header (POST) or query param (SSE GET — EventSource can't set headers)
3302
3339
  const queryToken = url.searchParams.get('token');