@honua/app-platform 0.1.7-beta.0 → 0.1.9-beta.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 (181) hide show
  1. package/control-plane/admin-client.d.ts +87 -0
  2. package/control-plane/admin-client.d.ts.map +1 -0
  3. package/control-plane/admin-client.js +169 -0
  4. package/control-plane/client.d.ts.map +1 -1
  5. package/control-plane/client.js +21 -3
  6. package/control-plane/commands/catalog.d.ts +133 -0
  7. package/control-plane/commands/catalog.d.ts.map +1 -0
  8. package/control-plane/commands/catalog.js +353 -0
  9. package/control-plane/commands/errors.d.ts +96 -0
  10. package/control-plane/commands/errors.d.ts.map +1 -0
  11. package/control-plane/commands/errors.js +130 -0
  12. package/control-plane/commands/identity.d.ts +71 -0
  13. package/control-plane/commands/identity.d.ts.map +1 -0
  14. package/control-plane/commands/identity.js +0 -0
  15. package/control-plane/commands/index.d.ts +39 -0
  16. package/control-plane/commands/index.d.ts.map +1 -0
  17. package/control-plane/commands/index.js +34 -0
  18. package/control-plane/commands/runtime.d.ts +146 -0
  19. package/control-plane/commands/runtime.d.ts.map +1 -0
  20. package/control-plane/commands/runtime.js +318 -0
  21. package/control-plane/commands/types.d.ts +226 -0
  22. package/control-plane/commands/types.d.ts.map +1 -0
  23. package/control-plane/commands/types.js +30 -0
  24. package/control-plane/commands/validate.d.ts +27 -0
  25. package/control-plane/commands/validate.d.ts.map +1 -0
  26. package/control-plane/commands/validate.js +132 -0
  27. package/control-plane/generated/admin-api.d.ts +30263 -0
  28. package/control-plane/generated/admin-api.d.ts.map +1 -0
  29. package/control-plane/generated/admin-api.js +5 -0
  30. package/control-plane/generated/admin-operations.d.ts +4053 -0
  31. package/control-plane/generated/admin-operations.d.ts.map +1 -0
  32. package/control-plane/generated/admin-operations.js +820 -0
  33. package/control-plane/index.d.ts +11 -0
  34. package/control-plane/index.d.ts.map +1 -1
  35. package/control-plane/index.js +8 -0
  36. package/control-plane/types.d.ts +14 -0
  37. package/control-plane/types.d.ts.map +1 -1
  38. package/controls/catalog.d.ts.map +1 -1
  39. package/controls/catalog.js +12 -1
  40. package/controls/qualification.d.ts.map +1 -1
  41. package/controls/qualification.js +61 -2
  42. package/core/client.js +1 -1
  43. package/core/credential-redaction.d.ts +163 -0
  44. package/core/credential-redaction.d.ts.map +1 -0
  45. package/core/credential-redaction.js +389 -0
  46. package/core/error-classifications.d.ts +15 -0
  47. package/core/error-classifications.d.ts.map +1 -1
  48. package/core/error-classifications.js +15 -0
  49. package/core/error-code-registry.d.ts +15 -0
  50. package/core/error-code-registry.d.ts.map +1 -1
  51. package/core/error-code-registry.js +15 -0
  52. package/core/grpc-adapter.d.ts +2 -2
  53. package/core/grpc-adapter.d.ts.map +1 -1
  54. package/core/grpc-adapter.js +30 -6
  55. package/core/job-run-errors.d.ts +10 -0
  56. package/core/job-run-errors.d.ts.map +1 -0
  57. package/core/job-run-errors.js +14 -0
  58. package/core/job-run-lifecycle.d.ts +34 -0
  59. package/core/job-run-lifecycle.d.ts.map +1 -0
  60. package/core/job-run-lifecycle.js +193 -0
  61. package/core/ogc-processes.d.ts +38 -31
  62. package/core/ogc-processes.d.ts.map +1 -1
  63. package/core/ogc-processes.js +123 -173
  64. package/core/process-runner.js +15 -100
  65. package/core/surfaces.d.ts +2 -8
  66. package/core/surfaces.d.ts.map +1 -1
  67. package/core/surfaces.js +21 -112
  68. package/core/types.d.ts +7 -6
  69. package/core/types.d.ts.map +1 -1
  70. package/gen/geospatial/v1/common_pb.d.ts +514 -0
  71. package/gen/geospatial/v1/common_pb.d.ts.map +1 -0
  72. package/gen/geospatial/v1/common_pb.js +335 -0
  73. package/gen/geospatial/v1/execution_types_pb.d.ts +1186 -0
  74. package/gen/geospatial/v1/execution_types_pb.d.ts.map +1 -0
  75. package/gen/geospatial/v1/execution_types_pb.js +396 -0
  76. package/gen/geospatial/v1/feature_service_pb.d.ts +403 -0
  77. package/gen/geospatial/v1/feature_service_pb.d.ts.map +1 -0
  78. package/gen/geospatial/v1/feature_service_pb.js +47 -0
  79. package/gen/geospatial/v1/index.d.ts +5 -0
  80. package/gen/geospatial/v1/index.d.ts.map +1 -0
  81. package/gen/geospatial/v1/index.js +9 -0
  82. package/gen/geospatial/v1/spatial_types_pb.d.ts +285 -0
  83. package/gen/geospatial/v1/spatial_types_pb.d.ts.map +1 -0
  84. package/gen/geospatial/v1/spatial_types_pb.js +58 -0
  85. package/gen/geospatial/v1/workspace_artifact_types_pb.d.ts +379 -0
  86. package/gen/geospatial/v1/workspace_artifact_types_pb.d.ts.map +1 -0
  87. package/gen/geospatial/v1/workspace_artifact_types_pb.js +151 -0
  88. package/generated-app/projection.d.ts.map +1 -1
  89. package/generated-app/projection.js +10 -1
  90. package/operate/client.d.ts +11 -1
  91. package/operate/client.d.ts.map +1 -1
  92. package/operate/client.js +39 -2
  93. package/operate/index.d.ts +1 -1
  94. package/operate/index.d.ts.map +1 -1
  95. package/operate/types.d.ts +40 -6
  96. package/operate/types.d.ts.map +1 -1
  97. package/package.json +2 -2
  98. package/query-planner/grpc.d.ts +4 -4
  99. package/query-planner/grpc.d.ts.map +1 -1
  100. package/query-planner/grpc.js +11 -11
  101. package/query-planner/types.d.ts +4 -4
  102. package/query-planner/types.d.ts.map +1 -1
  103. package/runtime/errors.d.ts +1 -1
  104. package/runtime/errors.d.ts.map +1 -1
  105. package/runtime/errors.js +2 -0
  106. package/runtime/generated/map-package-schema-meta.d.ts +11 -0
  107. package/runtime/generated/map-package-schema-meta.d.ts.map +1 -0
  108. package/runtime/generated/map-package-schema-meta.js +12 -0
  109. package/runtime/generated/map-package-schema-validator.d.ts +16 -0
  110. package/runtime/generated/map-package-schema-validator.d.ts.map +1 -0
  111. package/runtime/generated/map-package-schema-validator.js +1422 -0
  112. package/runtime/index.d.ts +5 -1
  113. package/runtime/index.d.ts.map +1 -1
  114. package/runtime/index.js +6 -0
  115. package/runtime/map-package-export.d.ts +151 -0
  116. package/runtime/map-package-export.d.ts.map +1 -0
  117. package/runtime/map-package-export.js +636 -0
  118. package/runtime/map-package-validation.d.ts +21 -1
  119. package/runtime/map-package-validation.d.ts.map +1 -1
  120. package/runtime/map-package-validation.js +132 -95
  121. package/runtime/map-package.d.ts +80 -0
  122. package/runtime/map-package.d.ts.map +1 -1
  123. package/scene-workspace/cesium-adapter.d.ts +8 -8
  124. package/scene-workspace/cesium-adapter.d.ts.map +1 -1
  125. package/scene-workspace/cesium-adapter.js +31 -18
  126. package/scene-workspace/primitives.d.ts.map +1 -1
  127. package/scene-workspace/primitives.js +9 -6
  128. package/scene-workspace/source-to-cesium.js +1 -1
  129. package/studio/chart-spec.d.ts +6 -6
  130. package/studio/chart-spec.d.ts.map +1 -1
  131. package/studio/chart-spec.js +6 -6
  132. package/studio/index.d.ts +17 -7
  133. package/studio/index.d.ts.map +1 -1
  134. package/studio/index.js +15 -5
  135. package/studio/lifecycle-client.d.ts +262 -22
  136. package/studio/lifecycle-client.d.ts.map +1 -1
  137. package/studio/lifecycle-client.js +524 -24
  138. package/studio/lifecycle-errors.d.ts +8 -2
  139. package/studio/lifecycle-errors.d.ts.map +1 -1
  140. package/studio/lifecycle-errors.js +6 -1
  141. package/studio/lifecycle-types.d.ts +228 -8
  142. package/studio/lifecycle-types.d.ts.map +1 -1
  143. package/studio/publication-status.d.ts +55 -0
  144. package/studio/publication-status.d.ts.map +1 -0
  145. package/studio/publication-status.js +103 -0
  146. package/web-components/application-context.d.ts +186 -0
  147. package/web-components/application-context.d.ts.map +1 -0
  148. package/web-components/application-context.js +429 -0
  149. package/web-components/elements.d.ts +10 -1
  150. package/web-components/elements.d.ts.map +1 -1
  151. package/web-components/elements.js +187 -7
  152. package/web-components/export-redaction.d.ts +11 -102
  153. package/web-components/export-redaction.d.ts.map +1 -1
  154. package/web-components/export-redaction.js +7 -260
  155. package/web-components/feature-editor-offline.d.ts +32 -0
  156. package/web-components/feature-editor-offline.d.ts.map +1 -0
  157. package/web-components/feature-editor-offline.js +115 -0
  158. package/web-components/feature-editor-workflow.d.ts +85 -22
  159. package/web-components/feature-editor-workflow.d.ts.map +1 -1
  160. package/web-components/feature-editor-workflow.js +240 -0
  161. package/web-components/feature-editor.d.ts +20 -6
  162. package/web-components/feature-editor.d.ts.map +1 -1
  163. package/web-components/feature-editor.js +159 -7
  164. package/web-components/feature-inspection.d.ts +287 -0
  165. package/web-components/feature-inspection.d.ts.map +1 -0
  166. package/web-components/feature-inspection.js +1464 -0
  167. package/web-components/feature-mutation.d.ts +77 -0
  168. package/web-components/feature-mutation.d.ts.map +1 -0
  169. package/web-components/feature-mutation.js +137 -0
  170. package/web-components/feature-table-engine.d.ts +94 -4
  171. package/web-components/feature-table-engine.d.ts.map +1 -1
  172. package/web-components/feature-table-engine.js +365 -18
  173. package/web-components/feature-table-view.d.ts +35 -1
  174. package/web-components/feature-table-view.d.ts.map +1 -1
  175. package/web-components/feature-table-view.js +128 -12
  176. package/web-components/index.d.ts +14 -6
  177. package/web-components/index.d.ts.map +1 -1
  178. package/web-components/index.js +8 -2
  179. package/gen/honua/v1/feature_service_pb.d.ts +0 -918
  180. package/gen/honua/v1/feature_service_pb.d.ts.map +0 -1
  181. package/gen/honua/v1/feature_service_pb.js +0 -375
