@elevasis/core 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/business/entities-published.d.ts +215 -0
- package/dist/business/entities-published.js +69 -0
- package/dist/index.d.ts +436 -42
- package/dist/index.js +601 -50
- package/dist/organization-model/index.d.ts +436 -42
- package/dist/organization-model/index.js +601 -50
- package/package.json +7 -3
- package/src/__tests__/publish.test.ts +1 -1
- package/src/__tests__/template-foundations-compatibility.test.ts +2 -2
- package/src/business/README.md +52 -0
- package/src/business/__tests__/entities-published.test.ts +33 -0
- package/src/business/acquisition/types.ts +2 -0
- package/src/business/entities-published.ts +24 -0
- package/src/commands/queue/types/task.ts +3 -3
- package/src/execution/engine/index.ts +8 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/__tests__/attio-crud.integration.test.ts +2 -3
- package/src/execution/engine/tools/registry.ts +26 -24
- package/src/execution/engine/tools/tool-maps.ts +13 -9
- package/src/execution/engine/workflow/types.ts +2 -3
- package/src/organization-model/README.md +16 -12
- package/src/organization-model/__tests__/defaults.test.ts +175 -0
- package/src/organization-model/__tests__/domains/customers.test.ts +295 -0
- package/src/organization-model/__tests__/domains/goals.test.ts +479 -0
- package/src/organization-model/__tests__/domains/identity.test.ts +278 -0
- package/src/organization-model/__tests__/domains/navigation.test.ts +212 -0
- package/src/organization-model/__tests__/domains/offerings.test.ts +419 -0
- package/src/organization-model/__tests__/domains/operations.test.ts +203 -0
- package/src/organization-model/__tests__/domains/resource-mappings.test.ts +362 -0
- package/src/organization-model/__tests__/domains/roles.test.ts +347 -0
- package/src/organization-model/__tests__/domains/statuses.test.ts +243 -0
- package/src/organization-model/__tests__/foundation.test.ts +105 -0
- package/src/organization-model/__tests__/resolve.test.ts +447 -3
- package/src/organization-model/__tests__/schema.test.ts +407 -0
- package/src/organization-model/contracts.ts +12 -1
- package/src/organization-model/defaults.ts +53 -17
- package/src/organization-model/domains/customers.ts +75 -0
- package/src/organization-model/domains/goals.ts +80 -0
- package/src/organization-model/domains/identity.ts +87 -0
- package/src/organization-model/domains/navigation.ts +43 -4
- package/src/organization-model/domains/offerings.ts +66 -0
- package/src/organization-model/domains/operations.ts +85 -0
- package/src/organization-model/domains/{delivery.ts → projects.ts} +6 -6
- package/src/organization-model/domains/{lead-gen.ts → prospecting.ts} +5 -5
- package/src/organization-model/domains/roles.ts +55 -0
- package/src/organization-model/domains/sales.ts +94 -0
- package/src/organization-model/domains/shared.ts +30 -1
- package/src/organization-model/domains/statuses.ts +130 -0
- package/src/organization-model/foundation.ts +3 -3
- package/src/organization-model/index.ts +3 -3
- package/src/organization-model/organization-graph.mdx +1 -0
- package/src/organization-model/organization-model.mdx +84 -19
- package/src/organization-model/published.ts +62 -4
- package/src/organization-model/schema.ts +67 -7
- package/src/organization-model/types.ts +31 -7
- package/src/platform/constants/versions.ts +1 -1
- package/src/platform/registry/types.ts +1 -1
- package/src/projects/api-schemas.ts +1 -0
- package/src/reference/_generated/contracts.md +116 -8
- package/src/reference/glossary.md +25 -4
- package/src/requests/__tests__/api-schemas.test.ts +277 -0
- package/src/requests/api-schemas.ts +83 -0
- package/src/requests/index.ts +1 -0
- package/src/supabase/database.types.ts +88 -0
- package/src/organization-model/domains/crm.ts +0 -46
- /package/src/business/{delivery → projects}/index.ts +0 -0
- /package/src/business/{delivery → projects}/types.ts +0 -0
- /package/src/business/{crm → sales}/api-schemas.ts +0 -0
package/dist/index.js
CHANGED
|
@@ -14,6 +14,25 @@ var DisplayMetadataSchema = z.object({
|
|
|
14
14
|
color: ColorTokenSchema.optional(),
|
|
15
15
|
icon: IconNameSchema.optional()
|
|
16
16
|
});
|
|
17
|
+
var TechStackEntrySchema = z.object({
|
|
18
|
+
/** Name of the external platform (e.g. "HubSpot", "Stripe", "Notion"). */
|
|
19
|
+
platform: z.string().trim().min(1).max(200),
|
|
20
|
+
/** Free-form description of what this integration is used for. */
|
|
21
|
+
purpose: z.string().trim().min(1).max(500),
|
|
22
|
+
/**
|
|
23
|
+
* Health of the credential backing this integration.
|
|
24
|
+
* - configured: credential present and valid
|
|
25
|
+
* - pending: not yet set up
|
|
26
|
+
* - expired: credential existed but has lapsed
|
|
27
|
+
* - missing: expected but not present
|
|
28
|
+
*/
|
|
29
|
+
credentialStatus: z.enum(["configured", "pending", "expired", "missing"]),
|
|
30
|
+
/**
|
|
31
|
+
* Whether this integration is the primary system of record for its domain
|
|
32
|
+
* (e.g. HubSpot is SoR for contacts). Defaults to false.
|
|
33
|
+
*/
|
|
34
|
+
isSystemOfRecord: z.boolean().default(false)
|
|
35
|
+
});
|
|
17
36
|
var ResourceMappingSchema = DisplayMetadataSchema.extend({
|
|
18
37
|
id: ModelIdSchema,
|
|
19
38
|
resourceId: z.string().trim().min(1).max(255),
|
|
@@ -21,7 +40,9 @@ var ResourceMappingSchema = DisplayMetadataSchema.extend({
|
|
|
21
40
|
featureIds: ReferenceIdsSchema,
|
|
22
41
|
entityIds: ReferenceIdsSchema,
|
|
23
42
|
surfaceIds: ReferenceIdsSchema,
|
|
24
|
-
capabilityIds: ReferenceIdsSchema
|
|
43
|
+
capabilityIds: ReferenceIdsSchema,
|
|
44
|
+
/** Optional tech-stack metadata for external-SaaS integrations. */
|
|
45
|
+
techStack: TechStackEntrySchema.optional()
|
|
25
46
|
});
|
|
26
47
|
|
|
27
48
|
// src/organization-model/domains/branding.ts
|
|
@@ -41,27 +62,27 @@ var DEFAULT_ORGANIZATION_MODEL_BRANDING = {
|
|
|
41
62
|
shortName: "Elevasis",
|
|
42
63
|
logos: {}
|
|
43
64
|
};
|
|
44
|
-
var
|
|
45
|
-
var
|
|
65
|
+
var SalesStageSemanticClassSchema = z.enum(["open", "active", "nurturing", "closed_won", "closed_lost"]);
|
|
66
|
+
var SalesStageSchema = DisplayMetadataSchema.extend({
|
|
46
67
|
id: ModelIdSchema,
|
|
47
68
|
order: z.number().int().min(0),
|
|
48
|
-
semanticClass:
|
|
69
|
+
semanticClass: SalesStageSemanticClassSchema,
|
|
49
70
|
surfaceIds: ReferenceIdsSchema,
|
|
50
71
|
resourceIds: ReferenceIdsSchema
|
|
51
72
|
});
|
|
52
|
-
var
|
|
73
|
+
var SalesPipelineSchema = z.object({
|
|
53
74
|
id: ModelIdSchema,
|
|
54
75
|
label: z.string().trim().min(1).max(120),
|
|
55
76
|
description: DescriptionSchema.optional(),
|
|
56
77
|
entityId: ModelIdSchema,
|
|
57
|
-
stages: z.array(
|
|
78
|
+
stages: z.array(SalesStageSchema).min(1)
|
|
58
79
|
});
|
|
59
|
-
var
|
|
80
|
+
var OrganizationModelSalesSchema = z.object({
|
|
60
81
|
entityId: ModelIdSchema,
|
|
61
82
|
defaultPipelineId: ModelIdSchema,
|
|
62
|
-
pipelines: z.array(
|
|
83
|
+
pipelines: z.array(SalesPipelineSchema).min(1)
|
|
63
84
|
});
|
|
64
|
-
var
|
|
85
|
+
var DEFAULT_ORGANIZATION_MODEL_SALES = {
|
|
65
86
|
entityId: "crm.deal",
|
|
66
87
|
defaultPipelineId: "default",
|
|
67
88
|
pipelines: [
|
|
@@ -70,29 +91,77 @@ var DEFAULT_ORGANIZATION_MODEL_CRM = {
|
|
|
70
91
|
label: "Default Pipeline",
|
|
71
92
|
entityId: "crm.deal",
|
|
72
93
|
stages: [
|
|
73
|
-
{
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
94
|
+
{
|
|
95
|
+
id: "interested",
|
|
96
|
+
label: "Interested",
|
|
97
|
+
color: "blue",
|
|
98
|
+
order: 1,
|
|
99
|
+
semanticClass: "open",
|
|
100
|
+
surfaceIds: ["crm.pipeline"],
|
|
101
|
+
resourceIds: []
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: "proposal",
|
|
105
|
+
label: "Proposal",
|
|
106
|
+
color: "yellow",
|
|
107
|
+
order: 2,
|
|
108
|
+
semanticClass: "active",
|
|
109
|
+
surfaceIds: ["crm.pipeline"],
|
|
110
|
+
resourceIds: []
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
id: "closing",
|
|
114
|
+
label: "Closing",
|
|
115
|
+
color: "lime",
|
|
116
|
+
order: 3,
|
|
117
|
+
semanticClass: "active",
|
|
118
|
+
surfaceIds: ["crm.pipeline"],
|
|
119
|
+
resourceIds: []
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
id: "closed_won",
|
|
123
|
+
label: "Closed Won",
|
|
124
|
+
color: "green",
|
|
125
|
+
order: 4,
|
|
126
|
+
semanticClass: "closed_won",
|
|
127
|
+
surfaceIds: ["crm.pipeline"],
|
|
128
|
+
resourceIds: []
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
id: "closed_lost",
|
|
132
|
+
label: "Closed Lost",
|
|
133
|
+
color: "red",
|
|
134
|
+
order: 5,
|
|
135
|
+
semanticClass: "closed_lost",
|
|
136
|
+
surfaceIds: ["crm.pipeline"],
|
|
137
|
+
resourceIds: []
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
id: "nurturing",
|
|
141
|
+
label: "Nurturing",
|
|
142
|
+
color: "grape",
|
|
143
|
+
order: 6,
|
|
144
|
+
semanticClass: "nurturing",
|
|
145
|
+
surfaceIds: ["crm.pipeline"],
|
|
146
|
+
resourceIds: []
|
|
147
|
+
}
|
|
79
148
|
]
|
|
80
149
|
}
|
|
81
150
|
]
|
|
82
151
|
};
|
|
83
|
-
var
|
|
152
|
+
var ProjectsDomainStateSchema = DisplayMetadataSchema.extend({
|
|
84
153
|
id: ModelIdSchema,
|
|
85
154
|
order: z.number().int().min(0)
|
|
86
155
|
});
|
|
87
|
-
var
|
|
156
|
+
var OrganizationModelProjectsSchema = z.object({
|
|
88
157
|
projectEntityId: ModelIdSchema,
|
|
89
158
|
milestoneEntityId: ModelIdSchema,
|
|
90
159
|
taskEntityId: ModelIdSchema,
|
|
91
|
-
projectStatuses: z.array(
|
|
92
|
-
milestoneStatuses: z.array(
|
|
93
|
-
taskStatuses: z.array(
|
|
160
|
+
projectStatuses: z.array(ProjectsDomainStateSchema).min(1),
|
|
161
|
+
milestoneStatuses: z.array(ProjectsDomainStateSchema).min(1),
|
|
162
|
+
taskStatuses: z.array(ProjectsDomainStateSchema).min(1)
|
|
94
163
|
});
|
|
95
|
-
var
|
|
164
|
+
var DEFAULT_ORGANIZATION_MODEL_PROJECTS = {
|
|
96
165
|
projectEntityId: "delivery.project",
|
|
97
166
|
milestoneEntityId: "delivery.milestone",
|
|
98
167
|
taskEntityId: "delivery.task",
|
|
@@ -135,19 +204,19 @@ var FeatureSchema = z.object({
|
|
|
135
204
|
resourceIds: ReferenceIdsSchema,
|
|
136
205
|
capabilityIds: ReferenceIdsSchema
|
|
137
206
|
});
|
|
138
|
-
var
|
|
207
|
+
var ProspectingLifecycleStageSchema = DisplayMetadataSchema.extend({
|
|
139
208
|
id: ModelIdSchema,
|
|
140
209
|
order: z.number().int().min(0)
|
|
141
210
|
});
|
|
142
|
-
var
|
|
211
|
+
var OrganizationModelProspectingSchema = z.object({
|
|
143
212
|
listEntityId: ModelIdSchema,
|
|
144
213
|
companyEntityId: ModelIdSchema,
|
|
145
214
|
contactEntityId: ModelIdSchema,
|
|
146
215
|
description: DescriptionSchema.optional(),
|
|
147
|
-
companyStages: z.array(
|
|
148
|
-
contactStages: z.array(
|
|
216
|
+
companyStages: z.array(ProspectingLifecycleStageSchema).min(1),
|
|
217
|
+
contactStages: z.array(ProspectingLifecycleStageSchema).min(1)
|
|
149
218
|
});
|
|
150
|
-
var
|
|
219
|
+
var DEFAULT_ORGANIZATION_MODEL_PROSPECTING = {
|
|
151
220
|
listEntityId: "leadgen.list",
|
|
152
221
|
companyEntityId: "leadgen.company",
|
|
153
222
|
contactEntityId: "leadgen.contact",
|
|
@@ -167,7 +236,16 @@ var DEFAULT_ORGANIZATION_MODEL_LEAD_GEN = {
|
|
|
167
236
|
// src/organization-model/contracts.ts
|
|
168
237
|
var PROJECTS_FEATURE_ID = "projects";
|
|
169
238
|
var PROJECTS_INDEX_SURFACE_ID = "projects.index";
|
|
170
|
-
var
|
|
239
|
+
var PROJECTS_VIEW_CAPABILITY_ID = "delivery.projects.view";
|
|
240
|
+
var SALES_FEATURE_ID = "crm";
|
|
241
|
+
var PROSPECTING_FEATURE_ID = "lead-gen";
|
|
242
|
+
var OPERATIONS_FEATURE_ID = "operations";
|
|
243
|
+
var MONITORING_FEATURE_ID = "monitoring";
|
|
244
|
+
var SETTINGS_FEATURE_ID = "settings";
|
|
245
|
+
var SEO_FEATURE_ID = "seo";
|
|
246
|
+
var SALES_PIPELINE_SURFACE_ID = "crm.pipeline";
|
|
247
|
+
var PROSPECTING_LISTS_SURFACE_ID = "lead-gen.lists";
|
|
248
|
+
var OPERATIONS_ORGANIZATION_GRAPH_SURFACE_ID = "operations.organization-graph";
|
|
171
249
|
|
|
172
250
|
// src/organization-model/domains/navigation.ts
|
|
173
251
|
var SurfaceTypeSchema = z.enum(["page", "dashboard", "graph", "detail", "list", "settings"]);
|
|
@@ -189,7 +267,7 @@ var SurfaceDefinitionSchema = z.object({
|
|
|
189
267
|
var NavigationGroupSchema = z.object({
|
|
190
268
|
id: ModelIdSchema,
|
|
191
269
|
label: LabelSchema,
|
|
192
|
-
placement: z.
|
|
270
|
+
placement: z.string().trim().min(1).max(50),
|
|
193
271
|
surfaceIds: z.array(ModelIdSchema).default([])
|
|
194
272
|
});
|
|
195
273
|
var OrganizationModelNavigationSchema = z.object({
|
|
@@ -234,7 +312,7 @@ var DEFAULT_ORGANIZATION_MODEL_NAVIGATION = {
|
|
|
234
312
|
featureIds: [PROJECTS_FEATURE_ID],
|
|
235
313
|
entityIds: ["delivery.project"],
|
|
236
314
|
resourceIds: [],
|
|
237
|
-
capabilityIds: [
|
|
315
|
+
capabilityIds: [PROJECTS_VIEW_CAPABILITY_ID]
|
|
238
316
|
},
|
|
239
317
|
{
|
|
240
318
|
id: "operations.organization-graph",
|
|
@@ -380,6 +458,30 @@ var DEFAULT_ORGANIZATION_MODEL_NAVIGATION = {
|
|
|
380
458
|
resourceIds: [],
|
|
381
459
|
capabilityIds: []
|
|
382
460
|
},
|
|
461
|
+
{
|
|
462
|
+
id: "submitted-requests.list",
|
|
463
|
+
label: "Submitted Requests",
|
|
464
|
+
path: "/monitoring/requests",
|
|
465
|
+
surfaceType: "list",
|
|
466
|
+
enabled: true,
|
|
467
|
+
featureId: "submitted-requests",
|
|
468
|
+
featureIds: ["submitted-requests"],
|
|
469
|
+
entityIds: ["reported_request"],
|
|
470
|
+
resourceIds: [],
|
|
471
|
+
capabilityIds: []
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
id: "submitted-requests.detail",
|
|
475
|
+
label: "Request Detail",
|
|
476
|
+
path: "/monitoring/requests/:requestId",
|
|
477
|
+
surfaceType: "detail",
|
|
478
|
+
enabled: true,
|
|
479
|
+
featureId: "submitted-requests",
|
|
480
|
+
featureIds: ["submitted-requests"],
|
|
481
|
+
entityIds: ["reported_request"],
|
|
482
|
+
resourceIds: [],
|
|
483
|
+
capabilityIds: []
|
|
484
|
+
},
|
|
383
485
|
{
|
|
384
486
|
id: "settings.account",
|
|
385
487
|
label: "Account",
|
|
@@ -495,7 +597,9 @@ var DEFAULT_ORGANIZATION_MODEL_NAVIGATION = {
|
|
|
495
597
|
"monitoring.execution-logs",
|
|
496
598
|
"monitoring.execution-health",
|
|
497
599
|
"monitoring.cost-analytics",
|
|
498
|
-
"monitoring.notifications"
|
|
600
|
+
"monitoring.notifications",
|
|
601
|
+
"submitted-requests.list",
|
|
602
|
+
"submitted-requests.detail"
|
|
499
603
|
]
|
|
500
604
|
},
|
|
501
605
|
{
|
|
@@ -514,6 +618,392 @@ var DEFAULT_ORGANIZATION_MODEL_NAVIGATION = {
|
|
|
514
618
|
}
|
|
515
619
|
]
|
|
516
620
|
};
|
|
621
|
+
var BusinessHoursDaySchema = z.object({
|
|
622
|
+
open: z.string().trim().regex(/^\d{2}:\d{2}$/, "Expected HH:MM format"),
|
|
623
|
+
close: z.string().trim().regex(/^\d{2}:\d{2}$/, "Expected HH:MM format")
|
|
624
|
+
});
|
|
625
|
+
var BusinessHoursSchema = z.object({
|
|
626
|
+
monday: BusinessHoursDaySchema.optional(),
|
|
627
|
+
tuesday: BusinessHoursDaySchema.optional(),
|
|
628
|
+
wednesday: BusinessHoursDaySchema.optional(),
|
|
629
|
+
thursday: BusinessHoursDaySchema.optional(),
|
|
630
|
+
friday: BusinessHoursDaySchema.optional(),
|
|
631
|
+
saturday: BusinessHoursDaySchema.optional(),
|
|
632
|
+
sunday: BusinessHoursDaySchema.optional()
|
|
633
|
+
}).default({});
|
|
634
|
+
var IdentityDomainSchema = z.object({
|
|
635
|
+
/** Why the organization exists — one or two plain-language sentences. */
|
|
636
|
+
mission: z.string().trim().max(1e3).default(""),
|
|
637
|
+
/** Long-term direction the organization is moving toward. */
|
|
638
|
+
vision: z.string().trim().max(1e3).default(""),
|
|
639
|
+
/** Legal registered name of the entity. */
|
|
640
|
+
legalName: z.string().trim().max(200).default(""),
|
|
641
|
+
/**
|
|
642
|
+
* Type of legal entity (e.g. "LLC", "Corporation", "Sole Proprietor",
|
|
643
|
+
* "Non-profit"). Free-form string so it covers any jurisdiction.
|
|
644
|
+
*/
|
|
645
|
+
entityType: z.string().trim().max(100).default(""),
|
|
646
|
+
/**
|
|
647
|
+
* Primary jurisdiction of registration or operation
|
|
648
|
+
* (e.g. "United States – Delaware", "Canada – Ontario").
|
|
649
|
+
*/
|
|
650
|
+
jurisdiction: z.string().trim().max(200).default(""),
|
|
651
|
+
/**
|
|
652
|
+
* Industry category — broad classification (e.g. "Marketing Agency",
|
|
653
|
+
* "Software / SaaS", "Professional Services").
|
|
654
|
+
*/
|
|
655
|
+
industryCategory: z.string().trim().max(200).default(""),
|
|
656
|
+
/**
|
|
657
|
+
* Geographic focus — where the organization primarily operates or serves
|
|
658
|
+
* (e.g. "North America", "Global", "Southeast Asia").
|
|
659
|
+
*/
|
|
660
|
+
geographicFocus: z.string().trim().max(200).default(""),
|
|
661
|
+
/**
|
|
662
|
+
* IANA timezone identifier for the organization's primary operating timezone
|
|
663
|
+
* (e.g. "America/Los_Angeles", "Europe/London", "UTC").
|
|
664
|
+
*/
|
|
665
|
+
timeZone: z.string().trim().max(100).default("UTC"),
|
|
666
|
+
/** Typical operating hours per day of week. Empty object means not configured. */
|
|
667
|
+
businessHours: BusinessHoursSchema
|
|
668
|
+
});
|
|
669
|
+
var DEFAULT_ORGANIZATION_MODEL_IDENTITY = {
|
|
670
|
+
mission: "",
|
|
671
|
+
vision: "",
|
|
672
|
+
legalName: "",
|
|
673
|
+
entityType: "",
|
|
674
|
+
jurisdiction: "",
|
|
675
|
+
industryCategory: "",
|
|
676
|
+
geographicFocus: "",
|
|
677
|
+
timeZone: "UTC",
|
|
678
|
+
businessHours: {}
|
|
679
|
+
};
|
|
680
|
+
var FirmographicsSchema = z.object({
|
|
681
|
+
/** Industry vertical (e.g. "Marketing Agency", "Legal", "Real Estate"). */
|
|
682
|
+
industry: z.string().trim().max(200).optional(),
|
|
683
|
+
/**
|
|
684
|
+
* Company headcount band (e.g. "1–10", "11–50", "51–200", "200+").
|
|
685
|
+
* Free-form string to accommodate any band notation.
|
|
686
|
+
*/
|
|
687
|
+
companySize: z.string().trim().max(100).optional(),
|
|
688
|
+
/**
|
|
689
|
+
* Primary geographic region the segment operates in or is targeted from
|
|
690
|
+
* (e.g. "North America", "Europe", "Global").
|
|
691
|
+
*/
|
|
692
|
+
region: z.string().trim().max(200).optional()
|
|
693
|
+
});
|
|
694
|
+
var CustomerSegmentSchema = z.object({
|
|
695
|
+
/** Stable unique identifier for the segment (e.g. "segment-smb-agencies"). */
|
|
696
|
+
id: z.string().trim().min(1).max(100),
|
|
697
|
+
/** Human-readable name shown to agents and in UI (e.g. "SMB Marketing Agencies"). */
|
|
698
|
+
name: z.string().trim().max(200).default(""),
|
|
699
|
+
/** One or two sentences describing who this segment is. */
|
|
700
|
+
description: z.string().trim().max(2e3).default(""),
|
|
701
|
+
/**
|
|
702
|
+
* The primary job(s) this segment is trying to get done — the goal they hire
|
|
703
|
+
* a product/service to accomplish. Plain-language narrative or bullet list.
|
|
704
|
+
*/
|
|
705
|
+
jobsToBeDone: z.string().trim().max(2e3).default(""),
|
|
706
|
+
/**
|
|
707
|
+
* Pains — frustrations, obstacles, and risks the segment experiences
|
|
708
|
+
* when trying to accomplish their jobs-to-be-done.
|
|
709
|
+
*/
|
|
710
|
+
pains: z.array(z.string().trim().max(500)).default([]),
|
|
711
|
+
/**
|
|
712
|
+
* Gains — outcomes and benefits the segment desires; positive motivators
|
|
713
|
+
* beyond merely resolving pains.
|
|
714
|
+
*/
|
|
715
|
+
gains: z.array(z.string().trim().max(500)).default([]),
|
|
716
|
+
/** Firmographic profile for targeting and filtering. */
|
|
717
|
+
firmographics: FirmographicsSchema.default({}),
|
|
718
|
+
/**
|
|
719
|
+
* Value proposition — one or two sentences stating why this organization's
|
|
720
|
+
* offering is uniquely suited for this segment's needs.
|
|
721
|
+
*/
|
|
722
|
+
valueProp: z.string().trim().max(2e3).default("")
|
|
723
|
+
});
|
|
724
|
+
var CustomersDomainSchema = z.object({
|
|
725
|
+
segments: z.array(CustomerSegmentSchema).default([])
|
|
726
|
+
});
|
|
727
|
+
var DEFAULT_ORGANIZATION_MODEL_CUSTOMERS = {
|
|
728
|
+
segments: []
|
|
729
|
+
};
|
|
730
|
+
var PricingModelSchema = z.enum(["one-time", "subscription", "usage-based", "custom"]);
|
|
731
|
+
var ProductSchema = z.object({
|
|
732
|
+
/** Stable unique identifier for the product (e.g. "product-starter-plan"). */
|
|
733
|
+
id: z.string().trim().min(1).max(100),
|
|
734
|
+
/** Human-readable name shown to agents and in UI (e.g. "Starter Plan"). */
|
|
735
|
+
name: z.string().trim().max(200).default(""),
|
|
736
|
+
/** One or two sentences describing what this product/service delivers. */
|
|
737
|
+
description: z.string().trim().max(2e3).default(""),
|
|
738
|
+
/**
|
|
739
|
+
* How this product is priced:
|
|
740
|
+
* - "one-time" — single purchase (setup fee, project fee)
|
|
741
|
+
* - "subscription" — recurring (monthly/annual SaaS, retainer)
|
|
742
|
+
* - "usage-based" — metered by consumption (API calls, seats)
|
|
743
|
+
* - "custom" — negotiated or bespoke pricing
|
|
744
|
+
*/
|
|
745
|
+
pricingModel: PricingModelSchema.default("custom"),
|
|
746
|
+
/** Base price amount (≥ 0). Currency unit defined by `currency`. */
|
|
747
|
+
price: z.number().min(0).default(0),
|
|
748
|
+
/**
|
|
749
|
+
* ISO 4217 currency code (e.g. "USD", "EUR", "GBP").
|
|
750
|
+
* Free-form string to accommodate any currency; defaults to "USD".
|
|
751
|
+
*/
|
|
752
|
+
currency: z.string().trim().max(10).default("USD"),
|
|
753
|
+
/**
|
|
754
|
+
* IDs of customer segments this product targets.
|
|
755
|
+
* Each id must reference a declared `customers.segments[].id`.
|
|
756
|
+
* Cross-reference enforced in `OrganizationModelSchema.superRefine()`.
|
|
757
|
+
*/
|
|
758
|
+
targetSegmentIds: z.array(z.string().trim().min(1)).default([]),
|
|
759
|
+
/**
|
|
760
|
+
* Optional: ID of the platform feature responsible for delivering this product.
|
|
761
|
+
* When present, must reference a declared `features[].id`.
|
|
762
|
+
* Cross-reference enforced in `OrganizationModelSchema.superRefine()`.
|
|
763
|
+
*/
|
|
764
|
+
deliveryFeatureId: z.string().trim().min(1).optional()
|
|
765
|
+
});
|
|
766
|
+
var OfferingsDomainSchema = z.object({
|
|
767
|
+
products: z.array(ProductSchema).default([])
|
|
768
|
+
});
|
|
769
|
+
var DEFAULT_ORGANIZATION_MODEL_OFFERINGS = {
|
|
770
|
+
products: []
|
|
771
|
+
};
|
|
772
|
+
var RoleSchema = z.object({
|
|
773
|
+
/** Stable unique identifier for the role (e.g. "role-ceo", "role-head-of-sales"). */
|
|
774
|
+
id: z.string().trim().min(1).max(100),
|
|
775
|
+
/** Human-readable title shown to agents and in UI (e.g. "CEO", "Head of Sales"). */
|
|
776
|
+
title: z.string().trim().min(1).max(200),
|
|
777
|
+
/**
|
|
778
|
+
* List of responsibilities this role owns — plain-language descriptions of
|
|
779
|
+
* what the person in this role is accountable for delivering.
|
|
780
|
+
* Defaults to empty array so minimal role definitions stay concise.
|
|
781
|
+
*/
|
|
782
|
+
responsibilities: z.array(z.string().trim().max(500)).default([]),
|
|
783
|
+
/**
|
|
784
|
+
* Optional: ID of another role this role reports to.
|
|
785
|
+
* When present, must reference another `roles[].id` in the same organization.
|
|
786
|
+
* Cross-reference enforced in `OrganizationModelSchema.superRefine()`.
|
|
787
|
+
* Absence indicates a top-level role (no reporting line).
|
|
788
|
+
*/
|
|
789
|
+
reportsToId: z.string().trim().min(1).max(100).optional(),
|
|
790
|
+
/**
|
|
791
|
+
* Optional: name or email of the person currently holding this role.
|
|
792
|
+
* Free-form string — supports "Alice Johnson", "alice@example.com", or
|
|
793
|
+
* any human-readable identifier. Not validated against any user registry.
|
|
794
|
+
*/
|
|
795
|
+
heldBy: z.string().trim().max(200).optional()
|
|
796
|
+
});
|
|
797
|
+
var RolesDomainSchema = z.object({
|
|
798
|
+
roles: z.array(RoleSchema).default([])
|
|
799
|
+
});
|
|
800
|
+
var DEFAULT_ORGANIZATION_MODEL_ROLES = {
|
|
801
|
+
roles: []
|
|
802
|
+
};
|
|
803
|
+
var KeyResultSchema = z.object({
|
|
804
|
+
/** Stable unique identifier for the measurable outcome (e.g. "kr-revenue-q1"). */
|
|
805
|
+
id: z.string().trim().min(1).max(100),
|
|
806
|
+
/** Plain-language description of this measurable outcome (e.g. "Increase trial-to-paid conversion"). */
|
|
807
|
+
description: z.string().trim().min(1).max(500),
|
|
808
|
+
/**
|
|
809
|
+
* What is being measured — the metric name (e.g. "monthly revenue", "NPS score",
|
|
810
|
+
* "trial-to-paid conversion rate"). Free-form string.
|
|
811
|
+
*/
|
|
812
|
+
targetMetric: z.string().trim().min(1).max(200),
|
|
813
|
+
/** Current measured value. Defaults to 0 when not yet tracked. */
|
|
814
|
+
currentValue: z.number().default(0),
|
|
815
|
+
/**
|
|
816
|
+
* Target value to reach for this measurable outcome to be considered achieved.
|
|
817
|
+
* Optional — omit if the outcome is directional (e.g. "reduce churn") without
|
|
818
|
+
* a hard numeric target.
|
|
819
|
+
*/
|
|
820
|
+
targetValue: z.number().optional()
|
|
821
|
+
});
|
|
822
|
+
var ISO_DATE_REGEX = /^\d{4}-\d{2}-\d{2}$/;
|
|
823
|
+
var ObjectiveSchema = z.object({
|
|
824
|
+
/** Stable unique identifier for the goal (e.g. "goal-grow-arr-q1-2026"). */
|
|
825
|
+
id: z.string().trim().min(1).max(100),
|
|
826
|
+
/** Plain-language description of what the organization wants to achieve. */
|
|
827
|
+
description: z.string().trim().min(1).max(1e3),
|
|
828
|
+
/**
|
|
829
|
+
* Start of the period this goal is active for — ISO 8601 date string (YYYY-MM-DD).
|
|
830
|
+
* Must be strictly before `periodEnd`.
|
|
831
|
+
*/
|
|
832
|
+
periodStart: z.string().regex(ISO_DATE_REGEX, "periodStart must be an ISO date string (YYYY-MM-DD)"),
|
|
833
|
+
/**
|
|
834
|
+
* End of the period this goal is active for — ISO 8601 date string (YYYY-MM-DD).
|
|
835
|
+
* Must be strictly after `periodStart`.
|
|
836
|
+
* Enforced via `OrganizationModelSchema.superRefine()`.
|
|
837
|
+
*/
|
|
838
|
+
periodEnd: z.string().regex(ISO_DATE_REGEX, "periodEnd must be an ISO date string (YYYY-MM-DD)"),
|
|
839
|
+
/**
|
|
840
|
+
* List of measurable outcomes that define success for this goal.
|
|
841
|
+
* Defaults to empty array so goals can be declared before outcomes are defined.
|
|
842
|
+
*/
|
|
843
|
+
keyResults: z.array(KeyResultSchema).default([])
|
|
844
|
+
});
|
|
845
|
+
var GoalsDomainSchema = z.object({
|
|
846
|
+
objectives: z.array(ObjectiveSchema).default([])
|
|
847
|
+
});
|
|
848
|
+
var DEFAULT_ORGANIZATION_MODEL_GOALS = {
|
|
849
|
+
objectives: []
|
|
850
|
+
};
|
|
851
|
+
var OperationSemanticClassSchema = z.enum(["queue", "executions", "sessions", "notifications", "schedules"]);
|
|
852
|
+
var OperationEntrySchema = z.object({
|
|
853
|
+
id: z.string().trim().min(1).max(100),
|
|
854
|
+
label: z.string().trim().min(1).max(120),
|
|
855
|
+
semanticClass: OperationSemanticClassSchema,
|
|
856
|
+
/** Optional reference to the feature that owns this runtime entity. */
|
|
857
|
+
featureId: z.string().trim().min(1).max(100).optional(),
|
|
858
|
+
/**
|
|
859
|
+
* Optional pointer to the status semanticClass values that apply to this
|
|
860
|
+
* entity — ties operations back to the statuses domain for vibe rendering.
|
|
861
|
+
*/
|
|
862
|
+
supportedStatusSemanticClass: z.array(z.string().trim().min(1).max(80)).optional()
|
|
863
|
+
});
|
|
864
|
+
var OperationsDomainSchema = z.object({
|
|
865
|
+
entries: z.array(OperationEntrySchema).default([])
|
|
866
|
+
});
|
|
867
|
+
var DEFAULT_ORGANIZATION_MODEL_OPERATIONS = {
|
|
868
|
+
entries: [
|
|
869
|
+
// --- queue (HITL command queue) ---
|
|
870
|
+
{
|
|
871
|
+
id: "operations.queue",
|
|
872
|
+
label: "HITL Queue",
|
|
873
|
+
semanticClass: "queue",
|
|
874
|
+
featureId: "operations",
|
|
875
|
+
supportedStatusSemanticClass: ["queue"]
|
|
876
|
+
},
|
|
877
|
+
// --- executions (workflow / agent executions) ---
|
|
878
|
+
{
|
|
879
|
+
id: "operations.executions",
|
|
880
|
+
label: "Executions",
|
|
881
|
+
semanticClass: "executions",
|
|
882
|
+
featureId: "operations",
|
|
883
|
+
supportedStatusSemanticClass: ["execution"]
|
|
884
|
+
},
|
|
885
|
+
// --- sessions (agent conversation sessions) ---
|
|
886
|
+
{
|
|
887
|
+
id: "operations.sessions",
|
|
888
|
+
label: "Sessions",
|
|
889
|
+
semanticClass: "sessions",
|
|
890
|
+
featureId: "operations"
|
|
891
|
+
},
|
|
892
|
+
// --- notifications (platform in-app notifications) ---
|
|
893
|
+
{
|
|
894
|
+
id: "operations.notifications",
|
|
895
|
+
label: "Notifications",
|
|
896
|
+
semanticClass: "notifications",
|
|
897
|
+
featureId: "monitoring"
|
|
898
|
+
},
|
|
899
|
+
// --- schedules (task scheduler) ---
|
|
900
|
+
{
|
|
901
|
+
id: "operations.schedules",
|
|
902
|
+
label: "Schedules",
|
|
903
|
+
semanticClass: "schedules",
|
|
904
|
+
featureId: "operations",
|
|
905
|
+
supportedStatusSemanticClass: ["schedule", "schedule.run"]
|
|
906
|
+
}
|
|
907
|
+
]
|
|
908
|
+
};
|
|
909
|
+
var StatusSemanticClassSchema = z.enum([
|
|
910
|
+
"delivery.task",
|
|
911
|
+
"delivery.project",
|
|
912
|
+
"delivery.milestone",
|
|
913
|
+
"queue",
|
|
914
|
+
"execution",
|
|
915
|
+
"schedule",
|
|
916
|
+
"schedule.run",
|
|
917
|
+
"request"
|
|
918
|
+
]);
|
|
919
|
+
var StatusEntrySchema = z.object({
|
|
920
|
+
id: z.string().trim().min(1).max(100),
|
|
921
|
+
label: z.string().trim().min(1).max(120),
|
|
922
|
+
semanticClass: StatusSemanticClassSchema,
|
|
923
|
+
category: z.string().trim().min(1).max(80).optional()
|
|
924
|
+
});
|
|
925
|
+
var StatusesDomainSchema = z.object({
|
|
926
|
+
entries: z.array(StatusEntrySchema).default([])
|
|
927
|
+
});
|
|
928
|
+
var DEFAULT_ORGANIZATION_MODEL_STATUSES = {
|
|
929
|
+
entries: [
|
|
930
|
+
// --- delivery.task (TaskStatus — 9 values) ---
|
|
931
|
+
{ id: "delivery.task.planned", label: "Planned", semanticClass: "delivery.task", category: "delivery" },
|
|
932
|
+
{ id: "delivery.task.in_progress", label: "In Progress", semanticClass: "delivery.task", category: "delivery" },
|
|
933
|
+
{ id: "delivery.task.blocked", label: "Blocked", semanticClass: "delivery.task", category: "delivery" },
|
|
934
|
+
{ id: "delivery.task.submitted", label: "Submitted", semanticClass: "delivery.task", category: "delivery" },
|
|
935
|
+
{ id: "delivery.task.approved", label: "Approved", semanticClass: "delivery.task", category: "delivery" },
|
|
936
|
+
{
|
|
937
|
+
id: "delivery.task.revision_requested",
|
|
938
|
+
label: "Revision Requested",
|
|
939
|
+
semanticClass: "delivery.task",
|
|
940
|
+
category: "delivery"
|
|
941
|
+
},
|
|
942
|
+
{ id: "delivery.task.rejected", label: "Rejected", semanticClass: "delivery.task", category: "delivery" },
|
|
943
|
+
{ id: "delivery.task.cancelled", label: "Cancelled", semanticClass: "delivery.task", category: "delivery" },
|
|
944
|
+
{ id: "delivery.task.completed", label: "Completed", semanticClass: "delivery.task", category: "delivery" },
|
|
945
|
+
// --- delivery.project (ProjectStatus — 6 values) ---
|
|
946
|
+
{ id: "delivery.project.active", label: "Active", semanticClass: "delivery.project", category: "delivery" },
|
|
947
|
+
{ id: "delivery.project.on_track", label: "On Track", semanticClass: "delivery.project", category: "delivery" },
|
|
948
|
+
{ id: "delivery.project.at_risk", label: "At Risk", semanticClass: "delivery.project", category: "delivery" },
|
|
949
|
+
{ id: "delivery.project.blocked", label: "Blocked", semanticClass: "delivery.project", category: "delivery" },
|
|
950
|
+
{ id: "delivery.project.paused", label: "Paused", semanticClass: "delivery.project", category: "delivery" },
|
|
951
|
+
{ id: "delivery.project.completed", label: "Completed", semanticClass: "delivery.project", category: "delivery" },
|
|
952
|
+
// --- delivery.milestone (MilestoneStatus — 5 values) ---
|
|
953
|
+
{
|
|
954
|
+
id: "delivery.milestone.upcoming",
|
|
955
|
+
label: "Upcoming",
|
|
956
|
+
semanticClass: "delivery.milestone",
|
|
957
|
+
category: "delivery"
|
|
958
|
+
},
|
|
959
|
+
{
|
|
960
|
+
id: "delivery.milestone.in_progress",
|
|
961
|
+
label: "In Progress",
|
|
962
|
+
semanticClass: "delivery.milestone",
|
|
963
|
+
category: "delivery"
|
|
964
|
+
},
|
|
965
|
+
{
|
|
966
|
+
id: "delivery.milestone.blocked",
|
|
967
|
+
label: "Blocked",
|
|
968
|
+
semanticClass: "delivery.milestone",
|
|
969
|
+
category: "delivery"
|
|
970
|
+
},
|
|
971
|
+
{ id: "delivery.milestone.overdue", label: "Overdue", semanticClass: "delivery.milestone", category: "delivery" },
|
|
972
|
+
{
|
|
973
|
+
id: "delivery.milestone.completed",
|
|
974
|
+
label: "Completed",
|
|
975
|
+
semanticClass: "delivery.milestone",
|
|
976
|
+
category: "delivery"
|
|
977
|
+
},
|
|
978
|
+
// --- queue (QueueTaskStatus — 5 values, maps hitl/command-queue tasks) ---
|
|
979
|
+
{ id: "queue.pending", label: "Pending", semanticClass: "queue", category: "queue" },
|
|
980
|
+
{ id: "queue.processing", label: "Processing", semanticClass: "queue", category: "queue" },
|
|
981
|
+
{ id: "queue.completed", label: "Completed", semanticClass: "queue", category: "queue" },
|
|
982
|
+
{ id: "queue.failed", label: "Failed", semanticClass: "queue", category: "queue" },
|
|
983
|
+
{ id: "queue.expired", label: "Expired", semanticClass: "queue", category: "queue" },
|
|
984
|
+
// --- execution (ExecutionStatus — 5 values) ---
|
|
985
|
+
{ id: "execution.pending", label: "Pending", semanticClass: "execution", category: "execution" },
|
|
986
|
+
{ id: "execution.running", label: "Running", semanticClass: "execution", category: "execution" },
|
|
987
|
+
{ id: "execution.completed", label: "Completed", semanticClass: "execution", category: "execution" },
|
|
988
|
+
{ id: "execution.failed", label: "Failed", semanticClass: "execution", category: "execution" },
|
|
989
|
+
{ id: "execution.warning", label: "Warning", semanticClass: "execution", category: "execution" },
|
|
990
|
+
// --- schedule (schedule status — 4 values) ---
|
|
991
|
+
{ id: "schedule.active", label: "Active", semanticClass: "schedule", category: "schedule" },
|
|
992
|
+
{ id: "schedule.paused", label: "Paused", semanticClass: "schedule", category: "schedule" },
|
|
993
|
+
{ id: "schedule.completed", label: "Completed", semanticClass: "schedule", category: "schedule" },
|
|
994
|
+
{ id: "schedule.cancelled", label: "Cancelled", semanticClass: "schedule", category: "schedule" },
|
|
995
|
+
// --- schedule.run (schedule run status — 4 values) ---
|
|
996
|
+
{ id: "schedule.run.running", label: "Running", semanticClass: "schedule.run", category: "schedule" },
|
|
997
|
+
{ id: "schedule.run.completed", label: "Completed", semanticClass: "schedule.run", category: "schedule" },
|
|
998
|
+
{ id: "schedule.run.failed", label: "Failed", semanticClass: "schedule.run", category: "schedule" },
|
|
999
|
+
{ id: "schedule.run.cancelled", label: "Cancelled", semanticClass: "schedule.run", category: "schedule" },
|
|
1000
|
+
// --- request (RequestStatus — 4 values, maps reported_requests) ---
|
|
1001
|
+
{ id: "request.open", label: "Open", semanticClass: "request", category: "request" },
|
|
1002
|
+
{ id: "request.investigating", label: "Investigating", semanticClass: "request", category: "request" },
|
|
1003
|
+
{ id: "request.resolved", label: "Resolved", semanticClass: "request", category: "request" },
|
|
1004
|
+
{ id: "request.wont_fix", label: "Won't Fix", semanticClass: "request", category: "request" }
|
|
1005
|
+
]
|
|
1006
|
+
};
|
|
517
1007
|
|
|
518
1008
|
// src/organization-model/schema.ts
|
|
519
1009
|
var OrganizationModelSchemaBase = z.object({
|
|
@@ -521,9 +1011,16 @@ var OrganizationModelSchemaBase = z.object({
|
|
|
521
1011
|
features: z.array(FeatureSchema).default([]),
|
|
522
1012
|
branding: OrganizationModelBrandingSchema,
|
|
523
1013
|
navigation: OrganizationModelNavigationSchema,
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
1014
|
+
sales: OrganizationModelSalesSchema,
|
|
1015
|
+
prospecting: OrganizationModelProspectingSchema,
|
|
1016
|
+
projects: OrganizationModelProjectsSchema,
|
|
1017
|
+
identity: IdentityDomainSchema.default(DEFAULT_ORGANIZATION_MODEL_IDENTITY),
|
|
1018
|
+
customers: CustomersDomainSchema.default(DEFAULT_ORGANIZATION_MODEL_CUSTOMERS),
|
|
1019
|
+
offerings: OfferingsDomainSchema.default(DEFAULT_ORGANIZATION_MODEL_OFFERINGS),
|
|
1020
|
+
roles: RolesDomainSchema.default(DEFAULT_ORGANIZATION_MODEL_ROLES),
|
|
1021
|
+
goals: GoalsDomainSchema.default(DEFAULT_ORGANIZATION_MODEL_GOALS),
|
|
1022
|
+
statuses: StatusesDomainSchema.default({ entries: [] }),
|
|
1023
|
+
operations: OperationsDomainSchema.default({ entries: [] }),
|
|
527
1024
|
resourceMappings: z.array(ResourceMappingSchema).default([])
|
|
528
1025
|
});
|
|
529
1026
|
function addIssue(ctx, path, message) {
|
|
@@ -657,11 +1154,49 @@ var OrganizationModelSchema = OrganizationModelSchemaBase.superRefine((model, ct
|
|
|
657
1154
|
addIssue(
|
|
658
1155
|
ctx,
|
|
659
1156
|
["navigation", "surfaces", surfaceIndex, "resourceIds", resourceIndex],
|
|
660
|
-
`Surface "${surface.id}" references resource "${resourceId}" but that
|
|
1157
|
+
`Surface "${surface.id}" references resource "${resourceId}" but that surface does not include resource "${surface.id}"`
|
|
661
1158
|
);
|
|
662
1159
|
}
|
|
663
1160
|
});
|
|
664
1161
|
});
|
|
1162
|
+
const segmentsById = new Map(model.customers.segments.map((seg) => [seg.id, seg]));
|
|
1163
|
+
model.offerings.products.forEach((product, productIndex) => {
|
|
1164
|
+
product.targetSegmentIds.forEach((segmentId, segmentIndex) => {
|
|
1165
|
+
if (!segmentsById.has(segmentId)) {
|
|
1166
|
+
addIssue(
|
|
1167
|
+
ctx,
|
|
1168
|
+
["offerings", "products", productIndex, "targetSegmentIds", segmentIndex],
|
|
1169
|
+
`Product "${product.id}" references unknown customer segment "${segmentId}"`
|
|
1170
|
+
);
|
|
1171
|
+
}
|
|
1172
|
+
});
|
|
1173
|
+
if (product.deliveryFeatureId !== void 0 && !featuresById.has(product.deliveryFeatureId)) {
|
|
1174
|
+
addIssue(
|
|
1175
|
+
ctx,
|
|
1176
|
+
["offerings", "products", productIndex, "deliveryFeatureId"],
|
|
1177
|
+
`Product "${product.id}" references unknown delivery feature "${product.deliveryFeatureId}"`
|
|
1178
|
+
);
|
|
1179
|
+
}
|
|
1180
|
+
});
|
|
1181
|
+
model.goals.objectives.forEach((objective, index) => {
|
|
1182
|
+
if (objective.periodEnd <= objective.periodStart) {
|
|
1183
|
+
addIssue(
|
|
1184
|
+
ctx,
|
|
1185
|
+
["goals", "objectives", index, "periodEnd"],
|
|
1186
|
+
`Goal "${objective.id}" has periodEnd "${objective.periodEnd}" which must be strictly after periodStart "${objective.periodStart}"`
|
|
1187
|
+
);
|
|
1188
|
+
}
|
|
1189
|
+
});
|
|
1190
|
+
const rolesById = new Map(model.roles.roles.map((role) => [role.id, role]));
|
|
1191
|
+
model.roles.roles.forEach((role, roleIndex) => {
|
|
1192
|
+
if (role.reportsToId !== void 0 && !rolesById.has(role.reportsToId)) {
|
|
1193
|
+
addIssue(
|
|
1194
|
+
ctx,
|
|
1195
|
+
["roles", "roles", roleIndex, "reportsToId"],
|
|
1196
|
+
`Role "${role.id}" references unknown reportsToId "${role.reportsToId}"`
|
|
1197
|
+
);
|
|
1198
|
+
}
|
|
1199
|
+
});
|
|
665
1200
|
model.resourceMappings.forEach((resourceMapping, resourceIndex) => {
|
|
666
1201
|
resourceMapping.featureIds.forEach((featureId, featureIndex) => {
|
|
667
1202
|
const feature = featuresById.get(featureId);
|
|
@@ -707,24 +1242,24 @@ var DEFAULT_ORGANIZATION_MODEL = {
|
|
|
707
1242
|
version: 1,
|
|
708
1243
|
features: [
|
|
709
1244
|
{
|
|
710
|
-
id:
|
|
1245
|
+
id: SALES_FEATURE_ID,
|
|
711
1246
|
label: "CRM",
|
|
712
1247
|
description: "Relationship pipeline and deal management",
|
|
713
1248
|
enabled: true,
|
|
714
1249
|
color: "blue",
|
|
715
1250
|
entityIds: ["crm.deal"],
|
|
716
|
-
surfaceIds: [
|
|
1251
|
+
surfaceIds: [SALES_PIPELINE_SURFACE_ID],
|
|
717
1252
|
resourceIds: [],
|
|
718
1253
|
capabilityIds: ["crm.pipeline.manage"]
|
|
719
1254
|
},
|
|
720
1255
|
{
|
|
721
|
-
id:
|
|
1256
|
+
id: PROSPECTING_FEATURE_ID,
|
|
722
1257
|
label: "Lead Gen",
|
|
723
1258
|
description: "Prospecting, qualification, and outreach preparation",
|
|
724
1259
|
enabled: true,
|
|
725
1260
|
color: "cyan",
|
|
726
1261
|
entityIds: ["leadgen.list", "leadgen.company", "leadgen.contact"],
|
|
727
|
-
surfaceIds: [
|
|
1262
|
+
surfaceIds: [PROSPECTING_LISTS_SURFACE_ID],
|
|
728
1263
|
resourceIds: [],
|
|
729
1264
|
capabilityIds: ["leadgen.lists.manage"]
|
|
730
1265
|
},
|
|
@@ -737,17 +1272,17 @@ var DEFAULT_ORGANIZATION_MODEL = {
|
|
|
737
1272
|
entityIds: ["delivery.project", "delivery.milestone", "delivery.task"],
|
|
738
1273
|
surfaceIds: [PROJECTS_INDEX_SURFACE_ID],
|
|
739
1274
|
resourceIds: [],
|
|
740
|
-
capabilityIds: [
|
|
1275
|
+
capabilityIds: [PROJECTS_VIEW_CAPABILITY_ID]
|
|
741
1276
|
},
|
|
742
1277
|
{
|
|
743
|
-
id:
|
|
1278
|
+
id: OPERATIONS_FEATURE_ID,
|
|
744
1279
|
label: "Operations",
|
|
745
1280
|
description: "Operational resources, topology, and orchestration visibility",
|
|
746
1281
|
enabled: true,
|
|
747
1282
|
color: "violet",
|
|
748
1283
|
entityIds: [],
|
|
749
1284
|
surfaceIds: [
|
|
750
|
-
|
|
1285
|
+
OPERATIONS_ORGANIZATION_GRAPH_SURFACE_ID,
|
|
751
1286
|
"operations.command-view",
|
|
752
1287
|
"operations.overview",
|
|
753
1288
|
"operations.resources",
|
|
@@ -759,7 +1294,7 @@ var DEFAULT_ORGANIZATION_MODEL = {
|
|
|
759
1294
|
capabilityIds: ["operations.organization-graph", "operations.command-view"]
|
|
760
1295
|
},
|
|
761
1296
|
{
|
|
762
|
-
id:
|
|
1297
|
+
id: MONITORING_FEATURE_ID,
|
|
763
1298
|
label: "Monitoring",
|
|
764
1299
|
enabled: true,
|
|
765
1300
|
entityIds: [],
|
|
@@ -774,7 +1309,7 @@ var DEFAULT_ORGANIZATION_MODEL = {
|
|
|
774
1309
|
capabilityIds: []
|
|
775
1310
|
},
|
|
776
1311
|
{
|
|
777
|
-
id:
|
|
1312
|
+
id: SETTINGS_FEATURE_ID,
|
|
778
1313
|
label: "Settings",
|
|
779
1314
|
enabled: true,
|
|
780
1315
|
entityIds: [],
|
|
@@ -791,7 +1326,16 @@ var DEFAULT_ORGANIZATION_MODEL = {
|
|
|
791
1326
|
capabilityIds: []
|
|
792
1327
|
},
|
|
793
1328
|
{
|
|
794
|
-
id: "
|
|
1329
|
+
id: "submitted-requests",
|
|
1330
|
+
label: "Submitted Requests",
|
|
1331
|
+
enabled: true,
|
|
1332
|
+
entityIds: ["reported_request"],
|
|
1333
|
+
surfaceIds: ["submitted-requests.list", "submitted-requests.detail"],
|
|
1334
|
+
resourceIds: [],
|
|
1335
|
+
capabilityIds: []
|
|
1336
|
+
},
|
|
1337
|
+
{
|
|
1338
|
+
id: SEO_FEATURE_ID,
|
|
795
1339
|
label: "SEO",
|
|
796
1340
|
enabled: false,
|
|
797
1341
|
entityIds: [],
|
|
@@ -802,9 +1346,16 @@ var DEFAULT_ORGANIZATION_MODEL = {
|
|
|
802
1346
|
],
|
|
803
1347
|
branding: DEFAULT_ORGANIZATION_MODEL_BRANDING,
|
|
804
1348
|
navigation: DEFAULT_ORGANIZATION_MODEL_NAVIGATION,
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
1349
|
+
sales: DEFAULT_ORGANIZATION_MODEL_SALES,
|
|
1350
|
+
prospecting: DEFAULT_ORGANIZATION_MODEL_PROSPECTING,
|
|
1351
|
+
projects: DEFAULT_ORGANIZATION_MODEL_PROJECTS,
|
|
1352
|
+
identity: DEFAULT_ORGANIZATION_MODEL_IDENTITY,
|
|
1353
|
+
customers: DEFAULT_ORGANIZATION_MODEL_CUSTOMERS,
|
|
1354
|
+
offerings: DEFAULT_ORGANIZATION_MODEL_OFFERINGS,
|
|
1355
|
+
roles: DEFAULT_ORGANIZATION_MODEL_ROLES,
|
|
1356
|
+
goals: DEFAULT_ORGANIZATION_MODEL_GOALS,
|
|
1357
|
+
statuses: DEFAULT_ORGANIZATION_MODEL_STATUSES,
|
|
1358
|
+
operations: DEFAULT_ORGANIZATION_MODEL_OPERATIONS,
|
|
808
1359
|
resourceMappings: []
|
|
809
1360
|
};
|
|
810
1361
|
|
|
@@ -856,8 +1407,8 @@ function resolveOrganizationModel(override) {
|
|
|
856
1407
|
}
|
|
857
1408
|
|
|
858
1409
|
// src/organization-model/foundation.ts
|
|
859
|
-
function createFoundationOrganizationModel(
|
|
860
|
-
const canonical = resolveOrganizationModel(
|
|
1410
|
+
function createFoundationOrganizationModel(override) {
|
|
1411
|
+
const canonical = resolveOrganizationModel(override);
|
|
861
1412
|
function requireCoreSurface(surfaceId) {
|
|
862
1413
|
const surface = canonical.navigation.surfaces.find((candidate) => candidate.id === surfaceId);
|
|
863
1414
|
if (!surface) {
|
|
@@ -912,4 +1463,4 @@ function createFoundationOrganizationModel(branding) {
|
|
|
912
1463
|
};
|
|
913
1464
|
}
|
|
914
1465
|
|
|
915
|
-
export { DEFAULT_ORGANIZATION_MODEL,
|
|
1466
|
+
export { CustomerSegmentSchema, CustomersDomainSchema, DEFAULT_ORGANIZATION_MODEL, DEFAULT_ORGANIZATION_MODEL_CUSTOMERS, DEFAULT_ORGANIZATION_MODEL_GOALS, DEFAULT_ORGANIZATION_MODEL_OFFERINGS, DEFAULT_ORGANIZATION_MODEL_OPERATIONS, DEFAULT_ORGANIZATION_MODEL_ROLES, DEFAULT_ORGANIZATION_MODEL_STATUSES, FeatureSchema, FirmographicsSchema, GoalsDomainSchema, KeyResultSchema, MONITORING_FEATURE_ID, OPERATIONS_FEATURE_ID, OPERATIONS_ORGANIZATION_GRAPH_SURFACE_ID, ObjectiveSchema, OfferingsDomainSchema, OperationEntrySchema, OperationSemanticClassSchema, OperationsDomainSchema, OrganizationModelSchema, PROJECTS_FEATURE_ID, PROJECTS_INDEX_SURFACE_ID, PROJECTS_VIEW_CAPABILITY_ID, PROSPECTING_FEATURE_ID, PROSPECTING_LISTS_SURFACE_ID, PricingModelSchema, ProductSchema, RoleSchema, RolesDomainSchema, SALES_FEATURE_ID, SALES_PIPELINE_SURFACE_ID, SEO_FEATURE_ID, SETTINGS_FEATURE_ID, StatusEntrySchema, StatusSemanticClassSchema, StatusesDomainSchema, TechStackEntrySchema, createFoundationOrganizationModel, defineOrganizationModel, resolveOrganizationModel };
|