@honua/app-platform 0.0.20-alpha.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/LICENSE +201 -0
- package/README.md +11 -0
- package/app/index.d.ts +164 -0
- package/app/index.d.ts.map +1 -0
- package/app/index.js +424 -0
- package/app-controller/controller.d.ts +425 -0
- package/app-controller/controller.d.ts.map +1 -0
- package/app-controller/controller.js +1173 -0
- package/app-controller/index.d.ts +14 -0
- package/app-controller/index.d.ts.map +1 -0
- package/app-controller/index.js +12 -0
- package/app-workspace/index.d.ts +421 -0
- package/app-workspace/index.d.ts.map +1 -0
- package/app-workspace/index.js +722 -0
- package/collaboration/client.d.ts +40 -0
- package/collaboration/client.d.ts.map +1 -0
- package/collaboration/client.js +299 -0
- package/collaboration/errors.d.ts +15 -0
- package/collaboration/errors.d.ts.map +1 -0
- package/collaboration/errors.js +17 -0
- package/collaboration/fixture.d.ts +41 -0
- package/collaboration/fixture.d.ts.map +1 -0
- package/collaboration/fixture.js +362 -0
- package/collaboration/index.d.ts +18 -0
- package/collaboration/index.d.ts.map +1 -0
- package/collaboration/index.js +14 -0
- package/collaboration/types.d.ts +240 -0
- package/collaboration/types.d.ts.map +1 -0
- package/collaboration/types.js +1 -0
- package/contract/analytics-sources.d.ts +149 -0
- package/contract/analytics-sources.d.ts.map +1 -0
- package/contract/analytics-sources.js +235 -0
- package/contract/edit-session.d.ts +203 -0
- package/contract/edit-session.d.ts.map +1 -0
- package/contract/edit-session.js +760 -0
- package/contract/edit-sketch.d.ts +91 -0
- package/contract/edit-sketch.d.ts.map +1 -0
- package/contract/edit-sketch.js +281 -0
- package/contract/index.d.ts +63 -0
- package/contract/index.d.ts.map +1 -0
- package/contract/index.js +52 -0
- package/contract/jobs.d.ts +149 -0
- package/contract/jobs.d.ts.map +1 -0
- package/contract/jobs.js +40 -0
- package/contract/pmtiles.d.ts +162 -0
- package/contract/pmtiles.d.ts.map +1 -0
- package/contract/pmtiles.js +155 -0
- package/contract/source.d.ts +447 -0
- package/contract/source.d.ts.map +1 -0
- package/contract/source.js +3909 -0
- package/contract/spatial-aggregation.d.ts +336 -0
- package/contract/spatial-aggregation.d.ts.map +1 -0
- package/contract/spatial-aggregation.js +298 -0
- package/contract/temporal.d.ts +455 -0
- package/contract/temporal.d.ts.map +1 -0
- package/contract/temporal.js +146 -0
- package/contract/tiles.d.ts +370 -0
- package/contract/tiles.d.ts.map +1 -0
- package/contract/tiles.js +519 -0
- package/contract/types.d.ts +694 -0
- package/contract/types.d.ts.map +1 -0
- package/contract/types.js +183 -0
- package/contract/widget-source.d.ts +205 -0
- package/contract/widget-source.d.ts.map +1 -0
- package/contract/widget-source.js +1473 -0
- package/control-plane/client.d.ts +95 -0
- package/control-plane/client.d.ts.map +1 -0
- package/control-plane/client.js +374 -0
- package/control-plane/index.d.ts +18 -0
- package/control-plane/index.d.ts.map +1 -0
- package/control-plane/index.js +14 -0
- package/control-plane/types.d.ts +233 -0
- package/control-plane/types.d.ts.map +1 -0
- package/control-plane/types.js +7 -0
- package/controls/basemap-style-binding.d.ts +54 -0
- package/controls/basemap-style-binding.d.ts.map +1 -0
- package/controls/basemap-style-binding.js +199 -0
- package/controls/basemap-switcher.d.ts +95 -0
- package/controls/basemap-switcher.d.ts.map +1 -0
- package/controls/basemap-switcher.js +379 -0
- package/controls/element-utils.d.ts +48 -0
- package/controls/element-utils.d.ts.map +1 -0
- package/controls/element-utils.js +78 -0
- package/controls/index.d.ts +33 -0
- package/controls/index.d.ts.map +1 -0
- package/controls/index.js +30 -0
- package/controls/layer-list.d.ts +98 -0
- package/controls/layer-list.d.ts.map +1 -0
- package/controls/layer-list.js +375 -0
- package/controls/legend-derive.d.ts +53 -0
- package/controls/legend-derive.d.ts.map +1 -0
- package/controls/legend-derive.js +196 -0
- package/controls/legend.d.ts +104 -0
- package/controls/legend.d.ts.map +1 -0
- package/controls/legend.js +381 -0
- package/controls/swipe-control.d.ts +80 -0
- package/controls/swipe-control.d.ts.map +1 -0
- package/controls/swipe-control.js +368 -0
- package/controls/types.d.ts +227 -0
- package/controls/types.d.ts.map +1 -0
- package/controls/types.js +11 -0
- package/core/auth/client-credentials-provider.d.ts +51 -0
- package/core/auth/client-credentials-provider.d.ts.map +1 -0
- package/core/auth/client-credentials-provider.js +115 -0
- package/core/auth/credential-store.d.ts +52 -0
- package/core/auth/credential-store.d.ts.map +1 -0
- package/core/auth/credential-store.js +82 -0
- package/core/auth/index.d.ts +23 -0
- package/core/auth/index.d.ts.map +1 -0
- package/core/auth/index.js +20 -0
- package/core/auth/oauth2-provider.d.ts +114 -0
- package/core/auth/oauth2-provider.d.ts.map +1 -0
- package/core/auth/oauth2-provider.js +408 -0
- package/core/auth/pkce.d.ts +25 -0
- package/core/auth/pkce.d.ts.map +1 -0
- package/core/auth/pkce.js +46 -0
- package/core/auth/static-providers.d.ts +20 -0
- package/core/auth/static-providers.d.ts.map +1 -0
- package/core/auth/static-providers.js +26 -0
- package/core/auth/token-endpoint.d.ts +40 -0
- package/core/auth/token-endpoint.d.ts.map +1 -0
- package/core/auth/token-endpoint.js +133 -0
- package/core/auth/types.d.ts +144 -0
- package/core/auth/types.d.ts.map +1 -0
- package/core/auth/types.js +8 -0
- package/core/batch.d.ts +37 -0
- package/core/batch.d.ts.map +1 -0
- package/core/batch.js +79 -0
- package/core/cache-state.d.ts +79 -0
- package/core/cache-state.d.ts.map +1 -0
- package/core/cache-state.js +87 -0
- package/core/client.d.ts +607 -0
- package/core/client.d.ts.map +1 -0
- package/core/client.js +1716 -0
- package/core/compatibility.d.ts +18 -0
- package/core/compatibility.d.ts.map +1 -0
- package/core/compatibility.js +245 -0
- package/core/errors.d.ts +139 -0
- package/core/errors.d.ts.map +1 -0
- package/core/errors.js +176 -0
- package/core/esri-geojson.d.ts +66 -0
- package/core/esri-geojson.d.ts.map +1 -0
- package/core/esri-geojson.js +363 -0
- package/core/geoparquet-sql.d.ts +162 -0
- package/core/geoparquet-sql.d.ts.map +1 -0
- package/core/geoparquet-sql.js +333 -0
- package/core/geoservices.d.ts +34 -0
- package/core/geoservices.d.ts.map +1 -0
- package/core/geoservices.js +434 -0
- package/core/grpc-adapter.d.ts +23 -0
- package/core/grpc-adapter.d.ts.map +1 -0
- package/core/grpc-adapter.js +688 -0
- package/core/odata.d.ts +347 -0
- package/core/odata.d.ts.map +1 -0
- package/core/odata.js +913 -0
- package/core/ogc-conformance.d.ts +35 -0
- package/core/ogc-conformance.d.ts.map +1 -0
- package/core/ogc-conformance.js +134 -0
- package/core/ogc-endpoint-layout.d.ts +70 -0
- package/core/ogc-endpoint-layout.d.ts.map +1 -0
- package/core/ogc-endpoint-layout.js +173 -0
- package/core/ogc-features.d.ts +23 -0
- package/core/ogc-features.d.ts.map +1 -0
- package/core/ogc-features.js +129 -0
- package/core/ogc-maps.d.ts +49 -0
- package/core/ogc-maps.d.ts.map +1 -0
- package/core/ogc-maps.js +126 -0
- package/core/ogc-processes.d.ts +118 -0
- package/core/ogc-processes.d.ts.map +1 -0
- package/core/ogc-processes.js +423 -0
- package/core/ogc-records.d.ts +75 -0
- package/core/ogc-records.d.ts.map +1 -0
- package/core/ogc-records.js +251 -0
- package/core/ogc-tiles.d.ts +125 -0
- package/core/ogc-tiles.d.ts.map +1 -0
- package/core/ogc-tiles.js +183 -0
- package/core/path-utils.d.ts +69 -0
- package/core/path-utils.d.ts.map +1 -0
- package/core/path-utils.js +123 -0
- package/core/pbf-decoder.d.ts +39 -0
- package/core/pbf-decoder.d.ts.map +1 -0
- package/core/pbf-decoder.js +702 -0
- package/core/process-runner.d.ts +104 -0
- package/core/process-runner.d.ts.map +1 -0
- package/core/process-runner.js +315 -0
- package/core/protocol-transport.d.ts +76 -0
- package/core/protocol-transport.d.ts.map +1 -0
- package/core/protocol-transport.js +15 -0
- package/core/query-builder.d.ts +261 -0
- package/core/query-builder.d.ts.map +1 -0
- package/core/query-builder.js +538 -0
- package/core/request-pipeline.d.ts +88 -0
- package/core/request-pipeline.d.ts.map +1 -0
- package/core/request-pipeline.js +273 -0
- package/core/spatial-filter.d.ts +93 -0
- package/core/spatial-filter.d.ts.map +1 -0
- package/core/spatial-filter.js +153 -0
- package/core/stac-static.d.ts +51 -0
- package/core/stac-static.d.ts.map +1 -0
- package/core/stac-static.js +195 -0
- package/core/stac.d.ts +67 -0
- package/core/stac.d.ts.map +1 -0
- package/core/stac.js +259 -0
- package/core/surfaces.d.ts +540 -0
- package/core/surfaces.d.ts.map +1 -0
- package/core/surfaces.js +1964 -0
- package/core/terrain-elevation.d.ts +114 -0
- package/core/terrain-elevation.d.ts.map +1 -0
- package/core/terrain-elevation.js +150 -0
- package/core/types.d.ts +1404 -0
- package/core/types.d.ts.map +1 -0
- package/core/types.js +13 -0
- package/core/wfs-capabilities.d.ts +153 -0
- package/core/wfs-capabilities.d.ts.map +1 -0
- package/core/wfs-capabilities.js +490 -0
- package/core/wfs-filter.d.ts +118 -0
- package/core/wfs-filter.d.ts.map +1 -0
- package/core/wfs-filter.js +634 -0
- package/core/wfs.d.ts +232 -0
- package/core/wfs.d.ts.map +1 -0
- package/core/wfs.js +426 -0
- package/core/wire-shared.d.ts +32 -0
- package/core/wire-shared.d.ts.map +1 -0
- package/core/wire-shared.js +76 -0
- package/core/wms-axis.d.ts +36 -0
- package/core/wms-axis.d.ts.map +1 -0
- package/core/wms-axis.js +73 -0
- package/core/wms-capabilities.d.ts +110 -0
- package/core/wms-capabilities.d.ts.map +1 -0
- package/core/wms-capabilities.js +559 -0
- package/core/wms-types.d.ts +128 -0
- package/core/wms-types.d.ts.map +1 -0
- package/core/wms-types.js +32 -0
- package/core/wms.d.ts +144 -0
- package/core/wms.d.ts.map +1 -0
- package/core/wms.js +338 -0
- package/core/wmts-capabilities.d.ts +82 -0
- package/core/wmts-capabilities.d.ts.map +1 -0
- package/core/wmts-capabilities.js +402 -0
- package/core/wmts.d.ts +103 -0
- package/core/wmts.d.ts.map +1 -0
- package/core/wmts.js +332 -0
- package/core/xml-text.d.ts +20 -0
- package/core/xml-text.d.ts.map +1 -0
- package/core/xml-text.js +85 -0
- package/esri-compat/basemap-gallery.d.ts +38 -0
- package/esri-compat/basemap-gallery.d.ts.map +1 -0
- package/esri-compat/basemap-gallery.js +159 -0
- package/esri-compat/basemap-layer-list.d.ts +35 -0
- package/esri-compat/basemap-layer-list.d.ts.map +1 -0
- package/esri-compat/basemap-layer-list.js +139 -0
- package/esri-compat/basemap.d.ts +32 -0
- package/esri-compat/basemap.d.ts.map +1 -0
- package/esri-compat/basemap.js +84 -0
- package/esri-compat/bookmarks.d.ts +36 -0
- package/esri-compat/bookmarks.d.ts.map +1 -0
- package/esri-compat/bookmarks.js +108 -0
- package/esri-compat/class-breaks-renderer.d.ts +50 -0
- package/esri-compat/class-breaks-renderer.d.ts.map +1 -0
- package/esri-compat/class-breaks-renderer.js +164 -0
- package/esri-compat/color.d.ts +22 -0
- package/esri-compat/color.d.ts.map +1 -0
- package/esri-compat/color.js +106 -0
- package/esri-compat/controls.d.ts +174 -0
- package/esri-compat/controls.d.ts.map +1 -0
- package/esri-compat/controls.js +479 -0
- package/esri-compat/coordinate-conversion.d.ts +41 -0
- package/esri-compat/coordinate-conversion.d.ts.map +1 -0
- package/esri-compat/coordinate-conversion.js +125 -0
- package/esri-compat/directions.d.ts +45 -0
- package/esri-compat/directions.d.ts.map +1 -0
- package/esri-compat/directions.js +123 -0
- package/esri-compat/editor.d.ts +47 -0
- package/esri-compat/editor.d.ts.map +1 -0
- package/esri-compat/editor.js +170 -0
- package/esri-compat/esri-config.d.ts +16 -0
- package/esri-compat/esri-config.d.ts.map +1 -0
- package/esri-compat/esri-config.js +23 -0
- package/esri-compat/esri-request.d.ts +17 -0
- package/esri-compat/esri-request.d.ts.map +1 -0
- package/esri-compat/esri-request.js +127 -0
- package/esri-compat/event-bus.d.ts +106 -0
- package/esri-compat/event-bus.d.ts.map +1 -0
- package/esri-compat/event-bus.js +90 -0
- package/esri-compat/expand.d.ts +36 -0
- package/esri-compat/expand.d.ts.map +1 -0
- package/esri-compat/expand.js +97 -0
- package/esri-compat/extent.d.ts +43 -0
- package/esri-compat/extent.d.ts.map +1 -0
- package/esri-compat/extent.js +140 -0
- package/esri-compat/feature-filter.d.ts +55 -0
- package/esri-compat/feature-filter.d.ts.map +1 -0
- package/esri-compat/feature-filter.js +109 -0
- package/esri-compat/feature-form.d.ts +64 -0
- package/esri-compat/feature-form.d.ts.map +1 -0
- package/esri-compat/feature-form.js +137 -0
- package/esri-compat/feature-layer.d.ts +173 -0
- package/esri-compat/feature-layer.d.ts.map +1 -0
- package/esri-compat/feature-layer.js +661 -0
- package/esri-compat/feature-set.d.ts +32 -0
- package/esri-compat/feature-set.d.ts.map +1 -0
- package/esri-compat/feature-set.js +80 -0
- package/esri-compat/feature-table.d.ts +141 -0
- package/esri-compat/feature-table.d.ts.map +1 -0
- package/esri-compat/feature-table.js +500 -0
- package/esri-compat/feature-templates.d.ts +41 -0
- package/esri-compat/feature-templates.d.ts.map +1 -0
- package/esri-compat/feature-templates.js +97 -0
- package/esri-compat/feature.d.ts +33 -0
- package/esri-compat/feature.d.ts.map +1 -0
- package/esri-compat/feature.js +83 -0
- package/esri-compat/geojson-layer.d.ts +86 -0
- package/esri-compat/geojson-layer.d.ts.map +1 -0
- package/esri-compat/geojson-layer.js +191 -0
- package/esri-compat/geometry-engine.d.ts +107 -0
- package/esri-compat/geometry-engine.d.ts.map +1 -0
- package/esri-compat/geometry-engine.js +266 -0
- package/esri-compat/graphic.d.ts +46 -0
- package/esri-compat/graphic.d.ts.map +1 -0
- package/esri-compat/graphic.js +103 -0
- package/esri-compat/graphics-layer.d.ts +49 -0
- package/esri-compat/graphics-layer.d.ts.map +1 -0
- package/esri-compat/graphics-layer.js +185 -0
- package/esri-compat/group-layer.d.ts +48 -0
- package/esri-compat/group-layer.d.ts.map +1 -0
- package/esri-compat/group-layer.js +212 -0
- package/esri-compat/identify.d.ts +71 -0
- package/esri-compat/identify.d.ts.map +1 -0
- package/esri-compat/identify.js +299 -0
- package/esri-compat/identity-manager.d.ts +74 -0
- package/esri-compat/identity-manager.d.ts.map +1 -0
- package/esri-compat/identity-manager.js +245 -0
- package/esri-compat/imagery-layer.d.ts +78 -0
- package/esri-compat/imagery-layer.d.ts.map +1 -0
- package/esri-compat/imagery-layer.js +167 -0
- package/esri-compat/label-class.d.ts +31 -0
- package/esri-compat/label-class.d.ts.map +1 -0
- package/esri-compat/label-class.js +102 -0
- package/esri-compat/layer-list.d.ts +77 -0
- package/esri-compat/layer-list.d.ts.map +1 -0
- package/esri-compat/layer-list.js +342 -0
- package/esri-compat/legend.d.ts +53 -0
- package/esri-compat/legend.d.ts.map +1 -0
- package/esri-compat/legend.js +254 -0
- package/esri-compat/map-image-layer.d.ts +162 -0
- package/esri-compat/map-image-layer.d.ts.map +1 -0
- package/esri-compat/map-image-layer.js +709 -0
- package/esri-compat/map-view.d.ts +323 -0
- package/esri-compat/map-view.d.ts.map +1 -0
- package/esri-compat/map-view.js +1175 -0
- package/esri-compat/map.d.ts +47 -0
- package/esri-compat/map.d.ts.map +1 -0
- package/esri-compat/map.js +209 -0
- package/esri-compat/measurement-2d.d.ts +61 -0
- package/esri-compat/measurement-2d.d.ts.map +1 -0
- package/esri-compat/measurement-2d.js +184 -0
- package/esri-compat/measurement.d.ts +45 -0
- package/esri-compat/measurement.d.ts.map +1 -0
- package/esri-compat/measurement.js +193 -0
- package/esri-compat/oauth-info.d.ts +50 -0
- package/esri-compat/oauth-info.d.ts.map +1 -0
- package/esri-compat/oauth-info.js +142 -0
- package/esri-compat/picture-marker-symbol.d.ts +35 -0
- package/esri-compat/picture-marker-symbol.d.ts.map +1 -0
- package/esri-compat/picture-marker-symbol.js +126 -0
- package/esri-compat/point.d.ts +31 -0
- package/esri-compat/point.d.ts.map +1 -0
- package/esri-compat/point.js +102 -0
- package/esri-compat/polygon.d.ts +31 -0
- package/esri-compat/polygon.d.ts.map +1 -0
- package/esri-compat/polygon.js +107 -0
- package/esri-compat/polyline.d.ts +31 -0
- package/esri-compat/polyline.d.ts.map +1 -0
- package/esri-compat/polyline.js +107 -0
- package/esri-compat/popup-template.d.ts +55 -0
- package/esri-compat/popup-template.d.ts.map +1 -0
- package/esri-compat/popup-template.js +128 -0
- package/esri-compat/popup.d.ts +54 -0
- package/esri-compat/popup.d.ts.map +1 -0
- package/esri-compat/popup.js +312 -0
- package/esri-compat/print.d.ts +47 -0
- package/esri-compat/print.d.ts.map +1 -0
- package/esri-compat/print.js +105 -0
- package/esri-compat/query.d.ts +58 -0
- package/esri-compat/query.d.ts.map +1 -0
- package/esri-compat/query.js +128 -0
- package/esri-compat/reactive-utils.d.ts +24 -0
- package/esri-compat/reactive-utils.d.ts.map +1 -0
- package/esri-compat/reactive-utils.js +193 -0
- package/esri-compat/request.d.ts +41 -0
- package/esri-compat/request.d.ts.map +1 -0
- package/esri-compat/request.js +253 -0
- package/esri-compat/route-layer.d.ts +59 -0
- package/esri-compat/route-layer.d.ts.map +1 -0
- package/esri-compat/route-layer.js +223 -0
- package/esri-compat/route-task.d.ts +88 -0
- package/esri-compat/route-task.d.ts.map +1 -0
- package/esri-compat/route-task.js +225 -0
- package/esri-compat/scene-view.d.ts +41 -0
- package/esri-compat/scene-view.d.ts.map +1 -0
- package/esri-compat/scene-view.js +68 -0
- package/esri-compat/search.d.ts +112 -0
- package/esri-compat/search.d.ts.map +1 -0
- package/esri-compat/search.js +820 -0
- package/esri-compat/simple-fill-symbol.d.ts +27 -0
- package/esri-compat/simple-fill-symbol.d.ts.map +1 -0
- package/esri-compat/simple-fill-symbol.js +85 -0
- package/esri-compat/simple-line-symbol.d.ts +27 -0
- package/esri-compat/simple-line-symbol.d.ts.map +1 -0
- package/esri-compat/simple-line-symbol.js +85 -0
- package/esri-compat/simple-marker-symbol.d.ts +29 -0
- package/esri-compat/simple-marker-symbol.d.ts.map +1 -0
- package/esri-compat/simple-marker-symbol.js +92 -0
- package/esri-compat/simple-renderer.d.ts +29 -0
- package/esri-compat/simple-renderer.d.ts.map +1 -0
- package/esri-compat/simple-renderer.js +92 -0
- package/esri-compat/sketch.d.ts +64 -0
- package/esri-compat/sketch.d.ts.map +1 -0
- package/esri-compat/sketch.js +227 -0
- package/esri-compat/spatial-reference.d.ts +31 -0
- package/esri-compat/spatial-reference.d.ts.map +1 -0
- package/esri-compat/spatial-reference.js +102 -0
- package/esri-compat/swipe.d.ts +34 -0
- package/esri-compat/swipe.d.ts.map +1 -0
- package/esri-compat/swipe.js +93 -0
- package/esri-compat/table-list.d.ts +36 -0
- package/esri-compat/table-list.d.ts.map +1 -0
- package/esri-compat/table-list.js +126 -0
- package/esri-compat/text-symbol.d.ts +37 -0
- package/esri-compat/text-symbol.d.ts.map +1 -0
- package/esri-compat/text-symbol.js +123 -0
- package/esri-compat/tile-layer.d.ts +52 -0
- package/esri-compat/tile-layer.d.ts.map +1 -0
- package/esri-compat/tile-layer.js +168 -0
- package/esri-compat/time-slider.d.ts +70 -0
- package/esri-compat/time-slider.d.ts.map +1 -0
- package/esri-compat/time-slider.js +208 -0
- package/esri-compat/track.d.ts +51 -0
- package/esri-compat/track.d.ts.map +1 -0
- package/esri-compat/track.js +174 -0
- package/esri-compat/unique-value-renderer.d.ts +41 -0
- package/esri-compat/unique-value-renderer.d.ts.map +1 -0
- package/esri-compat/unique-value-renderer.js +127 -0
- package/esri-compat/url.d.ts +13 -0
- package/esri-compat/url.d.ts.map +1 -0
- package/esri-compat/url.js +68 -0
- package/esri-compat/vector-tile-layer.d.ts +47 -0
- package/esri-compat/vector-tile-layer.d.ts.map +1 -0
- package/esri-compat/vector-tile-layer.js +130 -0
- package/esri-compat/web-map.d.ts +14 -0
- package/esri-compat/web-map.d.ts.map +1 -0
- package/esri-compat/web-map.js +24 -0
- package/esri-compat/wfs-layer.d.ts +64 -0
- package/esri-compat/wfs-layer.d.ts.map +1 -0
- package/esri-compat/wfs-layer.js +145 -0
- package/esri-compat/wms-layer.d.ts +76 -0
- package/esri-compat/wms-layer.d.ts.map +1 -0
- package/esri-compat/wms-layer.js +157 -0
- package/exploration/context.d.ts +25 -0
- package/exploration/context.d.ts.map +1 -0
- package/exploration/context.js +396 -0
- package/exploration/index.d.ts +27 -0
- package/exploration/index.d.ts.map +1 -0
- package/exploration/index.js +24 -0
- package/exploration/presets.d.ts +27 -0
- package/exploration/presets.d.ts.map +1 -0
- package/exploration/presets.js +114 -0
- package/exploration/reducer.d.ts +23 -0
- package/exploration/reducer.d.ts.map +1 -0
- package/exploration/reducer.js +332 -0
- package/exploration/selection.d.ts +25 -0
- package/exploration/selection.d.ts.map +1 -0
- package/exploration/selection.js +34 -0
- package/exploration/selectors.d.ts +56 -0
- package/exploration/selectors.d.ts.map +1 -0
- package/exploration/selectors.js +110 -0
- package/exploration/types.d.ts +294 -0
- package/exploration/types.d.ts.map +1 -0
- package/exploration/types.js +33 -0
- package/expr/expression.d.ts +457 -0
- package/expr/expression.d.ts.map +1 -0
- package/expr/expression.js +663 -0
- package/expr/index.d.ts +32 -0
- package/expr/index.d.ts.map +1 -0
- package/expr/index.js +30 -0
- package/filter-registry/index.d.ts +145 -0
- package/filter-registry/index.d.ts.map +1 -0
- package/filter-registry/index.js +531 -0
- package/gen/honua/v1/feature_service_pb.d.ts +918 -0
- package/gen/honua/v1/feature_service_pb.d.ts.map +1 -0
- package/gen/honua/v1/feature_service_pb.js +375 -0
- package/generated-app/errors.d.ts +41 -0
- package/generated-app/errors.d.ts.map +1 -0
- package/generated-app/errors.js +41 -0
- package/generated-app/index.d.ts +17 -0
- package/generated-app/index.d.ts.map +1 -0
- package/generated-app/index.js +12 -0
- package/generated-app/manifest.d.ts +183 -0
- package/generated-app/manifest.d.ts.map +1 -0
- package/generated-app/manifest.js +14 -0
- package/generated-app/projection.d.ts +44 -0
- package/generated-app/projection.d.ts.map +1 -0
- package/generated-app/projection.js +234 -0
- package/generated-app/runtime.d.ts +215 -0
- package/generated-app/runtime.d.ts.map +1 -0
- package/generated-app/runtime.js +1196 -0
- package/geocoding/index.d.ts +106 -0
- package/geocoding/index.d.ts.map +1 -0
- package/geocoding/index.js +278 -0
- package/interactions/detail-model.d.ts +54 -0
- package/interactions/detail-model.d.ts.map +1 -0
- package/interactions/detail-model.js +105 -0
- package/interactions/exploration-bindings.d.ts +120 -0
- package/interactions/exploration-bindings.d.ts.map +1 -0
- package/interactions/exploration-bindings.js +218 -0
- package/interactions/feature-state.d.ts +144 -0
- package/interactions/feature-state.d.ts.map +1 -0
- package/interactions/feature-state.js +169 -0
- package/interactions/hit-test.d.ts +112 -0
- package/interactions/hit-test.d.ts.map +1 -0
- package/interactions/hit-test.js +291 -0
- package/interactions/index.d.ts +31 -0
- package/interactions/index.d.ts.map +1 -0
- package/interactions/index.js +24 -0
- package/interactions/share-state.d.ts +36 -0
- package/interactions/share-state.d.ts.map +1 -0
- package/interactions/share-state.js +123 -0
- package/map/feature-service-adapter.d.ts +138 -0
- package/map/feature-service-adapter.d.ts.map +1 -0
- package/map/feature-service-adapter.js +279 -0
- package/map/honua-map.d.ts +203 -0
- package/map/honua-map.d.ts.map +1 -0
- package/map/honua-map.js +347 -0
- package/map/index.d.ts +27 -0
- package/map/index.d.ts.map +1 -0
- package/map/index.js +22 -0
- package/map/maplibre-target.d.ts +103 -0
- package/map/maplibre-target.d.ts.map +1 -0
- package/map/maplibre-target.js +164 -0
- package/map/webmap-maplibre.d.ts +60 -0
- package/map/webmap-maplibre.d.ts.map +1 -0
- package/map/webmap-maplibre.js +212 -0
- package/operate/client.d.ts +94 -0
- package/operate/client.d.ts.map +1 -0
- package/operate/client.js +361 -0
- package/operate/index.d.ts +22 -0
- package/operate/index.d.ts.map +1 -0
- package/operate/index.js +19 -0
- package/operate/types.d.ts +397 -0
- package/operate/types.d.ts.map +1 -0
- package/operate/types.js +17 -0
- package/operator/client.d.ts +60 -0
- package/operator/client.d.ts.map +1 -0
- package/operator/client.js +20 -0
- package/operator/controllers/approval.d.ts +52 -0
- package/operator/controllers/approval.d.ts.map +1 -0
- package/operator/controllers/approval.js +123 -0
- package/operator/controllers/base.d.ts +27 -0
- package/operator/controllers/base.d.ts.map +1 -0
- package/operator/controllers/base.js +53 -0
- package/operator/controllers/builder-workspace.d.ts +55 -0
- package/operator/controllers/builder-workspace.d.ts.map +1 -0
- package/operator/controllers/builder-workspace.js +108 -0
- package/operator/controllers/chat.d.ts +61 -0
- package/operator/controllers/chat.d.ts.map +1 -0
- package/operator/controllers/chat.js +154 -0
- package/operator/controllers/clarification.d.ts +52 -0
- package/operator/controllers/clarification.d.ts.map +1 -0
- package/operator/controllers/clarification.js +121 -0
- package/operator/controllers/execution.d.ts +60 -0
- package/operator/controllers/execution.d.ts.map +1 -0
- package/operator/controllers/execution.js +286 -0
- package/operator/controllers/index.d.ts +23 -0
- package/operator/controllers/index.d.ts.map +1 -0
- package/operator/controllers/index.js +15 -0
- package/operator/controllers/map-workspace.d.ts +85 -0
- package/operator/controllers/map-workspace.d.ts.map +1 -0
- package/operator/controllers/map-workspace.js +296 -0
- package/operator/controllers/plan-review.d.ts +66 -0
- package/operator/controllers/plan-review.d.ts.map +1 -0
- package/operator/controllers/plan-review.js +124 -0
- package/operator/errors.d.ts +62 -0
- package/operator/errors.d.ts.map +1 -0
- package/operator/errors.js +75 -0
- package/operator/i18n/index.d.ts +10 -0
- package/operator/i18n/index.d.ts.map +1 -0
- package/operator/i18n/index.js +8 -0
- package/operator/i18n/messages.d.ts +19 -0
- package/operator/i18n/messages.d.ts.map +1 -0
- package/operator/i18n/messages.js +54 -0
- package/operator/index.d.ts +19 -0
- package/operator/index.d.ts.map +1 -0
- package/operator/index.js +15 -0
- package/operator/telemetry.d.ts +26 -0
- package/operator/telemetry.d.ts.map +1 -0
- package/operator/telemetry.js +9 -0
- package/operator/theming/index.d.ts +12 -0
- package/operator/theming/index.d.ts.map +1 -0
- package/operator/theming/index.js +9 -0
- package/operator/theming/provider.d.ts +27 -0
- package/operator/theming/provider.d.ts.map +1 -0
- package/operator/theming/provider.js +26 -0
- package/operator/theming/tokens.d.ts +28 -0
- package/operator/theming/tokens.d.ts.map +1 -0
- package/operator/theming/tokens.js +65 -0
- package/operator/workspace/events.d.ts +70 -0
- package/operator/workspace/events.d.ts.map +1 -0
- package/operator/workspace/events.js +9 -0
- package/operator/workspace/index.d.ts +12 -0
- package/operator/workspace/index.d.ts.map +1 -0
- package/operator/workspace/index.js +8 -0
- package/operator/workspace/types.d.ts +178 -0
- package/operator/workspace/types.d.ts.map +1 -0
- package/operator/workspace/types.js +47 -0
- package/operator/workspace/workspace.d.ts +58 -0
- package/operator/workspace/workspace.d.ts.map +1 -0
- package/operator/workspace/workspace.js +339 -0
- package/package.json +105 -0
- package/realtime/exploration.d.ts +16 -0
- package/realtime/exploration.d.ts.map +1 -0
- package/realtime/exploration.js +32 -0
- package/realtime/honua-server.d.ts +123 -0
- package/realtime/honua-server.d.ts.map +1 -0
- package/realtime/honua-server.js +188 -0
- package/realtime/index.d.ts +20 -0
- package/realtime/index.d.ts.map +1 -0
- package/realtime/index.js +14 -0
- package/realtime/projections.d.ts +30 -0
- package/realtime/projections.d.ts.map +1 -0
- package/realtime/projections.js +51 -0
- package/realtime/reducer.d.ts +14 -0
- package/realtime/reducer.d.ts.map +1 -0
- package/realtime/reducer.js +351 -0
- package/realtime/sse.d.ts +23 -0
- package/realtime/sse.d.ts.map +1 -0
- package/realtime/sse.js +143 -0
- package/realtime/store.d.ts +18 -0
- package/realtime/store.d.ts.map +1 -0
- package/realtime/store.js +63 -0
- package/realtime/types.d.ts +190 -0
- package/realtime/types.d.ts.map +1 -0
- package/realtime/types.js +10 -0
- package/replica-sync/client.d.ts +32 -0
- package/replica-sync/client.d.ts.map +1 -0
- package/replica-sync/client.js +52 -0
- package/replica-sync/errors.d.ts +22 -0
- package/replica-sync/errors.d.ts.map +1 -0
- package/replica-sync/errors.js +29 -0
- package/replica-sync/fixture.d.ts +40 -0
- package/replica-sync/fixture.d.ts.map +1 -0
- package/replica-sync/fixture.js +364 -0
- package/replica-sync/index.d.ts +22 -0
- package/replica-sync/index.d.ts.map +1 -0
- package/replica-sync/index.js +17 -0
- package/replica-sync/types.d.ts +270 -0
- package/replica-sync/types.d.ts.map +1 -0
- package/replica-sync/types.js +13 -0
- package/runtime/diff.d.ts +31 -0
- package/runtime/diff.d.ts.map +1 -0
- package/runtime/diff.js +143 -0
- package/runtime/errors.d.ts +40 -0
- package/runtime/errors.d.ts.map +1 -0
- package/runtime/errors.js +35 -0
- package/runtime/index.d.ts +59 -0
- package/runtime/index.d.ts.map +1 -0
- package/runtime/index.js +40 -0
- package/runtime/legend.d.ts +23 -0
- package/runtime/legend.d.ts.map +1 -0
- package/runtime/legend.js +38 -0
- package/runtime/load-package.d.ts +125 -0
- package/runtime/load-package.d.ts.map +1 -0
- package/runtime/load-package.js +272 -0
- package/runtime/map-package-fetch.d.ts +107 -0
- package/runtime/map-package-fetch.d.ts.map +1 -0
- package/runtime/map-package-fetch.js +336 -0
- package/runtime/map-package-realtime.d.ts +169 -0
- package/runtime/map-package-realtime.d.ts.map +1 -0
- package/runtime/map-package-realtime.js +350 -0
- package/runtime/map-package-validation.d.ts +30 -0
- package/runtime/map-package-validation.d.ts.map +1 -0
- package/runtime/map-package-validation.js +257 -0
- package/runtime/map-package-watch.d.ts +78 -0
- package/runtime/map-package-watch.d.ts.map +1 -0
- package/runtime/map-package-watch.js +695 -0
- package/runtime/map-package.d.ts +167 -0
- package/runtime/map-package.d.ts.map +1 -0
- package/runtime/map-package.js +15 -0
- package/runtime/ogc-styles.d.ts +110 -0
- package/runtime/ogc-styles.d.ts.map +1 -0
- package/runtime/ogc-styles.js +195 -0
- package/runtime/pmtiles-protocol.d.ts +77 -0
- package/runtime/pmtiles-protocol.d.ts.map +1 -0
- package/runtime/pmtiles-protocol.js +120 -0
- package/runtime/popups.d.ts +62 -0
- package/runtime/popups.d.ts.map +1 -0
- package/runtime/popups.js +95 -0
- package/runtime/query-tiles.d.ts +217 -0
- package/runtime/query-tiles.d.ts.map +1 -0
- package/runtime/query-tiles.js +801 -0
- package/runtime/runtime.d.ts +243 -0
- package/runtime/runtime.d.ts.map +1 -0
- package/runtime/runtime.js +1147 -0
- package/runtime/source-bridge.d.ts +99 -0
- package/runtime/source-bridge.d.ts.map +1 -0
- package/runtime/source-bridge.js +428 -0
- package/runtime/style-compose.d.ts +46 -0
- package/runtime/style-compose.d.ts.map +1 -0
- package/runtime/style-compose.js +144 -0
- package/runtime/style-interactions.d.ts +141 -0
- package/runtime/style-interactions.d.ts.map +1 -0
- package/runtime/style-interactions.js +574 -0
- package/runtime/style-spec-validation.d.ts +23 -0
- package/runtime/style-spec-validation.d.ts.map +1 -0
- package/runtime/style-spec-validation.js +357 -0
- package/scene-workspace/analysis-widgets.d.ts +334 -0
- package/scene-workspace/analysis-widgets.d.ts.map +1 -0
- package/scene-workspace/analysis-widgets.js +424 -0
- package/scene-workspace/cesium-adapter.d.ts +438 -0
- package/scene-workspace/cesium-adapter.d.ts.map +1 -0
- package/scene-workspace/cesium-adapter.js +493 -0
- package/scene-workspace/index.d.ts +21 -0
- package/scene-workspace/index.d.ts.map +1 -0
- package/scene-workspace/index.js +14 -0
- package/scene-workspace/primitives.d.ts +162 -0
- package/scene-workspace/primitives.d.ts.map +1 -0
- package/scene-workspace/primitives.js +255 -0
- package/scene-workspace/scene-discovery.d.ts +196 -0
- package/scene-workspace/scene-discovery.d.ts.map +1 -0
- package/scene-workspace/scene-discovery.js +228 -0
- package/scene-workspace/scene-view.d.ts +209 -0
- package/scene-workspace/scene-view.d.ts.map +1 -0
- package/scene-workspace/scene-view.js +267 -0
- package/scene-workspace/types.d.ts +229 -0
- package/scene-workspace/types.d.ts.map +1 -0
- package/scene-workspace/types.js +23 -0
- package/scene-workspace/workspace.d.ts +13 -0
- package/scene-workspace/workspace.d.ts.map +1 -0
- package/scene-workspace/workspace.js +391 -0
- package/share/denial.d.ts +78 -0
- package/share/denial.d.ts.map +1 -0
- package/share/denial.js +61 -0
- package/share/embed-token.d.ts +71 -0
- package/share/embed-token.d.ts.map +1 -0
- package/share/embed-token.js +99 -0
- package/share/index.d.ts +35 -0
- package/share/index.d.ts.map +1 -0
- package/share/index.js +30 -0
- package/share/open-data.d.ts +114 -0
- package/share/open-data.d.ts.map +1 -0
- package/share/open-data.js +81 -0
- package/share/types.d.ts +163 -0
- package/share/types.d.ts.map +1 -0
- package/share/types.js +17 -0
- package/studio/capability-manifest.d.ts +285 -0
- package/studio/capability-manifest.d.ts.map +1 -0
- package/studio/capability-manifest.js +59 -0
- package/studio/chart-spec.d.ts +85 -0
- package/studio/chart-spec.d.ts.map +1 -0
- package/studio/chart-spec.js +106 -0
- package/studio/index.d.ts +34 -0
- package/studio/index.d.ts.map +1 -0
- package/studio/index.js +27 -0
- package/studio/provenance.d.ts +131 -0
- package/studio/provenance.d.ts.map +1 -0
- package/studio/provenance.js +39 -0
- package/studio/publish.d.ts +64 -0
- package/studio/publish.d.ts.map +1 -0
- package/studio/publish.js +13 -0
- package/studio/types.d.ts +278 -0
- package/studio/types.d.ts.map +1 -0
- package/studio/types.js +71 -0
- package/studio/validate.d.ts +45 -0
- package/studio/validate.d.ts.map +1 -0
- package/studio/validate.js +255 -0
- package/studio/validation.d.ts +112 -0
- package/studio/validation.d.ts.map +1 -0
- package/studio/validation.js +42 -0
- package/style/factory.d.ts +30 -0
- package/style/factory.d.ts.map +1 -0
- package/style/factory.js +61 -0
- package/style/index.d.ts +25 -0
- package/style/index.d.ts.map +1 -0
- package/style/index.js +24 -0
- package/style/specification.d.ts +203 -0
- package/style/specification.d.ts.map +1 -0
- package/style/specification.js +178 -0
- package/style/wms-wmts-resolvers.d.ts +38 -0
- package/style/wms-wmts-resolvers.d.ts.map +1 -0
- package/style/wms-wmts-resolvers.js +92 -0
- package/web-components/controller.d.ts +39 -0
- package/web-components/controller.d.ts.map +1 -0
- package/web-components/controller.js +640 -0
- package/web-components/elements.d.ts +210 -0
- package/web-components/elements.d.ts.map +1 -0
- package/web-components/elements.js +1651 -0
- package/web-components/index.d.ts +24 -0
- package/web-components/index.d.ts.map +1 -0
- package/web-components/index.js +22 -0
- package/web-components/maplibre-renderer.d.ts +22 -0
- package/web-components/maplibre-renderer.d.ts.map +1 -0
- package/web-components/maplibre-renderer.js +474 -0
- package/web-components/types.d.ts +397 -0
- package/web-components/types.d.ts.map +1 -0
- package/web-components/types.js +1 -0
- package/webmap/contract.d.ts +28 -0
- package/webmap/contract.d.ts.map +1 -0
- package/webmap/contract.js +130 -0
- package/webmap/convert-basemap.d.ts +17 -0
- package/webmap/convert-basemap.d.ts.map +1 -0
- package/webmap/convert-basemap.js +78 -0
- package/webmap/convert-extent.d.ts +17 -0
- package/webmap/convert-extent.d.ts.map +1 -0
- package/webmap/convert-extent.js +114 -0
- package/webmap/convert-label.d.ts +13 -0
- package/webmap/convert-label.d.ts.map +1 -0
- package/webmap/convert-label.js +125 -0
- package/webmap/convert-layer.d.ts +22 -0
- package/webmap/convert-layer.d.ts.map +1 -0
- package/webmap/convert-layer.js +181 -0
- package/webmap/convert-popup.d.ts +34 -0
- package/webmap/convert-popup.d.ts.map +1 -0
- package/webmap/convert-popup.js +68 -0
- package/webmap/convert-renderer.d.ts +17 -0
- package/webmap/convert-renderer.d.ts.map +1 -0
- package/webmap/convert-renderer.js +161 -0
- package/webmap/convert-symbol.d.ts +17 -0
- package/webmap/convert-symbol.d.ts.map +1 -0
- package/webmap/convert-symbol.js +122 -0
- package/webmap/index.d.ts +44 -0
- package/webmap/index.d.ts.map +1 -0
- package/webmap/index.js +33 -0
- package/webmap/parse.d.ts +25 -0
- package/webmap/parse.d.ts.map +1 -0
- package/webmap/parse.js +83 -0
- package/webmap/types.d.ts +264 -0
- package/webmap/types.d.ts.map +1 -0
- package/webmap/types.js +13 -0
- package/webmap/warnings.d.ts +30 -0
- package/webmap/warnings.d.ts.map +1 -0
- package/webmap/warnings.js +37 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ApprovalController` — loads the policy decision for an in-flight
|
|
3
|
+
* operation and exposes a single `confirm()` action when the gate is
|
|
4
|
+
* `pending`. The controller never short-circuits a deferred outcome
|
|
5
|
+
* to "approved"; it surfaces the server's verbatim decision.
|
|
6
|
+
*
|
|
7
|
+
* Audit entries returned with each decision are forwarded to the
|
|
8
|
+
* `OperatorTelemetry.after` hook as `approval-audit` events so partner
|
|
9
|
+
* observability stacks see the same evidence the server records. The
|
|
10
|
+
* server remains the canonical audit-of-record — client telemetry is
|
|
11
|
+
* observability, not evidence.
|
|
12
|
+
*
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
import { HonuaOperatorApprovalError } from "../errors.js";
|
|
16
|
+
import { ListenerBag, emitTelemetryEvent, withTelemetrySpan } from "./base.js";
|
|
17
|
+
export class ApprovalController {
|
|
18
|
+
#client;
|
|
19
|
+
#telemetry;
|
|
20
|
+
#bag = new ListenerBag();
|
|
21
|
+
#seenAudit = new Set();
|
|
22
|
+
#decision;
|
|
23
|
+
// Bumped on every load() / confirm() entry so a slow approval call
|
|
24
|
+
// for operation A cannot resolve after the controller has moved on
|
|
25
|
+
// to operation B and emit a stale `loaded` / `confirmed` for A. The
|
|
26
|
+
// captured value is checked at resolution time; mismatch ⇒ drop.
|
|
27
|
+
#generation = 0;
|
|
28
|
+
constructor(options) {
|
|
29
|
+
this.#client = options.client;
|
|
30
|
+
this.#telemetry = options.telemetry;
|
|
31
|
+
}
|
|
32
|
+
get decision() {
|
|
33
|
+
return this.#decision;
|
|
34
|
+
}
|
|
35
|
+
on(listener) {
|
|
36
|
+
return this.#bag.on(listener);
|
|
37
|
+
}
|
|
38
|
+
async load(operationId, signal) {
|
|
39
|
+
const gen = ++this.#generation;
|
|
40
|
+
try {
|
|
41
|
+
const decision = await withTelemetrySpan(this.#telemetry, "approval-load", undefined, () => this.#client.operator.getApproval(operationId, signal), { operationId });
|
|
42
|
+
if (gen !== this.#generation) {
|
|
43
|
+
// Superseded by a newer load()/confirm(); drop without
|
|
44
|
+
// committing or emitting so a stale operationId does not
|
|
45
|
+
// overwrite the active decision.
|
|
46
|
+
return decision;
|
|
47
|
+
}
|
|
48
|
+
this.#decision = decision;
|
|
49
|
+
this.#fanOutAudit(decision);
|
|
50
|
+
this.#bag.emit({ kind: "loaded", decision });
|
|
51
|
+
return decision;
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
const wrapped = error instanceof HonuaOperatorApprovalError
|
|
55
|
+
? error
|
|
56
|
+
: new HonuaOperatorApprovalError("approval load failed", {
|
|
57
|
+
cause: error,
|
|
58
|
+
detail: { operationId },
|
|
59
|
+
});
|
|
60
|
+
if (gen === this.#generation) {
|
|
61
|
+
this.#bag.emit({ kind: "error", error: wrapped });
|
|
62
|
+
}
|
|
63
|
+
throw wrapped;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Confirm a `pending` approval. The controller refuses to invoke the
|
|
68
|
+
* server when the loaded decision is in any other state — preventing
|
|
69
|
+
* a UI from re-confirming an already granted/denied/deferred outcome.
|
|
70
|
+
* Returns the server's outcome unchanged.
|
|
71
|
+
*/
|
|
72
|
+
async confirm(operationId, signal) {
|
|
73
|
+
if (!this.#decision || this.#decision.operationId !== operationId) {
|
|
74
|
+
throw new HonuaOperatorApprovalError("confirm requires a loaded decision for the same operation", {
|
|
75
|
+
detail: { operationId, decisionOperationId: this.#decision?.operationId },
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
if (this.#decision.state !== "pending") {
|
|
79
|
+
throw new HonuaOperatorApprovalError(`cannot confirm an approval in state "${this.#decision.state}"`, {
|
|
80
|
+
detail: { operationId, state: this.#decision.state },
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
const gen = ++this.#generation;
|
|
84
|
+
try {
|
|
85
|
+
const next = await withTelemetrySpan(this.#telemetry, "approval-confirm", undefined, () => this.#client.operator.confirmApproval(operationId, signal), { operationId });
|
|
86
|
+
if (gen !== this.#generation) {
|
|
87
|
+
return next;
|
|
88
|
+
}
|
|
89
|
+
this.#decision = next;
|
|
90
|
+
this.#fanOutAudit(next);
|
|
91
|
+
this.#bag.emit({ kind: "confirmed", decision: next });
|
|
92
|
+
return next;
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
const wrapped = error instanceof HonuaOperatorApprovalError
|
|
96
|
+
? error
|
|
97
|
+
: new HonuaOperatorApprovalError("approval confirm failed", {
|
|
98
|
+
cause: error,
|
|
99
|
+
detail: { operationId },
|
|
100
|
+
});
|
|
101
|
+
if (gen === this.#generation) {
|
|
102
|
+
this.#bag.emit({ kind: "error", error: wrapped });
|
|
103
|
+
}
|
|
104
|
+
throw wrapped;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
#fanOutAudit(decision) {
|
|
108
|
+
for (const entry of decision.audit) {
|
|
109
|
+
const key = `${decision.operationId}|${entry.at}|${entry.actor}|${entry.action}`;
|
|
110
|
+
if (this.#seenAudit.has(key))
|
|
111
|
+
continue;
|
|
112
|
+
this.#seenAudit.add(key);
|
|
113
|
+
emitTelemetryEvent(this.#telemetry, "approval-audit", undefined, {
|
|
114
|
+
operationId: decision.operationId,
|
|
115
|
+
actor: entry.actor,
|
|
116
|
+
action: entry.action,
|
|
117
|
+
reason: entry.reason,
|
|
118
|
+
at: entry.at,
|
|
119
|
+
});
|
|
120
|
+
this.#bag.emit({ kind: "audit", entry, decision });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiny shared subscribe/notify helper for operator controllers. Mirrors
|
|
3
|
+
* the listener-set pattern used by `HonuaMapRuntime` and
|
|
4
|
+
* `ExplorationContext` so a single embedder hook style works everywhere.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import type { OperatorTelemetry, OperatorTelemetryKind } from "../telemetry.js";
|
|
9
|
+
export type Unsubscribe = () => void;
|
|
10
|
+
export declare class ListenerBag<E> {
|
|
11
|
+
#private;
|
|
12
|
+
on(listener: (event: E) => void): Unsubscribe;
|
|
13
|
+
emit(event: E): void;
|
|
14
|
+
clear(): void;
|
|
15
|
+
get size(): number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Run an async operation with telemetry spans wrapped around it. Mirrors
|
|
19
|
+
* the before/after/error semantics of `HonuaRuntimeTelemetry`.
|
|
20
|
+
*/
|
|
21
|
+
export declare function withTelemetrySpan<T>(telemetry: OperatorTelemetry | undefined, kind: OperatorTelemetryKind, intentId: string | undefined, fn: () => Promise<T>, detail?: Record<string, unknown>): Promise<T>;
|
|
22
|
+
/**
|
|
23
|
+
* Telemetry counterpart for synchronous events that have no
|
|
24
|
+
* before/after wrap (e.g. an audit-record fan-out).
|
|
25
|
+
*/
|
|
26
|
+
export declare function emitTelemetryEvent(telemetry: OperatorTelemetry | undefined, kind: OperatorTelemetryKind, intentId: string | undefined, detail?: Record<string, unknown>): void;
|
|
27
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/operator/controllers/base.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAyB,MAAM,iBAAiB,CAAC;AAEvG,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAErC,qBAAa,WAAW,CAAC,CAAC;;IAGjB,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,WAAW;IAO7C,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAIpB,KAAK,IAAI,IAAI;IAIpB,IAAW,IAAI,IAAI,MAAM,CAExB;CACF;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,SAAS,EAAE,iBAAiB,GAAG,SAAS,EACxC,IAAI,EAAE,qBAAqB,EAC3B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC,CAaZ;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,iBAAiB,GAAG,SAAS,EACxC,IAAI,EAAE,qBAAqB,EAC3B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,IAAI,CAGN"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiny shared subscribe/notify helper for operator controllers. Mirrors
|
|
3
|
+
* the listener-set pattern used by `HonuaMapRuntime` and
|
|
4
|
+
* `ExplorationContext` so a single embedder hook style works everywhere.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
export class ListenerBag {
|
|
9
|
+
#listeners = new Set();
|
|
10
|
+
on(listener) {
|
|
11
|
+
this.#listeners.add(listener);
|
|
12
|
+
return () => {
|
|
13
|
+
this.#listeners.delete(listener);
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
emit(event) {
|
|
17
|
+
for (const listener of [...this.#listeners])
|
|
18
|
+
listener(event);
|
|
19
|
+
}
|
|
20
|
+
clear() {
|
|
21
|
+
this.#listeners.clear();
|
|
22
|
+
}
|
|
23
|
+
get size() {
|
|
24
|
+
return this.#listeners.size;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Run an async operation with telemetry spans wrapped around it. Mirrors
|
|
29
|
+
* the before/after/error semantics of `HonuaRuntimeTelemetry`.
|
|
30
|
+
*/
|
|
31
|
+
export async function withTelemetrySpan(telemetry, kind, intentId, fn, detail) {
|
|
32
|
+
const span = { kind, intentId, startedAt: Date.now(), detail };
|
|
33
|
+
telemetry?.before?.(span);
|
|
34
|
+
try {
|
|
35
|
+
const result = await fn();
|
|
36
|
+
const finishedAt = Date.now();
|
|
37
|
+
telemetry?.after?.({ ...span, finishedAt, durationMs: finishedAt - span.startedAt });
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
const finishedAt = Date.now();
|
|
42
|
+
telemetry?.error?.({ ...span, finishedAt, durationMs: finishedAt - span.startedAt, error });
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Telemetry counterpart for synchronous events that have no
|
|
48
|
+
* before/after wrap (e.g. an audit-record fan-out).
|
|
49
|
+
*/
|
|
50
|
+
export function emitTelemetryEvent(telemetry, kind, intentId, detail) {
|
|
51
|
+
const startedAt = Date.now();
|
|
52
|
+
telemetry?.after?.({ kind, intentId, startedAt, finishedAt: startedAt, durationMs: 0, detail });
|
|
53
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `BuilderWorkspaceController` — mirrors `MapWorkspaceController` for an
|
|
3
|
+
* `AppPackage`. The controller does not execute the app; it surfaces a
|
|
4
|
+
* `PreviewHandle` carrying the bundle URL the embedder mounts inside an
|
|
5
|
+
* `<iframe sandbox>`.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import type { HonuaMapPackage } from "../../runtime/index.js";
|
|
10
|
+
import type { OperatorClient } from "../client.js";
|
|
11
|
+
import { HonuaOperatorAppError } from "../errors.js";
|
|
12
|
+
import type { OperatorTelemetry } from "../telemetry.js";
|
|
13
|
+
import type { AppPackage, ArtifactRef } from "../workspace/types.js";
|
|
14
|
+
import { type Unsubscribe } from "./base.js";
|
|
15
|
+
export interface PreviewHandle {
|
|
16
|
+
readonly url: string | undefined;
|
|
17
|
+
readonly assets: ReadonlyArray<ArtifactRef>;
|
|
18
|
+
readonly mapPackage: HonuaMapPackage | undefined;
|
|
19
|
+
}
|
|
20
|
+
export type BuilderWorkspaceEvent = {
|
|
21
|
+
kind: "package-loaded";
|
|
22
|
+
pkg: AppPackage;
|
|
23
|
+
} | {
|
|
24
|
+
kind: "package-refined";
|
|
25
|
+
pkg: AppPackage;
|
|
26
|
+
} | {
|
|
27
|
+
kind: "map-bound";
|
|
28
|
+
pkg: HonuaMapPackage;
|
|
29
|
+
} | {
|
|
30
|
+
kind: "error";
|
|
31
|
+
error: HonuaOperatorAppError;
|
|
32
|
+
};
|
|
33
|
+
export interface BuilderWorkspaceControllerOptions {
|
|
34
|
+
client: OperatorClient;
|
|
35
|
+
telemetry?: OperatorTelemetry;
|
|
36
|
+
/**
|
|
37
|
+
* Optional adapter that picks the entry-point URL out of an
|
|
38
|
+
* `AppPackage`. Defaults to the first asset whose `kind === "app-package"`,
|
|
39
|
+
* falling back to the first asset with a `url`.
|
|
40
|
+
*/
|
|
41
|
+
resolveEntryUrl?: (pkg: AppPackage) => string | undefined;
|
|
42
|
+
}
|
|
43
|
+
export declare class BuilderWorkspaceController {
|
|
44
|
+
#private;
|
|
45
|
+
constructor(options: BuilderWorkspaceControllerOptions);
|
|
46
|
+
get appPackage(): AppPackage | undefined;
|
|
47
|
+
on(listener: (event: BuilderWorkspaceEvent) => void): Unsubscribe;
|
|
48
|
+
bindIntent(intentId: string): void;
|
|
49
|
+
loadPackage(pkg: AppPackage): Promise<void>;
|
|
50
|
+
bindMapPackage(pkg: HonuaMapPackage): void;
|
|
51
|
+
preview(): PreviewHandle;
|
|
52
|
+
refine(prompt: string, signal?: AbortSignal): Promise<AppPackage>;
|
|
53
|
+
dispose(): void;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=builder-workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder-workspace.d.ts","sourceRoot":"","sources":["../../../../src/operator/controllers/builder-workspace.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAe,KAAK,WAAW,EAAqB,MAAM,WAAW,CAAC;AAE7E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,eAAe,GAAG,SAAS,CAAC;CAClD;AAED,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,GAAG,EAAE,UAAU,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,GAAG,EAAE,UAAU,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,eAAe,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,qBAAqB,CAAA;CAAE,CAAC;AAEpD,MAAM,WAAW,iCAAiC;IAChD,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,MAAM,GAAG,SAAS,CAAC;CAC3D;AAQD,qBAAa,0BAA0B;;gBAclB,OAAO,EAAE,iCAAiC;IAM7D,IAAW,UAAU,IAAI,UAAU,GAAG,SAAS,CAE9C;IAEM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,GAAG,WAAW;IAIjE,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI5B,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBjD,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAK1C,OAAO,IAAI,aAAa;IAWlB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAiCvE,OAAO,IAAI,IAAI;CAOvB"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `BuilderWorkspaceController` — mirrors `MapWorkspaceController` for an
|
|
3
|
+
* `AppPackage`. The controller does not execute the app; it surfaces a
|
|
4
|
+
* `PreviewHandle` carrying the bundle URL the embedder mounts inside an
|
|
5
|
+
* `<iframe sandbox>`.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { HonuaOperatorAppError } from "../errors.js";
|
|
10
|
+
import { ListenerBag, withTelemetrySpan } from "./base.js";
|
|
11
|
+
const defaultEntryUrl = (pkg) => {
|
|
12
|
+
const appAsset = pkg.assets.find((asset) => asset.kind === "app-package" && asset.url);
|
|
13
|
+
if (appAsset?.url)
|
|
14
|
+
return appAsset.url;
|
|
15
|
+
return pkg.assets.find((asset) => asset.url)?.url;
|
|
16
|
+
};
|
|
17
|
+
export class BuilderWorkspaceController {
|
|
18
|
+
#client;
|
|
19
|
+
#telemetry;
|
|
20
|
+
#resolveEntryUrl;
|
|
21
|
+
#bag = new ListenerBag();
|
|
22
|
+
#pkg;
|
|
23
|
+
#boundMap;
|
|
24
|
+
#activeIntentId;
|
|
25
|
+
// Same generation pattern as the other controllers: bumped on
|
|
26
|
+
// every loadPackage()/refine()/dispose(), captured by each
|
|
27
|
+
// operation, and consulted at resolution time so an older
|
|
28
|
+
// refineApp() cannot overwrite a newer package.
|
|
29
|
+
#opGeneration = 0;
|
|
30
|
+
constructor(options) {
|
|
31
|
+
this.#client = options.client;
|
|
32
|
+
this.#telemetry = options.telemetry;
|
|
33
|
+
this.#resolveEntryUrl = options.resolveEntryUrl ?? defaultEntryUrl;
|
|
34
|
+
}
|
|
35
|
+
get appPackage() {
|
|
36
|
+
return this.#pkg;
|
|
37
|
+
}
|
|
38
|
+
on(listener) {
|
|
39
|
+
return this.#bag.on(listener);
|
|
40
|
+
}
|
|
41
|
+
bindIntent(intentId) {
|
|
42
|
+
this.#activeIntentId = intentId;
|
|
43
|
+
}
|
|
44
|
+
async loadPackage(pkg) {
|
|
45
|
+
const gen = ++this.#opGeneration;
|
|
46
|
+
// Clear the prior map binding eagerly so the next preview() call
|
|
47
|
+
// never returns a previous execution's map. The workspace re-binds
|
|
48
|
+
// the map within the same execution-success handler when the new
|
|
49
|
+
// result actually carries one; an app-only result therefore
|
|
50
|
+
// produces a preview with no `mapPackage`.
|
|
51
|
+
this.#boundMap = undefined;
|
|
52
|
+
return withTelemetrySpan(this.#telemetry, "app-load", this.#activeIntentId, async () => {
|
|
53
|
+
if (gen !== this.#opGeneration)
|
|
54
|
+
return;
|
|
55
|
+
this.#pkg = pkg;
|
|
56
|
+
this.#bag.emit({ kind: "package-loaded", pkg });
|
|
57
|
+
}, { appPackageId: pkg.id });
|
|
58
|
+
}
|
|
59
|
+
bindMapPackage(pkg) {
|
|
60
|
+
this.#boundMap = pkg;
|
|
61
|
+
this.#bag.emit({ kind: "map-bound", pkg });
|
|
62
|
+
}
|
|
63
|
+
preview() {
|
|
64
|
+
if (!this.#pkg) {
|
|
65
|
+
throw new HonuaOperatorAppError("preview called before loadPackage");
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
url: this.#resolveEntryUrl(this.#pkg),
|
|
69
|
+
assets: this.#pkg.assets,
|
|
70
|
+
mapPackage: this.#boundMap,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
async refine(prompt, signal) {
|
|
74
|
+
if (!this.#activeIntentId) {
|
|
75
|
+
throw new HonuaOperatorAppError("refine requires bindIntent before invocation");
|
|
76
|
+
}
|
|
77
|
+
const intentId = this.#activeIntentId;
|
|
78
|
+
const gen = ++this.#opGeneration;
|
|
79
|
+
return withTelemetrySpan(this.#telemetry, "app-refine", intentId, async () => {
|
|
80
|
+
try {
|
|
81
|
+
const next = await this.#client.operator.refineApp(intentId, prompt, signal);
|
|
82
|
+
if (gen !== this.#opGeneration)
|
|
83
|
+
return next;
|
|
84
|
+
this.#pkg = next;
|
|
85
|
+
this.#bag.emit({ kind: "package-refined", pkg: next });
|
|
86
|
+
return next;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
const wrapped = new HonuaOperatorAppError("app refine failed", {
|
|
90
|
+
intentId,
|
|
91
|
+
cause: error,
|
|
92
|
+
detail: { prompt },
|
|
93
|
+
});
|
|
94
|
+
if (gen === this.#opGeneration) {
|
|
95
|
+
this.#bag.emit({ kind: "error", error: wrapped });
|
|
96
|
+
}
|
|
97
|
+
throw wrapped;
|
|
98
|
+
}
|
|
99
|
+
}, { prompt });
|
|
100
|
+
}
|
|
101
|
+
dispose() {
|
|
102
|
+
this.#opGeneration += 1;
|
|
103
|
+
this.#pkg = undefined;
|
|
104
|
+
this.#boundMap = undefined;
|
|
105
|
+
this.#activeIntentId = undefined;
|
|
106
|
+
this.#bag.clear();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ChatController` — turn ledger and intent-draft pump for the freeform
|
|
3
|
+
* request surface. The controller owns no streaming token assembly logic
|
|
4
|
+
* beyond accumulating `ChatChunk.delta` strings; the transport (an
|
|
5
|
+
* `AsyncIterable<ChatChunk>` from the `OperatorClient`) is responsible
|
|
6
|
+
* for chunking.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import type { OperatorClient } from "../client.js";
|
|
11
|
+
import { HonuaOperatorIntentError } from "../errors.js";
|
|
12
|
+
import type { OperatorTelemetry } from "../telemetry.js";
|
|
13
|
+
import type { AnalysisIntent, BuilderIntent, ConversationTurn } from "../workspace/types.js";
|
|
14
|
+
import { type Unsubscribe } from "./base.js";
|
|
15
|
+
export type ChatEvent = {
|
|
16
|
+
kind: "turn-updated";
|
|
17
|
+
turn: ConversationTurn;
|
|
18
|
+
} | {
|
|
19
|
+
kind: "intent-drafted";
|
|
20
|
+
intent: AnalysisIntent | BuilderIntent;
|
|
21
|
+
} | {
|
|
22
|
+
kind: "error";
|
|
23
|
+
error: HonuaOperatorIntentError;
|
|
24
|
+
};
|
|
25
|
+
export type DecorateTurn = (turn: ConversationTurn) => ConversationTurn;
|
|
26
|
+
export interface ChatControllerOptions {
|
|
27
|
+
client: OperatorClient;
|
|
28
|
+
telemetry?: OperatorTelemetry;
|
|
29
|
+
/**
|
|
30
|
+
* Pure transformation applied to a turn snapshot before the
|
|
31
|
+
* `turn-updated` event fires. Cannot mutate controller state.
|
|
32
|
+
*/
|
|
33
|
+
decorate?: DecorateTurn;
|
|
34
|
+
/** Fixture seam for deterministic ids in tests. */
|
|
35
|
+
generateTurnId?: () => string;
|
|
36
|
+
/** Fixture seam for deterministic timestamps in tests. */
|
|
37
|
+
now?: () => number;
|
|
38
|
+
}
|
|
39
|
+
export declare class ChatController {
|
|
40
|
+
#private;
|
|
41
|
+
constructor(options: ChatControllerOptions);
|
|
42
|
+
get turns(): ReadonlyArray<ConversationTurn>;
|
|
43
|
+
on(listener: (event: ChatEvent) => void): Unsubscribe;
|
|
44
|
+
abort(): void;
|
|
45
|
+
/**
|
|
46
|
+
* Send a freeform user message and stream the agent reply. Resolves
|
|
47
|
+
* with the final agent turn (intent draft inlined) when the stream
|
|
48
|
+
* completes; rejects with `HonuaOperatorIntentError` on transport
|
|
49
|
+
* failure.
|
|
50
|
+
*
|
|
51
|
+
* If a previous send is still in flight, it is aborted before this
|
|
52
|
+
* one starts. The active controller identity is the per-send token —
|
|
53
|
+
* stream updates, `intent-drafted`, and `error` emissions are gated
|
|
54
|
+
* on it so a slow earlier stream cannot drive workspace state back
|
|
55
|
+
* to a stale intent after a newer send has taken over.
|
|
56
|
+
*/
|
|
57
|
+
send(text: string): Promise<ConversationTurn>;
|
|
58
|
+
/** Append a system message (e.g. an embedder-supplied notice). */
|
|
59
|
+
appendSystem(content: string): ConversationTurn;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../../src/operator/controllers/chat.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAa,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAY,MAAM,uBAAuB,CAAC;AACvG,OAAO,EAAe,KAAK,WAAW,EAAqB,MAAM,WAAW,CAAC;AAE7E,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,cAAc,GAAG,aAAa,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,wBAAwB,CAAA;CAAE,CAAC;AAEvD,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,gBAAgB,KAAK,gBAAgB,CAAC;AAExE,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,mDAAmD;IACnD,cAAc,CAAC,EAAE,MAAM,MAAM,CAAC;IAC9B,0DAA0D;IAC1D,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AASD,qBAAa,cAAc;;gBAUN,OAAO,EAAE,qBAAqB;IAQjD,IAAW,KAAK,IAAI,aAAa,CAAC,gBAAgB,CAAC,CAElD;IAEM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,WAAW;IAIrD,KAAK,IAAI,IAAI;IAKpB;;;;;;;;;;;OAWG;IACU,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuF1D,kEAAkE;IAC3D,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB;CAqBvD"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ChatController` — turn ledger and intent-draft pump for the freeform
|
|
3
|
+
* request surface. The controller owns no streaming token assembly logic
|
|
4
|
+
* beyond accumulating `ChatChunk.delta` strings; the transport (an
|
|
5
|
+
* `AsyncIterable<ChatChunk>` from the `OperatorClient`) is responsible
|
|
6
|
+
* for chunking.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import { HonuaOperatorIntentError } from "../errors.js";
|
|
11
|
+
import { ListenerBag, withTelemetrySpan } from "./base.js";
|
|
12
|
+
let chatTurnCounter = 0;
|
|
13
|
+
function defaultTurnId() {
|
|
14
|
+
chatTurnCounter += 1;
|
|
15
|
+
return `turn-${Date.now().toString(36)}-${chatTurnCounter.toString(36)}`;
|
|
16
|
+
}
|
|
17
|
+
export class ChatController {
|
|
18
|
+
#client;
|
|
19
|
+
#telemetry;
|
|
20
|
+
#decorate;
|
|
21
|
+
#generateTurnId;
|
|
22
|
+
#now;
|
|
23
|
+
#bag = new ListenerBag();
|
|
24
|
+
#turns = [];
|
|
25
|
+
#abortController;
|
|
26
|
+
constructor(options) {
|
|
27
|
+
this.#client = options.client;
|
|
28
|
+
this.#telemetry = options.telemetry;
|
|
29
|
+
this.#decorate = options.decorate;
|
|
30
|
+
this.#generateTurnId = options.generateTurnId ?? defaultTurnId;
|
|
31
|
+
this.#now = options.now ?? (() => Date.now());
|
|
32
|
+
}
|
|
33
|
+
get turns() {
|
|
34
|
+
return this.#turns;
|
|
35
|
+
}
|
|
36
|
+
on(listener) {
|
|
37
|
+
return this.#bag.on(listener);
|
|
38
|
+
}
|
|
39
|
+
abort() {
|
|
40
|
+
this.#abortController?.abort();
|
|
41
|
+
this.#abortController = undefined;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Send a freeform user message and stream the agent reply. Resolves
|
|
45
|
+
* with the final agent turn (intent draft inlined) when the stream
|
|
46
|
+
* completes; rejects with `HonuaOperatorIntentError` on transport
|
|
47
|
+
* failure.
|
|
48
|
+
*
|
|
49
|
+
* If a previous send is still in flight, it is aborted before this
|
|
50
|
+
* one starts. The active controller identity is the per-send token —
|
|
51
|
+
* stream updates, `intent-drafted`, and `error` emissions are gated
|
|
52
|
+
* on it so a slow earlier stream cannot drive workspace state back
|
|
53
|
+
* to a stale intent after a newer send has taken over.
|
|
54
|
+
*/
|
|
55
|
+
async send(text) {
|
|
56
|
+
this.#abortController?.abort();
|
|
57
|
+
const userTurn = this.#appendTurn({ role: "user", content: text });
|
|
58
|
+
const agentTurnId = this.#generateTurnId();
|
|
59
|
+
const startedAt = this.#now();
|
|
60
|
+
const agentIndex = this.#turns.push({
|
|
61
|
+
turnId: agentTurnId,
|
|
62
|
+
role: "agent",
|
|
63
|
+
content: "",
|
|
64
|
+
startedAt,
|
|
65
|
+
}) - 1;
|
|
66
|
+
this.#emitTurnUpdated(this.#turns[agentIndex]);
|
|
67
|
+
const controller = new AbortController();
|
|
68
|
+
this.#abortController = controller;
|
|
69
|
+
const signal = controller.signal;
|
|
70
|
+
const isCurrent = () => this.#abortController === controller;
|
|
71
|
+
try {
|
|
72
|
+
return await withTelemetrySpan(this.#telemetry, "chat-turn", undefined, async () => {
|
|
73
|
+
let intentDraft;
|
|
74
|
+
let accumulated = "";
|
|
75
|
+
let lastChunk;
|
|
76
|
+
for await (const chunk of this.#client.operator.chat(text, signal)) {
|
|
77
|
+
if (!isCurrent())
|
|
78
|
+
return this.#turns[agentIndex];
|
|
79
|
+
lastChunk = chunk;
|
|
80
|
+
accumulated += chunk.delta;
|
|
81
|
+
if (chunk.intentDraft)
|
|
82
|
+
intentDraft = chunk.intentDraft;
|
|
83
|
+
const updated = {
|
|
84
|
+
turnId: agentTurnId,
|
|
85
|
+
role: "agent",
|
|
86
|
+
content: accumulated,
|
|
87
|
+
startedAt,
|
|
88
|
+
...(chunk.done ? { finishedAt: this.#now() } : {}),
|
|
89
|
+
...(intentDraft ? { intentDraft } : {}),
|
|
90
|
+
};
|
|
91
|
+
this.#turns[agentIndex] = updated;
|
|
92
|
+
this.#emitTurnUpdated(updated);
|
|
93
|
+
if (chunk.done)
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
if (!isCurrent())
|
|
97
|
+
return this.#turns[agentIndex];
|
|
98
|
+
if (!lastChunk?.done) {
|
|
99
|
+
// Stream ended without an explicit terminal chunk — close
|
|
100
|
+
// the turn so consumers always observe a `finishedAt`.
|
|
101
|
+
const closed = {
|
|
102
|
+
...this.#turns[agentIndex],
|
|
103
|
+
finishedAt: this.#now(),
|
|
104
|
+
};
|
|
105
|
+
this.#turns[agentIndex] = closed;
|
|
106
|
+
this.#emitTurnUpdated(closed);
|
|
107
|
+
}
|
|
108
|
+
if (intentDraft) {
|
|
109
|
+
this.#bag.emit({ kind: "intent-drafted", intent: intentDraft });
|
|
110
|
+
}
|
|
111
|
+
// Touch userTurn so the variable is observed even when no
|
|
112
|
+
// intermediate observer reads it (silences strict-unused).
|
|
113
|
+
void userTurn;
|
|
114
|
+
return this.#turns[agentIndex];
|
|
115
|
+
}, { turnId: agentTurnId });
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
const wrapped = error instanceof HonuaOperatorIntentError
|
|
119
|
+
? error
|
|
120
|
+
: new HonuaOperatorIntentError("chat send failed", { cause: error, detail: { turnId: agentTurnId } });
|
|
121
|
+
// Only emit on the bag if this send still owns the surface; a
|
|
122
|
+
// superseded send is expected to throw (its consumer awaits the
|
|
123
|
+
// returned promise) but should not pollute the event stream.
|
|
124
|
+
if (isCurrent()) {
|
|
125
|
+
this.#bag.emit({ kind: "error", error: wrapped });
|
|
126
|
+
}
|
|
127
|
+
throw wrapped;
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
if (isCurrent())
|
|
131
|
+
this.#abortController = undefined;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/** Append a system message (e.g. an embedder-supplied notice). */
|
|
135
|
+
appendSystem(content) {
|
|
136
|
+
return this.#appendTurn({ role: "system", content });
|
|
137
|
+
}
|
|
138
|
+
#appendTurn(input) {
|
|
139
|
+
const turn = {
|
|
140
|
+
turnId: this.#generateTurnId(),
|
|
141
|
+
role: input.role,
|
|
142
|
+
content: input.content,
|
|
143
|
+
startedAt: this.#now(),
|
|
144
|
+
finishedAt: this.#now(),
|
|
145
|
+
};
|
|
146
|
+
this.#turns.push(turn);
|
|
147
|
+
this.#emitTurnUpdated(turn);
|
|
148
|
+
return turn;
|
|
149
|
+
}
|
|
150
|
+
#emitTurnUpdated(turn) {
|
|
151
|
+
const decorated = this.#decorate ? this.#decorate(turn) : turn;
|
|
152
|
+
this.#bag.emit({ kind: "turn-updated", turn: decorated });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ClarificationController` — typed form derived from
|
|
3
|
+
* `intent.clarifications[]`. Submission is a pass-through to
|
|
4
|
+
* `OperatorClient.operator.clarify` and yields a fresh intent revision.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import type { OperatorClient } from "../client.js";
|
|
9
|
+
import { HonuaOperatorIntentError } from "../errors.js";
|
|
10
|
+
import type { OperatorTelemetry } from "../telemetry.js";
|
|
11
|
+
import type { AnalysisIntent, BuilderIntent, ClarificationField } from "../workspace/types.js";
|
|
12
|
+
import { type Unsubscribe } from "./base.js";
|
|
13
|
+
export interface ClarificationState {
|
|
14
|
+
readonly intent: AnalysisIntent | BuilderIntent | undefined;
|
|
15
|
+
readonly fields: ReadonlyArray<ClarificationField>;
|
|
16
|
+
readonly answers: ReadonlyMap<string, string>;
|
|
17
|
+
readonly submitting: boolean;
|
|
18
|
+
}
|
|
19
|
+
export type ClarificationEvent = {
|
|
20
|
+
kind: "loaded";
|
|
21
|
+
intent: AnalysisIntent | BuilderIntent;
|
|
22
|
+
} | {
|
|
23
|
+
kind: "answer-changed";
|
|
24
|
+
fieldId: string;
|
|
25
|
+
value: string;
|
|
26
|
+
} | {
|
|
27
|
+
kind: "submitted";
|
|
28
|
+
intent: AnalysisIntent | BuilderIntent;
|
|
29
|
+
} | {
|
|
30
|
+
kind: "error";
|
|
31
|
+
error: HonuaOperatorIntentError;
|
|
32
|
+
};
|
|
33
|
+
export interface ClarificationControllerOptions {
|
|
34
|
+
client: OperatorClient;
|
|
35
|
+
telemetry?: OperatorTelemetry;
|
|
36
|
+
}
|
|
37
|
+
export declare class ClarificationController {
|
|
38
|
+
#private;
|
|
39
|
+
constructor(options: ClarificationControllerOptions);
|
|
40
|
+
get state(): ClarificationState;
|
|
41
|
+
on(listener: (event: ClarificationEvent) => void): Unsubscribe;
|
|
42
|
+
load(intent: AnalysisIntent | BuilderIntent): void;
|
|
43
|
+
setAnswer(fieldId: string, value: string): void;
|
|
44
|
+
/**
|
|
45
|
+
* Submit the current answers and resolve with the revised intent.
|
|
46
|
+
* Missing required answers reject with `HonuaOperatorIntentError`
|
|
47
|
+
* before any network call so the controller never depends on the
|
|
48
|
+
* server for required-field validation.
|
|
49
|
+
*/
|
|
50
|
+
submit(signal?: AbortSignal): Promise<AnalysisIntent | BuilderIntent>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=clarification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clarification.d.ts","sourceRoot":"","sources":["../../../../src/operator/controllers/clarification.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAuB,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACpH,OAAO,EAAe,KAAK,WAAW,EAAqB,MAAM,WAAW,CAAC;AAE7E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,aAAa,GAAG,SAAS,CAAC;IAC5D,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;IACnD,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,cAAc,GAAG,aAAa,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,cAAc,GAAG,aAAa,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,wBAAwB,CAAA;CAAE,CAAC;AAEvD,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B;AAED,qBAAa,uBAAuB;;gBAaf,OAAO,EAAE,8BAA8B;IAK1D,IAAW,KAAK,IAAI,kBAAkB,CAOrC;IAEM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAAG,WAAW;IAI9D,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,aAAa,GAAG,IAAI;IAYlD,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAetD;;;;;OAKG;IACU,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,GAAG,aAAa,CAAC;CAwDnF"}
|