@burdenoff/microfe-crewfoundry 2026.1029.2 → 2026.1030.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 (47) hide show
  1. package/dist/crewfoundry/components/EmployeeSkillsPanel.d.ts +12 -0
  2. package/dist/crewfoundry/components/EmployeeSkillsPanel.d.ts.map +1 -0
  3. package/dist/crewfoundry/components/EmployeeSkillsPanel.js +168 -0
  4. package/dist/crewfoundry/components/EmployeeSkillsPanel.js.map +1 -0
  5. package/dist/crewfoundry/lib/useFocusedRecordParam.d.ts +51 -0
  6. package/dist/crewfoundry/lib/useFocusedRecordParam.d.ts.map +1 -0
  7. package/dist/crewfoundry/lib/useFocusedRecordParam.js +38 -0
  8. package/dist/crewfoundry/lib/useFocusedRecordParam.js.map +1 -0
  9. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.d.ts.map +1 -1
  10. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +119 -112
  11. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
  12. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.d.ts.map +1 -1
  13. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +78 -71
  14. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
  15. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.d.ts.map +1 -1
  16. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +88 -81
  17. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
  18. package/dist/crewfoundry/pages/HiringCandidatesPagePage.d.ts.map +1 -1
  19. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +133 -126
  20. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
  21. package/dist/crewfoundry/pages/HiringInterviewsPagePage.d.ts.map +1 -1
  22. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +150 -143
  23. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
  24. package/dist/crewfoundry/pages/HrDepartmentsPagePage.d.ts.map +1 -1
  25. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +110 -103
  26. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
  27. package/dist/crewfoundry/pages/HrEmployeeProfilePagePage.d.ts.map +1 -1
  28. package/dist/crewfoundry/pages/HrEmployeeProfilePagePage.js +124 -134
  29. package/dist/crewfoundry/pages/HrEmployeeProfilePagePage.js.map +1 -1
  30. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.d.ts.map +1 -1
  31. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +173 -162
  32. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
  33. package/dist/crewfoundry/pages/HrPayrollPagePage.d.ts.map +1 -1
  34. package/dist/crewfoundry/pages/HrPayrollPagePage.js +169 -158
  35. package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
  36. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.d.ts.map +1 -1
  37. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +179 -163
  38. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
  39. package/dist/crewfoundry/store/crewfoundryStore.d.ts +22 -0
  40. package/dist/crewfoundry/store/crewfoundryStore.d.ts.map +1 -1
  41. package/dist/crewfoundry/store/crewfoundryStore.js +158 -129
  42. package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
  43. package/dist/utils/pageContext.d.ts +43 -4
  44. package/dist/utils/pageContext.d.ts.map +1 -1
  45. package/dist/utils/pageContext.js +10 -3
  46. package/dist/utils/pageContext.js.map +1 -1
  47. package/package.json +3 -2
@@ -10,7 +10,17 @@ interface ConversationContextShape {
10
10
  activeTab?: string;
11
11
  metadata?: Record<string, unknown>;
12
12
  }