@@ -3,6 +3,7 @@ import { renderCspSafeShadowHtml } from "./csp-styles.js";
3
3
  import { redactHonuaExportText } from "./export-redaction.js";
4
4
  import { HONUA_EXPORT_KINDS, approximateHonuaScaleLabel, createBrowserPrintExportAdapter, runHonuaExport, } from "./export.js";
5
5
  import { HonuaFeatureEditorElement, } from "./feature-editor.js";
6
+ import { HonuaFeatureInspectionElement } from "./feature-inspection.js";
6
7
  import { featureTableFocusMoveForKey, featureTableGridHtml, featureTableGridStyles, featureTableViewModel, legacyFeatureTableViewModel, } from "./feature-table-view.js";
7
8
  import { HonuaMapLibreRenderer } from "./maplibre-renderer.js";
8
9
  import { HonuaMeasurementElement } from "./measurement.js";
@@ -684,7 +685,7 @@ export class HonuaLegendElement extends HonuaElementBase {
684
685
  */
685
686
  export class HonuaFeatureTableElement extends HonuaElementBase {
686
687
  static get observedAttributes() {
687
- return ["for", "source", "fields", "page-size", "filter-text", "label", "row-height"];
688
+ return ["for", "source", "fields", "page-size", "filter-text", "label", "row-height", "column-width"];
688
689
  }
689
690
  #model;
690
691
  #refreshToken = 0;
@@ -695,6 +696,7 @@ export class HonuaFeatureTableElement extends HonuaElementBase {
695
696
  #tableConnected = false;
696
697
  #restoringScroll = false;
697
698
  #messages = {};
699
+ #applicationContext;
698
700
  get messages() {
699
701
  return this.#messages;
700
702
  }
@@ -724,8 +726,31 @@ export class HonuaFeatureTableElement extends HonuaElementBase {
724
726
  // Only hold a subscription while connected; `connectedCallback()` re-takes
725
727
  // it so a detached-then-reinserted grid resumes updating.
726
728
  this.#subscribeTable();
729
+ this.#applyApplicationContext();
727
730
  this.render();
728
731
  }
732
+ /** Application shell context assigned and driven by `mountHonuaApplication()`. */
733
+ get applicationContext() {
734
+ return this.#applicationContext;
735
+ }
736
+ set applicationContext(context) {
737
+ if (context === this.#applicationContext)
738
+ return;
739
+ this.#applicationContext = context;
740
+ this.#applyApplicationContext();
741
+ }
742
+ honuaApplicationContextConnected(context) {
743
+ this.applicationContext = context;
744
+ }
745
+ honuaApplicationContextChanged(event) {
746
+ if (event.current !== this.#applicationContext?.snapshot)
747
+ return;
748
+ this.#applyApplicationContext(event);
749
+ }
750
+ honuaApplicationContextDisconnected(context) {
751
+ if (this.#applicationContext === context)
752
+ this.applicationContext = undefined;
753
+ }
729
754
  /** Takes the engine subscription, unless one is already held or we are detached. */
730
755
  #subscribeTable() {
731
756
  const table = this.#table;
@@ -735,6 +760,7 @@ export class HonuaFeatureTableElement extends HonuaElementBase {
735
760
  this.#tableSnapshot = table.snapshot;
736
761
  this.#tableUnsubscribe = table.subscribe((snapshot) => {
737
762
  this.#tableSnapshot = snapshot;
763
+ this.#publishApplicationState(snapshot);
738
764
  this.render();
739
765
  this.#announceConflicts(snapshot);
740
766
  });
@@ -803,9 +829,10 @@ export class HonuaFeatureTableElement extends HonuaElementBase {
803
829
  render() {
804
830
  const label = this.#messages.label ?? this.getAttribute("label") ?? "Features";
805
831
  const rowHeight = this.rowHeight();
832
+ const columnWidth = this.columnWidth();
806
833
  const snapshot = this.#tableSnapshot;
807
834
  const viewModel = snapshot
808
- ? featureTableViewModel(snapshot, { label, rowHeight, messages: this.#messages })
835
+ ? featureTableViewModel(snapshot, { label, rowHeight, columnWidth, messages: this.#messages })
809
836
  : legacyFeatureTableViewModel(this.#model ?? tableModelFromState(this.state, this.sourceId(), this.fields(), this.pageSize()), {
810
837
  label,
811
838
  rowHeight,
@@ -820,23 +847,136 @@ export class HonuaFeatureTableElement extends HonuaElementBase {
820
847
  // on every publish — including the synchronous loading snapshot that
821
848
  // `setScroll` itself publishes. Carry the offset across the swap.
822
849
  const previousScrollTop = this.#scroller()?.scrollTop ?? 0;
823
- this.setShadowHtml(`<style>${baseStyles()}${tableStyles()}${featureTableGridStyles()}</style>${featureTableGridHtml(viewModel)}`);
850
+ const previousScrollLeft = this.#scroller()?.scrollLeft ?? 0;
851
+ this.setShadowHtml(`<style>${baseStyles()}${tableStyles()}${featureTableGridStyles()}</style>${this.#applicationPresentationHtml()}${featureTableGridHtml(viewModel)}`);
824
852
  this.#bindGrid();
825
- this.#restoreScrollTop(previousScrollTop);
853
+ this.#restoreScroll(previousScrollTop, previousScrollLeft);
826
854
  }
827
855
  #scroller() {
828
856
  return this.shadowRoot?.querySelector("[data-scroller]") ?? null;
829
857
  }
830
- #restoreScrollTop(scrollTop) {
831
- if (scrollTop <= 0)
858
+ #applyApplicationContext(event) {
859
+ const context = this.#applicationContext;
860
+ if (!context) {
861
+ this.removeAttribute("data-honua-status");
862
+ this.removeAttribute("aria-disabled");
863
+ this.render();
864
+ return;
865
+ }
866
+ const snapshot = context.snapshot;
867
+ this.setAttribute("data-honua-status", snapshot.status);
868
+ this.setAttribute("lang", snapshot.locale.locale);
869
+ this.setAttribute("dir", snapshot.locale.direction ?? "auto");
870
+ this.toggleAttribute("aria-disabled", snapshot.authorization.status === "unauthorized");
871
+ const table = this.#table;
872
+ if (!table) {
873
+ this.render();
874
+ return;
875
+ }
876
+ const sourceIdentity = snapshot.binding.sourceIdentity ?? snapshot.binding.source?.descriptor.id;
877
+ if (sourceIdentity && sourceIdentity !== table.snapshot.sourceId) {
878
+ table.cancel();
879
+ this.render();
880
+ return;
881
+ }
882
+ if (snapshot.authorization.status === "unauthorized")
883
+ table.cancel();
884
+ if (!event || event.changed.includes("selection")) {
885
+ const targets = snapshot.selection.filter(isApplicationSelectionTarget);
886
+ const keys = table.keysForTargets(targets);
887
+ if (!sameApplicationValue(table.snapshot.selection, keys))
888
+ table.select(keys, { replace: true });
889
+ }
890
+ if (!event || event.changed.includes("filters")) {
891
+ const filters = snapshot.filters.filter(isApplicationFilterClause);
892
+ if (!sameApplicationValue(table.snapshot.filters, filters))
893
+ void table.setFilters(filters);
894
+ }
895
+ if (event &&
896
+ (event.changed.includes("edits") || event.changed.includes("freshness")) &&
897
+ snapshot.authorization.status !== "unauthorized") {
898
+ table.markStale("Application edits or freshness changed; refreshing the bounded table.");
899
+ void table.refresh();
900
+ }
901
+ this.render();
902
+ }
903
+ #publishApplicationState(snapshot) {
904
+ const context = this.#applicationContext;
905
+ if (!context || context.disposed)
906
+ return;
907
+ const sourceId = snapshot.sourceId;
908
+ const peers = context.snapshot.selection.filter((entry) => !isApplicationSelectionTarget(entry) || entry.sourceId !== sourceId);
909
+ const selectionTargets = this.#table?.selectionTargets() ?? [];
910
+ const selected = snapshot.selection
911
+ .map((key, index) => {
912
+ const row = snapshot.rows.find((candidate) => candidate?.key === key);
913
+ const target = row?.target ?? selectionTargets[index];
914
+ if (!target)
915
+ return undefined;
916
+ return row && isApplicationSelectionTarget(target)
917
+ ? { ...target, attributes: row.attributes, ...(row.geometry !== undefined ? { geometry: row.geometry } : {}) }
918
+ : target;
919
+ })
920
+ .filter((entry) => entry !== undefined);
921
+ const selection = [...peers, ...selected];
922
+ const filters = snapshot.filters;
923
+ const componentId = "honua-feature-table";
924
+ const tableDiagnostics = [
925
+ ...(snapshot.error
926
+ ? [
927
+ {
928
+ code: "feature-table-query-failed",
929
+ message: snapshot.error instanceof Error
930
+ ? snapshot.error.message
931
+ : (snapshot.message ?? "The table query failed."),
932
+ severity: "error",
933
+ componentId,
934
+ status: "failed",
935
+ },
936
+ ]
937
+ : []),
938
+ ...snapshot.conflicts.map((conflict) => ({
939
+ code: `feature-table-${conflict.code}`,
940
+ message: conflict.message,
941
+ severity: "warning",
942
+ componentId,
943
+ status: "degraded",
944
+ })),
945
+ ];
946
+ const diagnostics = [
947
+ ...context.snapshot.diagnostics.filter((entry) => entry.componentId !== componentId),
948
+ ...tableDiagnostics,
949
+ ];
950
+ const update = {
951
+ ...(!sameApplicationValue(context.snapshot.selection, selection) ? { selection } : {}),
952
+ ...(!sameApplicationValue(context.snapshot.filters, filters) ? { filters } : {}),
953
+ ...(!sameApplicationValue(context.snapshot.diagnostics, diagnostics) ? { diagnostics } : {}),
954
+ };
955
+ if (Object.keys(update).length > 0)
956
+ context.update(update);
957
+ }
958
+ #applicationPresentationHtml() {
959
+ const context = this.#applicationContext;
960
+ if (!context)
961
+ return "";
962
+ const presentation = context.statusPresentation();
963
+ const diagnostics = context.snapshot.diagnostics.filter((diagnostic) => diagnostic.componentId === undefined || diagnostic.componentId === "honua-feature-table");
964
+ return `<div data-application-presentation>
965
+ <p class="status" data-application-status role="${presentation.role}" aria-live="${presentation.ariaLive}" aria-busy="${String(presentation.busy)}">${escapeHtml(presentation.label)}</p>
966
+ ${diagnostics.map((diagnostic) => `<p class="status" role="${diagnostic.severity === "error" ? "alert" : "status"}" data-application-diagnostic="${escapeAttribute(diagnostic.code)}">${escapeHtml(diagnostic.message)}</p>`).join("")}
967
+ </div>`;
968
+ }
969
+ #restoreScroll(scrollTop, scrollLeft) {
970
+ if (scrollTop <= 0 && scrollLeft <= 0)
832
971
  return;
833
972
  const scroller = this.#scroller();
834
- if (!scroller || scroller.scrollTop === scrollTop)
973
+ if (!scroller || (scroller.scrollTop === scrollTop && scroller.scrollLeft === scrollLeft))
835
974
  return;
836
975
  // Restoring the offset fires `scroll`; that echo must not be mistaken for a
837
976
  // user gesture and fed back into the engine as a new window.
838
977
  this.#restoringScroll = true;
839
978
  scroller.scrollTop = scrollTop;
979
+ scroller.scrollLeft = scrollLeft;
840
980
  queueMicrotask(() => {
841
981
  this.#restoringScroll = false;
842
982
  });
@@ -853,6 +993,13 @@ export class HonuaFeatureTableElement extends HonuaElementBase {
853
993
  void this.#table?.toggleSort(field, { additive: event.shiftKey });
854
994
  });
855
995
  }
996
+ for (const input of root.querySelectorAll("[data-column-field]")) {
997
+ input.addEventListener("change", () => {
998
+ const field = input.dataset.columnField;
999
+ if (field)
1000
+ void this.#table?.setColumnVisibility(field, input.checked);
1001
+ });
1002
+ }
856
1003
  for (const row of root.querySelectorAll("tbody tr[data-feature-id]")) {
857
1004
  row.addEventListener("click", () => this.selectRow(row));
858
1005
  row.addEventListener("keydown", (event) => this.#onRowKeydown(event, row));
@@ -871,6 +1018,11 @@ export class HonuaFeatureTableElement extends HonuaElementBase {
871
1018
  rowHeight: this.rowHeight(),
872
1019
  viewportHeight: scroller.clientHeight || this.rowHeight() * 10,
873
1020
  });
1021
+ this.#table?.setColumnScroll({
1022
+ scrollLeft: scroller.scrollLeft,
1023
+ columnWidth: this.columnWidth(),
1024
+ viewportWidth: scroller.clientWidth || this.columnWidth() * 4,
1025
+ });
874
1026
  });
875
1027
  }
876
1028
  }
@@ -1023,6 +1175,10 @@ export class HonuaFeatureTableElement extends HonuaElementBase {
1023
1175
  const parsed = Number(this.getAttribute("row-height"));
1024
1176
  return Number.isFinite(parsed) && parsed > 0 ? parsed : 32;
1025
1177
  }
1178
+ columnWidth() {
1179
+ const parsed = Number(this.getAttribute("column-width"));
1180
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 160;
1181
+ }
1026
1182
  }
