@burdenoff/microfe-theglobalfuel 2026.716.1 → 2026.720.2

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 (67) hide show
  1. package/dist/theglobalfuel/TheGlobalFuelRoutes.d.ts.map +1 -1
  2. package/dist/theglobalfuel/TheGlobalFuelRoutes.js +34 -22
  3. package/dist/theglobalfuel/TheGlobalFuelRoutes.js.map +1 -1
  4. package/dist/theglobalfuel/components/DataTable.js +1 -1
  5. package/dist/theglobalfuel/components/DataTable.js.map +1 -1
  6. package/dist/theglobalfuel/components/MiniBar.d.ts.map +1 -1
  7. package/dist/theglobalfuel/components/MiniBar.js +1 -1
  8. package/dist/theglobalfuel/components/MiniBar.js.map +1 -1
  9. package/dist/theglobalfuel/components/Tabs.js +1 -1
  10. package/dist/theglobalfuel/components/Tabs.js.map +1 -1
  11. package/dist/theglobalfuel/components/index.js +2 -0
  12. package/dist/theglobalfuel/components/viz/BarChart.js +83 -4
  13. package/dist/theglobalfuel/components/viz/BarChart.js.map +1 -0
  14. package/dist/theglobalfuel/components/viz/StatCard.js +60 -3
  15. package/dist/theglobalfuel/components/viz/StatCard.js.map +1 -0
  16. package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.d.ts +10 -1
  17. package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.d.ts.map +1 -1
  18. package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.js +1 -1
  19. package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.js.map +1 -1
  20. package/dist/theglobalfuel/pages/alerts/AlertsPage.d.ts +16 -0
  21. package/dist/theglobalfuel/pages/alerts/AlertsPage.d.ts.map +1 -0
  22. package/dist/theglobalfuel/pages/alerts/AlertsPage.js +295 -0
  23. package/dist/theglobalfuel/pages/alerts/AlertsPage.js.map +1 -0
  24. package/dist/theglobalfuel/pages/analytics/AnalyticsPage.d.ts +13 -0
  25. package/dist/theglobalfuel/pages/analytics/AnalyticsPage.d.ts.map +1 -0
  26. package/dist/theglobalfuel/pages/analytics/AnalyticsPage.js +358 -0
  27. package/dist/theglobalfuel/pages/analytics/AnalyticsPage.js.map +1 -0
  28. package/dist/theglobalfuel/pages/assets/AssetDetailPage.d.ts.map +1 -1
  29. package/dist/theglobalfuel/pages/assets/AssetDetailPage.js +386 -342
  30. package/dist/theglobalfuel/pages/assets/AssetDetailPage.js.map +1 -1
  31. package/dist/theglobalfuel/pages/assets/AssetsPage.d.ts.map +1 -1
  32. package/dist/theglobalfuel/pages/assets/AssetsPage.js +277 -199
  33. package/dist/theglobalfuel/pages/assets/AssetsPage.js.map +1 -1
  34. package/dist/theglobalfuel/pages/contracts/ContractsPage.js +1 -1
  35. package/dist/theglobalfuel/pages/contracts/ContractsPage.js.map +1 -1
  36. package/dist/theglobalfuel/pages/dashboard/DashboardPage.js +6 -6
  37. package/dist/theglobalfuel/pages/dashboard/DashboardPage.js.map +1 -1
  38. package/dist/theglobalfuel/pages/emissions/EmissionsPage.js +1 -1
  39. package/dist/theglobalfuel/pages/emissions/EmissionsPage.js.map +1 -1
  40. package/dist/theglobalfuel/pages/inventory/InventoryPage.js +1 -1
  41. package/dist/theglobalfuel/pages/inventory/InventoryPage.js.map +1 -1
  42. package/dist/theglobalfuel/pages/provenance/ProvenancePage.d.ts.map +1 -1
  43. package/dist/theglobalfuel/pages/provenance/ProvenancePage.js +372 -216
  44. package/dist/theglobalfuel/pages/provenance/ProvenancePage.js.map +1 -1
  45. package/dist/theglobalfuel/pages/reports/ReportsPage.d.ts +16 -0
  46. package/dist/theglobalfuel/pages/reports/ReportsPage.d.ts.map +1 -0
  47. package/dist/theglobalfuel/pages/reports/ReportsPage.js +578 -0
  48. package/dist/theglobalfuel/pages/reports/ReportsPage.js.map +1 -0
  49. package/dist/theglobalfuel/pages/shipments/ShipmentsPage.d.ts.map +1 -1
  50. package/dist/theglobalfuel/pages/shipments/ShipmentsPage.js +43 -12
  51. package/dist/theglobalfuel/pages/shipments/ShipmentsPage.js.map +1 -1
  52. package/dist/theglobalfuel/types/index.d.ts +37 -8
  53. package/dist/theglobalfuel/types/index.d.ts.map +1 -1
  54. package/dist/theglobalfuel/utils/csv.d.ts +16 -0
  55. package/dist/theglobalfuel/utils/csv.d.ts.map +1 -0
  56. package/dist/theglobalfuel/utils/csv.js +14 -0
  57. package/dist/theglobalfuel/utils/csv.js.map +1 -0
  58. package/dist/theglobalfuel/utils/index.d.ts +2 -0
  59. package/dist/theglobalfuel/utils/index.d.ts.map +1 -1
  60. package/dist/theglobalfuel/utils/pageContext.d.ts.map +1 -1
  61. package/dist/theglobalfuel/utils/pageContext.js +32 -0
  62. package/dist/theglobalfuel/utils/pageContext.js.map +1 -1
  63. package/dist/theglobalfuel/utils/provenance.d.ts +135 -0
  64. package/dist/theglobalfuel/utils/provenance.d.ts.map +1 -0
  65. package/dist/theglobalfuel/utils/provenance.js +57 -0
  66. package/dist/theglobalfuel/utils/provenance.js.map +1 -0
  67. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"pageContext.js","names":[],"sources":["../../../src/theglobalfuel/utils/pageContext.ts"],"sourcesContent":["/**\n * Page context gathering — captures the user's current browser context\n * to be sent alongside every assistant prompt for better AI awareness.\n * @module theglobalfuel/utils\n */\n\ninterface ConversationContextShape {\n entityType?: string;\n entityId?: string;\n activeTab?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface PageContext {\n // `currentUrl` (NOT `activeUrl`) — must match the agent's allowed-context-key\n // contract, otherwise the agent filters it out.\n currentUrl: string;\n currentPage: string;\n // The entity the user is currently looking at, resolved from the route. Lets\n // the assistant act on \"this / current / here\" without asking for an id.\n entityType?: string;\n entityId?: string;\n platform: string;\n version: string;\n viewportSize: string;\n userAgent: string;\n timestamp: string;\n}\n\nexport function gatherPageContext(): PageContext {\n const url = window.location.href;\n const pathSegments = window.location.pathname.split('/').filter(Boolean);\n const currentPage = pathSegments.slice(0, 3).join('/') || 'home';\n const entity = resolveTheGlobalFuelConversationContext(\n window.location.pathname,\n window.location.search\n );\n\n return {\n currentUrl: url,\n currentPage,\n entityType: entity.entityType,\n entityId: entity.entityId,\n platform: 'theglobalfuel',\n version: import.meta.env.VITE_APP_VERSION ?? '2026.705.2',\n viewportSize: `${window.innerWidth}x${window.innerHeight}`,\n userAgent: navigator.userAgent,\n timestamp: new Date().toISOString(),\n };\n}\n\nfunction matchPath(pattern: RegExp, pathname: string): RegExpMatchArray | null {\n return pathname.match(pattern);\n}\n\nexport function resolveTheGlobalFuelConversationContext(\n pathname: string,\n search: string\n): ConversationContextShape {\n const params = new URLSearchParams(search);\n\n // TheGlobalFuel routes are mounted under `/theglobalfuel/*` in the host shell.\n // Detail pages carry the entity id as the second-to-last segment.\n const directMatches: Array<[RegExp, string]> = [\n [/^\\/theglobalfuel\\/assets\\/([^/]+)$/, 'THEGLOBALFUEL_ASSET'],\n [/^\\/theglobalfuel\\/contracts\\/([^/]+)$/, 'THEGLOBALFUEL_CONTRACT'],\n [/^\\/theglobalfuel\\/shipments\\/([^/]+)$/, 'THEGLOBALFUEL_SHIPMENT'],\n [/^\\/theglobalfuel\\/inventory\\/([^/]+)$/, 'THEGLOBALFUEL_INVENTORY_LOT'],\n [/^\\/theglobalfuel\\/emissions\\/([^/]+)$/, 'THEGLOBALFUEL_EMISSION_RECORD'],\n [/^\\/theglobalfuel\\/compliance\\/([^/]+)$/, 'THEGLOBALFUEL_COMPLIANCE_CERT'],\n [/^\\/theglobalfuel\\/reserves\\/([^/]+)$/, 'THEGLOBALFUEL_RESERVE_ESTIMATE'],\n ];\n\n for (const [pattern, entityType] of directMatches) {\n const match = matchPath(pattern, pathname);\n if (match) {\n return {\n entityType,\n entityId: match[1],\n metadata: {\n routePattern: pattern.source,\n },\n };\n }\n }\n\n // Standalone dev mode routes (no /theglobalfuel prefix)\n const standaloneMatches: Array<[RegExp, string]> = [\n [/^\\/assets\\/([^/]+)$/, 'THEGLOBALFUEL_ASSET'],\n [/^\\/contracts\\/([^/]+)$/, 'THEGLOBALFUEL_CONTRACT'],\n [/^\\/shipments\\/([^/]+)$/, 'THEGLOBALFUEL_SHIPMENT'],\n [/^\\/inventory\\/([^/]+)$/, 'THEGLOBALFUEL_INVENTORY_LOT'],\n [/^\\/emissions\\/([^/]+)$/, 'THEGLOBALFUEL_EMISSION_RECORD'],\n [/^\\/compliance\\/([^/]+)$/, 'THEGLOBALFUEL_COMPLIANCE_CERT'],\n [/^\\/reserves\\/([^/]+)$/, 'THEGLOBALFUEL_RESERVE_ESTIMATE'],\n ];\n\n for (const [pattern, entityType] of standaloneMatches) {\n const match = matchPath(pattern, pathname);\n if (match) {\n return {\n entityType,\n entityId: match[1],\n metadata: {\n routePattern: pattern.source,\n },\n };\n }\n }\n\n const activeTab =\n params.get('tab') ??\n (() => {\n const segments = pathname.split('/').filter(Boolean);\n return segments.length > 2 ? segments[segments.length - 1] : undefined;\n })();\n\n return {\n activeTab: activeTab ?? undefined,\n metadata: {\n ...(activeTab ? { activeTab } : {}),\n },\n };\n}\n"],"mappings":";AA6BA,SAAgB,IAAiC;CAC/C,IAAM,IAAM,OAAO,SAAS,MAEtB,IADe,OAAO,SAAS,SAAS,MAAM,IAAI,CAAC,OAAO,QAAQ,CACvC,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI,IAAI,QACpD,IAAS,EACb,OAAO,SAAS,UAChB,OAAO,SAAS,OACjB;AAED,QAAO;EACL,YAAY;EACZ;EACA,YAAY,EAAO;EACnB,UAAU,EAAO;EACjB,UAAU;EACV,SAA6C;EAC7C,cAAc,GAAG,OAAO,WAAW,GAAG,OAAO;EAC7C,WAAW,UAAU;EACrB,4BAAW,IAAI,MAAM,EAAC,aAAa;EACpC;;AAGH,SAAS,EAAU,GAAiB,GAA2C;AAC7E,QAAO,EAAS,MAAM,EAAQ;;AAGhC,SAAgB,EACd,GACA,GAC0B;CAC1B,IAAM,IAAS,IAAI,gBAAgB,EAAO;AAc1C,MAAK,IAAM,CAAC,GAAS,MAV0B;EAC7C,CAAC,sCAAsC,sBAAsB;EAC7D,CAAC,yCAAyC,yBAAyB;EACnE,CAAC,yCAAyC,yBAAyB;EACnE,CAAC,yCAAyC,8BAA8B;EACxE,CAAC,yCAAyC,gCAAgC;EAC1E,CAAC,0CAA0C,gCAAgC;EAC3E,CAAC,wCAAwC,iCAAiC;EAC3E,EAEkD;EACjD,IAAM,IAAQ,EAAU,GAAS,EAAS;AAC1C,MAAI,EACF,QAAO;GACL;GACA,UAAU,EAAM;GAChB,UAAU,EACR,cAAc,EAAQ,QACvB;GACF;;AAeL,MAAK,IAAM,CAAC,GAAS,MAV8B;EACjD,CAAC,uBAAuB,sBAAsB;EAC9C,CAAC,0BAA0B,yBAAyB;EACpD,CAAC,0BAA0B,yBAAyB;EACpD,CAAC,0BAA0B,8BAA8B;EACzD,CAAC,0BAA0B,gCAAgC;EAC3D,CAAC,2BAA2B,gCAAgC;EAC5D,CAAC,yBAAyB,iCAAiC;EAC5D,EAEsD;EACrD,IAAM,IAAQ,EAAU,GAAS,EAAS;AAC1C,MAAI,EACF,QAAO;GACL;GACA,UAAU,EAAM;GAChB,UAAU,EACR,cAAc,EAAQ,QACvB;GACF;;CAIL,IAAM,IACJ,EAAO,IAAI,MAAM,WACV;EACL,IAAM,IAAW,EAAS,MAAM,IAAI,CAAC,OAAO,QAAQ;AACpD,SAAO,EAAS,SAAS,IAAI,EAAS,EAAS,SAAS,KAAK,KAAA;KAC3D;AAEN,QAAO;EACL,WAAW,KAAa,KAAA;EACxB,UAAU,EACR,GAAI,IAAY,EAAE,cAAW,GAAG,EAAE,EACnC;EACF"}
