openplanr 1.14.3 → 1.15.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/cli/commands/operate.d.ts.map +1 -1
- package/dist/cli/commands/operate.js +54 -87
- package/dist/cli/commands/operate.js.map +1 -1
- package/dist/services/operate/config.d.ts +4 -1
- package/dist/services/operate/config.d.ts.map +1 -1
- package/dist/services/operate/config.js +56 -2
- package/dist/services/operate/config.js.map +1 -1
- package/dist/services/operate/doctor.d.ts.map +1 -1
- package/dist/services/operate/doctor.js +15 -0
- package/dist/services/operate/doctor.js.map +1 -1
- package/dist/services/operate/evidence-classifications.d.ts +59 -0
- package/dist/services/operate/evidence-classifications.d.ts.map +1 -0
- package/dist/services/operate/evidence-classifications.js +132 -0
- package/dist/services/operate/evidence-classifications.js.map +1 -0
- package/dist/services/operate/evidence-diagnostics.d.ts +23 -0
- package/dist/services/operate/evidence-diagnostics.d.ts.map +1 -0
- package/dist/services/operate/evidence-diagnostics.js +152 -0
- package/dist/services/operate/evidence-diagnostics.js.map +1 -0
- package/dist/services/operate/evidence.d.ts.map +1 -1
- package/dist/services/operate/evidence.js +54 -7
- package/dist/services/operate/evidence.js.map +1 -1
- package/dist/services/operate/index.d.ts.map +1 -1
- package/dist/services/operate/index.js +459 -62
- package/dist/services/operate/index.js.map +1 -1
- package/dist/services/operate/interaction/action-service.d.ts +17 -0
- package/dist/services/operate/interaction/action-service.d.ts.map +1 -0
- package/dist/services/operate/interaction/action-service.js +84 -0
- package/dist/services/operate/interaction/action-service.js.map +1 -0
- package/dist/services/operate/interaction/answer-service.d.ts +33 -0
- package/dist/services/operate/interaction/answer-service.d.ts.map +1 -0
- package/dist/services/operate/interaction/answer-service.js +239 -0
- package/dist/services/operate/interaction/answer-service.js.map +1 -0
- package/dist/services/operate/interaction/charter-suggestions.d.ts +29 -0
- package/dist/services/operate/interaction/charter-suggestions.d.ts.map +1 -0
- package/dist/services/operate/interaction/charter-suggestions.js +104 -0
- package/dist/services/operate/interaction/charter-suggestions.js.map +1 -0
- package/dist/services/operate/interaction/confirmation-service.d.ts +30 -0
- package/dist/services/operate/interaction/confirmation-service.d.ts.map +1 -0
- package/dist/services/operate/interaction/confirmation-service.js +78 -0
- package/dist/services/operate/interaction/confirmation-service.js.map +1 -0
- package/dist/services/operate/interaction/question-engine.d.ts +39 -0
- package/dist/services/operate/interaction/question-engine.d.ts.map +1 -0
- package/dist/services/operate/interaction/question-engine.js +277 -0
- package/dist/services/operate/interaction/question-engine.js.map +1 -0
- package/dist/services/operate/interaction/question-registry.d.ts +16 -0
- package/dist/services/operate/interaction/question-registry.d.ts.map +1 -0
- package/dist/services/operate/interaction/question-registry.js +190 -0
- package/dist/services/operate/interaction/question-registry.js.map +1 -0
- package/dist/services/operate/interaction/session-service.d.ts +55 -0
- package/dist/services/operate/interaction/session-service.d.ts.map +1 -0
- package/dist/services/operate/interaction/session-service.js +272 -0
- package/dist/services/operate/interaction/session-service.js.map +1 -0
- package/dist/services/operate/interaction/terminal-renderer.d.ts +8 -0
- package/dist/services/operate/interaction/terminal-renderer.d.ts.map +1 -0
- package/dist/services/operate/interaction/terminal-renderer.js +103 -0
- package/dist/services/operate/interaction/terminal-renderer.js.map +1 -0
- package/dist/services/operate/maintenance.d.ts.map +1 -1
- package/dist/services/operate/maintenance.js +40 -3
- package/dist/services/operate/maintenance.js.map +1 -1
- package/dist/services/operate/redaction.d.ts +7 -0
- package/dist/services/operate/redaction.d.ts.map +1 -1
- package/dist/services/operate/redaction.js +110 -14
- package/dist/services/operate/redaction.js.map +1 -1
- package/dist/services/operate/types.d.ts +194 -1
- package/dist/services/operate/types.d.ts.map +1 -1
- package/dist/services/operate/types.js.map +1 -1
- package/dist/services/operate/workspace.d.ts +1 -0
- package/dist/services/operate/workspace.d.ts.map +1 -1
- package/dist/services/operate/workspace.js +2 -0
- package/dist/services/operate/workspace.js.map +1 -1
- package/dist/services/pipeline-package-service.d.ts +14 -0
- package/dist/services/pipeline-package-service.d.ts.map +1 -1
- package/dist/services/pipeline-package-service.js +45 -1
- package/dist/services/pipeline-package-service.js.map +1 -1
- package/dist/services/runtime-manager-service.d.ts +3 -0
- package/dist/services/runtime-manager-service.d.ts.map +1 -1
- package/dist/services/runtime-manager-service.js +26 -2
- package/dist/services/runtime-manager-service.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { canonicalDigest } from '../canonical.js';
|
|
4
|
+
import { inspectEmbeddedInstructions, normalizeUntrustedText, redactSensitiveText, } from '../redaction.js';
|
|
5
|
+
const ENGINE_VERSION = '1.0.0';
|
|
6
|
+
const MAX_METADATA_BYTES = 64 * 1024;
|
|
7
|
+
const MAX_SUGGESTION_LENGTH = 1_000;
|
|
8
|
+
async function readBoundedJson(projectRoot, relativePath) {
|
|
9
|
+
const target = path.join(projectRoot, relativePath);
|
|
10
|
+
const bytes = await readFile(target).catch(() => null);
|
|
11
|
+
if (!bytes || bytes.byteLength > MAX_METADATA_BYTES)
|
|
12
|
+
return null;
|
|
13
|
+
try {
|
|
14
|
+
const parsed = JSON.parse(bytes.toString('utf8'));
|
|
15
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
|
|
16
|
+
? parsed
|
|
17
|
+
: null;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function safeMetadataValue(value) {
|
|
24
|
+
if (typeof value !== 'string')
|
|
25
|
+
return null;
|
|
26
|
+
const normalized = normalizeUntrustedText(value).replace(/\s+/g, ' ').trim();
|
|
27
|
+
if (!normalized || normalized.length > MAX_SUGGESTION_LENGTH)
|
|
28
|
+
return null;
|
|
29
|
+
const inspection = inspectEmbeddedInstructions(normalized);
|
|
30
|
+
if (inspection.annotations.length > 0 || inspection.quarantined)
|
|
31
|
+
return null;
|
|
32
|
+
try {
|
|
33
|
+
const redacted = redactSensitiveText(normalized);
|
|
34
|
+
return redacted.redactions.length === 0 ? redacted.value : null;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Produce bounded, provider-free charter drafts from local metadata.
|
|
42
|
+
*
|
|
43
|
+
* Only purpose is eligible at launch. Product stage, commercial facts,
|
|
44
|
+
* customers, goals, metrics, guardrails, and unknowns remain human-owned.
|
|
45
|
+
*/
|
|
46
|
+
export async function buildOperatingCharterSuggestions(input) {
|
|
47
|
+
const [packageJson, planrConfig] = await Promise.all([
|
|
48
|
+
readBoundedJson(input.projectRoot, 'package.json'),
|
|
49
|
+
readBoundedJson(input.projectRoot, '.planr/config.json'),
|
|
50
|
+
]);
|
|
51
|
+
const evidence = {
|
|
52
|
+
packageDescription: safeMetadataValue(packageJson?.description),
|
|
53
|
+
projectName: safeMetadataValue(planrConfig?.projectName),
|
|
54
|
+
};
|
|
55
|
+
const evidenceDigest = canonicalDigest({
|
|
56
|
+
engineVersion: ENGINE_VERSION,
|
|
57
|
+
evidence,
|
|
58
|
+
});
|
|
59
|
+
const suggestions = [];
|
|
60
|
+
if (evidence.packageDescription) {
|
|
61
|
+
suggestions.push({
|
|
62
|
+
field: 'purpose',
|
|
63
|
+
value: evidence.packageDescription,
|
|
64
|
+
draft: true,
|
|
65
|
+
confidence: 'high',
|
|
66
|
+
citation: {
|
|
67
|
+
source: 'package-json',
|
|
68
|
+
location: 'package.json#description',
|
|
69
|
+
digest: canonicalDigest(evidence.packageDescription),
|
|
70
|
+
},
|
|
71
|
+
engineVersion: ENGINE_VERSION,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
else if (evidence.projectName) {
|
|
75
|
+
suggestions.push({
|
|
76
|
+
field: 'purpose',
|
|
77
|
+
value: `Operate ${evidence.projectName} with explicit, evidence-cited decisions.`,
|
|
78
|
+
draft: true,
|
|
79
|
+
confidence: 'medium',
|
|
80
|
+
citation: {
|
|
81
|
+
source: 'planr-config',
|
|
82
|
+
location: '.planr/config.json#projectName',
|
|
83
|
+
digest: canonicalDigest(evidence.projectName),
|
|
84
|
+
},
|
|
85
|
+
engineVersion: ENGINE_VERSION,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const suggested = new Set(suggestions.map((entry) => entry.field));
|
|
89
|
+
return {
|
|
90
|
+
evidenceDigest,
|
|
91
|
+
suggestions,
|
|
92
|
+
gaps: [
|
|
93
|
+
'purpose',
|
|
94
|
+
'stage',
|
|
95
|
+
'businessModel',
|
|
96
|
+
'idealCustomer',
|
|
97
|
+
'goals',
|
|
98
|
+
'successMetrics',
|
|
99
|
+
'guardrails',
|
|
100
|
+
'knownUnknowns',
|
|
101
|
+
].filter((field) => !suggested.has(field)),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=charter-suggestions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"charter-suggestions.js","sourceRoot":"","sources":["../../../../src/services/operate/interaction/charter-suggestions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type GuidedConfirmation, type OperatingActionEffect, type OperatingEventHead } from '../types.js';
|
|
2
|
+
export interface OperatingConfirmationMaterial {
|
|
3
|
+
actionId: string;
|
|
4
|
+
sessionId: string;
|
|
5
|
+
command: string;
|
|
6
|
+
effect: Exclude<OperatingActionEffect, 'read-only'>;
|
|
7
|
+
providerUse: boolean;
|
|
8
|
+
confirmationScope: string;
|
|
9
|
+
projectIdentity: `sha256:${string}`;
|
|
10
|
+
projectHead: `sha256:${string}`;
|
|
11
|
+
configHead: `sha256:${string}`;
|
|
12
|
+
eventHead?: OperatingEventHead | null;
|
|
13
|
+
evidenceHead?: `sha256:${string}` | null;
|
|
14
|
+
providerPolicy?: `sha256:${string}` | null;
|
|
15
|
+
arguments?: string[];
|
|
16
|
+
destinations?: string[];
|
|
17
|
+
writes?: string[];
|
|
18
|
+
createdAt?: string;
|
|
19
|
+
expiresAt?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function operatingConfirmationDigest(material: OperatingConfirmationMaterial): `sha256:${string}`;
|
|
22
|
+
export declare function createOperatingConfirmation(material: OperatingConfirmationMaterial): GuidedConfirmation;
|
|
23
|
+
export declare function assertOperatingConfirmation(input: {
|
|
24
|
+
expected: GuidedConfirmation;
|
|
25
|
+
actionId: string;
|
|
26
|
+
confirmationDigest?: string;
|
|
27
|
+
confirmed: boolean;
|
|
28
|
+
now?: Date;
|
|
29
|
+
}): GuidedConfirmation;
|
|
30
|
+
//# sourceMappingURL=confirmation-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmation-service.d.ts","sourceRoot":"","sources":["../../../../src/services/operate/interaction/confirmation-service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,kBAAkB,EAEvB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACxB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;IACpD,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,UAAU,MAAM,EAAE,CAAC;IACpC,WAAW,EAAE,UAAU,MAAM,EAAE,CAAC;IAChC,UAAU,EAAE,UAAU,MAAM,EAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACtC,YAAY,CAAC,EAAE,UAAU,MAAM,EAAE,GAAG,IAAI,CAAC;IACzC,cAAc,CAAC,EAAE,UAAU,MAAM,EAAE,GAAG,IAAI,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,6BAA6B,GACtC,UAAU,MAAM,EAAE,CAkBpB;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,6BAA6B,GACtC,kBAAkB,CA4BpB;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,GAAG,kBAAkB,CAkCrB"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { canonicalDigest } from '../canonical.js';
|
|
2
|
+
import { OperateError, } from '../types.js';
|
|
3
|
+
function sorted(values = []) {
|
|
4
|
+
return [...new Set(values)].sort();
|
|
5
|
+
}
|
|
6
|
+
export function operatingConfirmationDigest(material) {
|
|
7
|
+
return canonicalDigest({
|
|
8
|
+
actionId: material.actionId,
|
|
9
|
+
sessionId: material.sessionId,
|
|
10
|
+
command: material.command,
|
|
11
|
+
effect: material.effect,
|
|
12
|
+
providerUse: material.providerUse,
|
|
13
|
+
confirmationScope: material.confirmationScope,
|
|
14
|
+
projectIdentity: material.projectIdentity,
|
|
15
|
+
projectHead: material.projectHead,
|
|
16
|
+
configHead: material.configHead,
|
|
17
|
+
eventHead: material.eventHead ?? null,
|
|
18
|
+
evidenceHead: material.evidenceHead ?? null,
|
|
19
|
+
providerPolicy: material.providerPolicy ?? null,
|
|
20
|
+
arguments: [...(material.arguments ?? [])],
|
|
21
|
+
destinations: sorted(material.destinations),
|
|
22
|
+
writes: sorted(material.writes),
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
export function createOperatingConfirmation(material) {
|
|
26
|
+
const createdAt = material.createdAt ?? new Date().toISOString();
|
|
27
|
+
const expiresAt = material.expiresAt ?? new Date(Date.parse(createdAt) + 30 * 60 * 1_000).toISOString();
|
|
28
|
+
const confirmationDigest = operatingConfirmationDigest(material);
|
|
29
|
+
return {
|
|
30
|
+
kind: 'guided-confirmation',
|
|
31
|
+
schemaVersion: '1.0.0',
|
|
32
|
+
protocolVersion: '1.2.0',
|
|
33
|
+
confirmationId: `GIC-${confirmationDigest.slice('sha256:'.length, 'sha256:'.length + 24)}`,
|
|
34
|
+
state: 'preview',
|
|
35
|
+
actionId: material.actionId,
|
|
36
|
+
sessionId: material.sessionId,
|
|
37
|
+
command: material.command,
|
|
38
|
+
effect: material.effect,
|
|
39
|
+
providerUse: material.providerUse,
|
|
40
|
+
confirmationScope: material.confirmationScope,
|
|
41
|
+
confirmationDigest,
|
|
42
|
+
projectIdentity: material.projectIdentity,
|
|
43
|
+
projectHead: material.projectHead,
|
|
44
|
+
configHead: material.configHead,
|
|
45
|
+
eventHead: material.eventHead ?? null,
|
|
46
|
+
arguments: [...(material.arguments ?? [])],
|
|
47
|
+
destinations: sorted(material.destinations),
|
|
48
|
+
writes: sorted(material.writes),
|
|
49
|
+
createdAt,
|
|
50
|
+
expiresAt,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export function assertOperatingConfirmation(input) {
|
|
54
|
+
const now = input.now ?? new Date();
|
|
55
|
+
if (!input.confirmed ||
|
|
56
|
+
input.actionId !== input.expected.actionId ||
|
|
57
|
+
input.confirmationDigest !== input.expected.confirmationDigest) {
|
|
58
|
+
throw new OperateError('E_OPERATE_ROUTE_CONFIRMATION_REQUIRED', `Action ${input.expected.actionId} requires its exact named confirmation digest.`, {
|
|
59
|
+
actionId: input.expected.actionId,
|
|
60
|
+
confirmationDigest: input.expected.confirmationDigest,
|
|
61
|
+
previewCommand: input.expected.command.replace(/\s+--yes\b/g, ''),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (now.getTime() >= Date.parse(input.expected.expiresAt)) {
|
|
65
|
+
throw new OperateError('E_OPERATE_ROUTE_DRIFT', `Confirmation for ${input.expected.actionId} expired; preview the action again.`, {
|
|
66
|
+
actionId: input.expected.actionId,
|
|
67
|
+
changedDimensions: ['expiry'],
|
|
68
|
+
previewCommand: input.expected.command.replace(/\s+--yes\b/g, ''),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
...input.expected,
|
|
73
|
+
state: 'confirmed',
|
|
74
|
+
confirmedAt: now.toISOString(),
|
|
75
|
+
confirmedBy: 'explicit-cli-authority',
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=confirmation-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmation-service.js","sourceRoot":"","sources":["../../../../src/services/operate/interaction/confirmation-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type GuidedQuestion, type GuidedQuestionnaire, type GuidedQuestionValue, type OperatingInitAnswers } from '../types.js';
|
|
2
|
+
import { type OperatingQuestionContext } from './question-registry.js';
|
|
3
|
+
export interface OperatingQuestionEngineContext extends OperatingQuestionContext {
|
|
4
|
+
projectRoot: string;
|
|
5
|
+
projectIdentity?: `sha256:${string}`;
|
|
6
|
+
runtime?: string;
|
|
7
|
+
interaction?: 'native' | 'chat' | 'terminal' | 'none';
|
|
8
|
+
projectHead?: `sha256:${string}`;
|
|
9
|
+
configHead?: `sha256:${string}`;
|
|
10
|
+
now?: string;
|
|
11
|
+
}
|
|
12
|
+
export type OperatingQuestionEngineResult = {
|
|
13
|
+
status: 'input-required';
|
|
14
|
+
stage: 'foundation' | 'product-charter';
|
|
15
|
+
answers: OperatingInitAnswers;
|
|
16
|
+
questions: GuidedQuestion[];
|
|
17
|
+
} | {
|
|
18
|
+
status: 'preview-ready';
|
|
19
|
+
stage: 'review';
|
|
20
|
+
answers: OperatingInitAnswers;
|
|
21
|
+
questions: GuidedQuestion[];
|
|
22
|
+
};
|
|
23
|
+
export declare function operatingInitAnswersFromOptions(options: Record<string, unknown>): OperatingInitAnswers;
|
|
24
|
+
export declare function mergeOperatingInitAnswersIntoOptions(options: Record<string, unknown>, answers: OperatingInitAnswers): Record<string, unknown>;
|
|
25
|
+
export declare function evaluateOperatingInitQuestions(input: {
|
|
26
|
+
answers?: OperatingInitAnswers;
|
|
27
|
+
context: OperatingQuestionEngineContext;
|
|
28
|
+
requireCharter?: boolean;
|
|
29
|
+
}): Promise<OperatingQuestionEngineResult>;
|
|
30
|
+
export declare function applyOperatingInitAnswer(answers: OperatingInitAnswers, context: OperatingQuestionContext, questionId: string, value: GuidedQuestionValue): OperatingInitAnswers;
|
|
31
|
+
export declare function createOperatingInitQuestionnaire(input: {
|
|
32
|
+
context: OperatingQuestionEngineContext;
|
|
33
|
+
questions: GuidedQuestion[];
|
|
34
|
+
stage: 'foundation' | 'product-charter' | 'review';
|
|
35
|
+
sessionId?: string;
|
|
36
|
+
createdAt?: string;
|
|
37
|
+
expiresAt?: string;
|
|
38
|
+
}): Promise<GuidedQuestionnaire>;
|
|
39
|
+
//# sourceMappingURL=question-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"question-engine.d.ts","sourceRoot":"","sources":["../../../../src/services/operate/interaction/question-engine.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EAExB,KAAK,oBAAoB,EAC1B,MAAM,aAAa,CAAC;AAErB,OAAO,EAGL,KAAK,wBAAwB,EAE9B,MAAM,wBAAwB,CAAC;AAIhC,MAAM,WAAW,8BAA+B,SAAQ,wBAAwB;IAC9E,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,UAAU,MAAM,EAAE,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;IACtD,WAAW,CAAC,EAAE,UAAU,MAAM,EAAE,CAAC;IACjC,UAAU,CAAC,EAAE,UAAU,MAAM,EAAE,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,6BAA6B,GACrC;IACE,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,YAAY,GAAG,iBAAiB,CAAC;IACxC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,SAAS,EAAE,cAAc,EAAE,CAAC;CAC7B,GACD;IACE,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,SAAS,EAAE,cAAc,EAAE,CAAC;CAC7B,CAAC;AAEN,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,oBAAoB,CAwDtB;AAED,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,oBAAoB,GAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AA8GD,wBAAsB,8BAA8B,CAAC,KAAK,EAAE;IAC1D,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,OAAO,EAAE,8BAA8B,CAAC;IACxC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,6BAA6B,CAAC,CA6DzC;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,wBAAwB,EACjC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,mBAAmB,GACzB,oBAAoB,CAWtB;AAED,wBAAsB,gCAAgC,CAAC,KAAK,EAAE;IAC5D,OAAO,EAAE,8BAA8B,CAAC;IACxC,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,KAAK,EAAE,YAAY,GAAG,iBAAiB,GAAG,QAAQ,CAAC;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA2E/B"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { resolveGuidedInteractionValidators } from '../../pipeline-package-service.js';
|
|
3
|
+
import { canonicalDigest } from '../canonical.js';
|
|
4
|
+
import { OperateError, } from '../types.js';
|
|
5
|
+
import { buildOperatingCharterSuggestions } from './charter-suggestions.js';
|
|
6
|
+
import { operatingInitQuestionRegistry, } from './question-registry.js';
|
|
7
|
+
const STAGES = ['foundation', 'product-charter', 'review'];
|
|
8
|
+
export function operatingInitAnswersFromOptions(options) {
|
|
9
|
+
const list = (value) => Array.isArray(value)
|
|
10
|
+
? value
|
|
11
|
+
.map(String)
|
|
12
|
+
.map((entry) => entry.trim())
|
|
13
|
+
.filter(Boolean)
|
|
14
|
+
: undefined;
|
|
15
|
+
const charter = options.charter && typeof options.charter === 'object' && !Array.isArray(options.charter)
|
|
16
|
+
? options.charter
|
|
17
|
+
: {
|
|
18
|
+
...(typeof options.purpose === 'string' ? { purpose: options.purpose } : {}),
|
|
19
|
+
...(typeof options.productStage === 'string' ? { stage: options.productStage } : {}),
|
|
20
|
+
...(typeof options.businessModel === 'string'
|
|
21
|
+
? { businessModel: options.businessModel }
|
|
22
|
+
: {}),
|
|
23
|
+
...(typeof options.idealCustomer === 'string'
|
|
24
|
+
? { idealCustomer: options.idealCustomer }
|
|
25
|
+
: {}),
|
|
26
|
+
...(list(options.goal) ? { goals: list(options.goal) } : {}),
|
|
27
|
+
...(list(options.successMetric) ? { successMetrics: list(options.successMetric) } : {}),
|
|
28
|
+
...(list(options.guardrail) ? { guardrails: list(options.guardrail) } : {}),
|
|
29
|
+
...(list(options.knownUnknown) ? { knownUnknowns: list(options.knownUnknown) } : {}),
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
...(typeof options.profile === 'string'
|
|
33
|
+
? { profile: options.profile }
|
|
34
|
+
: {}),
|
|
35
|
+
...(typeof options.profileFile === 'string' ? { profileFile: options.profileFile } : {}),
|
|
36
|
+
...(typeof options.decisionOwner === 'string' ? { decisionOwner: options.decisionOwner } : {}),
|
|
37
|
+
...(typeof options.planningEngine === 'string'
|
|
38
|
+
? { planningEngine: options.planningEngine }
|
|
39
|
+
: {}),
|
|
40
|
+
...(typeof options.runtime === 'string'
|
|
41
|
+
? { runtime: options.runtime }
|
|
42
|
+
: {}),
|
|
43
|
+
...(typeof options.cadence === 'string'
|
|
44
|
+
? { cadence: options.cadence }
|
|
45
|
+
: {}),
|
|
46
|
+
...(typeof options.timezone === 'string' ? { timezone: options.timezone } : {}),
|
|
47
|
+
...(typeof options.sensitivityCeiling === 'string'
|
|
48
|
+
? {
|
|
49
|
+
sensitivityCeiling: options.sensitivityCeiling,
|
|
50
|
+
}
|
|
51
|
+
: {}),
|
|
52
|
+
...(list(options.sources ?? options.source)
|
|
53
|
+
? { sources: list(options.sources ?? options.source) }
|
|
54
|
+
: {}),
|
|
55
|
+
...(list(options.evidenceFile) ? { evidenceFiles: list(options.evidenceFile) } : {}),
|
|
56
|
+
...(list(options.components ?? options.component)
|
|
57
|
+
? { componentRoots: list(options.components ?? options.component) }
|
|
58
|
+
: {}),
|
|
59
|
+
...(Object.keys(charter ?? {}).length > 0 ? { charter } : {}),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export function mergeOperatingInitAnswersIntoOptions(options, answers) {
|
|
63
|
+
return {
|
|
64
|
+
...options,
|
|
65
|
+
...answers,
|
|
66
|
+
...(answers.sources === undefined ? {} : { source: answers.sources, sources: answers.sources }),
|
|
67
|
+
...(answers.evidenceFiles === undefined ? {} : { evidenceFile: answers.evidenceFiles }),
|
|
68
|
+
...(answers.componentRoots === undefined
|
|
69
|
+
? {}
|
|
70
|
+
: { component: answers.componentRoots, components: answers.componentRoots }),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function answered(value) {
|
|
74
|
+
if (typeof value === 'string')
|
|
75
|
+
return value.trim().length > 0;
|
|
76
|
+
if (Array.isArray(value))
|
|
77
|
+
return value.length > 0;
|
|
78
|
+
return value !== undefined;
|
|
79
|
+
}
|
|
80
|
+
function conditionVisible(definition, definitions, answers) {
|
|
81
|
+
return (definition.question.visibleWhen ?? []).every((condition) => {
|
|
82
|
+
const dependency = definitions.find((candidate) => candidate.question.questionId === condition.questionId);
|
|
83
|
+
const actual = dependency?.read(answers);
|
|
84
|
+
switch (condition.operator) {
|
|
85
|
+
case 'answered':
|
|
86
|
+
return answered(actual);
|
|
87
|
+
case 'not-answered':
|
|
88
|
+
return !answered(actual);
|
|
89
|
+
case 'equals':
|
|
90
|
+
return actual === condition.value;
|
|
91
|
+
case 'not-equals':
|
|
92
|
+
return actual !== condition.value;
|
|
93
|
+
case 'contains':
|
|
94
|
+
return Array.isArray(actual)
|
|
95
|
+
? actual.includes(String(condition.value))
|
|
96
|
+
: String(actual ?? '').includes(String(condition.value));
|
|
97
|
+
case 'not-contains':
|
|
98
|
+
return Array.isArray(actual)
|
|
99
|
+
? !actual.includes(String(condition.value))
|
|
100
|
+
: !String(actual ?? '').includes(String(condition.value));
|
|
101
|
+
}
|
|
102
|
+
return false;
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
function normalizeValue(question, value) {
|
|
106
|
+
const normalized = Array.isArray(value)
|
|
107
|
+
? [...new Set(value.map((entry) => entry.trim()).filter(Boolean))]
|
|
108
|
+
: typeof value === 'string'
|
|
109
|
+
? value.trim()
|
|
110
|
+
: value;
|
|
111
|
+
const choices = question.choices?.map((choice) => choice.id);
|
|
112
|
+
if (choices &&
|
|
113
|
+
(Array.isArray(normalized)
|
|
114
|
+
? normalized.some((entry) => !choices.includes(entry))
|
|
115
|
+
: !choices.includes(String(normalized)))) {
|
|
116
|
+
throw new OperateError('E_OPERATE_QUESTIONNAIRE_INVALID', `${question.label} contains an unsupported choice.`);
|
|
117
|
+
}
|
|
118
|
+
const length = typeof normalized === 'string' ? normalized.length : undefined;
|
|
119
|
+
const itemCount = Array.isArray(normalized) ? normalized.length : undefined;
|
|
120
|
+
if ((length !== undefined &&
|
|
121
|
+
((question.validation?.minLength !== undefined && length < question.validation.minLength) ||
|
|
122
|
+
(question.validation?.maxLength !== undefined &&
|
|
123
|
+
length > question.validation.maxLength))) ||
|
|
124
|
+
(itemCount !== undefined &&
|
|
125
|
+
((question.validation?.minItems !== undefined && itemCount < question.validation.minItems) ||
|
|
126
|
+
(question.validation?.maxItems !== undefined && itemCount > question.validation.maxItems)))) {
|
|
127
|
+
throw new OperateError('E_OPERATE_QUESTIONNAIRE_INVALID', `${question.label} does not satisfy its bounded validation rules.`);
|
|
128
|
+
}
|
|
129
|
+
return normalized;
|
|
130
|
+
}
|
|
131
|
+
function validateSemanticAnswers(answers, context) {
|
|
132
|
+
if (answers.timezone) {
|
|
133
|
+
try {
|
|
134
|
+
new Intl.DateTimeFormat('en', { timeZone: answers.timezone }).format(new Date(0));
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
throw new OperateError('E_OPERATE_QUESTIONNAIRE_INVALID', `Invalid IANA timezone: ${answers.timezone}.`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const unavailable = (answers.sources ?? []).filter((source) => !context.availableSources.includes(source));
|
|
141
|
+
if (unavailable.length > 0) {
|
|
142
|
+
throw new OperateError('E_OPERATE_QUESTIONNAIRE_INVALID', `Evidence source is unavailable: ${unavailable.join(', ')}. Configure it or leave it disabled.`);
|
|
143
|
+
}
|
|
144
|
+
for (const candidate of answers.evidenceFiles ?? []) {
|
|
145
|
+
if (path.isAbsolute(candidate) || candidate.split(/[\\/]+/).includes('..')) {
|
|
146
|
+
throw new OperateError('E_OPERATE_QUESTIONNAIRE_INVALID', 'Evidence import paths must remain relative to a configured workspace root.');
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
export async function evaluateOperatingInitQuestions(input) {
|
|
151
|
+
const definitions = operatingInitQuestionRegistry(input.context);
|
|
152
|
+
let answers = structuredClone(input.answers ?? {});
|
|
153
|
+
for (const definition of definitions) {
|
|
154
|
+
const current = definition.read(answers);
|
|
155
|
+
if (current !== undefined && answered(current)) {
|
|
156
|
+
answers = definition.write(answers, normalizeValue(definition.question, current));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
validateSemanticAnswers(answers, input.context);
|
|
160
|
+
for (const stage of STAGES.slice(0, input.requireCharter === false ? 1 : 2)) {
|
|
161
|
+
const visible = definitions.filter((definition) => definition.stage === stage && conditionVisible(definition, definitions, answers));
|
|
162
|
+
const missing = visible.filter((definition) => definition.question.type !== 'informational' &&
|
|
163
|
+
definition.question.required &&
|
|
164
|
+
!answered(definition.read(answers)));
|
|
165
|
+
if (missing.length > 0) {
|
|
166
|
+
const suggestions = stage === 'product-charter'
|
|
167
|
+
? await buildOperatingCharterSuggestions({ projectRoot: input.context.projectRoot })
|
|
168
|
+
: null;
|
|
169
|
+
return {
|
|
170
|
+
status: 'input-required',
|
|
171
|
+
stage: stage,
|
|
172
|
+
answers,
|
|
173
|
+
questions: visible
|
|
174
|
+
.filter((definition) => !answered(definition.read(answers)))
|
|
175
|
+
.map((definition) => {
|
|
176
|
+
const question = structuredClone(definition.question);
|
|
177
|
+
const suggestion = suggestions?.suggestions.find((entry) => entry.field === question.questionId);
|
|
178
|
+
if (!suggestion)
|
|
179
|
+
return question;
|
|
180
|
+
return {
|
|
181
|
+
...question,
|
|
182
|
+
valueSemantics: 'suggestion',
|
|
183
|
+
suggestedValue: suggestion.value,
|
|
184
|
+
suggestionReason: [
|
|
185
|
+
`Draft from ${suggestion.citation.location}`,
|
|
186
|
+
`${suggestion.confidence} confidence`,
|
|
187
|
+
`evidence ${suggestion.citation.digest}`,
|
|
188
|
+
`rules ${suggestion.engineVersion}`,
|
|
189
|
+
].join('; '),
|
|
190
|
+
};
|
|
191
|
+
}),
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
status: 'preview-ready',
|
|
197
|
+
stage: 'review',
|
|
198
|
+
answers,
|
|
199
|
+
questions: definitions
|
|
200
|
+
.filter((definition) => definition.stage === 'review')
|
|
201
|
+
.map((definition) => structuredClone(definition.question)),
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
export function applyOperatingInitAnswer(answers, context, questionId, value) {
|
|
205
|
+
const definition = operatingInitQuestionRegistry(context).find((candidate) => candidate.question.questionId === questionId);
|
|
206
|
+
if (!definition) {
|
|
207
|
+
throw new OperateError('E_OPERATE_QUESTIONNAIRE_INVALID', `Unknown Operating Board question: ${questionId}.`);
|
|
208
|
+
}
|
|
209
|
+
return definition.write(answers, normalizeValue(definition.question, value));
|
|
210
|
+
}
|
|
211
|
+
export async function createOperatingInitQuestionnaire(input) {
|
|
212
|
+
const createdAt = input.createdAt ?? input.context.now ?? new Date().toISOString();
|
|
213
|
+
const expiresAt = input.expiresAt ?? new Date(new Date(createdAt).getTime() + 24 * 60 * 60 * 1000).toISOString();
|
|
214
|
+
const projectIdentity = input.context.projectIdentity ??
|
|
215
|
+
canonicalDigest({
|
|
216
|
+
projectRoot: path.resolve(input.context.projectRoot),
|
|
217
|
+
});
|
|
218
|
+
const projectHead = input.context.projectHead ?? canonicalDigest({ projectIdentity });
|
|
219
|
+
const configHead = input.context.configHead ?? canonicalDigest({ config: null });
|
|
220
|
+
const seed = {
|
|
221
|
+
command: 'operate.init',
|
|
222
|
+
projectIdentity,
|
|
223
|
+
projectHead,
|
|
224
|
+
configHead,
|
|
225
|
+
stage: input.stage,
|
|
226
|
+
questions: input.questions,
|
|
227
|
+
createdAt,
|
|
228
|
+
expiresAt,
|
|
229
|
+
};
|
|
230
|
+
const sessionId = input.sessionId ??
|
|
231
|
+
`GIS-${canonicalDigest(seed).slice('sha256:'.length, 'sha256:'.length + 24)}`;
|
|
232
|
+
const withoutDigest = {
|
|
233
|
+
kind: 'guided-questionnaire',
|
|
234
|
+
schemaVersion: '1.0.0',
|
|
235
|
+
protocolVersion: '1.2.0',
|
|
236
|
+
sessionId,
|
|
237
|
+
questionnaireVersion: '1.0.0',
|
|
238
|
+
command: 'operate.init',
|
|
239
|
+
projectIdentity,
|
|
240
|
+
projectHead,
|
|
241
|
+
configHead,
|
|
242
|
+
adapter: {
|
|
243
|
+
runtime: input.context.runtime ?? 'unknown',
|
|
244
|
+
version: 'detected',
|
|
245
|
+
interaction: input.context.interaction ?? 'none',
|
|
246
|
+
},
|
|
247
|
+
stage: input.stage,
|
|
248
|
+
step: STAGES.indexOf(input.stage) + 1,
|
|
249
|
+
totalSteps: 3,
|
|
250
|
+
title: 'Configure the Operating Board',
|
|
251
|
+
description: input.stage === 'review'
|
|
252
|
+
? 'Review exact writes and boundaries before applying initialization.'
|
|
253
|
+
: 'Answer only the governance questions in this stage.',
|
|
254
|
+
questions: input.questions,
|
|
255
|
+
createdAt,
|
|
256
|
+
expiresAt,
|
|
257
|
+
};
|
|
258
|
+
const questionnaire = {
|
|
259
|
+
...withoutDigest,
|
|
260
|
+
digest: canonicalDigest(withoutDigest),
|
|
261
|
+
};
|
|
262
|
+
let validators;
|
|
263
|
+
try {
|
|
264
|
+
validators = await resolveGuidedInteractionValidators();
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
throw new OperateError(error instanceof Error && error.name === 'E_PIPELINE_NOT_INSTALLED'
|
|
268
|
+
? 'E_PIPELINE_NOT_INSTALLED'
|
|
269
|
+
: 'E_PIPELINE_VERSION_INCOMPATIBLE', error instanceof Error ? error.message : 'Compatible guided validators are unavailable.');
|
|
270
|
+
}
|
|
271
|
+
const errors = validators.validateGuidedQuestionnaire(questionnaire);
|
|
272
|
+
if (errors.length > 0) {
|
|
273
|
+
throw new OperateError('E_OPERATE_QUESTIONNAIRE_INVALID', 'The generated Operating Board questionnaire did not satisfy Protocol v1.2.', { validationErrors: errors });
|
|
274
|
+
}
|
|
275
|
+
return questionnaire;
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=question-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"question-engine.js","sourceRoot":"","sources":["../../../../src/services/operate/interaction/question-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { GuidedQuestion, GuidedQuestionValue, OperatingInitAnswers } from '../types.js';
|
|
2
|
+
export type OperatingInitStage = 'foundation' | 'product-charter' | 'review';
|
|
3
|
+
export interface OperatingQuestionContext {
|
|
4
|
+
gitUserName?: string;
|
|
5
|
+
detectedRuntime?: 'claude' | 'codex' | 'cursor';
|
|
6
|
+
timezone: string;
|
|
7
|
+
availableSources: string[];
|
|
8
|
+
}
|
|
9
|
+
export interface OperatingInitQuestionDefinition {
|
|
10
|
+
stage: OperatingInitStage;
|
|
11
|
+
question: GuidedQuestion;
|
|
12
|
+
read(answers: OperatingInitAnswers): GuidedQuestionValue | undefined;
|
|
13
|
+
write(answers: OperatingInitAnswers, value: GuidedQuestionValue): OperatingInitAnswers;
|
|
14
|
+
}
|
|
15
|
+
export declare function operatingInitQuestionRegistry(context: OperatingQuestionContext): readonly OperatingInitQuestionDefinition[];
|
|
16
|
+
//# sourceMappingURL=question-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"question-registry.d.ts","sourceRoot":"","sources":["../../../../src/services/operate/interaction/question-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE7F,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,iBAAiB,GAAG,QAAQ,CAAC;AAE7E,MAAM,WAAW,wBAAwB;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,+BAA+B;IAC9C,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,CAAC,OAAO,EAAE,oBAAoB,GAAG,mBAAmB,GAAG,SAAS,CAAC;IACrE,KAAK,CAAC,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CAAC;CACxF;AAuED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,wBAAwB,GAChC,SAAS,+BAA+B,EAAE,CA6U5C"}
|