1027
1183
  /**
1028
1184
  * Project a bounded snapshot onto the legacy {@link HonuaFeatureTableModel} so
@@ -2310,6 +2466,7 @@ const WEB_COMPONENT_ELEMENTS = new Map([
2310
2466
  ["honua-layer-list", HonuaLayerListElement],
2311
2467
  ["honua-legend", HonuaLegendElement],
2312
2468
  ["honua-feature-table", HonuaFeatureTableElement],
2469
+ ["honua-feature-inspection", HonuaFeatureInspectionElement],
2313
2470
  ["honua-search", HonuaSearchElement],
2314
2471
  ["honua-editor", HonuaEditorElement],
2315
2472
  ["honua-feature-editor", HonuaFeatureEditorElement],
@@ -2544,6 +2701,29 @@ function escapeHtml(value) {
2544
2701
  function escapeAttribute(value) {
2545
2702
  return escapeHtml(value).replace(/'/g, "&#39;");
2546
2703
  }
2704
+ function isApplicationSelectionTarget(value) {
2705
+ return (typeof value === "object" &&
2706
+ value !== null &&
2707
+ "sourceId" in value &&
2708
+ typeof value.sourceId === "string" &&
2709
+ "id" in value &&
2710
+ (typeof value.id === "string" || typeof value.id === "number"));
2711
+ }
2712
+ function isApplicationFilterClause(value) {
2713
+ if (typeof value !== "object" || value === null || !("id" in value) || !("owner" in value))
2714
+ return false;
2715
+ const owner = value.owner;
2716
+ return (typeof value.id === "string" &&
2717
+ typeof owner === "object" &&
2718
+ owner !== null &&
2719
+ "kind" in owner &&
2720
+ typeof owner.kind === "string" &&
2721
+ "id" in owner &&
2722
+ typeof owner.id === "string");
2723
+ }
2724
+ function sameApplicationValue(left, right) {
2725
+ return JSON.stringify(left) === JSON.stringify(right);
2726
+ }
2547
2727
  function formatLayerOpacityValue(format, percent) {
2548
2728
  if (typeof format === "function")
2549
2729
  return format(percent);
@@ -39,104 +39,19 @@
39
39
  *
40
40
  * @module
41
41
  */