1
+ {"version":3,"file":"pageContext.js","names":[],"sources":["../../../src/theglobalfuel/utils/pageContext.ts"],"sourcesContent":["/**\n * Page context gathering — captures the user's current browser context\n * to be sent alongside every assistant prompt for better AI awareness.\n * @module theglobalfuel/utils\n */\n\ninterface ConversationContextShape {\n entityType?: string;\n entityId?: string;\n activeTab?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface PageContext {\n // `currentUrl` (NOT `activeUrl`) — must match the agent's allowed-context-key\n // contract, otherwise the agent filters it out.\n currentUrl: string;\n currentPage: string;\n // The entity the user is currently looking at, resolved from the route. Lets\n // the assistant act on \"this / current / here\" without asking for an id.\n entityType?: string;\n entityId?: string;\n platform: string;\n version: string;\n viewportSize: string;\n userAgent: string;\n timestamp: string;\n}\n\nexport function gatherPageContext(): PageContext {\n const url = window.location.href;\n const pathSegments = window.location.pathname.split('/').filter(Boolean);\n const currentPage = pathSegments.slice(0, 3).join('/') || 'home';\n const entity = resolveTheGlobalFuelConversationContext(\n window.location.pathname,\n window.location.search\n );\n\n return {\n currentUrl: url,\n currentPage,\n entityType: entity.entityType,\n entityId: entity.entityId,\n platform: 'theglobalfuel',\n version: import.meta.env.VITE_APP_VERSION ?? '2026.705.2',\n viewportSize: `${window.innerWidth}x${window.innerHeight}`,\n userAgent: navigator.userAgent,\n timestamp: new Date().toISOString(),\n };\n}\n\nfunction matchPath(pattern: RegExp, pathname: string): RegExpMatchArray | null {\n return pathname.match(pattern);\n}\n\nexport function resolveTheGlobalFuelConversationContext(\n pathname: string,\n search: string\n): ConversationContextShape {\n const params = new URLSearchParams(search);\n\n // TheGlobalFuel routes are mounted under `/theglobalfuel/*` in the host shell.\n // Detail pages carry the entity id as the second-to-last segment.\n const directMatches: Array<[RegExp, string]> = [\n [/^\\/theglobalfuel\\/assets\\/([^/]+)$/, 'THEGLOBALFUEL_ASSET'],\n [/^\\/theglobalfuel\\/contracts\\/([^/]+)$/, 'THEGLOBALFUEL_CONTRACT'],\n [/^\\/theglobalfuel\\/shipments\\/([^/]+)$/, 'THEGLOBALFUEL_SHIPMENT'],\n [/^\\/theglobalfuel\\/inventory\\/([^/]+)$/, 'THEGLOBALFUEL_INVENTORY_LOT'],\n [/^\\/theglobalfuel\\/emissions\\/([^/]+)$/, 'THEGLOBALFUEL_EMISSION_RECORD'],\n [/^\\/theglobalfuel\\/compliance\\/([^/]+)$/, 'THEGLOBALFUEL_COMPLIANCE_CERT'],\n [/^\\/theglobalfuel\\/reserves\\/([^/]+)$/, 'THEGLOBALFUEL_RESERVE_ESTIMATE'],\n ];\n\n for (const [pattern, entityType] of directMatches) {\n const match = matchPath(pattern, pathname);\n if (match) {\n return {\n entityType,\n entityId: match[1],\n metadata: {\n routePattern: pattern.source,\n },\n };\n }\n }\n\n // Standalone dev mode routes (no /theglobalfuel prefix)\n const standaloneMatches: Array<[RegExp, string]> = [\n [/^\\/assets\\/([^/]+)$/, 'THEGLOBALFUEL_ASSET'],\n [/^\\/contracts\\/([^/]+)$/, 'THEGLOBALFUEL_CONTRACT'],\n [/^\\/shipments\\/([^/]+)$/, 'THEGLOBALFUEL_SHIPMENT'],\n [/^\\/inventory\\/([^/]+)$/, 'THEGLOBALFUEL_INVENTORY_LOT'],\n [/^\\/emissions\\/([^/]+)$/, 'THEGLOBALFUEL_EMISSION_RECORD'],\n [/^\\/compliance\\/([^/]+)$/, 'THEGLOBALFUEL_COMPLIANCE_CERT'],\n [/^\\/reserves\\/([^/]+)$/, 'THEGLOBALFUEL_RESERVE_ESTIMATE'],\n ];\n\n for (const [pattern, entityType] of standaloneMatches) {\n const match = matchPath(pattern, pathname);\n if (match) {\n return {\n entityType,\n entityId: match[1],\n metadata: {\n routePattern: pattern.source,\n },\n };\n }\n }\n\n // The Provenance page has no `:id` detail route — the asset under trace is\n // carried in the query string (`?assetId=…`, the same parameter the Share\n // action produces). Resolve it so \"explain this chain of custody\" works from\n // a shared link without the user restating which asset they mean.\n if (/^(\\/theglobalfuel)?\\/provenance\\/?$/.test(pathname)) {\n const assetId = params.get('assetId');\n if (assetId) {\n return {\n entityType: 'THEGLOBALFUEL_ASSET',\n entityId: assetId,\n metadata: { surface: 'provenance', routePattern: '/provenance?assetId' },\n };\n }\n }\n\n // Section (list / overview) routes carry no entity id, but the assistant\n // still needs to know which product surface the user is looking at so it can\n // scope \"show me…\", \"why is this down…\" style questions. Previously only\n // detail routes resolved anything, which left /production, /provenance and\n // the dashboard index with no context at all.\n const sectionMatches: Array<[RegExp, string]> = [\n [/^(\\/theglobalfuel)?\\/assets\\/?$/, 'THEGLOBALFUEL_ASSET'],\n [/^(\\/theglobalfuel)?\\/production\\/?$/, 'THEGLOBALFUEL_PRODUCTION_RECORD'],\n [/^(\\/theglobalfuel)?\\/reserves\\/?$/, 'THEGLOBALFUEL_RESERVE_ESTIMATE'],\n [/^(\\/theglobalfuel)?\\/contracts\\/?$/, 'THEGLOBALFUEL_CONTRACT'],\n [/^(\\/theglobalfuel)?\\/shipments\\/?$/, 'THEGLOBALFUEL_SHIPMENT'],\n [/^(\\/theglobalfuel)?\\/inventory\\/?$/, 'THEGLOBALFUEL_INVENTORY_LOT'],\n [/^(\\/theglobalfuel)?\\/emissions\\/?$/, 'THEGLOBALFUEL_EMISSION_RECORD'],\n [/^(\\/theglobalfuel)?\\/compliance\\/?$/, 'THEGLOBALFUEL_COMPLIANCE_CERT'],\n [/^(\\/theglobalfuel)?\\/provenance\\/?$/, 'THEGLOBALFUEL_PROVENANCE'],\n [/^(\\/theglobalfuel)?\\/analytics\\/?$/, 'THEGLOBALFUEL_ANALYTICS'],\n [/^(\\/theglobalfuel)?\\/reports\\/?$/, 'THEGLOBALFUEL_REPORTS'],\n [/^(\\/theglobalfuel)?\\/alerts\\/?$/, 'THEGLOBALFUEL_ALERTS'],\n // Product root = the portfolio dashboard (the index route).\n [/^\\/theglobalfuel\\/?$/, 'THEGLOBALFUEL_DASHBOARD'],\n ];\n\n for (const [pattern, entityType] of sectionMatches) {\n if (matchPath(pattern, pathname)) {\n return {\n entityType,\n metadata: { surface: 'section', routePattern: pattern.source },\n };\n }\n }\n\n const activeTab =\n params.get('tab') ??\n (() => {\n const segments = pathname.split('/').filter(Boolean);\n return segments.length > 2 ? segments[segments.length - 1] : undefined;\n })();\n\n return {\n activeTab: activeTab ?? undefined,\n metadata: {\n ...(activeTab ? { activeTab } : {}),\n },\n };\n}\n"],"mappings":";AA6BA,SAAgB,IAAiC;CAC/C,IAAM,IAAM,OAAO,SAAS,MAEtB,IADe,OAAO,SAAS,SAAS,MAAM,IAAI,CAAC,OAAO,QAAQ,CACvC,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI,IAAI,QACpD,IAAS,EACb,OAAO,SAAS,UAChB,OAAO,SAAS,OACjB;AAED,QAAO;EACL,YAAY;EACZ;EACA,YAAY,EAAO;EACnB,UAAU,EAAO;EACjB,UAAU;EACV,SAA6C;EAC7C,cAAc,GAAG,OAAO,WAAW,GAAG,OAAO;EAC7C,WAAW,UAAU;EACrB,4BAAW,IAAI,MAAM,EAAC,aAAa;EACpC;;AAGH,SAAS,EAAU,GAAiB,GAA2C;AAC7E,QAAO,EAAS,MAAM,EAAQ;;AAGhC,SAAgB,EACd,GACA,GAC0B;CAC1B,IAAM,IAAS,IAAI,gBAAgB,EAAO;AAc1C,MAAK,IAAM,CAAC,GAAS,MAV0B;EAC7C,CAAC,sCAAsC,sBAAsB;EAC7D,CAAC,yCAAyC,yBAAyB;EACnE,CAAC,yCAAyC,yBAAyB;EACnE,CAAC,yCAAyC,8BAA8B;EACxE,CAAC,yCAAyC,gCAAgC;EAC1E,CAAC,0CAA0C,gCAAgC;EAC3E,CAAC,wCAAwC,iCAAiC;EAC3E,EAEkD;EACjD,IAAM,IAAQ,EAAU,GAAS,EAAS;AAC1C,MAAI,EACF,QAAO;GACL;GACA,UAAU,EAAM;GAChB,UAAU,EACR,cAAc,EAAQ,QACvB;GACF;;AAeL,MAAK,IAAM,CAAC,GAAS,MAV8B;EACjD,CAAC,uBAAuB,sBAAsB;EAC9C,CAAC,0BAA0B,yBAAyB;EACpD,CAAC,0BAA0B,yBAAyB;EACpD,CAAC,0BAA0B,8BAA8B;EACzD,CAAC,0BAA0B,gCAAgC;EAC3D,CAAC,2BAA2B,gCAAgC;EAC5D,CAAC,yBAAyB,iCAAiC;EAC5D,EAEsD;EACrD,IAAM,IAAQ,EAAU,GAAS,EAAS;AAC1C,MAAI,EACF,QAAO;GACL;GACA,UAAU,EAAM;GAChB,UAAU,EACR,cAAc,EAAQ,QACvB;GACF;;AAQL,KAAI,sCAAsC,KAAK,EAAS,EAAE;EACxD,IAAM,IAAU,EAAO,IAAI,UAAU;AACrC,MAAI,EACF,QAAO;GACL,YAAY;GACZ,UAAU;GACV,UAAU;IAAE,SAAS;IAAc,cAAc;IAAuB;GACzE;;AA0BL,MAAK,IAAM,CAAC,GAAS,MAjB2B;EAC9C,CAAC,mCAAmC,sBAAsB;EAC1D,CAAC,uCAAuC,kCAAkC;EAC1E,CAAC,qCAAqC,iCAAiC;EACvE,CAAC,sCAAsC,yBAAyB;EAChE,CAAC,sCAAsC,yBAAyB;EAChE,CAAC,sCAAsC,8BAA8B;EACrE,CAAC,sCAAsC,gCAAgC;EACvE,CAAC,uCAAuC,gCAAgC;EACxE,CAAC,uCAAuC,2BAA2B;EACnE,CAAC,sCAAsC,0BAA0B;EACjE,CAAC,oCAAoC,wBAAwB;EAC7D,CAAC,mCAAmC,uBAAuB;EAE3D,CAAC,wBAAwB,0BAA0B;EACpD,CAGC,KAAI,EAAU,GAAS,EAAS,CAC9B,QAAO;EACL;EACA,UAAU;GAAE,SAAS;GAAW,cAAc,EAAQ;GAAQ;EAC/D;CAIL,IAAM,IACJ,EAAO,IAAI,MAAM,WACV;EACL,IAAM,IAAW,EAAS,MAAM,IAAI,CAAC,OAAO,QAAQ;AACpD,SAAO,EAAS,SAAS,IAAI,EAAS,EAAS,SAAS,KAAK,KAAA;KAC3D;AAEN,QAAO;EACL,WAAW,KAAa,KAAA;EACxB,UAAU,EACR,GAAI,IAAY,EAAE,cAAW,GAAG,EAAE,EACnC;EACF"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Provenance chain assembly helpers.
3
+ * @module theglobalfuel/utils
4
+ *
5
+ * Pure, framework-free helpers that turn the linked records the Provenance page
6
+ * has already fetched (asset → production → inventory lot → shipment →
7
+ * delivery → chain-of-custody certificate) into:
8
+ *
9
+ * - a canonical, order-stable JSON document (the export payload), and
10
+ * - a deterministic integrity digest over that document.
11
+ *
12
+ * The digest is a *tamper-evident checksum over the records as served*, not a
13
+ * cryptographic attestation and not a distributed-ledger anchor: two exports of
14
+ * the same chain produce the same digest, and any change to a linked record's
15
+ * identity, state or timestamps changes it. That property is what makes an
16
+ * exported certificate comparable against a later re-export, which is the
17
+ * actual auditor workflow. It is computed client-side over data the caller is
18
+ * already authorized to read, so it carries no additional trust assumptions.
19
+ */
20
+ /** Records the chain is assembled from, in chain order. */
21
+ export interface ProvenanceChainInput {
22
+ asset: {
23
+ id: string;
24
+ name: string;
25
+ code?: string | null;
26
+ commodity: string;
27
+ kind: string;
28
+ status: string;
29
+ location?: string | null;
30
+ latitude?: number | null;
31
+ longitude?: number | null;
32
+ commissionedAt?: string | null;
33
+ createdAt: string;
34
+ };
35
+ production?: {
36
+ id: string;
37
+ periodStart: string;
38
+ periodEnd: string;
39
+ volume: number;
40
+ unit: string;
41
+ source?: string | null;
42
+ createdAt: string;
43
+ } | null;
44
+ lot?: {
45
+ id: string;
46
+ lotCode: string;
47
+ quantity: number;
48
+ unit: string;
49
+ status: string;
50
+ location?: string | null;
51
+ producedAt?: string | null;
52
+ createdAt: string;
53
+ } | null;
54
+ shipment?: {
55
+ id: string;
56
+ reference: string;
57
+ status: string;
58
+ mode: string;
59
+ volume: number;
60
+ unit: string;
61
+ carrier?: string | null;
62
+ trackingId?: string | null;
63
+ origin?: string | null;
64
+ destination?: string | null;
65
+ scheduledAt?: string | null;
66
+ departedAt?: string | null;
67
+ deliveredAt?: string | null;
68
+ createdAt: string;
69
+ } | null;
70
+ contract?: {
71
+ id: string;
72
+ reference: string;
73
+ counterparty: string;
74
+ side: string;
75
+ status: string;
76
+ } | null;
77
+ certificate?: {
78
+ id: string;
79
+ title: string;
80
+ category: string;
81
+ status: string;
82
+ certNumber?: string | null;
83
+ authority?: string | null;
84
+ issuedAt?: string | null;
85
+ expiresAt?: string | null;
86
+ createdAt: string;
87
+ } | null;
88
+ emissions: {
89
+ totalCo2eTonnes: number;
90
+ recordCount: number;
91
+ verifiedCount: number;
92
+ };
93
+ }
94
+ /** The canonical export document for one asset's chain of custody. */
95
+ export interface ProvenanceDocument extends ProvenanceChainInput {
96
+ /** Schema marker so a consumer can validate what it received. */
97
+ document: 'theglobalfuel.chain-of-custody';
98
+ version: 1;
99
+ /** Workspace the records belong to — provenance is always tenant-scoped. */
100
+ workspaceId: string;
101
+ /** How many of the six chain stages carry a real record. */
102
+ stagesComplete: number;
103
+ stagesTotal: number;
104
+ /** True only when the chain is delivered AND its custody cert is approved. */
105
+ verified: boolean;
106
+ /** Deterministic checksum over the chain records (see module docs). */
107
+ integrityDigest: string;
108
+ /** When this export was produced (excluded from the digest by construction). */
109
+ exportedAt: string;
110
+ }
111
+ /**
112
+ * 128-bit FNV-1a digest over the canonical JSON form, emitted as 32 lowercase
113
+ * hex characters. FNV-1a is used (rather than SHA-256 via WebCrypto) because
114
+ * the digest must be synchronous and renderable during the same paint as the
115
+ * chain it describes; it is a collision-resistant-enough content checksum for
116
+ * change detection, which is the documented purpose, not a security primitive.
117
+ */
118
+ export declare function chainDigest(input: unknown): string;
119
+ /**
120
+ * Assemble the canonical, exportable chain-of-custody document.
121
+ *
122
+ * `exportedAt` is stamped *after* the digest is computed, so re-exporting an
123
+ * unchanged chain yields an identical `integrityDigest`.
124
+ */
125
+ export declare function buildProvenanceDocument(workspaceId: string, chain: ProvenanceChainInput, stagesComplete: number, stagesTotal: number, verified: boolean): ProvenanceDocument;
126
+ /** Short, human-comparable form of a digest, e.g. `a1b2c3d4…9f0e1d2c`. */
127
+ export declare function shortDigest(digest: string): string;
128
+ /**
129
+ * Trigger a browser download of `content` as `filename`. No-ops outside a DOM
130
+ * (SSR / test) environment so callers need no guard of their own.
131
+ */
132
+ export declare function downloadTextFile(filename: string, mimeType: string, content: string): boolean;
133
+ /** Filesystem-safe slug for use in an export filename. */
134
+ export declare function slugify(value: string): string;
135
+ //# sourceMappingURL=provenance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provenance.d.ts","sourceRoot":"","sources":["../../../src/theglobalfuel/utils/provenance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ //#region src/theglobalfuel/utils/provenance.ts
2
+ function e(t) {
3
+ if (Array.isArray(t)) return t.map(e);
4
+ if (typeof t == "object" && t) {
5
+ let n = t, r = {};
6
+ for (let t of Object.keys(n).sort()) {
7
+ let i = n[t];
8
+ i !== void 0 && (r[t] = e(i));
9
+ }
10
+ return r;
11
+ }
12
+ return t;
13
+ }
14
+ function t(t) {
15
+ let n = JSON.stringify(e(t));
16
+ return [
17
+ 2166136261,
18
+ 16777619,
19
+ 2654435769,
20
+ 2246822507
21
+ ].map((e) => {
22
+ let t = e >>> 0;
23
+ for (let e = 0; e < n.length; e += 1) t ^= n.charCodeAt(e), t = Math.imul(t, 16777619) >>> 0;
24
+ return t >>> 0;
25
+ }).map((e) => e.toString(16).padStart(8, "0")).join("");
26
+ }
27
+ function n(e, n, r, i, a) {
28
+ let o = {
29
+ document: "theglobalfuel.chain-of-custody",
30
+ version: 1,
31
+ workspaceId: e,
32
+ stagesComplete: r,
33
+ stagesTotal: i,
34
+ verified: a,
35
+ ...n
36
+ };
37
+ return {
38
+ ...o,
39
+ integrityDigest: t(o),
40
+ exportedAt: (/* @__PURE__ */ new Date()).toISOString()
41
+ };
42
+ }
43
+ function r(e) {
44
+ return e.length <= 20 ? e : `${e.slice(0, 8)}…${e.slice(-8)}`;
45
+ }
46
+ function i(e, t, n) {
47
+ if (typeof document > "u" || typeof URL.createObjectURL != "function") return !1;
48
+ let r = new Blob([n], { type: `${t};charset=utf-8` }), i = URL.createObjectURL(r), a = document.createElement("a");
49
+ return a.href = i, a.download = e, a.rel = "noopener", document.body.appendChild(a), a.click(), a.remove(), URL.revokeObjectURL(i), !0;
50
+ }
51
+ function a(e) {
52
+ return e.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 60) || "asset";
53
+ }
54
+ //#endregion
55
+ export { n as buildProvenanceDocument, i as downloadTextFile, r as shortDigest, a as slugify };
56
+
57
+ //# sourceMappingURL=provenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provenance.js","names":[],"sources":["../../../src/theglobalfuel/utils/provenance.ts"],"sourcesContent":["/**\n * Provenance chain assembly helpers.\n * @module theglobalfuel/utils\n *\n * Pure, framework-free helpers that turn the linked records the Provenance page\n * has already fetched (asset → production → inventory lot → shipment →\n * delivery → chain-of-custody certificate) into:\n *\n * - a canonical, order-stable JSON document (the export payload), and\n * - a deterministic integrity digest over that document.\n *\n * The digest is a *tamper-evident checksum over the records as served*, not a\n * cryptographic attestation and not a distributed-ledger anchor: two exports of\n * the same chain produce the same digest, and any change to a linked record's\n * identity, state or timestamps changes it. That property is what makes an\n * exported certificate comparable against a later re-export, which is the\n * actual auditor workflow. It is computed client-side over data the caller is\n * already authorized to read, so it carries no additional trust assumptions.\n */\n\n/** Records the chain is assembled from, in chain order. */\nexport interface ProvenanceChainInput {\n asset: {\n id: string;\n name: string;\n code?: string | null;\n commodity: string;\n kind: string;\n status: string;\n location?: string | null;\n latitude?: number | null;\n longitude?: number | null;\n commissionedAt?: string | null;\n createdAt: string;\n };\n production?: {\n id: string;\n periodStart: string;\n periodEnd: string;\n volume: number;\n unit: string;\n source?: string | null;\n createdAt: string;\n } | null;\n lot?: {\n id: string;\n lotCode: string;\n quantity: number;\n unit: string;\n status: string;\n location?: string | null;\n producedAt?: string | null;\n createdAt: string;\n } | null;\n shipment?: {\n id: string;\n reference: string;\n status: string;\n mode: string;\n volume: number;\n unit: string;\n carrier?: string | null;\n trackingId?: string | null;\n origin?: string | null;\n destination?: string | null;\n scheduledAt?: string | null;\n departedAt?: string | null;\n deliveredAt?: string | null;\n createdAt: string;\n } | null;\n contract?: {\n id: string;\n reference: string;\n counterparty: string;\n side: string;\n status: string;\n } | null;\n certificate?: {\n id: string;\n title: string;\n category: string;\n status: string;\n certNumber?: string | null;\n authority?: string | null;\n issuedAt?: string | null;\n expiresAt?: string | null;\n createdAt: string;\n } | null;\n emissions: { totalCo2eTonnes: number; recordCount: number; verifiedCount: number };\n}\n\n/** The canonical export document for one asset's chain of custody. */\nexport interface ProvenanceDocument extends ProvenanceChainInput {\n /** Schema marker so a consumer can validate what it received. */\n document: 'theglobalfuel.chain-of-custody';\n version: 1;\n /** Workspace the records belong to — provenance is always tenant-scoped. */\n workspaceId: string;\n /** How many of the six chain stages carry a real record. */\n stagesComplete: number;\n stagesTotal: number;\n /** True only when the chain is delivered AND its custody cert is approved. */\n verified: boolean;\n /** Deterministic checksum over the chain records (see module docs). */\n integrityDigest: string;\n /** When this export was produced (excluded from the digest by construction). */\n exportedAt: string;\n}\n\n/**\n * Recursively sort object keys so the serialized form of a document depends\n * only on its content, never on property insertion order. Arrays keep their\n * order (chain order is meaningful).\n */\nfunction canonicalize(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalize);\n if (value !== null && typeof value === 'object') {\n const source = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(source).sort()) {\n const v = source[key];\n if (v === undefined) continue;\n out[key] = canonicalize(v);\n }\n return out;\n }\n return value;\n}\n\n/**\n * 128-bit FNV-1a digest over the canonical JSON form, emitted as 32 lowercase\n * hex characters. FNV-1a is used (rather than SHA-256 via WebCrypto) because\n * the digest must be synchronous and renderable during the same paint as the\n * chain it describes; it is a collision-resistant-enough content checksum for\n * change detection, which is the documented purpose, not a security primitive.\n */\nexport function chainDigest(input: unknown): string {\n const serialized = JSON.stringify(canonicalize(input));\n // Four independently seeded 32-bit FNV-1a lanes, concatenated. Each lane uses\n // the standard FNV-1a prime/offset with a distinct seed mix so lanes cannot\n // degenerate to the same value.\n const seeds = [0x811c9dc5, 0x01000193, 0x9e3779b9, 0x85ebca6b];\n const lanes = seeds.map((seed) => {\n let hash = seed >>> 0;\n for (let i = 0; i < serialized.length; i += 1) {\n hash ^= serialized.charCodeAt(i);\n // hash *= 16777619, in 32-bit arithmetic without overflow loss.\n hash = Math.imul(hash, 0x01000193) >>> 0;\n }\n return hash >>> 0;\n });\n return lanes.map((lane) => lane.toString(16).padStart(8, '0')).join('');\n}\n\n/**\n * Assemble the canonical, exportable chain-of-custody document.\n *\n * `exportedAt` is stamped *after* the digest is computed, so re-exporting an\n * unchanged chain yields an identical `integrityDigest`.\n */\nexport function buildProvenanceDocument(\n workspaceId: string,\n chain: ProvenanceChainInput,\n stagesComplete: number,\n stagesTotal: number,\n verified: boolean\n): ProvenanceDocument {\n const core = {\n document: 'theglobalfuel.chain-of-custody' as const,\n version: 1 as const,\n workspaceId,\n stagesComplete,\n stagesTotal,\n verified,\n ...chain,\n };\n return {\n ...core,\n integrityDigest: chainDigest(core),\n exportedAt: new Date().toISOString(),\n };\n}\n\n/** Short, human-comparable form of a digest, e.g. `a1b2c3d4…9f0e1d2c`. */\nexport function shortDigest(digest: string): string {\n if (digest.length <= 20) return digest;\n return `${digest.slice(0, 8)}…${digest.slice(-8)}`;\n}\n\n/**\n * Trigger a browser download of `content` as `filename`. No-ops outside a DOM\n * (SSR / test) environment so callers need no guard of their own.\n */\nexport function downloadTextFile(filename: string, mimeType: string, content: string): boolean {\n if (typeof document === 'undefined' || typeof URL.createObjectURL !== 'function') return false;\n const blob = new Blob([content], { type: `${mimeType};charset=utf-8` });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.rel = 'noopener';\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n URL.revokeObjectURL(url);\n return true;\n}\n\n/** Filesystem-safe slug for use in an export filename. */\nexport function slugify(value: string): string {\n return (\n value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 60) || 'asset'\n );\n}\n"],"mappings":";AAkHA,SAAS,EAAa,GAAyB;AAC7C,KAAI,MAAM,QAAQ,EAAM,CAAE,QAAO,EAAM,IAAI,EAAa;AACxD,KAAsB,OAAO,KAAU,YAAnC,GAA6C;EAC/C,IAAM,IAAS,GACT,IAA+B,EAAE;AACvC,OAAK,IAAM,KAAO,OAAO,KAAK,EAAO,CAAC,MAAM,EAAE;GAC5C,IAAM,IAAI,EAAO;AACb,SAAM,KAAA,MACV,EAAI,KAAO,EAAa,EAAE;;AAE5B,SAAO;;AAET,QAAO;;AAUT,SAAgB,EAAY,GAAwB;CAClD,IAAM,IAAa,KAAK,UAAU,EAAa,EAAM,CAAC;AActD,QAVc;EAAC;EAAY;EAAY;EAAY;EAAW,CAC1C,KAAK,MAAS;EAChC,IAAI,IAAO,MAAS;AACpB,OAAK,IAAI,IAAI,GAAG,IAAI,EAAW,QAAQ,KAAK,EAG1C,CAFA,KAAQ,EAAW,WAAW,EAAE,EAEhC,IAAO,KAAK,KAAK,GAAM,SAAW,KAAK;AAEzC,SAAO,MAAS;GAChB,CACW,KAAK,MAAS,EAAK,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,KAAK,GAAG;;AASzE,SAAgB,EACd,GACA,GACA,GACA,GACA,GACoB;CACpB,IAAM,IAAO;EACX,UAAU;EACV,SAAS;EACT;EACA;EACA;EACA;EACA,GAAG;EACJ;AACD,QAAO;EACL,GAAG;EACH,iBAAiB,EAAY,EAAK;EAClC,6BAAY,IAAI,MAAM,EAAC,aAAa;EACrC;;AAIH,SAAgB,EAAY,GAAwB;AAElD,QADI,EAAO,UAAU,KAAW,IACzB,GAAG,EAAO,MAAM,GAAG,EAAE,CAAC,GAAG,EAAO,MAAM,GAAG;;AAOlD,SAAgB,EAAiB,GAAkB,GAAkB,GAA0B;AAC7F,KAAI,OAAO,WAAa,OAAe,OAAO,IAAI,mBAAoB,WAAY,QAAO;CACzF,IAAM,IAAO,IAAI,KAAK,CAAC,EAAQ,EAAE,EAAE,MAAM,GAAG,EAAS,iBAAiB,CAAC,EACjE,IAAM,IAAI,gBAAgB,EAAK,EAC/B,IAAS,SAAS,cAAc,IAAI;AAQ1C,QAPA,EAAO,OAAO,GACd,EAAO,WAAW,GAClB,EAAO,MAAM,YACb,SAAS,KAAK,YAAY,EAAO,EACjC,EAAO,OAAO,EACd,EAAO,QAAQ,EACf,IAAI,gBAAgB,EAAI,EACjB;;AAIT,SAAgB,EAAQ,GAAuB;AAC7C,QACE,EACG,aAAa,CACb,QAAQ,eAAe,IAAI,CAC3B,QAAQ,YAAY,GAAG,CACvB,MAAM,GAAG,GAAG,IAAI"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-theglobalfuel",
3
- "version": "2026.716.1",
3
+ "version": "2026.720.2",
4
4
  "description": "Burdenoff TheGlobalFuel Microfrontend — Energy, Mineral & Commodity Resource operating system",
5
5
  "type": "module",
6
6
  "files": [