13
- export interface PageContext {
13
+ /**
14
+ * What the assistant is told about the page.
15
+ *
16
+ * A `type` alias rather than an interface so it stays assignable to the shared
17
+ * transport's index-signature `PageContext`. Every key here is on the agent's
18
+ * `ALLOWED_CONTEXT_KEYS` list (ai-assistant `src/context-loader.ts`); keys off
19
+ * that list are transmitted and then dropped, so the platform contract
20
+ * (HOW_TO_INTEGRATE_AI_ASSISTANT.md, Step 3) forbids sending `userAgent`,
21
+ * `timestamp` or anything else that would not be logged.
22
+ */
23
+ export type PageContext = {
14
24
  currentUrl: string;
15
25
  currentPage: string;
16
26
  entityType?: string;
@@ -18,10 +28,39 @@ export interface PageContext {
18
28
  platform: string;
19
29
  version: string;
20
30
  viewportSize: string;
21
- userAgent: string;
22
- timestamp: string;
23
- }
31
+ };
24
32
  export declare function gatherPageContext(): PageContext;
33
+ /**
34
+ * Every page-context entity type the assistant can receive from CrewFoundry.
35
+ *
36
+ * Each one is a record `wspace-crewfoundry-svc` owns, with a single-record
37
+ * read the assistant's CrewFoundry guide names (ai-assistant
38
+ * `context/api-calls/products/crewfoundry.md`, "Page context"). Keep the two in
39
+ * step: the guide's tests pin this exact list.
40
+ */
41
+ export declare const CREWFOUNDRY_ENTITY_TYPES: readonly ["CREWFOUNDRY_JOB_POSTING", "CREWFOUNDRY_CANDIDATE", "CREWFOUNDRY_INTERVIEW", "CREWFOUNDRY_EMPLOYEE", "CREWFOUNDRY_DEPARTMENT", "CREWFOUNDRY_TEAM", "CREWFOUNDRY_PROJECT", "CREWFOUNDRY_LEAVE_REQUEST", "CREWFOUNDRY_TIME_ENTRY", "CREWFOUNDRY_PAYROLL_RECORD", "CREWFOUNDRY_CLIENT", "CREWFOUNDRY_VENDOR", "CREWFOUNDRY_ANNOUNCEMENT", "CREWFOUNDRY_COURSE", "CREWFOUNDRY_SERVICE"];
42
+ export type CrewFoundryEntityType = (typeof CREWFOUNDRY_ENTITY_TYPES)[number];
43
+ /**
44
+ * Pages that identify a single record, keyed by their `<section>/<page>` route.
45
+ *
46
+ * Every route in `CrewFoundryRoutes` is a flat two-segment path with the record
47
+ * id in the `id` SEARCH PARAM, never a path segment:
48
+ *
49
+ * - detail pages read it (`hiring/job-details-page?id=…`);
50
+ * - list pages write it while a record is focused in place — a selected row or
51
+ * an open edit dialog — through `useFocusedRecordParam`
52
+ * (`src/crewfoundry/lib/useFocusedRecordParam.ts`).
53
+ *
54
+ * Matching is done on the last two path segments rather than an absolute path
55
+ * so the mapping survives the shell mounting the MFE under a different
56
+ * `basePath`.
57
+ *
58
+ * `CREWFOUNDRY_COURSE` is a `CrewTrainingCourse` and `CREWFOUNDRY_SERVICE` a
59
+ * `CrewServiceListing`: both are owned by the service's Learning and
60
+ * talent-marketplace modules since BOFF-4201/BOFF-4203 (BOFF-3401 retired the
61
+ * mocked surfaces that used to sit on these routes).
62
+ */
63
+ export declare const ENTITY_ROUTES: ReadonlyArray<readonly [route: string, entityType: CrewFoundryEntityType]>;
25
64
  export declare function resolveCrewFoundryConversationContext(pathname: string, search: string): ConversationContextShape;
26
65
  export {};
27
66
  //# sourceMappingURL=pageContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pageContext.d.ts","sourceRoot":"","sources":["../../src/utils/pageContext.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,UAAU,wBAAwB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAE1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,iBAAiB,IAAI,WAAW,CAoB/C;AA2BD,wBAAgB,qCAAqC,CACnD,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,wBAAwB,CA2B1B"}
1
+ {"version":3,"file":"pageContext.d.ts","sourceRoot":"","sources":["../../src/utils/pageContext.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,UAAU,wBAAwB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,WAAW,GAAG;IAExB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,iBAAiB,IAAI,WAAW,CAkB/C;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,+XAgB3B,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,aAAa,EAAE,aAAa,CACvC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAkB5D,CAAC;AAEF,wBAAgB,qCAAqC,CACnD,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,wBAAwB,CA2B1B"}
@@ -8,17 +8,24 @@ function e() {
8
8
  entityId: r.entityId,
9
9
  platform: "crewfoundry",
10
10
  version: "2026.704.1",
11
- viewportSize: `${window.innerWidth}x${window.innerHeight}`,
12
- userAgent: navigator.userAgent,
13
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
11
+ viewportSize: `${window.innerWidth}x${window.innerHeight}`
14
12
  };
15
13
  }
16
14
  var t = [
17
15
  ["hiring/job-details-page", "CREWFOUNDRY_JOB_POSTING"],
16
+ ["hiring/candidates-page", "CREWFOUNDRY_CANDIDATE"],
17
+ ["hiring/interviews-page", "CREWFOUNDRY_INTERVIEW"],
18
18
  ["hr/employee-profile-page", "CREWFOUNDRY_EMPLOYEE"],
19
+ ["hr/departments-page", "CREWFOUNDRY_DEPARTMENT"],
20
+ ["hr/leave-management-page", "CREWFOUNDRY_LEAVE_REQUEST"],
21
+ ["hr/time-tracking-page", "CREWFOUNDRY_TIME_ENTRY"],
22
+ ["hr/payroll-page", "CREWFOUNDRY_PAYROLL_RECORD"],
19
23
  ["teams/team-detail-page", "CREWFOUNDRY_TEAM"],
20
24
  ["teams/team-settings-page", "CREWFOUNDRY_TEAM"],
21
25
  ["projects/project-details-page", "CREWFOUNDRY_PROJECT"],
26
+ ["company/client-management-page", "CREWFOUNDRY_CLIENT"],
27
+ ["company/vendor-management-page", "CREWFOUNDRY_VENDOR"],
28
+ ["communications/announcements-page", "CREWFOUNDRY_ANNOUNCEMENT"],
22
29
  ["learning/course-details-page", "CREWFOUNDRY_COURSE"],
23
30
  ["marketplace/service-details-page", "CREWFOUNDRY_SERVICE"]
24
31
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"pageContext.js","names":[],"sources":["../../src/utils/pageContext.ts"],"sourcesContent":["/**\n * Page context gathering for CrewFoundry.\n *\n * Captures the user's current browser context to be sent alongside every\n * assistant prompt for better AI awareness.\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` matches the agent's allowed-context-key contract.\n currentUrl: string;\n currentPage: string;\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 = resolveCrewFoundryConversationContext(\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: 'crewfoundry',\n version: import.meta.env.VITE_APP_VERSION ?? '2026.704.1',\n viewportSize: `${window.innerWidth}x${window.innerHeight}`,\n userAgent: navigator.userAgent,\n timestamp: new Date().toISOString(),\n };\n}\n\n/**\n * Detail surfaces that identify a single record, keyed by their `<section>/<page>`\n * route.\n *\n * Every detail route in `CrewFoundryRoutes` is a flat two-segment path with the\n * record id in the `id` SEARCH PARAM — `/crewfoundry/hiring/job-details-page?id=…`\n * — never a path segment. Matching is done on the last two path segments rather\n * than an absolute path so the mapping survives the shell mounting the MFE under\n * a different `basePath`.\n *\n * `CREWFOUNDRY_CANDIDATE` is deliberately absent: candidates are selected inside\n * `hiring/candidates-page` without writing an id to the URL, so no navigable\n * location identifies one. Adding a pattern for it would only ever produce a\n * context key that never fires.\n */\nconst ENTITY_ROUTES: ReadonlyArray<readonly [route: string, entityType: string]> = [\n ['hiring/job-details-page', 'CREWFOUNDRY_JOB_POSTING'],\n ['hr/employee-profile-page', 'CREWFOUNDRY_EMPLOYEE'],\n ['teams/team-detail-page', 'CREWFOUNDRY_TEAM'],\n ['teams/team-settings-page', 'CREWFOUNDRY_TEAM'],\n ['projects/project-details-page', 'CREWFOUNDRY_PROJECT'],\n ['learning/course-details-page', 'CREWFOUNDRY_COURSE'],\n ['marketplace/service-details-page', 'CREWFOUNDRY_SERVICE'],\n];\n\nexport function resolveCrewFoundryConversationContext(\n pathname: string,\n search: string\n): ConversationContextShape {\n const params = new URLSearchParams(search);\n const segments = pathname.split('/').filter(Boolean);\n const route = segments.slice(-2).join('/');\n const entityId = params.get('id');\n\n if (entityId) {\n const matched = ENTITY_ROUTES.find(([candidateRoute]) => candidateRoute === route);\n if (matched) {\n return {\n entityType: matched[1],\n entityId,\n metadata: { route },\n };\n }\n }\n\n const activeTab =\n params.get('tab') ?? (segments.length > 2 ? segments[segments.length - 1] : undefined);\n\n return {\n activeTab: activeTab ?? undefined,\n metadata: {\n ...(activeTab ? { activeTab } : {}),\n ...(params.get('selectedId') ? { selectedId: params.get('selectedId') } : {}),\n },\n };\n}\n"],"mappings":";AA2BA,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;;AAkBH,IAAM,IAA6E;CACjF,CAAC,2BAA2B,0BAA0B;CACtD,CAAC,4BAA4B,uBAAuB;CACpD,CAAC,0BAA0B,mBAAmB;CAC9C,CAAC,4BAA4B,mBAAmB;CAChD,CAAC,iCAAiC,sBAAsB;CACxD,CAAC,gCAAgC,qBAAqB;CACtD,CAAC,oCAAoC,sBAAsB;CAC5D;AAED,SAAgB,EACd,GACA,GAC0B;CAC1B,IAAM,IAAS,IAAI,gBAAgB,EAAO,EACpC,IAAW,EAAS,MAAM,IAAI,CAAC,OAAO,QAAQ,EAC9C,IAAQ,EAAS,MAAM,GAAG,CAAC,KAAK,IAAI,EACpC,IAAW,EAAO,IAAI,KAAK;AAEjC,KAAI,GAAU;EACZ,IAAM,IAAU,EAAc,MAAM,CAAC,OAAoB,MAAmB,EAAM;AAClF,MAAI,EACF,QAAO;GACL,YAAY,EAAQ;GACpB;GACA,UAAU,EAAE,UAAO;GACpB;;CAIL,IAAM,IACJ,EAAO,IAAI,MAAM,KAAK,EAAS,SAAS,IAAI,EAAS,EAAS,SAAS,KAAK,KAAA;AAE9E,QAAO;EACL,WAAW,KAAa,KAAA;EACxB,UAAU;GACR,GAAI,IAAY,EAAE,cAAW,GAAG,EAAE;GAClC,GAAI,EAAO,IAAI,aAAa,GAAG,EAAE,YAAY,EAAO,IAAI,aAAa,EAAE,GAAG,EAAE;GAC7E;EACF"}
1
+ {"version":3,"file":"pageContext.js","names":[],"sources":["../../src/utils/pageContext.ts"],"sourcesContent":["/**\n * Page context gathering for CrewFoundry.\n *\n * Captures the user's current browser context to be sent alongside every\n * assistant prompt for better AI awareness.\n */\n\ninterface ConversationContextShape {\n entityType?: string;\n entityId?: string;\n activeTab?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * What the assistant is told about the page.\n *\n * A `type` alias rather than an interface so it stays assignable to the shared\n * transport's index-signature `PageContext`. Every key here is on the agent's\n * `ALLOWED_CONTEXT_KEYS` list (ai-assistant `src/context-loader.ts`); keys off\n * that list are transmitted and then dropped, so the platform contract\n * (HOW_TO_INTEGRATE_AI_ASSISTANT.md, Step 3) forbids sending `userAgent`,\n * `timestamp` or anything else that would not be logged.\n */\nexport type PageContext = {\n // `currentUrl` matches the agent's allowed-context-key contract.\n currentUrl: string;\n currentPage: string;\n entityType?: string;\n entityId?: string;\n platform: string;\n version: string;\n viewportSize: 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 = resolveCrewFoundryConversationContext(\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: 'crewfoundry',\n version: import.meta.env.VITE_APP_VERSION ?? '2026.704.1',\n viewportSize: `${window.innerWidth}x${window.innerHeight}`,\n };\n}\n\n/**\n * Every page-context entity type the assistant can receive from CrewFoundry.\n *\n * Each one is a record `wspace-crewfoundry-svc` owns, with a single-record\n * read the assistant's CrewFoundry guide names (ai-assistant\n * `context/api-calls/products/crewfoundry.md`, \"Page context\"). Keep the two in\n * step: the guide's tests pin this exact list.\n */\nexport const CREWFOUNDRY_ENTITY_TYPES = [\n 'CREWFOUNDRY_JOB_POSTING',\n 'CREWFOUNDRY_CANDIDATE',\n 'CREWFOUNDRY_INTERVIEW',\n 'CREWFOUNDRY_EMPLOYEE',\n 'CREWFOUNDRY_DEPARTMENT',\n 'CREWFOUNDRY_TEAM',\n 'CREWFOUNDRY_PROJECT',\n 'CREWFOUNDRY_LEAVE_REQUEST',\n 'CREWFOUNDRY_TIME_ENTRY',\n 'CREWFOUNDRY_PAYROLL_RECORD',\n 'CREWFOUNDRY_CLIENT',\n 'CREWFOUNDRY_VENDOR',\n 'CREWFOUNDRY_ANNOUNCEMENT',\n 'CREWFOUNDRY_COURSE',\n 'CREWFOUNDRY_SERVICE',\n] as const;\n\nexport type CrewFoundryEntityType = (typeof CREWFOUNDRY_ENTITY_TYPES)[number];\n\n/**\n * Pages that identify a single record, keyed by their `<section>/<page>` route.\n *\n * Every route in `CrewFoundryRoutes` is a flat two-segment path with the record\n * id in the `id` SEARCH PARAM, never a path segment:\n *\n * - detail pages read it (`hiring/job-details-page?id=…`);\n * - list pages write it while a record is focused in place — a selected row or\n * an open edit dialog — through `useFocusedRecordParam`\n * (`src/crewfoundry/lib/useFocusedRecordParam.ts`).\n *\n * Matching is done on the last two path segments rather than an absolute path\n * so the mapping survives the shell mounting the MFE under a different\n * `basePath`.\n *\n * `CREWFOUNDRY_COURSE` is a `CrewTrainingCourse` and `CREWFOUNDRY_SERVICE` a\n * `CrewServiceListing`: both are owned by the service's Learning and\n * talent-marketplace modules since BOFF-4201/BOFF-4203 (BOFF-3401 retired the\n * mocked surfaces that used to sit on these routes).\n */\nexport const ENTITY_ROUTES: ReadonlyArray<\n readonly [route: string, entityType: CrewFoundryEntityType]\n> = [\n ['hiring/job-details-page', 'CREWFOUNDRY_JOB_POSTING'],\n ['hiring/candidates-page', 'CREWFOUNDRY_CANDIDATE'],\n ['hiring/interviews-page', 'CREWFOUNDRY_INTERVIEW'],\n ['hr/employee-profile-page', 'CREWFOUNDRY_EMPLOYEE'],\n ['hr/departments-page', 'CREWFOUNDRY_DEPARTMENT'],\n ['hr/leave-management-page', 'CREWFOUNDRY_LEAVE_REQUEST'],\n ['hr/time-tracking-page', 'CREWFOUNDRY_TIME_ENTRY'],\n ['hr/payroll-page', 'CREWFOUNDRY_PAYROLL_RECORD'],\n ['teams/team-detail-page', 'CREWFOUNDRY_TEAM'],\n ['teams/team-settings-page', 'CREWFOUNDRY_TEAM'],\n ['projects/project-details-page', 'CREWFOUNDRY_PROJECT'],\n ['company/client-management-page', 'CREWFOUNDRY_CLIENT'],\n ['company/vendor-management-page', 'CREWFOUNDRY_VENDOR'],\n ['communications/announcements-page', 'CREWFOUNDRY_ANNOUNCEMENT'],\n ['learning/course-details-page', 'CREWFOUNDRY_COURSE'],\n ['marketplace/service-details-page', 'CREWFOUNDRY_SERVICE'],\n];\n\nexport function resolveCrewFoundryConversationContext(\n pathname: string,\n search: string\n): ConversationContextShape {\n const params = new URLSearchParams(search);\n const segments = pathname.split('/').filter(Boolean);\n const route = segments.slice(-2).join('/');\n const entityId = params.get('id');\n\n if (entityId) {\n const matched = ENTITY_ROUTES.find(([candidateRoute]) => candidateRoute === route);\n if (matched) {\n return {\n entityType: matched[1],\n entityId,\n metadata: { route },\n };\n }\n }\n\n const activeTab =\n params.get('tab') ?? (segments.length > 2 ? segments[segments.length - 1] : undefined);\n\n return {\n activeTab: activeTab ?? undefined,\n metadata: {\n ...(activeTab ? { activeTab } : {}),\n ...(params.get('selectedId') ? { selectedId: params.get('selectedId') } : {}),\n },\n };\n}\n"],"mappings":";AAmCA,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;EAC9C;;AAmDH,IAAa,IAET;CACF,CAAC,2BAA2B,0BAA0B;CACtD,CAAC,0BAA0B,wBAAwB;CACnD,CAAC,0BAA0B,wBAAwB;CACnD,CAAC,4BAA4B,uBAAuB;CACpD,CAAC,uBAAuB,yBAAyB;CACjD,CAAC,4BAA4B,4BAA4B;CACzD,CAAC,yBAAyB,yBAAyB;CACnD,CAAC,mBAAmB,6BAA6B;CACjD,CAAC,0BAA0B,mBAAmB;CAC9C,CAAC,4BAA4B,mBAAmB;CAChD,CAAC,iCAAiC,sBAAsB;CACxD,CAAC,kCAAkC,qBAAqB;CACxD,CAAC,kCAAkC,qBAAqB;CACxD,CAAC,qCAAqC,2BAA2B;CACjE,CAAC,gCAAgC,qBAAqB;CACtD,CAAC,oCAAoC,sBAAsB;CAC5D;AAED,SAAgB,EACd,GACA,GAC0B;CAC1B,IAAM,IAAS,IAAI,gBAAgB,EAAO,EACpC,IAAW,EAAS,MAAM,IAAI,CAAC,OAAO,QAAQ,EAC9C,IAAQ,EAAS,MAAM,GAAG,CAAC,KAAK,IAAI,EACpC,IAAW,EAAO,IAAI,KAAK;AAEjC,KAAI,GAAU;EACZ,IAAM,IAAU,EAAc,MAAM,CAAC,OAAoB,MAAmB,EAAM;AAClF,MAAI,EACF,QAAO;GACL,YAAY,EAAQ;GACpB;GACA,UAAU,EAAE,UAAO;GACpB;;CAIL,IAAM,IACJ,EAAO,IAAI,MAAM,KAAK,EAAS,SAAS,IAAI,EAAS,EAAS,SAAS,KAAK,KAAA;AAE9E,QAAO;EACL,WAAW,KAAa,KAAA;EACxB,UAAU;GACR,GAAI,IAAY,EAAE,cAAW,GAAG,EAAE;GAClC,GAAI,EAAO,IAAI,aAAa,GAAG,EAAE,YAAY,EAAO,IAAI,aAAa,EAAE,GAAG,EAAE;GAC7E;EACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-crewfoundry",
3
- "version": "2026.1029.2",
3
+ "version": "2026.1030.2",
4
4
  "description": "Burdenoff CrewFoundry Microfrontend",
5
5
  "type": "module",
6
6
  "files": [
@@ -31,7 +31,8 @@
31
31
  "lint:sanity": "if [ \"${CI:-}\" = \"true\" ]; then bun run lint; else bun run lint -- --cache --cache-location .eslintcache; fi",
32
32
  "format": "prettier --write \"src/**/*.{ts,tsx}\"",
33
33
  "type:check": "bash scripts/build-limits.sh tsc --noEmit",
34
- "sanity": "bash scripts/build-limits.sh --gate bash -c 'bun run codegen && bun run lint:sanity && bun run format && bun run type:check && bun run build'",
34
+ "test": "bun test ./tests",
35
+ "sanity": "bash scripts/build-limits.sh --gate bash -c 'bun run codegen && bun run lint:sanity && bun run format && bun run type:check && bun run test && bun run build'",
35
36
  "schema:pull": "graphql-codegen --project schema-wspace && graphql-codegen --project schema-global",
36
37
  "codegen": "graphql-codegen --project wspace && graphql-codegen --project global",
37
38
  "codegen:all": "bun run schema:pull && bun run codegen",