42
- import { HonuaSdkError } from "../core/error-envelope.js";
42
+ import { type HonuaExportRedaction } from "../core/credential-redaction.js";
43
43
  import type { HonuaViewportState, HonuaWebComponentState } from "./types.js";
44
44
  /** Schema id stamped on every sanitized state document. */
45
45
  export declare const HONUA_EXPORT_STATE_SCHEMA = "honua.app-platform.export-state.v1";
46
- /** Placeholder substituted for any value the export pipeline refuses to emit. */
47
- export declare const HONUA_EXPORT_REDACTED = "[REDACTED]";
48
- /** Why a value was withheld from an export. */
49
- export type HonuaExportRedactionReason =
50
- /** The property name itself named a credential (`token`, `apiKey`, `cookie`, ...). */
51
- "sensitive-key"
52
- /** A URL carried a signature, SAS, or token query parameter, or embedded userinfo. */
53
- | "signed-url"
54
- /** A free-text value matched a credential shape (bearer token, JWT, provider key, ...). */
55
- | "credential-pattern"
56
- /** A request-header map was dropped because it is not on the export allowlist. */
57
- | "private-header"
58
- /** OAuth/authorization scope, audience, tenant, or grant detail. */
59
- | "authorization-scope"
60
- /** A source explicitly marked as not exportable by the plan or the source itself. */
61
- | "non-exportable-source"
62
- /** A value could not be represented safely (unserializable, cyclic, over budget). */
63
- | "unsupported-value";
64
- /** One withheld value, addressed by its path in the sanitized document. */
65
- export interface HonuaExportRedaction {
66
- /** Dotted/bracketed path in the *sanitized* document, e.g. `sources[0].endpoint`. */
67
- readonly path: string;
68
- readonly reason: HonuaExportRedactionReason;
69
- }
70
- /** Thrown when the export pipeline cannot produce a provably credential-free artifact. */
71
- export declare class HonuaExportSafetyError extends HonuaSdkError {
72
- readonly reason: HonuaExportRedactionReason | "assertion";
73
- constructor(message: string, reason?: HonuaExportRedactionReason | "assertion");
74
- }
75
- /**
76
- * Redacts credential material from arbitrary human-readable text: adapter
77
- * error messages, titles, status strings, log lines, event detail messages.
78
- *
79
- * Percent-encoded payloads are decoded (twice, bounded) before matching so a
80
- * `%42earer%20abc` style evasion cannot slip a token past the scan; the
81
- * returned string is the redacted *decoded* form when decoding changed
82
- * anything, because emitting the still-encoded original would defeat the
83
- * point.
84
- */
85
- export declare function redactHonuaExportText(value: string): string;
86
- /** Whether `value` still looks like it carries credential material. */
87
- export declare function containsCredentialMaterial(value: string): boolean;
88
46
  /**
89
- * Fail-closed assertion for finished export payloads (REQ-002). Throws
90
- * {@link HonuaExportSafetyError} rather than scrubbing, because reaching this
91
- * point with credential material means an earlier layer is broken.
92
- */
93
- export declare function assertCredentialFreeExportText(value: string, label: string): void;
94
- /**
95
- * Extracts runs of printable ASCII from a binary buffer, joined by newlines.
96
- *
97
- * This is the `strings(1)` idea, and it exists because "binary" is not a
98
- * security boundary. A PNG `tEXt`/`iTXt` chunk, a JPEG `COM` marker, PDF
99
- * metadata or an embedded XMP packet, an EXIF `UserComment`, a ZIP comment —
100
- * all carry plainly readable text inside a buffer that will never decode as
101
- * UTF-8 as a whole. Scanning only whole-buffer-decodable artifacts would let a
102
- * token ride out inside any of them.
103
- *
104
- * Runs shorter than {@link MIN_PRINTABLE_RUN} are dropped: they are the
105
- * incidental byte values that fall in the ASCII range inside compressed data,
106
- * and keeping them would produce noise without ever forming a credential.
107
- */
108
- export declare function extractPrintableRuns(bytes: Uint8Array, start?: number, end?: number): string;
109
- /**
110
- * Fail-closed credential scan over a binary artifact (REQ-002).
111
- *
112
- * Scans in bounded chunks with an overlap, so an arbitrarily large artifact
113
- * costs bounded memory while a token that straddles a chunk boundary is still
114
- * caught. Throws {@link HonuaExportSafetyError} on a hit, like the text scan —
115
- * a credential surviving to this point means an earlier layer is broken, and
116
- * emitting the bytes anyway is the one outcome that cannot be walked back.
117
- */
118
- export declare function assertCredentialFreeExportBytes(bytes: Uint8Array, label: string): void;
119
- /** Result of reducing an endpoint URL to its exportable form. */
120
- export interface HonuaExportEndpointProjection {
121
- /** `scheme://host[:port]/path` with query, fragment, and userinfo removed, or `undefined` when nothing is safe to emit. */
122
- readonly endpoint: string | undefined;
123
- readonly reason?: HonuaExportRedactionReason;
124
- }
125
- /**
126
- * Reduces a source URL to `origin + pathname`, always dropping the query
127
- * string and fragment.
128
- *
129
- * Query strings are where every practical map-service credential lives (Esri
130
- * `?token=`, Azure SAS `?sv=...&sig=`, S3/GCS presigned `?X-Amz-Signature=`,
131
- * tile-provider `?api_key=`), and a partial per-parameter allowlist has to be
132
- * right about every provider forever. Dropping the whole query is the only
133
- * rule that is right by construction; the origin+path that remains is what an
134
- * attribution/provenance block legitimately needs.
135
- *
136
- * Non-HTTP(S) schemes (`data:`, `blob:`, `file:`), URLs with embedded
137
- * `user:password@` userinfo, and unparseable strings yield no endpoint at all.
47
+ * The credential recognizer itself now lives in `src/core/credential-redaction.ts`
48
+ * so `src/runtime`'s portable MapPackage export (#1426) can share exactly one
49
+ * scanner across the `@honua/sdk` / `@honua/app-platform` split-package
50
+ * boundary. Every symbol is re-exported here unchanged: this module's published
51
+ * surface, and its two-layer guarantee, are identical to before the move.
138
52
  */
