@contractspec/bundle.lifecycle-managed 1.57.0 → 1.59.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/__tests__/assessment-service.test.d.ts +2 -0
- package/dist/__tests__/assessment-service.test.d.ts.map +1 -0
- package/dist/agents/lifecycle-advisor-agent.d.ts +1 -6
- package/dist/agents/lifecycle-advisor-agent.d.ts.map +1 -1
- package/dist/api/rest-handlers.d.ts +14 -17
- package/dist/api/rest-handlers.d.ts.map +1 -1
- package/dist/browser/index.js +213 -0
- package/dist/events/lifecycle-events.d.ts +9 -13
- package/dist/events/lifecycle-events.d.ts.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +213 -5
- package/dist/node/index.js +213 -0
- package/dist/services/assessment-service.d.ts +39 -44
- package/dist/services/assessment-service.d.ts.map +1 -1
- package/package.json +25 -20
- package/dist/agents/lifecycle-advisor-agent.js +0 -71
- package/dist/agents/lifecycle-advisor-agent.js.map +0 -1
- package/dist/api/rest-handlers.js +0 -23
- package/dist/api/rest-handlers.js.map +0 -1
- package/dist/events/lifecycle-events.js +0 -45
- package/dist/events/lifecycle-events.js.map +0 -1
- package/dist/services/assessment-service.js +0 -64
- package/dist/services/assessment-service.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assessment-service.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/assessment-service.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,7 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
//#region src/agents/lifecycle-advisor-agent.d.ts
|
|
4
|
-
declare const LifecycleAdvisorAgent: _contractspec_lib_ai_agent0.AgentSpec;
|
|
5
|
-
//#endregion
|
|
6
|
-
export { LifecycleAdvisorAgent };
|
|
1
|
+
export declare const LifecycleAdvisorAgent: import("@contractspec/lib.ai-agent").AgentSpec;
|
|
7
2
|
//# sourceMappingURL=lifecycle-advisor-agent.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle-advisor-agent.d.ts","
|
|
1
|
+
{"version":3,"file":"lifecycle-advisor-agent.d.ts","sourceRoot":"","sources":["../../src/agents/lifecycle-advisor-agent.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qBAAqB,gDAgEhC,CAAC"}
|
|
@@ -1,21 +1,18 @@
|
|
|
1
|
-
import { LifecycleAssessmentRequest, LifecycleAssessmentResponse
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
query?: Record<string, string | undefined>;
|
|
1
|
+
import type { LifecycleAssessmentRequest, LifecycleAssessmentResponse } from '../services/assessment-service';
|
|
2
|
+
import { LifecycleAssessmentService } from '../services/assessment-service';
|
|
3
|
+
export interface HttpRequest<TBody = unknown, TParams = Record<string, string>> {
|
|
4
|
+
body?: TBody;
|
|
5
|
+
params?: TParams;
|
|
6
|
+
query?: Record<string, string | undefined>;
|
|
8
7
|
}
|
|
9
|
-
interface HttpResponse<T = Record<string, unknown>> {
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
export interface HttpResponse<T = Record<string, unknown>> {
|
|
9
|
+
status: number;
|
|
10
|
+
body: T;
|
|
12
11
|
}
|
|
13
|
-
declare const createLifecycleHandlers: (service: LifecycleAssessmentService) => {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
export declare const createLifecycleHandlers: (service: LifecycleAssessmentService) => {
|
|
13
|
+
runAssessment: (req: HttpRequest<LifecycleAssessmentRequest>) => Promise<HttpResponse<LifecycleAssessmentResponse>>;
|
|
14
|
+
getPlaybook: (req: HttpRequest<unknown, {
|
|
15
|
+
stage: string;
|
|
16
|
+
}>) => Promise<HttpResponse>;
|
|
18
17
|
};
|
|
19
|
-
//#endregion
|
|
20
|
-
export { HttpRequest, HttpResponse, createLifecycleHandlers };
|
|
21
18
|
//# sourceMappingURL=rest-handlers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rest-handlers.d.ts","
|
|
1
|
+
{"version":3,"file":"rest-handlers.d.ts","sourceRoot":"","sources":["../../src/api/rest-handlers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,0BAA0B,EAC1B,2BAA2B,EAC5B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAE5E,MAAM,WAAW,WAAW,CAC1B,KAAK,GAAG,OAAO,EACf,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAEhC,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CAAC,CAAC;CACT;AAED,eAAO,MAAM,uBAAuB,GAClC,SAAS,0BAA0B;yBAG5B,WAAW,CAAC,0BAA0B,CAAC,KAC3C,OAAO,CAAC,YAAY,CAAC,2BAA2B,CAAC,CAAC;uBAM9C,WAAW,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,KAC3C,OAAO,CAAC,YAAY,CAAC;CAKxB,CAAC"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
// src/services/assessment-service.ts
|
|
2
|
+
import {
|
|
3
|
+
ProductPhase,
|
|
4
|
+
CompanyPhase,
|
|
5
|
+
CapitalPhase
|
|
6
|
+
} from "@contractspec/lib.lifecycle";
|
|
7
|
+
import {
|
|
8
|
+
LifecycleOrchestrator,
|
|
9
|
+
StageSignalCollector,
|
|
10
|
+
StageScorer,
|
|
11
|
+
LifecycleMilestonePlanner
|
|
12
|
+
} from "@contractspec/module.lifecycle-core";
|
|
13
|
+
import {
|
|
14
|
+
LifecycleRecommendationEngine,
|
|
15
|
+
ContractSpecLibraryRecommender,
|
|
16
|
+
LifecycleCeremonyDesigner
|
|
17
|
+
} from "@contractspec/module.lifecycle-advisor";
|
|
18
|
+
import {
|
|
19
|
+
LifecycleKpiPipeline
|
|
20
|
+
} from "@contractspec/lib.observability";
|
|
21
|
+
|
|
22
|
+
class LifecycleAssessmentService {
|
|
23
|
+
orchestrator;
|
|
24
|
+
recommendationEngine;
|
|
25
|
+
libraryRecommender;
|
|
26
|
+
ceremonyDesigner;
|
|
27
|
+
pipeline;
|
|
28
|
+
eventBridge;
|
|
29
|
+
constructor(options) {
|
|
30
|
+
const collector = new StageSignalCollector(options.collector);
|
|
31
|
+
const scorer = new StageScorer;
|
|
32
|
+
const milestonePlanner = new LifecycleMilestonePlanner;
|
|
33
|
+
this.orchestrator = new LifecycleOrchestrator({
|
|
34
|
+
collector,
|
|
35
|
+
scorer,
|
|
36
|
+
milestonePlanner
|
|
37
|
+
});
|
|
38
|
+
this.recommendationEngine = options.recommendationEngine ?? new LifecycleRecommendationEngine;
|
|
39
|
+
this.libraryRecommender = options.libraryRecommender ?? new ContractSpecLibraryRecommender;
|
|
40
|
+
this.ceremonyDesigner = options.ceremonyDesigner ?? new LifecycleCeremonyDesigner;
|
|
41
|
+
this.pipeline = options.pipeline ?? new LifecycleKpiPipeline;
|
|
42
|
+
this.eventBridge = options.eventBridge;
|
|
43
|
+
if (options.onPipelineEvent) {
|
|
44
|
+
this.pipeline.on(options.onPipelineEvent);
|
|
45
|
+
}
|
|
46
|
+
if (this.eventBridge) {
|
|
47
|
+
this.pipeline.on((event) => this.eventBridge?.forward(event));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async runAssessment(request) {
|
|
51
|
+
const assessment = await this.orchestrator.run(request);
|
|
52
|
+
const upcoming = this.orchestrator.getUpcomingMilestones(assessment.stage, request.completedMilestones);
|
|
53
|
+
this.pipeline.recordAssessment(assessment, request.tenantId);
|
|
54
|
+
const recommendation = this.recommendationEngine.generate(assessment, {
|
|
55
|
+
upcomingMilestones: upcoming
|
|
56
|
+
});
|
|
57
|
+
const libraries = this.libraryRecommender.recommend(assessment.stage);
|
|
58
|
+
const ceremony = this.ceremonyDesigner.design(assessment.stage);
|
|
59
|
+
return {
|
|
60
|
+
assessment,
|
|
61
|
+
recommendation,
|
|
62
|
+
libraries,
|
|
63
|
+
ceremony
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
getStagePlaybook(stage) {
|
|
67
|
+
const recommendation = this.recommendationEngine.generate({
|
|
68
|
+
stage,
|
|
69
|
+
confidence: 1,
|
|
70
|
+
axes: {
|
|
71
|
+
product: ProductPhase.Mvp,
|
|
72
|
+
company: CompanyPhase.TinyTeam,
|
|
73
|
+
capital: CapitalPhase.Seed
|
|
74
|
+
},
|
|
75
|
+
signals: [],
|
|
76
|
+
gaps: [],
|
|
77
|
+
focusAreas: [],
|
|
78
|
+
scorecard: [],
|
|
79
|
+
generatedAt: new Date().toISOString()
|
|
80
|
+
}, { upcomingMilestones: this.orchestrator.getUpcomingMilestones(stage) });
|
|
81
|
+
return {
|
|
82
|
+
recommendation,
|
|
83
|
+
libraries: this.libraryRecommender.recommend(stage),
|
|
84
|
+
ceremony: this.ceremonyDesigner.design(stage)
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// src/events/lifecycle-events.ts
|
|
89
|
+
import { lifecycleEventNames } from "@contractspec/lib.analytics";
|
|
90
|
+
|
|
91
|
+
class LifecycleEventBridge {
|
|
92
|
+
publisher;
|
|
93
|
+
constructor(publisher) {
|
|
94
|
+
this.publisher = publisher;
|
|
95
|
+
}
|
|
96
|
+
forward(event) {
|
|
97
|
+
if (!this.publisher)
|
|
98
|
+
return;
|
|
99
|
+
switch (event.type) {
|
|
100
|
+
case "assessment.recorded":
|
|
101
|
+
this.publisher({
|
|
102
|
+
name: lifecycleEventNames.assessmentRun,
|
|
103
|
+
properties: {
|
|
104
|
+
tenantId: event.payload.tenantId,
|
|
105
|
+
stage: event.payload.stage
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
break;
|
|
109
|
+
case "stage.changed":
|
|
110
|
+
this.publisher({
|
|
111
|
+
name: lifecycleEventNames.stageChanged,
|
|
112
|
+
properties: {
|
|
113
|
+
tenantId: event.payload.tenantId,
|
|
114
|
+
previousStage: event.payload.previousStage,
|
|
115
|
+
nextStage: event.payload.nextStage
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
break;
|
|
119
|
+
case "confidence.low":
|
|
120
|
+
this.publisher({
|
|
121
|
+
name: `${lifecycleEventNames.assessmentRun}.low_confidence`,
|
|
122
|
+
properties: {
|
|
123
|
+
tenantId: event.payload.tenantId,
|
|
124
|
+
confidence: event.payload.confidence
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// src/agents/lifecycle-advisor-agent.ts
|
|
132
|
+
import { defineAgent } from "@contractspec/lib.ai-agent";
|
|
133
|
+
var LifecycleAdvisorAgent = defineAgent({
|
|
134
|
+
meta: {
|
|
135
|
+
key: "lifecycle.advisor",
|
|
136
|
+
version: "1.0.0",
|
|
137
|
+
title: "Lifecycle Advisor Agent",
|
|
138
|
+
description: "Guides artisans through lifecycle detection, focus areas, and ceremonies.",
|
|
139
|
+
owners: ["team-lifecycle"],
|
|
140
|
+
domain: "operations",
|
|
141
|
+
tags: ["guide", "lifecycle", "ops"],
|
|
142
|
+
stability: "experimental"
|
|
143
|
+
},
|
|
144
|
+
description: "Guides users through lifecycle assessments, highlights gaps, and recommends actions tied to ContractSpec libraries.",
|
|
145
|
+
instructions: `You are the Lifecycle Advisor. Always clarify the user's current stage, confidence, and blockers before suggesting actions.
|
|
146
|
+
- Prioritize simple, mobile-friendly instructions.
|
|
147
|
+
- When in early stages, focus on learning loops, not heavy infra.
|
|
148
|
+
- When in later stages, emphasize repeatability, telemetry, and managed ceremonies.
|
|
149
|
+
- Suggest at most 3 actions at a time. Reference ContractSpec libraries or modules when relevant.`,
|
|
150
|
+
tools: [
|
|
151
|
+
{
|
|
152
|
+
name: "run_assessment",
|
|
153
|
+
description: "Trigger a lifecycle assessment for a tenant.",
|
|
154
|
+
schema: {
|
|
155
|
+
type: "object",
|
|
156
|
+
properties: {
|
|
157
|
+
tenantId: { type: "string" },
|
|
158
|
+
questionnaire: { type: "object", additionalProperties: true }
|
|
159
|
+
},
|
|
160
|
+
required: ["tenantId"]
|
|
161
|
+
},
|
|
162
|
+
automationSafe: true
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
name: "fetch_playbook",
|
|
166
|
+
description: "Retrieve stage-specific playbook (actions, ceremonies, libraries).",
|
|
167
|
+
schema: {
|
|
168
|
+
type: "object",
|
|
169
|
+
properties: {
|
|
170
|
+
stage: {
|
|
171
|
+
type: "integer",
|
|
172
|
+
minimum: 0,
|
|
173
|
+
maximum: 6,
|
|
174
|
+
description: "Lifecycle stage number (0-6)"
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
required: ["stage"]
|
|
178
|
+
},
|
|
179
|
+
automationSafe: true
|
|
180
|
+
}
|
|
181
|
+
],
|
|
182
|
+
memory: {
|
|
183
|
+
maxEntries: 25,
|
|
184
|
+
ttlMinutes: 120
|
|
185
|
+
},
|
|
186
|
+
policy: {
|
|
187
|
+
confidence: { min: 0.7 },
|
|
188
|
+
escalation: {
|
|
189
|
+
confidenceThreshold: 0.5,
|
|
190
|
+
approvalWorkflow: "ops.lifecycle.escalation"
|
|
191
|
+
},
|
|
192
|
+
flags: ["lifecycle_advisor"]
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
// src/api/rest-handlers.ts
|
|
196
|
+
var createLifecycleHandlers = (service) => ({
|
|
197
|
+
runAssessment: async (req) => {
|
|
198
|
+
const payload = req.body ?? {};
|
|
199
|
+
const result = await service.runAssessment(payload);
|
|
200
|
+
return { status: 200, body: result };
|
|
201
|
+
},
|
|
202
|
+
getPlaybook: async (req) => {
|
|
203
|
+
const stage = Number(req.params?.stage ?? 0);
|
|
204
|
+
const result = service.getStagePlaybook(stage);
|
|
205
|
+
return { status: 200, body: result };
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
export {
|
|
209
|
+
createLifecycleHandlers,
|
|
210
|
+
LifecycleEventBridge,
|
|
211
|
+
LifecycleAssessmentService,
|
|
212
|
+
LifecycleAdvisorAgent
|
|
213
|
+
};
|
|
@@ -1,16 +1,12 @@
|
|
|
1
|
-
import { LifecyclePipelineEvent } from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
name: string;
|
|
6
|
-
properties: Record<string, unknown>;
|
|
1
|
+
import type { LifecyclePipelineEvent } from '@contractspec/lib.observability';
|
|
2
|
+
export interface ManagedLifecycleEvent {
|
|
3
|
+
name: string;
|
|
4
|
+
properties: Record<string, unknown>;
|
|
7
5
|
}
|
|
8
|
-
type LifecycleEventPublisher = (event: ManagedLifecycleEvent) => Promise<void> | void;
|
|
9
|
-
declare class LifecycleEventBridge {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
export type LifecycleEventPublisher = (event: ManagedLifecycleEvent) => Promise<void> | void;
|
|
7
|
+
export declare class LifecycleEventBridge {
|
|
8
|
+
private readonly publisher?;
|
|
9
|
+
constructor(publisher?: LifecycleEventPublisher | undefined);
|
|
10
|
+
forward(event: LifecyclePipelineEvent): void;
|
|
13
11
|
}
|
|
14
|
-
//#endregion
|
|
15
|
-
export { LifecycleEventBridge, LifecycleEventPublisher, ManagedLifecycleEvent };
|
|
16
12
|
//# sourceMappingURL=lifecycle-events.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle-events.d.ts","
|
|
1
|
+
{"version":3,"file":"lifecycle-events.d.ts","sourceRoot":"","sources":["../../src/events/lifecycle-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAG9E,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,MAAM,uBAAuB,GAAG,CACpC,KAAK,EAAE,qBAAqB,KACzB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE1B,qBAAa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAAV,SAAS,CAAC,EAAE,uBAAuB,YAAA;IAEhE,OAAO,CAAC,KAAK,EAAE,sBAAsB;CAiCtC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
export * from './services/assessment-service';
|
|
2
|
+
export * from './events/lifecycle-events';
|
|
3
|
+
export * from './agents/lifecycle-advisor-agent';
|
|
4
|
+
export * from './api/rest-handlers';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,214 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
|
|
1
|
+
// @bun
|
|
2
|
+
// src/services/assessment-service.ts
|
|
3
|
+
import {
|
|
4
|
+
ProductPhase,
|
|
5
|
+
CompanyPhase,
|
|
6
|
+
CapitalPhase
|
|
7
|
+
} from "@contractspec/lib.lifecycle";
|
|
8
|
+
import {
|
|
9
|
+
LifecycleOrchestrator,
|
|
10
|
+
StageSignalCollector,
|
|
11
|
+
StageScorer,
|
|
12
|
+
LifecycleMilestonePlanner
|
|
13
|
+
} from "@contractspec/module.lifecycle-core";
|
|
14
|
+
import {
|
|
15
|
+
LifecycleRecommendationEngine,
|
|
16
|
+
ContractSpecLibraryRecommender,
|
|
17
|
+
LifecycleCeremonyDesigner
|
|
18
|
+
} from "@contractspec/module.lifecycle-advisor";
|
|
19
|
+
import {
|
|
20
|
+
LifecycleKpiPipeline
|
|
21
|
+
} from "@contractspec/lib.observability";
|
|
5
22
|
|
|
6
|
-
|
|
23
|
+
class LifecycleAssessmentService {
|
|
24
|
+
orchestrator;
|
|
25
|
+
recommendationEngine;
|
|
26
|
+
libraryRecommender;
|
|
27
|
+
ceremonyDesigner;
|
|
28
|
+
pipeline;
|
|
29
|
+
eventBridge;
|
|
30
|
+
constructor(options) {
|
|
31
|
+
const collector = new StageSignalCollector(options.collector);
|
|
32
|
+
const scorer = new StageScorer;
|
|
33
|
+
const milestonePlanner = new LifecycleMilestonePlanner;
|
|
34
|
+
this.orchestrator = new LifecycleOrchestrator({
|
|
35
|
+
collector,
|
|
36
|
+
scorer,
|
|
37
|
+
milestonePlanner
|
|
38
|
+
});
|
|
39
|
+
this.recommendationEngine = options.recommendationEngine ?? new LifecycleRecommendationEngine;
|
|
40
|
+
this.libraryRecommender = options.libraryRecommender ?? new ContractSpecLibraryRecommender;
|
|
41
|
+
this.ceremonyDesigner = options.ceremonyDesigner ?? new LifecycleCeremonyDesigner;
|
|
42
|
+
this.pipeline = options.pipeline ?? new LifecycleKpiPipeline;
|
|
43
|
+
this.eventBridge = options.eventBridge;
|
|
44
|
+
if (options.onPipelineEvent) {
|
|
45
|
+
this.pipeline.on(options.onPipelineEvent);
|
|
46
|
+
}
|
|
47
|
+
if (this.eventBridge) {
|
|
48
|
+
this.pipeline.on((event) => this.eventBridge?.forward(event));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async runAssessment(request) {
|
|
52
|
+
const assessment = await this.orchestrator.run(request);
|
|
53
|
+
const upcoming = this.orchestrator.getUpcomingMilestones(assessment.stage, request.completedMilestones);
|
|
54
|
+
this.pipeline.recordAssessment(assessment, request.tenantId);
|
|
55
|
+
const recommendation = this.recommendationEngine.generate(assessment, {
|
|
56
|
+
upcomingMilestones: upcoming
|
|
57
|
+
});
|
|
58
|
+
const libraries = this.libraryRecommender.recommend(assessment.stage);
|
|
59
|
+
const ceremony = this.ceremonyDesigner.design(assessment.stage);
|
|
60
|
+
return {
|
|
61
|
+
assessment,
|
|
62
|
+
recommendation,
|
|
63
|
+
libraries,
|
|
64
|
+
ceremony
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
getStagePlaybook(stage) {
|
|
68
|
+
const recommendation = this.recommendationEngine.generate({
|
|
69
|
+
stage,
|
|
70
|
+
confidence: 1,
|
|
71
|
+
axes: {
|
|
72
|
+
product: ProductPhase.Mvp,
|
|
73
|
+
company: CompanyPhase.TinyTeam,
|
|
74
|
+
capital: CapitalPhase.Seed
|
|
75
|
+
},
|
|
76
|
+
signals: [],
|
|
77
|
+
gaps: [],
|
|
78
|
+
focusAreas: [],
|
|
79
|
+
scorecard: [],
|
|
80
|
+
generatedAt: new Date().toISOString()
|
|
81
|
+
}, { upcomingMilestones: this.orchestrator.getUpcomingMilestones(stage) });
|
|
82
|
+
return {
|
|
83
|
+
recommendation,
|
|
84
|
+
libraries: this.libraryRecommender.recommend(stage),
|
|
85
|
+
ceremony: this.ceremonyDesigner.design(stage)
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// src/events/lifecycle-events.ts
|
|
90
|
+
import { lifecycleEventNames } from "@contractspec/lib.analytics";
|
|
91
|
+
|
|
92
|
+
class LifecycleEventBridge {
|
|
93
|
+
publisher;
|
|
94
|
+
constructor(publisher) {
|
|
95
|
+
this.publisher = publisher;
|
|
96
|
+
}
|
|
97
|
+
forward(event) {
|
|
98
|
+
if (!this.publisher)
|
|
99
|
+
return;
|
|
100
|
+
switch (event.type) {
|
|
101
|
+
case "assessment.recorded":
|
|
102
|
+
this.publisher({
|
|
103
|
+
name: lifecycleEventNames.assessmentRun,
|
|
104
|
+
properties: {
|
|
105
|
+
tenantId: event.payload.tenantId,
|
|
106
|
+
stage: event.payload.stage
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
break;
|
|
110
|
+
case "stage.changed":
|
|
111
|
+
this.publisher({
|
|
112
|
+
name: lifecycleEventNames.stageChanged,
|
|
113
|
+
properties: {
|
|
114
|
+
tenantId: event.payload.tenantId,
|
|
115
|
+
previousStage: event.payload.previousStage,
|
|
116
|
+
nextStage: event.payload.nextStage
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
break;
|
|
120
|
+
case "confidence.low":
|
|
121
|
+
this.publisher({
|
|
122
|
+
name: `${lifecycleEventNames.assessmentRun}.low_confidence`,
|
|
123
|
+
properties: {
|
|
124
|
+
tenantId: event.payload.tenantId,
|
|
125
|
+
confidence: event.payload.confidence
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// src/agents/lifecycle-advisor-agent.ts
|
|
133
|
+
import { defineAgent } from "@contractspec/lib.ai-agent";
|
|
134
|
+
var LifecycleAdvisorAgent = defineAgent({
|
|
135
|
+
meta: {
|
|
136
|
+
key: "lifecycle.advisor",
|
|
137
|
+
version: "1.0.0",
|
|
138
|
+
title: "Lifecycle Advisor Agent",
|
|
139
|
+
description: "Guides artisans through lifecycle detection, focus areas, and ceremonies.",
|
|
140
|
+
owners: ["team-lifecycle"],
|
|
141
|
+
domain: "operations",
|
|
142
|
+
tags: ["guide", "lifecycle", "ops"],
|
|
143
|
+
stability: "experimental"
|
|
144
|
+
},
|
|
145
|
+
description: "Guides users through lifecycle assessments, highlights gaps, and recommends actions tied to ContractSpec libraries.",
|
|
146
|
+
instructions: `You are the Lifecycle Advisor. Always clarify the user's current stage, confidence, and blockers before suggesting actions.
|
|
147
|
+
- Prioritize simple, mobile-friendly instructions.
|
|
148
|
+
- When in early stages, focus on learning loops, not heavy infra.
|
|
149
|
+
- When in later stages, emphasize repeatability, telemetry, and managed ceremonies.
|
|
150
|
+
- Suggest at most 3 actions at a time. Reference ContractSpec libraries or modules when relevant.`,
|
|
151
|
+
tools: [
|
|
152
|
+
{
|
|
153
|
+
name: "run_assessment",
|
|
154
|
+
description: "Trigger a lifecycle assessment for a tenant.",
|
|
155
|
+
schema: {
|
|
156
|
+
type: "object",
|
|
157
|
+
properties: {
|
|
158
|
+
tenantId: { type: "string" },
|
|
159
|
+
questionnaire: { type: "object", additionalProperties: true }
|
|
160
|
+
},
|
|
161
|
+
required: ["tenantId"]
|
|
162
|
+
},
|
|
163
|
+
automationSafe: true
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
name: "fetch_playbook",
|
|
167
|
+
description: "Retrieve stage-specific playbook (actions, ceremonies, libraries).",
|
|
168
|
+
schema: {
|
|
169
|
+
type: "object",
|
|
170
|
+
properties: {
|
|
171
|
+
stage: {
|
|
172
|
+
type: "integer",
|
|
173
|
+
minimum: 0,
|
|
174
|
+
maximum: 6,
|
|
175
|
+
description: "Lifecycle stage number (0-6)"
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
required: ["stage"]
|
|
179
|
+
},
|
|
180
|
+
automationSafe: true
|
|
181
|
+
}
|
|
182
|
+
],
|
|
183
|
+
memory: {
|
|
184
|
+
maxEntries: 25,
|
|
185
|
+
ttlMinutes: 120
|
|
186
|
+
},
|
|
187
|
+
policy: {
|
|
188
|
+
confidence: { min: 0.7 },
|
|
189
|
+
escalation: {
|
|
190
|
+
confidenceThreshold: 0.5,
|
|
191
|
+
approvalWorkflow: "ops.lifecycle.escalation"
|
|
192
|
+
},
|
|
193
|
+
flags: ["lifecycle_advisor"]
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
// src/api/rest-handlers.ts
|
|
197
|
+
var createLifecycleHandlers = (service) => ({
|
|
198
|
+
runAssessment: async (req) => {
|
|
199
|
+
const payload = req.body ?? {};
|
|
200
|
+
const result = await service.runAssessment(payload);
|
|
201
|
+
return { status: 200, body: result };
|
|
202
|
+
},
|
|
203
|
+
getPlaybook: async (req) => {
|
|
204
|
+
const stage = Number(req.params?.stage ?? 0);
|
|
205
|
+
const result = service.getStagePlaybook(stage);
|
|
206
|
+
return { status: 200, body: result };
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
export {
|
|
210
|
+
createLifecycleHandlers,
|
|
211
|
+
LifecycleEventBridge,
|
|
212
|
+
LifecycleAssessmentService,
|
|
213
|
+
LifecycleAdvisorAgent
|
|
214
|
+
};
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
// src/services/assessment-service.ts
|
|
2
|
+
import {
|
|
3
|
+
ProductPhase,
|
|
4
|
+
CompanyPhase,
|
|
5
|
+
CapitalPhase
|
|
6
|
+
} from "@contractspec/lib.lifecycle";
|
|
7
|
+
import {
|
|
8
|
+
LifecycleOrchestrator,
|
|
9
|
+
StageSignalCollector,
|
|
10
|
+
StageScorer,
|
|
11
|
+
LifecycleMilestonePlanner
|
|
12
|
+
} from "@contractspec/module.lifecycle-core";
|
|
13
|
+
import {
|
|
14
|
+
LifecycleRecommendationEngine,
|
|
15
|
+
ContractSpecLibraryRecommender,
|
|
16
|
+
LifecycleCeremonyDesigner
|
|
17
|
+
} from "@contractspec/module.lifecycle-advisor";
|
|
18
|
+
import {
|
|
19
|
+
LifecycleKpiPipeline
|
|
20
|
+
} from "@contractspec/lib.observability";
|
|
21
|
+
|
|
22
|
+
class LifecycleAssessmentService {
|
|
23
|
+
orchestrator;
|
|
24
|
+
recommendationEngine;
|
|
25
|
+
libraryRecommender;
|
|
26
|
+
ceremonyDesigner;
|
|
27
|
+
pipeline;
|
|
28
|
+
eventBridge;
|
|
29
|
+
constructor(options) {
|
|
30
|
+
const collector = new StageSignalCollector(options.collector);
|
|
31
|
+
const scorer = new StageScorer;
|
|
32
|
+
const milestonePlanner = new LifecycleMilestonePlanner;
|
|
33
|
+
this.orchestrator = new LifecycleOrchestrator({
|
|
34
|
+
collector,
|
|
35
|
+
scorer,
|
|
36
|
+
milestonePlanner
|
|
37
|
+
});
|
|
38
|
+
this.recommendationEngine = options.recommendationEngine ?? new LifecycleRecommendationEngine;
|
|
39
|
+
this.libraryRecommender = options.libraryRecommender ?? new ContractSpecLibraryRecommender;
|
|
40
|
+
this.ceremonyDesigner = options.ceremonyDesigner ?? new LifecycleCeremonyDesigner;
|
|
41
|
+
this.pipeline = options.pipeline ?? new LifecycleKpiPipeline;
|
|
42
|
+
this.eventBridge = options.eventBridge;
|
|
43
|
+
if (options.onPipelineEvent) {
|
|
44
|
+
this.pipeline.on(options.onPipelineEvent);
|
|
45
|
+
}
|
|
46
|
+
if (this.eventBridge) {
|
|
47
|
+
this.pipeline.on((event) => this.eventBridge?.forward(event));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async runAssessment(request) {
|
|
51
|
+
const assessment = await this.orchestrator.run(request);
|
|
52
|
+
const upcoming = this.orchestrator.getUpcomingMilestones(assessment.stage, request.completedMilestones);
|
|
53
|
+
this.pipeline.recordAssessment(assessment, request.tenantId);
|
|
54
|
+
const recommendation = this.recommendationEngine.generate(assessment, {
|
|
55
|
+
upcomingMilestones: upcoming
|
|
56
|
+
});
|
|
57
|
+
const libraries = this.libraryRecommender.recommend(assessment.stage);
|
|
58
|
+
const ceremony = this.ceremonyDesigner.design(assessment.stage);
|
|
59
|
+
return {
|
|
60
|
+
assessment,
|
|
61
|
+
recommendation,
|
|
62
|
+
libraries,
|
|
63
|
+
ceremony
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
getStagePlaybook(stage) {
|
|
67
|
+
const recommendation = this.recommendationEngine.generate({
|
|
68
|
+
stage,
|
|
69
|
+
confidence: 1,
|
|
70
|
+
axes: {
|
|
71
|
+
product: ProductPhase.Mvp,
|
|
72
|
+
company: CompanyPhase.TinyTeam,
|
|
73
|
+
capital: CapitalPhase.Seed
|
|
74
|
+
},
|
|
75
|
+
signals: [],
|
|
76
|
+
gaps: [],
|
|
77
|
+
focusAreas: [],
|
|
78
|
+
scorecard: [],
|
|
79
|
+
generatedAt: new Date().toISOString()
|
|
80
|
+
}, { upcomingMilestones: this.orchestrator.getUpcomingMilestones(stage) });
|
|
81
|
+
return {
|
|
82
|
+
recommendation,
|
|
83
|
+
libraries: this.libraryRecommender.recommend(stage),
|
|
84
|
+
ceremony: this.ceremonyDesigner.design(stage)
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// src/events/lifecycle-events.ts
|
|
89
|
+
import { lifecycleEventNames } from "@contractspec/lib.analytics";
|
|
90
|
+
|
|
91
|
+
class LifecycleEventBridge {
|
|
92
|
+
publisher;
|
|
93
|
+
constructor(publisher) {
|
|
94
|
+
this.publisher = publisher;
|
|
95
|
+
}
|
|
96
|
+
forward(event) {
|
|
97
|
+
if (!this.publisher)
|
|
98
|
+
return;
|
|
99
|
+
switch (event.type) {
|
|
100
|
+
case "assessment.recorded":
|
|
101
|
+
this.publisher({
|
|
102
|
+
name: lifecycleEventNames.assessmentRun,
|
|
103
|
+
properties: {
|
|
104
|
+
tenantId: event.payload.tenantId,
|
|
105
|
+
stage: event.payload.stage
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
break;
|
|
109
|
+
case "stage.changed":
|
|
110
|
+
this.publisher({
|
|
111
|
+
name: lifecycleEventNames.stageChanged,
|
|
112
|
+
properties: {
|
|
113
|
+
tenantId: event.payload.tenantId,
|
|
114
|
+
previousStage: event.payload.previousStage,
|
|
115
|
+
nextStage: event.payload.nextStage
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
break;
|
|
119
|
+
case "confidence.low":
|
|
120
|
+
this.publisher({
|
|
121
|
+
name: `${lifecycleEventNames.assessmentRun}.low_confidence`,
|
|
122
|
+
properties: {
|
|
123
|
+
tenantId: event.payload.tenantId,
|
|
124
|
+
confidence: event.payload.confidence
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// src/agents/lifecycle-advisor-agent.ts
|
|
132
|
+
import { defineAgent } from "@contractspec/lib.ai-agent";
|
|
133
|
+
var LifecycleAdvisorAgent = defineAgent({
|
|
134
|
+
meta: {
|
|
135
|
+
key: "lifecycle.advisor",
|
|
136
|
+
version: "1.0.0",
|
|
137
|
+
title: "Lifecycle Advisor Agent",
|
|
138
|
+
description: "Guides artisans through lifecycle detection, focus areas, and ceremonies.",
|
|
139
|
+
owners: ["team-lifecycle"],
|
|
140
|
+
domain: "operations",
|
|
141
|
+
tags: ["guide", "lifecycle", "ops"],
|
|
142
|
+
stability: "experimental"
|
|
143
|
+
},
|
|
144
|
+
description: "Guides users through lifecycle assessments, highlights gaps, and recommends actions tied to ContractSpec libraries.",
|
|
145
|
+
instructions: `You are the Lifecycle Advisor. Always clarify the user's current stage, confidence, and blockers before suggesting actions.
|
|
146
|
+
- Prioritize simple, mobile-friendly instructions.
|
|
147
|
+
- When in early stages, focus on learning loops, not heavy infra.
|
|
148
|
+
- When in later stages, emphasize repeatability, telemetry, and managed ceremonies.
|
|
149
|
+
- Suggest at most 3 actions at a time. Reference ContractSpec libraries or modules when relevant.`,
|
|
150
|
+
tools: [
|
|
151
|
+
{
|
|
152
|
+
name: "run_assessment",
|
|
153
|
+
description: "Trigger a lifecycle assessment for a tenant.",
|
|
154
|
+
schema: {
|
|
155
|
+
type: "object",
|
|
156
|
+
properties: {
|
|
157
|
+
tenantId: { type: "string" },
|
|
158
|
+
questionnaire: { type: "object", additionalProperties: true }
|
|
159
|
+
},
|
|
160
|
+
required: ["tenantId"]
|
|
161
|
+
},
|
|
162
|
+
automationSafe: true
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
name: "fetch_playbook",
|
|
166
|
+
description: "Retrieve stage-specific playbook (actions, ceremonies, libraries).",
|
|
167
|
+
schema: {
|
|
168
|
+
type: "object",
|
|
169
|
+
properties: {
|
|
170
|
+
stage: {
|
|
171
|
+
type: "integer",
|
|
172
|
+
minimum: 0,
|
|
173
|
+
maximum: 6,
|
|
174
|
+
description: "Lifecycle stage number (0-6)"
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
required: ["stage"]
|
|
178
|
+
},
|
|
179
|
+
automationSafe: true
|
|
180
|
+
}
|
|
181
|
+
],
|
|
182
|
+
memory: {
|
|
183
|
+
maxEntries: 25,
|
|
184
|
+
ttlMinutes: 120
|
|
185
|
+
},
|
|
186
|
+
policy: {
|
|
187
|
+
confidence: { min: 0.7 },
|
|
188
|
+
escalation: {
|
|
189
|
+
confidenceThreshold: 0.5,
|
|
190
|
+
approvalWorkflow: "ops.lifecycle.escalation"
|
|
191
|
+
},
|
|
192
|
+
flags: ["lifecycle_advisor"]
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
// src/api/rest-handlers.ts
|
|
196
|
+
var createLifecycleHandlers = (service) => ({
|
|
197
|
+
runAssessment: async (req) => {
|
|
198
|
+
const payload = req.body ?? {};
|
|
199
|
+
const result = await service.runAssessment(payload);
|
|
200
|
+
return { status: 200, body: result };
|
|
201
|
+
},
|
|
202
|
+
getPlaybook: async (req) => {
|
|
203
|
+
const stage = Number(req.params?.stage ?? 0);
|
|
204
|
+
const result = service.getStagePlaybook(stage);
|
|
205
|
+
return { status: 200, body: result };
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
export {
|
|
209
|
+
createLifecycleHandlers,
|
|
210
|
+
LifecycleEventBridge,
|
|
211
|
+
LifecycleAssessmentService,
|
|
212
|
+
LifecycleAdvisorAgent
|
|
213
|
+
};
|
|
@@ -1,49 +1,44 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
interface LifecycleAssessmentRequest extends LifecycleAssessmentInput {
|
|
10
|
-
tenantId?: string;
|
|
11
|
-
completedMilestones?: string[];
|
|
1
|
+
import type { LifecycleAssessment, LifecycleAssessmentInput, LifecycleRecommendation, LifecycleStage } from '@contractspec/lib.lifecycle';
|
|
2
|
+
import { type StageSignalCollectorOptions } from '@contractspec/module.lifecycle-core';
|
|
3
|
+
import { LifecycleRecommendationEngine, ContractSpecLibraryRecommender, LifecycleCeremonyDesigner } from '@contractspec/module.lifecycle-advisor';
|
|
4
|
+
import { LifecycleKpiPipeline, type LifecyclePipelineEvent } from '@contractspec/lib.observability';
|
|
5
|
+
import { LifecycleEventBridge } from '../events/lifecycle-events';
|
|
6
|
+
export interface LifecycleAssessmentRequest extends LifecycleAssessmentInput {
|
|
7
|
+
tenantId?: string;
|
|
8
|
+
completedMilestones?: string[];
|
|
12
9
|
}
|
|
13
|
-
interface LifecycleAssessmentResponse {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
10
|
+
export interface LifecycleAssessmentResponse {
|
|
11
|
+
assessment: LifecycleAssessment;
|
|
12
|
+
recommendation: LifecycleRecommendation;
|
|
13
|
+
libraries: ReturnType<ContractSpecLibraryRecommender['recommend']>;
|
|
14
|
+
ceremony?: ReturnType<LifecycleCeremonyDesigner['design']>;
|
|
18
15
|
}
|
|
19
|
-
interface LifecycleAssessmentServiceOptions {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
16
|
+
export interface LifecycleAssessmentServiceOptions {
|
|
17
|
+
collector: StageSignalCollectorOptions;
|
|
18
|
+
pipeline?: LifecycleKpiPipeline;
|
|
19
|
+
recommendationEngine?: LifecycleRecommendationEngine;
|
|
20
|
+
libraryRecommender?: ContractSpecLibraryRecommender;
|
|
21
|
+
ceremonyDesigner?: LifecycleCeremonyDesigner;
|
|
22
|
+
eventBridge?: LifecycleEventBridge;
|
|
23
|
+
onPipelineEvent?: (event: LifecyclePipelineEvent) => void;
|
|
27
24
|
}
|
|
28
|
-
declare class LifecycleAssessmentService {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
25
|
+
export declare class LifecycleAssessmentService {
|
|
26
|
+
private readonly orchestrator;
|
|
27
|
+
private readonly recommendationEngine;
|
|
28
|
+
private readonly libraryRecommender;
|
|
29
|
+
private readonly ceremonyDesigner;
|
|
30
|
+
private readonly pipeline;
|
|
31
|
+
private readonly eventBridge?;
|
|
32
|
+
constructor(options: LifecycleAssessmentServiceOptions);
|
|
33
|
+
runAssessment(request: LifecycleAssessmentRequest): Promise<LifecycleAssessmentResponse>;
|
|
34
|
+
getStagePlaybook(stage: LifecycleStage): {
|
|
35
|
+
recommendation: LifecycleRecommendation;
|
|
36
|
+
libraries: import("@contractspec/module.lifecycle-advisor").LibraryRecommendation[];
|
|
37
|
+
ceremony: {
|
|
38
|
+
title: string;
|
|
39
|
+
copy: string;
|
|
40
|
+
cues: string[];
|
|
41
|
+
} | undefined;
|
|
42
|
+
};
|
|
46
43
|
}
|
|
47
|
-
//#endregion
|
|
48
|
-
export { LifecycleAssessmentRequest, LifecycleAssessmentResponse, LifecycleAssessmentService, LifecycleAssessmentServiceOptions };
|
|
49
44
|
//# sourceMappingURL=assessment-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assessment-service.d.ts","
|
|
1
|
+
{"version":3,"file":"assessment-service.d.ts","sourceRoot":"","sources":["../../src/services/assessment-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACvB,cAAc,EACf,MAAM,6BAA6B,CAAC;AAMrC,OAAO,EAKL,KAAK,2BAA2B,EACjC,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,6BAA6B,EAC7B,8BAA8B,EAC9B,yBAAyB,EAC1B,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,oBAAoB,EACpB,KAAK,sBAAsB,EAC5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAElE,MAAM,WAAW,0BAA2B,SAAQ,wBAAwB;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,2BAA2B;IAC1C,UAAU,EAAE,mBAAmB,CAAC;IAChC,cAAc,EAAE,uBAAuB,CAAC;IACxC,SAAS,EAAE,UAAU,CAAC,8BAA8B,CAAC,WAAW,CAAC,CAAC,CAAC;IACnE,QAAQ,CAAC,EAAE,UAAU,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,iCAAiC;IAChD,SAAS,EAAE,2BAA2B,CAAC;IACvC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,oBAAoB,CAAC,EAAE,6BAA6B,CAAC;IACrD,kBAAkB,CAAC,EAAE,8BAA8B,CAAC;IACpD,gBAAgB,CAAC,EAAE,yBAAyB,CAAC;IAC7C,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC;CAC3D;AAED,qBAAa,0BAA0B;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwB;IACrD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAgC;IACrE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAiC;IACpE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA4B;IAC7D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAuB;gBAExC,OAAO,EAAE,iCAAiC;IAyBhD,aAAa,CACjB,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,2BAA2B,CAAC;IAuBvC,gBAAgB,CAAC,KAAK,EAAE,cAAc;;;;;;;;;CAyBvC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contractspec/bundle.lifecycle-managed",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.59.0",
|
|
4
4
|
"description": "Lifecycle management bundle with analytics and AI advisor",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"contractspec",
|
|
@@ -19,39 +19,44 @@
|
|
|
19
19
|
"scripts": {
|
|
20
20
|
"publish:pkg": "bun publish --tolerate-republish --ignore-scripts --verbose",
|
|
21
21
|
"publish:pkg:canary": "bun publish:pkg --tag canary",
|
|
22
|
-
"build": "bun build:
|
|
23
|
-
"build:bundle": "
|
|
24
|
-
"build:types": "
|
|
25
|
-
"dev": "bun
|
|
22
|
+
"build": "bun run prebuild && bun run build:bundle && bun run build:types",
|
|
23
|
+
"build:bundle": "contractspec-bun-build transpile",
|
|
24
|
+
"build:types": "contractspec-bun-build types",
|
|
25
|
+
"dev": "contractspec-bun-build dev",
|
|
26
26
|
"clean": "rimraf dist .turbo",
|
|
27
27
|
"lint": "bun lint:fix",
|
|
28
28
|
"lint:fix": "eslint src --fix",
|
|
29
29
|
"lint:check": "eslint src",
|
|
30
|
-
"test": "bun test"
|
|
30
|
+
"test": "bun test",
|
|
31
|
+
"prebuild": "contractspec-bun-build prebuild",
|
|
32
|
+
"typecheck": "tsc --noEmit"
|
|
31
33
|
},
|
|
32
34
|
"dependencies": {
|
|
33
|
-
"@contractspec/lib.ai-agent": "1.
|
|
34
|
-
"@contractspec/lib.analytics": "1.
|
|
35
|
-
"@contractspec/lib.lifecycle": "1.
|
|
36
|
-
"@contractspec/lib.observability": "1.
|
|
37
|
-
"@contractspec/module.lifecycle-advisor": "1.
|
|
38
|
-
"@contractspec/module.lifecycle-core": "1.
|
|
35
|
+
"@contractspec/lib.ai-agent": "1.59.0",
|
|
36
|
+
"@contractspec/lib.analytics": "1.59.0",
|
|
37
|
+
"@contractspec/lib.lifecycle": "1.59.0",
|
|
38
|
+
"@contractspec/lib.observability": "1.59.0",
|
|
39
|
+
"@contractspec/module.lifecycle-advisor": "1.59.0",
|
|
40
|
+
"@contractspec/module.lifecycle-core": "1.59.0"
|
|
39
41
|
},
|
|
40
42
|
"devDependencies": {
|
|
41
|
-
"@contractspec/tool.
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"typescript": "^5.9.3"
|
|
43
|
+
"@contractspec/tool.typescript": "1.59.0",
|
|
44
|
+
"typescript": "^5.9.3",
|
|
45
|
+
"@contractspec/tool.bun": "1.58.0"
|
|
45
46
|
},
|
|
46
47
|
"exports": {
|
|
47
|
-
".": "./
|
|
48
|
-
"./*": "./*"
|
|
48
|
+
".": "./src/index.ts"
|
|
49
49
|
},
|
|
50
50
|
"publishConfig": {
|
|
51
51
|
"access": "public",
|
|
52
52
|
"exports": {
|
|
53
|
-
".":
|
|
54
|
-
|
|
53
|
+
".": {
|
|
54
|
+
"types": "./dist/index.d.ts",
|
|
55
|
+
"bun": "./dist/index.js",
|
|
56
|
+
"node": "./dist/node/index.mjs",
|
|
57
|
+
"browser": "./dist/browser/index.js",
|
|
58
|
+
"default": "./dist/index.js"
|
|
59
|
+
}
|
|
55
60
|
},
|
|
56
61
|
"registry": "https://registry.npmjs.org/"
|
|
57
62
|
},
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { defineAgent } from "@contractspec/lib.ai-agent";
|
|
2
|
-
|
|
3
|
-
//#region src/agents/lifecycle-advisor-agent.ts
|
|
4
|
-
const LifecycleAdvisorAgent = defineAgent({
|
|
5
|
-
meta: {
|
|
6
|
-
key: "lifecycle.advisor",
|
|
7
|
-
version: "1.0.0",
|
|
8
|
-
title: "Lifecycle Advisor Agent",
|
|
9
|
-
description: "Guides artisans through lifecycle detection, focus areas, and ceremonies.",
|
|
10
|
-
owners: ["team-lifecycle"],
|
|
11
|
-
domain: "operations",
|
|
12
|
-
tags: [
|
|
13
|
-
"guide",
|
|
14
|
-
"lifecycle",
|
|
15
|
-
"ops"
|
|
16
|
-
],
|
|
17
|
-
stability: "experimental"
|
|
18
|
-
},
|
|
19
|
-
description: "Guides users through lifecycle assessments, highlights gaps, and recommends actions tied to ContractSpec libraries.",
|
|
20
|
-
instructions: `You are the Lifecycle Advisor. Always clarify the user's current stage, confidence, and blockers before suggesting actions.
|
|
21
|
-
- Prioritize simple, mobile-friendly instructions.
|
|
22
|
-
- When in early stages, focus on learning loops, not heavy infra.
|
|
23
|
-
- When in later stages, emphasize repeatability, telemetry, and managed ceremonies.
|
|
24
|
-
- Suggest at most 3 actions at a time. Reference ContractSpec libraries or modules when relevant.`,
|
|
25
|
-
tools: [{
|
|
26
|
-
name: "run_assessment",
|
|
27
|
-
description: "Trigger a lifecycle assessment for a tenant.",
|
|
28
|
-
schema: {
|
|
29
|
-
type: "object",
|
|
30
|
-
properties: {
|
|
31
|
-
tenantId: { type: "string" },
|
|
32
|
-
questionnaire: {
|
|
33
|
-
type: "object",
|
|
34
|
-
additionalProperties: true
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
|
-
required: ["tenantId"]
|
|
38
|
-
},
|
|
39
|
-
automationSafe: true
|
|
40
|
-
}, {
|
|
41
|
-
name: "fetch_playbook",
|
|
42
|
-
description: "Retrieve stage-specific playbook (actions, ceremonies, libraries).",
|
|
43
|
-
schema: {
|
|
44
|
-
type: "object",
|
|
45
|
-
properties: { stage: {
|
|
46
|
-
type: "integer",
|
|
47
|
-
minimum: 0,
|
|
48
|
-
maximum: 6,
|
|
49
|
-
description: "Lifecycle stage number (0-6)"
|
|
50
|
-
} },
|
|
51
|
-
required: ["stage"]
|
|
52
|
-
},
|
|
53
|
-
automationSafe: true
|
|
54
|
-
}],
|
|
55
|
-
memory: {
|
|
56
|
-
maxEntries: 25,
|
|
57
|
-
ttlMinutes: 120
|
|
58
|
-
},
|
|
59
|
-
policy: {
|
|
60
|
-
confidence: { min: .7 },
|
|
61
|
-
escalation: {
|
|
62
|
-
confidenceThreshold: .5,
|
|
63
|
-
approvalWorkflow: "ops.lifecycle.escalation"
|
|
64
|
-
},
|
|
65
|
-
flags: ["lifecycle_advisor"]
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
//#endregion
|
|
70
|
-
export { LifecycleAdvisorAgent };
|
|
71
|
-
//# sourceMappingURL=lifecycle-advisor-agent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle-advisor-agent.js","names":[],"sources":["../../src/agents/lifecycle-advisor-agent.ts"],"sourcesContent":["import { defineAgent } from '@contractspec/lib.ai-agent';\n\nexport const LifecycleAdvisorAgent = defineAgent({\n meta: {\n key: 'lifecycle.advisor',\n version: '1.0.0',\n title: 'Lifecycle Advisor Agent',\n description:\n 'Guides artisans through lifecycle detection, focus areas, and ceremonies.',\n owners: ['team-lifecycle'],\n domain: 'operations',\n tags: ['guide', 'lifecycle', 'ops'],\n stability: 'experimental',\n },\n description:\n 'Guides users through lifecycle assessments, highlights gaps, and recommends actions tied to ContractSpec libraries.',\n instructions: `You are the Lifecycle Advisor. Always clarify the user's current stage, confidence, and blockers before suggesting actions.\n- Prioritize simple, mobile-friendly instructions.\n- When in early stages, focus on learning loops, not heavy infra.\n- When in later stages, emphasize repeatability, telemetry, and managed ceremonies.\n- Suggest at most 3 actions at a time. Reference ContractSpec libraries or modules when relevant.`,\n tools: [\n {\n name: 'run_assessment',\n description: 'Trigger a lifecycle assessment for a tenant.',\n schema: {\n type: 'object',\n properties: {\n tenantId: { type: 'string' },\n questionnaire: { type: 'object', additionalProperties: true },\n },\n required: ['tenantId'],\n },\n automationSafe: true,\n },\n {\n name: 'fetch_playbook',\n description:\n 'Retrieve stage-specific playbook (actions, ceremonies, libraries).',\n schema: {\n type: 'object',\n properties: {\n stage: {\n type: 'integer',\n minimum: 0,\n maximum: 6,\n description: 'Lifecycle stage number (0-6)',\n },\n },\n required: ['stage'],\n },\n automationSafe: true,\n },\n ],\n memory: {\n maxEntries: 25,\n ttlMinutes: 120,\n },\n policy: {\n confidence: { min: 0.7 },\n escalation: {\n confidenceThreshold: 0.5,\n approvalWorkflow: 'ops.lifecycle.escalation',\n },\n flags: ['lifecycle_advisor'],\n },\n});\n"],"mappings":";;;AAEA,MAAa,wBAAwB,YAAY;CAC/C,MAAM;EACJ,KAAK;EACL,SAAS;EACT,OAAO;EACP,aACE;EACF,QAAQ,CAAC,iBAAiB;EAC1B,QAAQ;EACR,MAAM;GAAC;GAAS;GAAa;GAAM;EACnC,WAAW;EACZ;CACD,aACE;CACF,cAAc;;;;;CAKd,OAAO,CACL;EACE,MAAM;EACN,aAAa;EACb,QAAQ;GACN,MAAM;GACN,YAAY;IACV,UAAU,EAAE,MAAM,UAAU;IAC5B,eAAe;KAAE,MAAM;KAAU,sBAAsB;KAAM;IAC9D;GACD,UAAU,CAAC,WAAW;GACvB;EACD,gBAAgB;EACjB,EACD;EACE,MAAM;EACN,aACE;EACF,QAAQ;GACN,MAAM;GACN,YAAY,EACV,OAAO;IACL,MAAM;IACN,SAAS;IACT,SAAS;IACT,aAAa;IACd,EACF;GACD,UAAU,CAAC,QAAQ;GACpB;EACD,gBAAgB;EACjB,CACF;CACD,QAAQ;EACN,YAAY;EACZ,YAAY;EACb;CACD,QAAQ;EACN,YAAY,EAAE,KAAK,IAAK;EACxB,YAAY;GACV,qBAAqB;GACrB,kBAAkB;GACnB;EACD,OAAO,CAAC,oBAAoB;EAC7B;CACF,CAAC"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import "../services/assessment-service.js";
|
|
2
|
-
|
|
3
|
-
//#region src/api/rest-handlers.ts
|
|
4
|
-
const createLifecycleHandlers = (service) => ({
|
|
5
|
-
runAssessment: async (req) => {
|
|
6
|
-
const payload = req.body ?? {};
|
|
7
|
-
return {
|
|
8
|
-
status: 200,
|
|
9
|
-
body: await service.runAssessment(payload)
|
|
10
|
-
};
|
|
11
|
-
},
|
|
12
|
-
getPlaybook: async (req) => {
|
|
13
|
-
const stage = Number(req.params?.stage ?? 0);
|
|
14
|
-
return {
|
|
15
|
-
status: 200,
|
|
16
|
-
body: service.getStagePlaybook(stage)
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
//#endregion
|
|
22
|
-
export { createLifecycleHandlers };
|
|
23
|
-
//# sourceMappingURL=rest-handlers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rest-handlers.js","names":[],"sources":["../../src/api/rest-handlers.ts"],"sourcesContent":["import type { LifecycleStage } from '@contractspec/lib.lifecycle';\nimport type {\n LifecycleAssessmentRequest,\n LifecycleAssessmentResponse,\n} from '../services/assessment-service';\nimport { LifecycleAssessmentService } from '../services/assessment-service';\n\nexport interface HttpRequest<\n TBody = unknown,\n TParams = Record<string, string>,\n> {\n body?: TBody;\n params?: TParams;\n query?: Record<string, string | undefined>;\n}\n\nexport interface HttpResponse<T = Record<string, unknown>> {\n status: number;\n body: T;\n}\n\nexport const createLifecycleHandlers = (\n service: LifecycleAssessmentService\n) => ({\n runAssessment: async (\n req: HttpRequest<LifecycleAssessmentRequest>\n ): Promise<HttpResponse<LifecycleAssessmentResponse>> => {\n const payload = req.body ?? {};\n const result = await service.runAssessment(payload);\n return { status: 200, body: result };\n },\n getPlaybook: async (\n req: HttpRequest<unknown, { stage: string }>\n ): Promise<HttpResponse> => {\n const stage = Number(req.params?.stage ?? 0) as LifecycleStage;\n const result = service.getStagePlaybook(stage);\n return { status: 200, body: result };\n },\n});\n"],"mappings":";;;AAqBA,MAAa,2BACX,aACI;CACJ,eAAe,OACb,QACuD;EACvD,MAAM,UAAU,IAAI,QAAQ,EAAE;AAE9B,SAAO;GAAE,QAAQ;GAAK,MADP,MAAM,QAAQ,cAAc,QAAQ;GACf;;CAEtC,aAAa,OACX,QAC0B;EAC1B,MAAM,QAAQ,OAAO,IAAI,QAAQ,SAAS,EAAE;AAE5C,SAAO;GAAE,QAAQ;GAAK,MADP,QAAQ,iBAAiB,MAAM;GACV;;CAEvC"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { lifecycleEventNames } from "@contractspec/lib.analytics";
|
|
2
|
-
|
|
3
|
-
//#region src/events/lifecycle-events.ts
|
|
4
|
-
var LifecycleEventBridge = class {
|
|
5
|
-
constructor(publisher) {
|
|
6
|
-
this.publisher = publisher;
|
|
7
|
-
}
|
|
8
|
-
forward(event) {
|
|
9
|
-
if (!this.publisher) return;
|
|
10
|
-
switch (event.type) {
|
|
11
|
-
case "assessment.recorded":
|
|
12
|
-
this.publisher({
|
|
13
|
-
name: lifecycleEventNames.assessmentRun,
|
|
14
|
-
properties: {
|
|
15
|
-
tenantId: event.payload.tenantId,
|
|
16
|
-
stage: event.payload.stage
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
break;
|
|
20
|
-
case "stage.changed":
|
|
21
|
-
this.publisher({
|
|
22
|
-
name: lifecycleEventNames.stageChanged,
|
|
23
|
-
properties: {
|
|
24
|
-
tenantId: event.payload.tenantId,
|
|
25
|
-
previousStage: event.payload.previousStage,
|
|
26
|
-
nextStage: event.payload.nextStage
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
break;
|
|
30
|
-
case "confidence.low":
|
|
31
|
-
this.publisher({
|
|
32
|
-
name: `${lifecycleEventNames.assessmentRun}.low_confidence`,
|
|
33
|
-
properties: {
|
|
34
|
-
tenantId: event.payload.tenantId,
|
|
35
|
-
confidence: event.payload.confidence
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
break;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
//#endregion
|
|
44
|
-
export { LifecycleEventBridge };
|
|
45
|
-
//# sourceMappingURL=lifecycle-events.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle-events.js","names":[],"sources":["../../src/events/lifecycle-events.ts"],"sourcesContent":["import type { LifecyclePipelineEvent } from '@contractspec/lib.observability';\nimport { lifecycleEventNames } from '@contractspec/lib.analytics';\n\nexport interface ManagedLifecycleEvent {\n name: string;\n properties: Record<string, unknown>;\n}\n\nexport type LifecycleEventPublisher = (\n event: ManagedLifecycleEvent\n) => Promise<void> | void;\n\nexport class LifecycleEventBridge {\n constructor(private readonly publisher?: LifecycleEventPublisher) {}\n\n forward(event: LifecyclePipelineEvent) {\n if (!this.publisher) return;\n switch (event.type) {\n case 'assessment.recorded':\n this.publisher({\n name: lifecycleEventNames.assessmentRun,\n properties: {\n tenantId: event.payload.tenantId,\n stage: event.payload.stage,\n },\n });\n break;\n case 'stage.changed':\n this.publisher({\n name: lifecycleEventNames.stageChanged,\n properties: {\n tenantId: event.payload.tenantId,\n previousStage: event.payload.previousStage,\n nextStage: event.payload.nextStage,\n },\n });\n break;\n case 'confidence.low':\n this.publisher({\n name: `${lifecycleEventNames.assessmentRun}.low_confidence`,\n properties: {\n tenantId: event.payload.tenantId,\n confidence: event.payload.confidence,\n },\n });\n break;\n }\n }\n}\n"],"mappings":";;;AAYA,IAAa,uBAAb,MAAkC;CAChC,YAAY,AAAiB,WAAqC;EAArC;;CAE7B,QAAQ,OAA+B;AACrC,MAAI,CAAC,KAAK,UAAW;AACrB,UAAQ,MAAM,MAAd;GACE,KAAK;AACH,SAAK,UAAU;KACb,MAAM,oBAAoB;KAC1B,YAAY;MACV,UAAU,MAAM,QAAQ;MACxB,OAAO,MAAM,QAAQ;MACtB;KACF,CAAC;AACF;GACF,KAAK;AACH,SAAK,UAAU;KACb,MAAM,oBAAoB;KAC1B,YAAY;MACV,UAAU,MAAM,QAAQ;MACxB,eAAe,MAAM,QAAQ;MAC7B,WAAW,MAAM,QAAQ;MAC1B;KACF,CAAC;AACF;GACF,KAAK;AACH,SAAK,UAAU;KACb,MAAM,GAAG,oBAAoB,cAAc;KAC3C,YAAY;MACV,UAAU,MAAM,QAAQ;MACxB,YAAY,MAAM,QAAQ;MAC3B;KACF,CAAC;AACF"}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import "../events/lifecycle-events.js";
|
|
2
|
-
import { CapitalPhase, CompanyPhase, ProductPhase } from "@contractspec/lib.lifecycle";
|
|
3
|
-
import { LifecycleMilestonePlanner, LifecycleOrchestrator, StageScorer, StageSignalCollector } from "@contractspec/module.lifecycle-core";
|
|
4
|
-
import { ContractSpecLibraryRecommender, LifecycleCeremonyDesigner, LifecycleRecommendationEngine } from "@contractspec/module.lifecycle-advisor";
|
|
5
|
-
import { LifecycleKpiPipeline } from "@contractspec/lib.observability";
|
|
6
|
-
|
|
7
|
-
//#region src/services/assessment-service.ts
|
|
8
|
-
var LifecycleAssessmentService = class {
|
|
9
|
-
orchestrator;
|
|
10
|
-
recommendationEngine;
|
|
11
|
-
libraryRecommender;
|
|
12
|
-
ceremonyDesigner;
|
|
13
|
-
pipeline;
|
|
14
|
-
eventBridge;
|
|
15
|
-
constructor(options) {
|
|
16
|
-
this.orchestrator = new LifecycleOrchestrator({
|
|
17
|
-
collector: new StageSignalCollector(options.collector),
|
|
18
|
-
scorer: new StageScorer(),
|
|
19
|
-
milestonePlanner: new LifecycleMilestonePlanner()
|
|
20
|
-
});
|
|
21
|
-
this.recommendationEngine = options.recommendationEngine ?? new LifecycleRecommendationEngine();
|
|
22
|
-
this.libraryRecommender = options.libraryRecommender ?? new ContractSpecLibraryRecommender();
|
|
23
|
-
this.ceremonyDesigner = options.ceremonyDesigner ?? new LifecycleCeremonyDesigner();
|
|
24
|
-
this.pipeline = options.pipeline ?? new LifecycleKpiPipeline();
|
|
25
|
-
this.eventBridge = options.eventBridge;
|
|
26
|
-
if (options.onPipelineEvent) this.pipeline.on(options.onPipelineEvent);
|
|
27
|
-
if (this.eventBridge) this.pipeline.on((event) => this.eventBridge?.forward(event));
|
|
28
|
-
}
|
|
29
|
-
async runAssessment(request) {
|
|
30
|
-
const assessment = await this.orchestrator.run(request);
|
|
31
|
-
const upcoming = this.orchestrator.getUpcomingMilestones(assessment.stage, request.completedMilestones);
|
|
32
|
-
this.pipeline.recordAssessment(assessment, request.tenantId);
|
|
33
|
-
return {
|
|
34
|
-
assessment,
|
|
35
|
-
recommendation: this.recommendationEngine.generate(assessment, { upcomingMilestones: upcoming }),
|
|
36
|
-
libraries: this.libraryRecommender.recommend(assessment.stage),
|
|
37
|
-
ceremony: this.ceremonyDesigner.design(assessment.stage)
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
getStagePlaybook(stage) {
|
|
41
|
-
return {
|
|
42
|
-
recommendation: this.recommendationEngine.generate({
|
|
43
|
-
stage,
|
|
44
|
-
confidence: 1,
|
|
45
|
-
axes: {
|
|
46
|
-
product: ProductPhase.Mvp,
|
|
47
|
-
company: CompanyPhase.TinyTeam,
|
|
48
|
-
capital: CapitalPhase.Seed
|
|
49
|
-
},
|
|
50
|
-
signals: [],
|
|
51
|
-
gaps: [],
|
|
52
|
-
focusAreas: [],
|
|
53
|
-
scorecard: [],
|
|
54
|
-
generatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
55
|
-
}, { upcomingMilestones: this.orchestrator.getUpcomingMilestones(stage) }),
|
|
56
|
-
libraries: this.libraryRecommender.recommend(stage),
|
|
57
|
-
ceremony: this.ceremonyDesigner.design(stage)
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
//#endregion
|
|
63
|
-
export { LifecycleAssessmentService };
|
|
64
|
-
//# sourceMappingURL=assessment-service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"assessment-service.js","names":[],"sources":["../../src/services/assessment-service.ts"],"sourcesContent":["import type {\n LifecycleAssessment,\n LifecycleAssessmentInput,\n LifecycleRecommendation,\n LifecycleStage,\n} from '@contractspec/lib.lifecycle';\nimport {\n ProductPhase,\n CompanyPhase,\n CapitalPhase,\n} from '@contractspec/lib.lifecycle';\nimport {\n LifecycleOrchestrator,\n StageSignalCollector,\n StageScorer,\n LifecycleMilestonePlanner,\n type StageSignalCollectorOptions,\n} from '@contractspec/module.lifecycle-core';\nimport {\n LifecycleRecommendationEngine,\n ContractSpecLibraryRecommender,\n LifecycleCeremonyDesigner,\n} from '@contractspec/module.lifecycle-advisor';\nimport {\n LifecycleKpiPipeline,\n type LifecyclePipelineEvent,\n} from '@contractspec/lib.observability';\nimport { LifecycleEventBridge } from '../events/lifecycle-events';\n\nexport interface LifecycleAssessmentRequest extends LifecycleAssessmentInput {\n tenantId?: string;\n completedMilestones?: string[];\n}\n\nexport interface LifecycleAssessmentResponse {\n assessment: LifecycleAssessment;\n recommendation: LifecycleRecommendation;\n libraries: ReturnType<ContractSpecLibraryRecommender['recommend']>;\n ceremony?: ReturnType<LifecycleCeremonyDesigner['design']>;\n}\n\nexport interface LifecycleAssessmentServiceOptions {\n collector: StageSignalCollectorOptions;\n pipeline?: LifecycleKpiPipeline;\n recommendationEngine?: LifecycleRecommendationEngine;\n libraryRecommender?: ContractSpecLibraryRecommender;\n ceremonyDesigner?: LifecycleCeremonyDesigner;\n eventBridge?: LifecycleEventBridge;\n onPipelineEvent?: (event: LifecyclePipelineEvent) => void;\n}\n\nexport class LifecycleAssessmentService {\n private readonly orchestrator: LifecycleOrchestrator;\n private readonly recommendationEngine: LifecycleRecommendationEngine;\n private readonly libraryRecommender: ContractSpecLibraryRecommender;\n private readonly ceremonyDesigner: LifecycleCeremonyDesigner;\n private readonly pipeline: LifecycleKpiPipeline;\n private readonly eventBridge?: LifecycleEventBridge;\n\n constructor(options: LifecycleAssessmentServiceOptions) {\n const collector = new StageSignalCollector(options.collector);\n const scorer = new StageScorer();\n const milestonePlanner = new LifecycleMilestonePlanner();\n this.orchestrator = new LifecycleOrchestrator({\n collector,\n scorer,\n milestonePlanner,\n });\n this.recommendationEngine =\n options.recommendationEngine ?? new LifecycleRecommendationEngine();\n this.libraryRecommender =\n options.libraryRecommender ?? new ContractSpecLibraryRecommender();\n this.ceremonyDesigner =\n options.ceremonyDesigner ?? new LifecycleCeremonyDesigner();\n this.pipeline = options.pipeline ?? new LifecycleKpiPipeline();\n this.eventBridge = options.eventBridge;\n if (options.onPipelineEvent) {\n this.pipeline.on(options.onPipelineEvent);\n }\n if (this.eventBridge) {\n this.pipeline.on((event) => this.eventBridge?.forward(event));\n }\n }\n\n async runAssessment(\n request: LifecycleAssessmentRequest\n ): Promise<LifecycleAssessmentResponse> {\n const assessment = await this.orchestrator.run(request);\n const upcoming = this.orchestrator.getUpcomingMilestones(\n assessment.stage,\n request.completedMilestones\n );\n this.pipeline.recordAssessment(assessment, request.tenantId);\n\n const recommendation = this.recommendationEngine.generate(assessment, {\n upcomingMilestones: upcoming,\n });\n\n const libraries = this.libraryRecommender.recommend(assessment.stage);\n const ceremony = this.ceremonyDesigner.design(assessment.stage);\n\n return {\n assessment,\n recommendation,\n libraries,\n ceremony,\n };\n }\n\n getStagePlaybook(stage: LifecycleStage) {\n const recommendation = this.recommendationEngine.generate(\n {\n stage,\n confidence: 1,\n axes: {\n product: ProductPhase.Mvp,\n company: CompanyPhase.TinyTeam,\n capital: CapitalPhase.Seed,\n },\n signals: [],\n gaps: [],\n focusAreas: [],\n scorecard: [],\n generatedAt: new Date().toISOString(),\n },\n { upcomingMilestones: this.orchestrator.getUpcomingMilestones(stage) }\n );\n\n return {\n recommendation,\n libraries: this.libraryRecommender.recommend(stage),\n ceremony: this.ceremonyDesigner.design(stage),\n };\n }\n}\n"],"mappings":";;;;;;;AAmDA,IAAa,6BAAb,MAAwC;CACtC,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,YAAY,SAA4C;AAItD,OAAK,eAAe,IAAI,sBAAsB;GAC5C,WAJgB,IAAI,qBAAqB,QAAQ,UAAU;GAK3D,QAJa,IAAI,aAAa;GAK9B,kBAJuB,IAAI,2BAA2B;GAKvD,CAAC;AACF,OAAK,uBACH,QAAQ,wBAAwB,IAAI,+BAA+B;AACrE,OAAK,qBACH,QAAQ,sBAAsB,IAAI,gCAAgC;AACpE,OAAK,mBACH,QAAQ,oBAAoB,IAAI,2BAA2B;AAC7D,OAAK,WAAW,QAAQ,YAAY,IAAI,sBAAsB;AAC9D,OAAK,cAAc,QAAQ;AAC3B,MAAI,QAAQ,gBACV,MAAK,SAAS,GAAG,QAAQ,gBAAgB;AAE3C,MAAI,KAAK,YACP,MAAK,SAAS,IAAI,UAAU,KAAK,aAAa,QAAQ,MAAM,CAAC;;CAIjE,MAAM,cACJ,SACsC;EACtC,MAAM,aAAa,MAAM,KAAK,aAAa,IAAI,QAAQ;EACvD,MAAM,WAAW,KAAK,aAAa,sBACjC,WAAW,OACX,QAAQ,oBACT;AACD,OAAK,SAAS,iBAAiB,YAAY,QAAQ,SAAS;AAS5D,SAAO;GACL;GACA,gBATqB,KAAK,qBAAqB,SAAS,YAAY,EACpE,oBAAoB,UACrB,CAAC;GAQA,WANgB,KAAK,mBAAmB,UAAU,WAAW,MAAM;GAOnE,UANe,KAAK,iBAAiB,OAAO,WAAW,MAAM;GAO9D;;CAGH,iBAAiB,OAAuB;AAmBtC,SAAO;GACL,gBAnBqB,KAAK,qBAAqB,SAC/C;IACE;IACA,YAAY;IACZ,MAAM;KACJ,SAAS,aAAa;KACtB,SAAS,aAAa;KACtB,SAAS,aAAa;KACvB;IACD,SAAS,EAAE;IACX,MAAM,EAAE;IACR,YAAY,EAAE;IACd,WAAW,EAAE;IACb,8BAAa,IAAI,MAAM,EAAC,aAAa;IACtC,EACD,EAAE,oBAAoB,KAAK,aAAa,sBAAsB,MAAM,EAAE,CACvE;GAIC,WAAW,KAAK,mBAAmB,UAAU,MAAM;GACnD,UAAU,KAAK,iBAAiB,OAAO,MAAM;GAC9C"}
|