@elevasis/core 0.5.0 → 0.7.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/index.d.ts +428 -42
- package/dist/index.js +596 -47
- package/dist/organization-model/index.d.ts +428 -42
- package/dist/organization-model/index.js +596 -47
- package/package.json +4 -3
- package/src/__tests__/template-foundations-compatibility.test.ts +2 -2
- package/src/_gen/__tests__/__snapshots__/contracts.md.snap +1131 -0
- package/src/_gen/__tests__/scaffold-contracts.test.ts +53 -0
- package/src/_gen/scaffold-contracts.ts +45 -0
- package/src/business/acquisition/types.ts +2 -0
- package/src/commands/queue/types/task.ts +3 -3
- package/src/execution/engine/index.ts +8 -0
- 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/index.ts +10 -0
- 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 +279 -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 +3 -3
- 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 +5 -5
- package/src/organization-model/defaults.ts +39 -16
- 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 +94 -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/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 +53 -8
- 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/scaffold-registry/__tests__/schema.test.ts +280 -0
- package/src/scaffold-registry/index.ts +194 -0
- package/src/scaffold-registry/schema.ts +144 -0
- package/src/supabase/database.types.ts +158 -6
- 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
|
@@ -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,15 +236,15 @@ 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
|
|
171
|
-
var
|
|
172
|
-
var
|
|
239
|
+
var PROJECTS_VIEW_CAPABILITY_ID = "delivery.projects.view";
|
|
240
|
+
var SALES_FEATURE_ID = "crm";
|
|
241
|
+
var PROSPECTING_FEATURE_ID = "lead-gen";
|
|
173
242
|
var OPERATIONS_FEATURE_ID = "operations";
|
|
174
243
|
var MONITORING_FEATURE_ID = "monitoring";
|
|
175
244
|
var SETTINGS_FEATURE_ID = "settings";
|
|
176
245
|
var SEO_FEATURE_ID = "seo";
|
|
177
|
-
var
|
|
178
|
-
var
|
|
246
|
+
var SALES_PIPELINE_SURFACE_ID = "crm.pipeline";
|
|
247
|
+
var PROSPECTING_LISTS_SURFACE_ID = "lead-gen.lists";
|
|
179
248
|
var OPERATIONS_ORGANIZATION_GRAPH_SURFACE_ID = "operations.organization-graph";
|
|
180
249
|
|
|
181
250
|
// src/organization-model/domains/navigation.ts
|
|
@@ -198,7 +267,7 @@ var SurfaceDefinitionSchema = z.object({
|
|
|
198
267
|
var NavigationGroupSchema = z.object({
|
|
199
268
|
id: ModelIdSchema,
|
|
200
269
|
label: LabelSchema,
|
|
201
|
-
placement: z.
|
|
270
|
+
placement: z.string().trim().min(1).max(50),
|
|
202
271
|
surfaceIds: z.array(ModelIdSchema).default([])
|
|
203
272
|
});
|
|
204
273
|
var OrganizationModelNavigationSchema = z.object({
|
|
@@ -243,7 +312,7 @@ var DEFAULT_ORGANIZATION_MODEL_NAVIGATION = {
|
|
|
243
312
|
featureIds: [PROJECTS_FEATURE_ID],
|
|
244
313
|
entityIds: ["delivery.project"],
|
|
245
314
|
resourceIds: [],
|
|
246
|
-
capabilityIds: [
|
|
315
|
+
capabilityIds: [PROJECTS_VIEW_CAPABILITY_ID]
|
|
247
316
|
},
|
|
248
317
|
{
|
|
249
318
|
id: "operations.organization-graph",
|
|
@@ -389,6 +458,30 @@ var DEFAULT_ORGANIZATION_MODEL_NAVIGATION = {
|
|
|
389
458
|
resourceIds: [],
|
|
390
459
|
capabilityIds: []
|
|
391
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
|
+
},
|
|
392
485
|
{
|
|
393
486
|
id: "settings.account",
|
|
394
487
|
label: "Account",
|
|
@@ -504,7 +597,9 @@ var DEFAULT_ORGANIZATION_MODEL_NAVIGATION = {
|
|
|
504
597
|
"monitoring.execution-logs",
|
|
505
598
|
"monitoring.execution-health",
|
|
506
599
|
"monitoring.cost-analytics",
|
|
507
|
-
"monitoring.notifications"
|
|
600
|
+
"monitoring.notifications",
|
|
601
|
+
"submitted-requests.list",
|
|
602
|
+
"submitted-requests.detail"
|
|
508
603
|
]
|
|
509
604
|
},
|
|
510
605
|
{
|
|
@@ -523,6 +618,399 @@ var DEFAULT_ORGANIZATION_MODEL_NAVIGATION = {
|
|
|
523
618
|
}
|
|
524
619
|
]
|
|
525
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
|
+
* Long-form markdown capturing client context, problem narrative, and domain
|
|
670
|
+
* background. Populated by /setup; surfaced to agents as organizational context.
|
|
671
|
+
* Optional — many projects have no external client.
|
|
672
|
+
*/
|
|
673
|
+
clientBrief: z.string().trim().default("")
|
|
674
|
+
});
|
|
675
|
+
var DEFAULT_ORGANIZATION_MODEL_IDENTITY = {
|
|
676
|
+
mission: "",
|
|
677
|
+
vision: "",
|
|
678
|
+
legalName: "",
|
|
679
|
+
entityType: "",
|
|
680
|
+
jurisdiction: "",
|
|
681
|
+
industryCategory: "",
|
|
682
|
+
geographicFocus: "",
|
|
683
|
+
timeZone: "UTC",
|
|
684
|
+
businessHours: {},
|
|
685
|
+
clientBrief: ""
|
|
686
|
+
};
|
|
687
|
+
var FirmographicsSchema = z.object({
|
|
688
|
+
/** Industry vertical (e.g. "Marketing Agency", "Legal", "Real Estate"). */
|
|
689
|
+
industry: z.string().trim().max(200).optional(),
|
|
690
|
+
/**
|
|
691
|
+
* Company headcount band (e.g. "1–10", "11–50", "51–200", "200+").
|
|
692
|
+
* Free-form string to accommodate any band notation.
|
|
693
|
+
*/
|
|
694
|
+
companySize: z.string().trim().max(100).optional(),
|
|
695
|
+
/**
|
|
696
|
+
* Primary geographic region the segment operates in or is targeted from
|
|
697
|
+
* (e.g. "North America", "Europe", "Global").
|
|
698
|
+
*/
|
|
699
|
+
region: z.string().trim().max(200).optional()
|
|
700
|
+
});
|
|
701
|
+
var CustomerSegmentSchema = z.object({
|
|
702
|
+
/** Stable unique identifier for the segment (e.g. "segment-smb-agencies"). */
|
|
703
|
+
id: z.string().trim().min(1).max(100),
|
|
704
|
+
/** Human-readable name shown to agents and in UI (e.g. "SMB Marketing Agencies"). */
|
|
705
|
+
name: z.string().trim().max(200).default(""),
|
|
706
|
+
/** One or two sentences describing who this segment is. */
|
|
707
|
+
description: z.string().trim().max(2e3).default(""),
|
|
708
|
+
/**
|
|
709
|
+
* The primary job(s) this segment is trying to get done — the goal they hire
|
|
710
|
+
* a product/service to accomplish. Plain-language narrative or bullet list.
|
|
711
|
+
*/
|
|
712
|
+
jobsToBeDone: z.string().trim().max(2e3).default(""),
|
|
713
|
+
/**
|
|
714
|
+
* Pains — frustrations, obstacles, and risks the segment experiences
|
|
715
|
+
* when trying to accomplish their jobs-to-be-done.
|
|
716
|
+
*/
|
|
717
|
+
pains: z.array(z.string().trim().max(500)).default([]),
|
|
718
|
+
/**
|
|
719
|
+
* Gains — outcomes and benefits the segment desires; positive motivators
|
|
720
|
+
* beyond merely resolving pains.
|
|
721
|
+
*/
|
|
722
|
+
gains: z.array(z.string().trim().max(500)).default([]),
|
|
723
|
+
/** Firmographic profile for targeting and filtering. */
|
|
724
|
+
firmographics: FirmographicsSchema.default({}),
|
|
725
|
+
/**
|
|
726
|
+
* Value proposition — one or two sentences stating why this organization's
|
|
727
|
+
* offering is uniquely suited for this segment's needs.
|
|
728
|
+
*/
|
|
729
|
+
valueProp: z.string().trim().max(2e3).default("")
|
|
730
|
+
});
|
|
731
|
+
var CustomersDomainSchema = z.object({
|
|
732
|
+
segments: z.array(CustomerSegmentSchema).default([])
|
|
733
|
+
});
|
|
734
|
+
var DEFAULT_ORGANIZATION_MODEL_CUSTOMERS = {
|
|
735
|
+
segments: []
|
|
736
|
+
};
|
|
737
|
+
var PricingModelSchema = z.enum(["one-time", "subscription", "usage-based", "custom"]);
|
|
738
|
+
var ProductSchema = z.object({
|
|
739
|
+
/** Stable unique identifier for the product (e.g. "product-starter-plan"). */
|
|
740
|
+
id: z.string().trim().min(1).max(100),
|
|
741
|
+
/** Human-readable name shown to agents and in UI (e.g. "Starter Plan"). */
|
|
742
|
+
name: z.string().trim().max(200).default(""),
|
|
743
|
+
/** One or two sentences describing what this product/service delivers. */
|
|
744
|
+
description: z.string().trim().max(2e3).default(""),
|
|
745
|
+
/**
|
|
746
|
+
* How this product is priced:
|
|
747
|
+
* - "one-time" — single purchase (setup fee, project fee)
|
|
748
|
+
* - "subscription" — recurring (monthly/annual SaaS, retainer)
|
|
749
|
+
* - "usage-based" — metered by consumption (API calls, seats)
|
|
750
|
+
* - "custom" — negotiated or bespoke pricing
|
|
751
|
+
*/
|
|
752
|
+
pricingModel: PricingModelSchema.default("custom"),
|
|
753
|
+
/** Base price amount (≥ 0). Currency unit defined by `currency`. */
|
|
754
|
+
price: z.number().min(0).default(0),
|
|
755
|
+
/**
|
|
756
|
+
* ISO 4217 currency code (e.g. "USD", "EUR", "GBP").
|
|
757
|
+
* Free-form string to accommodate any currency; defaults to "USD".
|
|
758
|
+
*/
|
|
759
|
+
currency: z.string().trim().max(10).default("USD"),
|
|
760
|
+
/**
|
|
761
|
+
* IDs of customer segments this product targets.
|
|
762
|
+
* Each id must reference a declared `customers.segments[].id`.
|
|
763
|
+
* Cross-reference enforced in `OrganizationModelSchema.superRefine()`.
|
|
764
|
+
*/
|
|
765
|
+
targetSegmentIds: z.array(z.string().trim().min(1)).default([]),
|
|
766
|
+
/**
|
|
767
|
+
* Optional: ID of the platform feature responsible for delivering this product.
|
|
768
|
+
* When present, must reference a declared `features[].id`.
|
|
769
|
+
* Cross-reference enforced in `OrganizationModelSchema.superRefine()`.
|
|
770
|
+
*/
|
|
771
|
+
deliveryFeatureId: z.string().trim().min(1).optional()
|
|
772
|
+
});
|
|
773
|
+
var OfferingsDomainSchema = z.object({
|
|
774
|
+
products: z.array(ProductSchema).default([])
|
|
775
|
+
});
|
|
776
|
+
var DEFAULT_ORGANIZATION_MODEL_OFFERINGS = {
|
|
777
|
+
products: []
|
|
778
|
+
};
|
|
779
|
+
var RoleSchema = z.object({
|
|
780
|
+
/** Stable unique identifier for the role (e.g. "role-ceo", "role-head-of-sales"). */
|
|
781
|
+
id: z.string().trim().min(1).max(100),
|
|
782
|
+
/** Human-readable title shown to agents and in UI (e.g. "CEO", "Head of Sales"). */
|
|
783
|
+
title: z.string().trim().min(1).max(200),
|
|
784
|
+
/**
|
|
785
|
+
* List of responsibilities this role owns — plain-language descriptions of
|
|
786
|
+
* what the person in this role is accountable for delivering.
|
|
787
|
+
* Defaults to empty array so minimal role definitions stay concise.
|
|
788
|
+
*/
|
|
789
|
+
responsibilities: z.array(z.string().trim().max(500)).default([]),
|
|
790
|
+
/**
|
|
791
|
+
* Optional: ID of another role this role reports to.
|
|
792
|
+
* When present, must reference another `roles[].id` in the same organization.
|
|
793
|
+
* Cross-reference enforced in `OrganizationModelSchema.superRefine()`.
|
|
794
|
+
* Absence indicates a top-level role (no reporting line).
|
|
795
|
+
*/
|
|
796
|
+
reportsToId: z.string().trim().min(1).max(100).optional(),
|
|
797
|
+
/**
|
|
798
|
+
* Optional: name or email of the person currently holding this role.
|
|
799
|
+
* Free-form string — supports "Alice Johnson", "alice@example.com", or
|
|
800
|
+
* any human-readable identifier. Not validated against any user registry.
|
|
801
|
+
*/
|
|
802
|
+
heldBy: z.string().trim().max(200).optional()
|
|
803
|
+
});
|
|
804
|
+
var RolesDomainSchema = z.object({
|
|
805
|
+
roles: z.array(RoleSchema).default([])
|
|
806
|
+
});
|
|
807
|
+
var DEFAULT_ORGANIZATION_MODEL_ROLES = {
|
|
808
|
+
roles: []
|
|
809
|
+
};
|
|
810
|
+
var KeyResultSchema = z.object({
|
|
811
|
+
/** Stable unique identifier for the measurable outcome (e.g. "kr-revenue-q1"). */
|
|
812
|
+
id: z.string().trim().min(1).max(100),
|
|
813
|
+
/** Plain-language description of this measurable outcome (e.g. "Increase trial-to-paid conversion"). */
|
|
814
|
+
description: z.string().trim().min(1).max(500),
|
|
815
|
+
/**
|
|
816
|
+
* What is being measured — the metric name (e.g. "monthly revenue", "NPS score",
|
|
817
|
+
* "trial-to-paid conversion rate"). Free-form string.
|
|
818
|
+
*/
|
|
819
|
+
targetMetric: z.string().trim().min(1).max(200),
|
|
820
|
+
/** Current measured value. Defaults to 0 when not yet tracked. */
|
|
821
|
+
currentValue: z.number().default(0),
|
|
822
|
+
/**
|
|
823
|
+
* Target value to reach for this measurable outcome to be considered achieved.
|
|
824
|
+
* Optional — omit if the outcome is directional (e.g. "reduce churn") without
|
|
825
|
+
* a hard numeric target.
|
|
826
|
+
*/
|
|
827
|
+
targetValue: z.number().optional()
|
|
828
|
+
});
|
|
829
|
+
var ISO_DATE_REGEX = /^\d{4}-\d{2}-\d{2}$/;
|
|
830
|
+
var ObjectiveSchema = z.object({
|
|
831
|
+
/** Stable unique identifier for the goal (e.g. "goal-grow-arr-q1-2026"). */
|
|
832
|
+
id: z.string().trim().min(1).max(100),
|
|
833
|
+
/** Plain-language description of what the organization wants to achieve. */
|
|
834
|
+
description: z.string().trim().min(1).max(1e3),
|
|
835
|
+
/**
|
|
836
|
+
* Start of the period this goal is active for — ISO 8601 date string (YYYY-MM-DD).
|
|
837
|
+
* Must be strictly before `periodEnd`.
|
|
838
|
+
*/
|
|
839
|
+
periodStart: z.string().regex(ISO_DATE_REGEX, "periodStart must be an ISO date string (YYYY-MM-DD)"),
|
|
840
|
+
/**
|
|
841
|
+
* End of the period this goal is active for — ISO 8601 date string (YYYY-MM-DD).
|
|
842
|
+
* Must be strictly after `periodStart`.
|
|
843
|
+
* Enforced via `OrganizationModelSchema.superRefine()`.
|
|
844
|
+
*/
|
|
845
|
+
periodEnd: z.string().regex(ISO_DATE_REGEX, "periodEnd must be an ISO date string (YYYY-MM-DD)"),
|
|
846
|
+
/**
|
|
847
|
+
* List of measurable outcomes that define success for this goal.
|
|
848
|
+
* Defaults to empty array so goals can be declared before outcomes are defined.
|
|
849
|
+
*/
|
|
850
|
+
keyResults: z.array(KeyResultSchema).default([])
|
|
851
|
+
});
|
|
852
|
+
var GoalsDomainSchema = z.object({
|
|
853
|
+
objectives: z.array(ObjectiveSchema).default([])
|
|
854
|
+
});
|
|
855
|
+
var DEFAULT_ORGANIZATION_MODEL_GOALS = {
|
|
856
|
+
objectives: []
|
|
857
|
+
};
|
|
858
|
+
var OperationSemanticClassSchema = z.enum(["queue", "executions", "sessions", "notifications", "schedules"]);
|
|
859
|
+
var OperationEntrySchema = z.object({
|
|
860
|
+
id: z.string().trim().min(1).max(100),
|
|
861
|
+
label: z.string().trim().min(1).max(120),
|
|
862
|
+
semanticClass: OperationSemanticClassSchema,
|
|
863
|
+
/** Optional reference to the feature that owns this runtime entity. */
|
|
864
|
+
featureId: z.string().trim().min(1).max(100).optional(),
|
|
865
|
+
/**
|
|
866
|
+
* Optional pointer to the status semanticClass values that apply to this
|
|
867
|
+
* entity — ties operations back to the statuses domain for vibe rendering.
|
|
868
|
+
*/
|
|
869
|
+
supportedStatusSemanticClass: z.array(z.string().trim().min(1).max(80)).optional()
|
|
870
|
+
});
|
|
871
|
+
var OperationsDomainSchema = z.object({
|
|
872
|
+
entries: z.array(OperationEntrySchema).default([])
|
|
873
|
+
});
|
|
874
|
+
var DEFAULT_ORGANIZATION_MODEL_OPERATIONS = {
|
|
875
|
+
entries: [
|
|
876
|
+
// --- queue (HITL command queue) ---
|
|
877
|
+
{
|
|
878
|
+
id: "operations.queue",
|
|
879
|
+
label: "HITL Queue",
|
|
880
|
+
semanticClass: "queue",
|
|
881
|
+
featureId: "operations",
|
|
882
|
+
supportedStatusSemanticClass: ["queue"]
|
|
883
|
+
},
|
|
884
|
+
// --- executions (workflow / agent executions) ---
|
|
885
|
+
{
|
|
886
|
+
id: "operations.executions",
|
|
887
|
+
label: "Executions",
|
|
888
|
+
semanticClass: "executions",
|
|
889
|
+
featureId: "operations",
|
|
890
|
+
supportedStatusSemanticClass: ["execution"]
|
|
891
|
+
},
|
|
892
|
+
// --- sessions (agent conversation sessions) ---
|
|
893
|
+
{
|
|
894
|
+
id: "operations.sessions",
|
|
895
|
+
label: "Sessions",
|
|
896
|
+
semanticClass: "sessions",
|
|
897
|
+
featureId: "operations"
|
|
898
|
+
},
|
|
899
|
+
// --- notifications (platform in-app notifications) ---
|
|
900
|
+
{
|
|
901
|
+
id: "operations.notifications",
|
|
902
|
+
label: "Notifications",
|
|
903
|
+
semanticClass: "notifications",
|
|
904
|
+
featureId: "monitoring"
|
|
905
|
+
},
|
|
906
|
+
// --- schedules (task scheduler) ---
|
|
907
|
+
{
|
|
908
|
+
id: "operations.schedules",
|
|
909
|
+
label: "Schedules",
|
|
910
|
+
semanticClass: "schedules",
|
|
911
|
+
featureId: "operations",
|
|
912
|
+
supportedStatusSemanticClass: ["schedule", "schedule.run"]
|
|
913
|
+
}
|
|
914
|
+
]
|
|
915
|
+
};
|
|
916
|
+
var StatusSemanticClassSchema = z.enum([
|
|
917
|
+
"delivery.task",
|
|
918
|
+
"delivery.project",
|
|
919
|
+
"delivery.milestone",
|
|
920
|
+
"queue",
|
|
921
|
+
"execution",
|
|
922
|
+
"schedule",
|
|
923
|
+
"schedule.run",
|
|
924
|
+
"request"
|
|
925
|
+
]);
|
|
926
|
+
var StatusEntrySchema = z.object({
|
|
927
|
+
id: z.string().trim().min(1).max(100),
|
|
928
|
+
label: z.string().trim().min(1).max(120),
|
|
929
|
+
semanticClass: StatusSemanticClassSchema,
|
|
930
|
+
category: z.string().trim().min(1).max(80).optional()
|
|
931
|
+
});
|
|
932
|
+
var StatusesDomainSchema = z.object({
|
|
933
|
+
entries: z.array(StatusEntrySchema).default([])
|
|
934
|
+
});
|
|
935
|
+
var DEFAULT_ORGANIZATION_MODEL_STATUSES = {
|
|
936
|
+
entries: [
|
|
937
|
+
// --- delivery.task (TaskStatus — 9 values) ---
|
|
938
|
+
{ id: "delivery.task.planned", label: "Planned", semanticClass: "delivery.task", category: "delivery" },
|
|
939
|
+
{ id: "delivery.task.in_progress", label: "In Progress", semanticClass: "delivery.task", category: "delivery" },
|
|
940
|
+
{ id: "delivery.task.blocked", label: "Blocked", semanticClass: "delivery.task", category: "delivery" },
|
|
941
|
+
{ id: "delivery.task.submitted", label: "Submitted", semanticClass: "delivery.task", category: "delivery" },
|
|
942
|
+
{ id: "delivery.task.approved", label: "Approved", semanticClass: "delivery.task", category: "delivery" },
|
|
943
|
+
{
|
|
944
|
+
id: "delivery.task.revision_requested",
|
|
945
|
+
label: "Revision Requested",
|
|
946
|
+
semanticClass: "delivery.task",
|
|
947
|
+
category: "delivery"
|
|
948
|
+
},
|
|
949
|
+
{ id: "delivery.task.rejected", label: "Rejected", semanticClass: "delivery.task", category: "delivery" },
|
|
950
|
+
{ id: "delivery.task.cancelled", label: "Cancelled", semanticClass: "delivery.task", category: "delivery" },
|
|
951
|
+
{ id: "delivery.task.completed", label: "Completed", semanticClass: "delivery.task", category: "delivery" },
|
|
952
|
+
// --- delivery.project (ProjectStatus — 6 values) ---
|
|
953
|
+
{ id: "delivery.project.active", label: "Active", semanticClass: "delivery.project", category: "delivery" },
|
|
954
|
+
{ id: "delivery.project.on_track", label: "On Track", semanticClass: "delivery.project", category: "delivery" },
|
|
955
|
+
{ id: "delivery.project.at_risk", label: "At Risk", semanticClass: "delivery.project", category: "delivery" },
|
|
956
|
+
{ id: "delivery.project.blocked", label: "Blocked", semanticClass: "delivery.project", category: "delivery" },
|
|
957
|
+
{ id: "delivery.project.paused", label: "Paused", semanticClass: "delivery.project", category: "delivery" },
|
|
958
|
+
{ id: "delivery.project.completed", label: "Completed", semanticClass: "delivery.project", category: "delivery" },
|
|
959
|
+
// --- delivery.milestone (MilestoneStatus — 5 values) ---
|
|
960
|
+
{
|
|
961
|
+
id: "delivery.milestone.upcoming",
|
|
962
|
+
label: "Upcoming",
|
|
963
|
+
semanticClass: "delivery.milestone",
|
|
964
|
+
category: "delivery"
|
|
965
|
+
},
|
|
966
|
+
{
|
|
967
|
+
id: "delivery.milestone.in_progress",
|
|
968
|
+
label: "In Progress",
|
|
969
|
+
semanticClass: "delivery.milestone",
|
|
970
|
+
category: "delivery"
|
|
971
|
+
},
|
|
972
|
+
{
|
|
973
|
+
id: "delivery.milestone.blocked",
|
|
974
|
+
label: "Blocked",
|
|
975
|
+
semanticClass: "delivery.milestone",
|
|
976
|
+
category: "delivery"
|
|
977
|
+
},
|
|
978
|
+
{ id: "delivery.milestone.overdue", label: "Overdue", semanticClass: "delivery.milestone", category: "delivery" },
|
|
979
|
+
{
|
|
980
|
+
id: "delivery.milestone.completed",
|
|
981
|
+
label: "Completed",
|
|
982
|
+
semanticClass: "delivery.milestone",
|
|
983
|
+
category: "delivery"
|
|
984
|
+
},
|
|
985
|
+
// --- queue (QueueTaskStatus — 5 values, maps hitl/command-queue tasks) ---
|
|
986
|
+
{ id: "queue.pending", label: "Pending", semanticClass: "queue", category: "queue" },
|
|
987
|
+
{ id: "queue.processing", label: "Processing", semanticClass: "queue", category: "queue" },
|
|
988
|
+
{ id: "queue.completed", label: "Completed", semanticClass: "queue", category: "queue" },
|
|
989
|
+
{ id: "queue.failed", label: "Failed", semanticClass: "queue", category: "queue" },
|
|
990
|
+
{ id: "queue.expired", label: "Expired", semanticClass: "queue", category: "queue" },
|
|
991
|
+
// --- execution (ExecutionStatus — 5 values) ---
|
|
992
|
+
{ id: "execution.pending", label: "Pending", semanticClass: "execution", category: "execution" },
|
|
993
|
+
{ id: "execution.running", label: "Running", semanticClass: "execution", category: "execution" },
|
|
994
|
+
{ id: "execution.completed", label: "Completed", semanticClass: "execution", category: "execution" },
|
|
995
|
+
{ id: "execution.failed", label: "Failed", semanticClass: "execution", category: "execution" },
|
|
996
|
+
{ id: "execution.warning", label: "Warning", semanticClass: "execution", category: "execution" },
|
|
997
|
+
// --- schedule (schedule status — 4 values) ---
|
|
998
|
+
{ id: "schedule.active", label: "Active", semanticClass: "schedule", category: "schedule" },
|
|
999
|
+
{ id: "schedule.paused", label: "Paused", semanticClass: "schedule", category: "schedule" },
|
|
1000
|
+
{ id: "schedule.completed", label: "Completed", semanticClass: "schedule", category: "schedule" },
|
|
1001
|
+
{ id: "schedule.cancelled", label: "Cancelled", semanticClass: "schedule", category: "schedule" },
|
|
1002
|
+
// --- schedule.run (schedule run status — 4 values) ---
|
|
1003
|
+
{ id: "schedule.run.running", label: "Running", semanticClass: "schedule.run", category: "schedule" },
|
|
1004
|
+
{ id: "schedule.run.completed", label: "Completed", semanticClass: "schedule.run", category: "schedule" },
|
|
1005
|
+
{ id: "schedule.run.failed", label: "Failed", semanticClass: "schedule.run", category: "schedule" },
|
|
1006
|
+
{ id: "schedule.run.cancelled", label: "Cancelled", semanticClass: "schedule.run", category: "schedule" },
|
|
1007
|
+
// --- request (RequestStatus — 4 values, maps reported_requests) ---
|
|
1008
|
+
{ id: "request.open", label: "Open", semanticClass: "request", category: "request" },
|
|
1009
|
+
{ id: "request.investigating", label: "Investigating", semanticClass: "request", category: "request" },
|
|
1010
|
+
{ id: "request.resolved", label: "Resolved", semanticClass: "request", category: "request" },
|
|
1011
|
+
{ id: "request.wont_fix", label: "Won't Fix", semanticClass: "request", category: "request" }
|
|
1012
|
+
]
|
|
1013
|
+
};
|
|
526
1014
|
|
|
527
1015
|
// src/organization-model/schema.ts
|
|
528
1016
|
var OrganizationModelSchemaBase = z.object({
|
|
@@ -530,9 +1018,16 @@ var OrganizationModelSchemaBase = z.object({
|
|
|
530
1018
|
features: z.array(FeatureSchema).default([]),
|
|
531
1019
|
branding: OrganizationModelBrandingSchema,
|
|
532
1020
|
navigation: OrganizationModelNavigationSchema,
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
1021
|
+
sales: OrganizationModelSalesSchema,
|
|
1022
|
+
prospecting: OrganizationModelProspectingSchema,
|
|
1023
|
+
projects: OrganizationModelProjectsSchema,
|
|
1024
|
+
identity: IdentityDomainSchema.default(DEFAULT_ORGANIZATION_MODEL_IDENTITY),
|
|
1025
|
+
customers: CustomersDomainSchema.default(DEFAULT_ORGANIZATION_MODEL_CUSTOMERS),
|
|
1026
|
+
offerings: OfferingsDomainSchema.default(DEFAULT_ORGANIZATION_MODEL_OFFERINGS),
|
|
1027
|
+
roles: RolesDomainSchema.default(DEFAULT_ORGANIZATION_MODEL_ROLES),
|
|
1028
|
+
goals: GoalsDomainSchema.default(DEFAULT_ORGANIZATION_MODEL_GOALS),
|
|
1029
|
+
statuses: StatusesDomainSchema.default({ entries: [] }),
|
|
1030
|
+
operations: OperationsDomainSchema.default({ entries: [] }),
|
|
536
1031
|
resourceMappings: z.array(ResourceMappingSchema).default([])
|
|
537
1032
|
});
|
|
538
1033
|
function addIssue(ctx, path, message) {
|
|
@@ -666,10 +1161,48 @@ var OrganizationModelSchema = OrganizationModelSchemaBase.superRefine((model, ct
|
|
|
666
1161
|
addIssue(
|
|
667
1162
|
ctx,
|
|
668
1163
|
["navigation", "surfaces", surfaceIndex, "resourceIds", resourceIndex],
|
|
669
|
-
`Surface "${surface.id}" references resource "${resourceId}" but that
|
|
1164
|
+
`Surface "${surface.id}" references resource "${resourceId}" but that surface does not include resource "${surface.id}"`
|
|
1165
|
+
);
|
|
1166
|
+
}
|
|
1167
|
+
});
|
|
1168
|
+
});
|
|
1169
|
+
const segmentsById = new Map(model.customers.segments.map((seg) => [seg.id, seg]));
|
|
1170
|
+
model.offerings.products.forEach((product, productIndex) => {
|
|
1171
|
+
product.targetSegmentIds.forEach((segmentId, segmentIndex) => {
|
|
1172
|
+
if (!segmentsById.has(segmentId)) {
|
|
1173
|
+
addIssue(
|
|
1174
|
+
ctx,
|
|
1175
|
+
["offerings", "products", productIndex, "targetSegmentIds", segmentIndex],
|
|
1176
|
+
`Product "${product.id}" references unknown customer segment "${segmentId}"`
|
|
670
1177
|
);
|
|
671
1178
|
}
|
|
672
1179
|
});
|
|
1180
|
+
if (product.deliveryFeatureId !== void 0 && !featuresById.has(product.deliveryFeatureId)) {
|
|
1181
|
+
addIssue(
|
|
1182
|
+
ctx,
|
|
1183
|
+
["offerings", "products", productIndex, "deliveryFeatureId"],
|
|
1184
|
+
`Product "${product.id}" references unknown delivery feature "${product.deliveryFeatureId}"`
|
|
1185
|
+
);
|
|
1186
|
+
}
|
|
1187
|
+
});
|
|
1188
|
+
model.goals.objectives.forEach((objective, index) => {
|
|
1189
|
+
if (objective.periodEnd <= objective.periodStart) {
|
|
1190
|
+
addIssue(
|
|
1191
|
+
ctx,
|
|
1192
|
+
["goals", "objectives", index, "periodEnd"],
|
|
1193
|
+
`Goal "${objective.id}" has periodEnd "${objective.periodEnd}" which must be strictly after periodStart "${objective.periodStart}"`
|
|
1194
|
+
);
|
|
1195
|
+
}
|
|
1196
|
+
});
|
|
1197
|
+
const rolesById = new Map(model.roles.roles.map((role) => [role.id, role]));
|
|
1198
|
+
model.roles.roles.forEach((role, roleIndex) => {
|
|
1199
|
+
if (role.reportsToId !== void 0 && !rolesById.has(role.reportsToId)) {
|
|
1200
|
+
addIssue(
|
|
1201
|
+
ctx,
|
|
1202
|
+
["roles", "roles", roleIndex, "reportsToId"],
|
|
1203
|
+
`Role "${role.id}" references unknown reportsToId "${role.reportsToId}"`
|
|
1204
|
+
);
|
|
1205
|
+
}
|
|
673
1206
|
});
|
|
674
1207
|
model.resourceMappings.forEach((resourceMapping, resourceIndex) => {
|
|
675
1208
|
resourceMapping.featureIds.forEach((featureId, featureIndex) => {
|
|
@@ -716,24 +1249,24 @@ var DEFAULT_ORGANIZATION_MODEL = {
|
|
|
716
1249
|
version: 1,
|
|
717
1250
|
features: [
|
|
718
1251
|
{
|
|
719
|
-
id:
|
|
1252
|
+
id: SALES_FEATURE_ID,
|
|
720
1253
|
label: "CRM",
|
|
721
1254
|
description: "Relationship pipeline and deal management",
|
|
722
1255
|
enabled: true,
|
|
723
1256
|
color: "blue",
|
|
724
1257
|
entityIds: ["crm.deal"],
|
|
725
|
-
surfaceIds: [
|
|
1258
|
+
surfaceIds: [SALES_PIPELINE_SURFACE_ID],
|
|
726
1259
|
resourceIds: [],
|
|
727
1260
|
capabilityIds: ["crm.pipeline.manage"]
|
|
728
1261
|
},
|
|
729
1262
|
{
|
|
730
|
-
id:
|
|
1263
|
+
id: PROSPECTING_FEATURE_ID,
|
|
731
1264
|
label: "Lead Gen",
|
|
732
1265
|
description: "Prospecting, qualification, and outreach preparation",
|
|
733
1266
|
enabled: true,
|
|
734
1267
|
color: "cyan",
|
|
735
1268
|
entityIds: ["leadgen.list", "leadgen.company", "leadgen.contact"],
|
|
736
|
-
surfaceIds: [
|
|
1269
|
+
surfaceIds: [PROSPECTING_LISTS_SURFACE_ID],
|
|
737
1270
|
resourceIds: [],
|
|
738
1271
|
capabilityIds: ["leadgen.lists.manage"]
|
|
739
1272
|
},
|
|
@@ -746,7 +1279,7 @@ var DEFAULT_ORGANIZATION_MODEL = {
|
|
|
746
1279
|
entityIds: ["delivery.project", "delivery.milestone", "delivery.task"],
|
|
747
1280
|
surfaceIds: [PROJECTS_INDEX_SURFACE_ID],
|
|
748
1281
|
resourceIds: [],
|
|
749
|
-
capabilityIds: [
|
|
1282
|
+
capabilityIds: [PROJECTS_VIEW_CAPABILITY_ID]
|
|
750
1283
|
},
|
|
751
1284
|
{
|
|
752
1285
|
id: OPERATIONS_FEATURE_ID,
|
|
@@ -799,6 +1332,15 @@ var DEFAULT_ORGANIZATION_MODEL = {
|
|
|
799
1332
|
resourceIds: [],
|
|
800
1333
|
capabilityIds: []
|
|
801
1334
|
},
|
|
1335
|
+
{
|
|
1336
|
+
id: "submitted-requests",
|
|
1337
|
+
label: "Submitted Requests",
|
|
1338
|
+
enabled: true,
|
|
1339
|
+
entityIds: ["reported_request"],
|
|
1340
|
+
surfaceIds: ["submitted-requests.list", "submitted-requests.detail"],
|
|
1341
|
+
resourceIds: [],
|
|
1342
|
+
capabilityIds: []
|
|
1343
|
+
},
|
|
802
1344
|
{
|
|
803
1345
|
id: SEO_FEATURE_ID,
|
|
804
1346
|
label: "SEO",
|
|
@@ -811,9 +1353,16 @@ var DEFAULT_ORGANIZATION_MODEL = {
|
|
|
811
1353
|
],
|
|
812
1354
|
branding: DEFAULT_ORGANIZATION_MODEL_BRANDING,
|
|
813
1355
|
navigation: DEFAULT_ORGANIZATION_MODEL_NAVIGATION,
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
1356
|
+
sales: DEFAULT_ORGANIZATION_MODEL_SALES,
|
|
1357
|
+
prospecting: DEFAULT_ORGANIZATION_MODEL_PROSPECTING,
|
|
1358
|
+
projects: DEFAULT_ORGANIZATION_MODEL_PROJECTS,
|
|
1359
|
+
identity: DEFAULT_ORGANIZATION_MODEL_IDENTITY,
|
|
1360
|
+
customers: DEFAULT_ORGANIZATION_MODEL_CUSTOMERS,
|
|
1361
|
+
offerings: DEFAULT_ORGANIZATION_MODEL_OFFERINGS,
|
|
1362
|
+
roles: DEFAULT_ORGANIZATION_MODEL_ROLES,
|
|
1363
|
+
goals: DEFAULT_ORGANIZATION_MODEL_GOALS,
|
|
1364
|
+
statuses: DEFAULT_ORGANIZATION_MODEL_STATUSES,
|
|
1365
|
+
operations: DEFAULT_ORGANIZATION_MODEL_OPERATIONS,
|
|
817
1366
|
resourceMappings: []
|
|
818
1367
|
};
|
|
819
1368
|
|
|
@@ -921,4 +1470,4 @@ function createFoundationOrganizationModel(override) {
|
|
|
921
1470
|
};
|
|
922
1471
|
}
|
|
923
1472
|
|
|
924
|
-
export {
|
|
1473
|
+
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 };
|