139
- export declare function projectExportEndpoint(url: string): HonuaExportEndpointProjection;
53
+ export { HONUA_EXPORT_REDACTED, HonuaExportSafetyError, assertCredentialFreeExportBytes, assertCredentialFreeExportText, containsCredentialMaterial, extractPrintableRuns, isSensitiveExportKey, projectExportEndpoint, redactHonuaExportText, sanitizeHonuaExportHeaders, } from "../core/credential-redaction.js";
54
+ export type { HonuaExportEndpointProjection, HonuaExportRedaction, HonuaExportRedactionReason, } from "../core/credential-redaction.js";
140
55
  export interface SanitizeHonuaExportFilenameOptions {
141
56
  /** Caller-supplied title (map title, package id, adapter hint). May be untrusted. */
142
57
  readonly title?: string;
@@ -239,14 +154,8 @@ export interface HonuaExportStateSanitizationResult {
239
154
  */
240
155
  export declare function sanitizeHonuaExportState(state: HonuaWebComponentState<unknown> | undefined, options?: SanitizeHonuaExportStateOptions): HonuaExportStateSanitizationResult;
241
156
  /**
242
- * Filters a header map down to the export allowlist, recording every drop.
243
- * Exposed so adapters can prove — in their own tests — that no `Authorization`,
244
- * `Cookie`, or provider-specific key header rides along with export metadata.
157
+ * Header allowlist for adapters that make their own requests while producing an
158
+ * export (a server-side renderer, a tile fetch for a print layout). Everything
159
+ * outside this set is a private header for export purposes (REQ-002).
245
160
  */
246
- export declare function sanitizeHonuaExportHeaders(headers: Readonly<Record<string, string>> | undefined): {
247
- headers: Readonly<Record<string, string>>;
248
- redactions: readonly HonuaExportRedaction[];
249
- };
250
- /** Whether a property name is refused outright by the export pipeline. */
251
- export declare function isSensitiveExportKey(name: string): boolean;
252
161
  //# sourceMappingURL=export-redaction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"export-redaction.d.ts","sourceRoot":"","sources":["../../../src/web-components/export-redaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,KAAK,EAKV,kBAAkB,EAClB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAEpB,2DAA2D;AAC3D,eAAO,MAAM,yBAAyB,uCAAuC,CAAC;AAE9E,iFAAiF;AACjF,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,+CAA+C;AAC/C,MAAM,MAAM,0BAA0B;AACpC,sFAAsF;AACpF,eAAe;AACjB,sFAAsF;GACpF,YAAY;AACd,2FAA2F;GACzF,oBAAoB;AACtB,kFAAkF;GAChF,gBAAgB;AAClB,oEAAoE;GAClE,qBAAqB;AACvB,qFAAqF;GACnF,uBAAuB;AACzB,qFAAqF;GACnF,mBAAmB,CAAC;AAExB,2EAA2E;AAC3E,MAAM,WAAW,oBAAoB;IACnC,qFAAqF;IACrF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,0BAA0B,CAAC;CAC7C;AAED,0FAA0F;AAC1F,qBAAa,sBAAuB,SAAQ,aAAa;IACvD,SAAgB,MAAM,EAAE,0BAA0B,GAAG,WAAW,CAAC;gBAE9C,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,0BAA0B,GAAG,WAAyB;CAKnG;AAmFD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO3D;AAED,uEAAuE;AACvE,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAOjF;AAgBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,SAAI,EAAE,GAAG,SAAmB,GAAG,MAAM,CAiBjG;AAED;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAStF;AAID,iEAAiE;AACjE,MAAM,WAAW,6BAA6B;IAC5C,2HAA2H;IAC3H,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,0BAA0B,CAAC;CAC9C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,6BAA6B,CAiChF;AAoBD,MAAM,WAAW,kCAAkC;IACjD,qFAAqF;IACrF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,kCAAuC,GAAG,MAAM,CASpG;AA0BD,0CAA0C;AAC1C,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,iDAAiD;AACjD,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,gFAAgF;AAChF,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,uEAAuE;IACvE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,iEAAiE;AACjE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,kFAAkF;AAClF,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACtC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,OAAO,yBAAyB,CAAC;IAClD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,SAAS,yBAAyB,EAAE,CAAC;IACtD,QAAQ,CAAC,MAAM,EAAE,SAAS,8BAA8B,EAAE,CAAC;IAC3D,QAAQ,CAAC,OAAO,EAAE,SAAS,0BAA0B,EAAE,CAAC;IACxD,QAAQ,CAAC,OAAO,EAAE,SAAS,0BAA0B,EAAE,CAAC;IACxD,QAAQ,CAAC,SAAS,CAAC,EAAE,6BAA6B,CAAC;IACnD,gFAAgF;IAChF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,gEAAgE;IAChE,QAAQ,CAAC,UAAU,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACtD;AAED,MAAM,WAAW,+BAA+B;IAC9C;;;;;;OAMG;IACH,QAAQ,CAAC,sBAAsB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrD;AAED,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,KAAK,EAAE,yBAAyB,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACtD;AAoND;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,sBAAsB,CAAC,OAAO,CAAC,GAAG,SAAS,EAClD,OAAO,GAAE,+BAAoC,GAC5C,kCAAkC,CAmCpC;AASD;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,GAAG;IACjG,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1C,UAAU,EAAE,SAAS,oBAAoB,EAAE,CAAC;CAC7C,CAoBA;AAED,0EAA0E;AAC1E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D"}
1
+ {"version":3,"file":"export-redaction.d.ts","sourceRoot":"","sources":["../../../src/web-components/export-redaction.ts"],"names":[],"mappings":"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"}