openplanr 1.14.4 → 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.
Files changed (75) hide show
  1. package/dist/cli/commands/operate.d.ts.map +1 -1
  2. package/dist/cli/commands/operate.js +54 -87
  3. package/dist/cli/commands/operate.js.map +1 -1
  4. package/dist/services/operate/config.d.ts +4 -1
  5. package/dist/services/operate/config.d.ts.map +1 -1
  6. package/dist/services/operate/config.js +56 -2
  7. package/dist/services/operate/config.js.map +1 -1
  8. package/dist/services/operate/doctor.d.ts.map +1 -1
  9. package/dist/services/operate/doctor.js +15 -0
  10. package/dist/services/operate/doctor.js.map +1 -1
  11. package/dist/services/operate/evidence-classifications.d.ts +59 -0
  12. package/dist/services/operate/evidence-classifications.d.ts.map +1 -0
  13. package/dist/services/operate/evidence-classifications.js +132 -0
  14. package/dist/services/operate/evidence-classifications.js.map +1 -0
  15. package/dist/services/operate/evidence-diagnostics.d.ts +23 -0
  16. package/dist/services/operate/evidence-diagnostics.d.ts.map +1 -0
  17. package/dist/services/operate/evidence-diagnostics.js +152 -0
  18. package/dist/services/operate/evidence-diagnostics.js.map +1 -0
  19. package/dist/services/operate/evidence.d.ts.map +1 -1
  20. package/dist/services/operate/evidence.js +54 -7
  21. package/dist/services/operate/evidence.js.map +1 -1
  22. package/dist/services/operate/index.d.ts.map +1 -1
  23. package/dist/services/operate/index.js +459 -62
  24. package/dist/services/operate/index.js.map +1 -1
  25. package/dist/services/operate/interaction/action-service.d.ts +17 -0
  26. package/dist/services/operate/interaction/action-service.d.ts.map +1 -0
  27. package/dist/services/operate/interaction/action-service.js +84 -0
  28. package/dist/services/operate/interaction/action-service.js.map +1 -0
  29. package/dist/services/operate/interaction/answer-service.d.ts +33 -0
  30. package/dist/services/operate/interaction/answer-service.d.ts.map +1 -0
  31. package/dist/services/operate/interaction/answer-service.js +239 -0
  32. package/dist/services/operate/interaction/answer-service.js.map +1 -0
  33. package/dist/services/operate/interaction/charter-suggestions.d.ts +29 -0
  34. package/dist/services/operate/interaction/charter-suggestions.d.ts.map +1 -0
  35. package/dist/services/operate/interaction/charter-suggestions.js +104 -0
  36. package/dist/services/operate/interaction/charter-suggestions.js.map +1 -0
  37. package/dist/services/operate/interaction/confirmation-service.d.ts +30 -0
  38. package/dist/services/operate/interaction/confirmation-service.d.ts.map +1 -0
  39. package/dist/services/operate/interaction/confirmation-service.js +78 -0
  40. package/dist/services/operate/interaction/confirmation-service.js.map +1 -0
  41. package/dist/services/operate/interaction/question-engine.d.ts +39 -0
  42. package/dist/services/operate/interaction/question-engine.d.ts.map +1 -0
  43. package/dist/services/operate/interaction/question-engine.js +277 -0
  44. package/dist/services/operate/interaction/question-engine.js.map +1 -0
  45. package/dist/services/operate/interaction/question-registry.d.ts +16 -0
  46. package/dist/services/operate/interaction/question-registry.d.ts.map +1 -0
  47. package/dist/services/operate/interaction/question-registry.js +190 -0
  48. package/dist/services/operate/interaction/question-registry.js.map +1 -0
  49. package/dist/services/operate/interaction/session-service.d.ts +55 -0
  50. package/dist/services/operate/interaction/session-service.d.ts.map +1 -0
  51. package/dist/services/operate/interaction/session-service.js +272 -0
  52. package/dist/services/operate/interaction/session-service.js.map +1 -0
  53. package/dist/services/operate/interaction/terminal-renderer.d.ts +8 -0
  54. package/dist/services/operate/interaction/terminal-renderer.d.ts.map +1 -0
  55. package/dist/services/operate/interaction/terminal-renderer.js +103 -0
  56. package/dist/services/operate/interaction/terminal-renderer.js.map +1 -0
  57. package/dist/services/operate/maintenance.d.ts.map +1 -1
  58. package/dist/services/operate/maintenance.js +40 -3
  59. package/dist/services/operate/maintenance.js.map +1 -1
  60. package/dist/services/operate/types.d.ts +194 -1
  61. package/dist/services/operate/types.d.ts.map +1 -1
  62. package/dist/services/operate/types.js.map +1 -1
  63. package/dist/services/operate/workspace.d.ts +1 -0
  64. package/dist/services/operate/workspace.d.ts.map +1 -1
  65. package/dist/services/operate/workspace.js +2 -0
  66. package/dist/services/operate/workspace.js.map +1 -1
  67. package/dist/services/pipeline-package-service.d.ts +14 -0
  68. package/dist/services/pipeline-package-service.d.ts.map +1 -1
  69. package/dist/services/pipeline-package-service.js +45 -1
  70. package/dist/services/pipeline-package-service.js.map +1 -1
  71. package/dist/services/runtime-manager-service.d.ts +3 -0
  72. package/dist/services/runtime-manager-service.d.ts.map +1 -1
  73. package/dist/services/runtime-manager-service.js +26 -2
  74. package/dist/services/runtime-manager-service.js.map +1 -1
  75. package/package.json +3 -2
@@ -0,0 +1,190 @@
1
+ const question = (questionId, type, label, explanation, options = {}) => ({
2
+ kind: 'guided-question',
3
+ schemaVersion: '1.0.0',
4
+ protocolVersion: '1.2.0',
5
+ questionId,
6
+ questionVersion: '1.0.0',
7
+ type,
8
+ label,
9
+ explanation,
10
+ required: false,
11
+ sensitivity: 'internal',
12
+ persistence: 'session',
13
+ valueSemantics: 'none',
14
+ ...options,
15
+ });
16
+ function scalar(stage, key, definition) {
17
+ return {
18
+ stage,
19
+ question: definition,
20
+ read: (answers) => answers[key],
21
+ write: (answers, value) => ({ ...answers, [key]: value }),
22
+ };
23
+ }
24
+ function list(stage, key, definition) {
25
+ return {
26
+ stage,
27
+ question: definition,
28
+ read: (answers) => answers[key],
29
+ write: (answers, value) => ({
30
+ ...answers,
31
+ [key]: Array.isArray(value) ? value : [String(value)],
32
+ }),
33
+ };
34
+ }
35
+ function charter(key, definition) {
36
+ return {
37
+ stage: 'product-charter',
38
+ question: definition,
39
+ read: (answers) => answers.charter?.[key],
40
+ write: (answers, value) => ({
41
+ ...answers,
42
+ charter: {
43
+ ...answers.charter,
44
+ [key]: value,
45
+ },
46
+ }),
47
+ };
48
+ }
49
+ export function operatingInitQuestionRegistry(context) {
50
+ const sourceSuggestion = context.availableSources.filter((source) => ['repository', 'planr', 'git'].includes(source));
51
+ return [
52
+ scalar('foundation', 'profile', question('profile', 'single-select', 'Operating profile', 'The profile selects bounded advisory lenses, evidence budgets, and attention caps.', {
53
+ required: true,
54
+ valueSemantics: 'default',
55
+ defaultValue: 'saas',
56
+ defaultReason: 'SaaS is the balanced first-use profile.',
57
+ choices: [
58
+ {
59
+ id: 'saas',
60
+ label: 'SaaS',
61
+ description: 'Balanced product, growth, risk, and operations.',
62
+ },
63
+ { id: 'product', label: 'Product', description: 'Activation and customer outcomes.' },
64
+ {
65
+ id: 'engineering',
66
+ label: 'Engineering',
67
+ description: 'Delivery, reliability, and risk.',
68
+ },
69
+ {
70
+ id: 'custom',
71
+ label: 'Custom',
72
+ description: 'A validated project-contained profile file.',
73
+ },
74
+ ],
75
+ })),
76
+ scalar('foundation', 'profileFile', question('profile-file', 'path', 'Validated custom profile file', 'Custom profiles must be bounded JSON files contained by the product workspace.', {
77
+ required: true,
78
+ validation: { minLength: 1, maxLength: 4096 },
79
+ visibleWhen: [{ questionId: 'profile', operator: 'equals', value: 'custom' }],
80
+ })),
81
+ scalar('foundation', 'decisionOwner', question('decision-owner', 'text', 'Who owns final operating decisions?', 'This human is the final authority for governance decisions; advisors cannot supply this answer.', {
82
+ required: true,
83
+ validation: { minLength: 1, maxLength: 160 },
84
+ ...(context.gitUserName
85
+ ? {
86
+ valueSemantics: 'suggestion',
87
+ suggestedValue: context.gitUserName,
88
+ suggestionReason: 'Suggested from the configured Git user name; confirm or replace it.',
89
+ }
90
+ : {}),
91
+ })),
92
+ scalar('foundation', 'planningEngine', question('planning-engine', 'single-select', 'Which engine creates accepted DEV specs?', 'This selects the planning handoff only; it never authorizes PLAN or SHIP.', {
93
+ required: true,
94
+ choices: [
95
+ { id: 'openplanr', label: 'OpenPlanr', description: 'Dedicated planning CLI.' },
96
+ {
97
+ id: 'pipeline-po',
98
+ label: 'Pipeline PO',
99
+ description: 'Feature-local planning through an explicit native PLAN handoff.',
100
+ },
101
+ ],
102
+ })),
103
+ scalar('foundation', 'runtime', question('runtime', 'single-select', 'Preferred coding runtime', 'The runtime presents questions and dispatches advisors; it receives no additional authority.', {
104
+ required: true,
105
+ ...(context.detectedRuntime
106
+ ? {
107
+ valueSemantics: 'suggestion',
108
+ suggestedValue: context.detectedRuntime,
109
+ suggestionReason: 'Suggested from a detected compatible runtime.',
110
+ }
111
+ : {
112
+ valueSemantics: 'default',
113
+ defaultValue: 'auto',
114
+ defaultReason: 'Auto preserves runtime routing until a compatible runtime is selected.',
115
+ }),
116
+ choices: [
117
+ { id: 'auto', label: 'Auto-detect' },
118
+ { id: 'claude', label: 'Claude Code' },
119
+ { id: 'codex', label: 'Codex' },
120
+ { id: 'cursor', label: 'Cursor' },
121
+ ],
122
+ })),
123
+ scalar('foundation', 'cadence', question('cadence', 'single-select', 'Operating cadence', 'Cadence controls display and reminders only; cycles still start only when requested.', {
124
+ required: true,
125
+ valueSemantics: 'default',
126
+ defaultValue: 'manual',
127
+ defaultReason: 'Manual cadence avoids implying background or scheduled execution.',
128
+ choices: [
129
+ { id: 'manual', label: 'Manual' },
130
+ { id: 'weekly', label: 'Weekly' },
131
+ { id: 'monthly', label: 'Monthly' },
132
+ ],
133
+ })),
134
+ scalar('foundation', 'timezone', question('timezone', 'text', 'Display timezone (IANA)', 'Persisted timestamps remain UTC; this IANA zone controls human-readable display.', {
135
+ required: true,
136
+ valueSemantics: 'suggestion',
137
+ suggestedValue: context.timezone,
138
+ suggestionReason: 'Suggested from the current environment.',
139
+ validation: { minLength: 1, maxLength: 128 },
140
+ })),
141
+ scalar('foundation', 'sensitivityCeiling', question('sensitivity-ceiling', 'single-select', 'Highest evidence class allowed', 'Evidence above this ceiling is excluded before collection or provider use.', {
142
+ required: true,
143
+ valueSemantics: 'default',
144
+ defaultValue: 'internal',
145
+ defaultReason: 'Internal permits normal project evidence without allowing restricted material.',
146
+ choices: [
147
+ { id: 'public', label: 'Public only' },
148
+ { id: 'internal', label: 'Internal' },
149
+ { id: 'confidential', label: 'Confidential' },
150
+ { id: 'restricted', label: 'Restricted' },
151
+ ],
152
+ })),
153
+ list('foundation', 'sources', question('sources', 'multi-select', 'Evidence sources', 'Sources are collected read-only. Unavailable integrations must be configured or left disabled.', {
154
+ required: true,
155
+ valueSemantics: 'suggestion',
156
+ suggestedValue: sourceSuggestion,
157
+ suggestionReason: 'Suggested from locally available provider capabilities.',
158
+ validation: { minItems: 1, maxItems: 6 },
159
+ choices: [
160
+ { id: 'repository', label: 'Repository files and metadata' },
161
+ { id: 'planr', label: 'OpenPlanr planning and delivery records' },
162
+ { id: 'git', label: 'Git history and working-tree metadata' },
163
+ { id: 'github', label: 'GitHub (read-only)' },
164
+ { id: 'linear', label: 'Linear (read-only)' },
165
+ { id: 'file-import', label: 'Local JSON/CSV files' },
166
+ ],
167
+ })),
168
+ list('foundation', 'evidenceFiles', question('evidence-files', 'repeated-text', 'Workspace-contained JSON/CSV evidence paths', 'Every import is resolved beneath a configured workspace component before collection.', {
169
+ required: true,
170
+ validation: { minItems: 1, maxItems: 50 },
171
+ visibleWhen: [{ questionId: 'sources', operator: 'contains', value: 'file-import' }],
172
+ })),
173
+ list('foundation', 'componentRoots', question('component-roots', 'repeated-text', 'Read-only component repository paths', 'The current repository remains the control repository; additional component roots are evidence-only.', { validation: { maxItems: 50 } })),
174
+ charter('purpose', question('purpose', 'text', 'What product outcome does this workspace exist to create?', 'Purpose anchors advisor relevance and does not authorize any route.', { required: true, validation: { minLength: 1, maxLength: 1000 } })),
175
+ charter('stage', question('product-stage', 'text', 'Current product stage', 'Stage calibrates evidence expectations and recommendation confidence.', { required: true, validation: { minLength: 1, maxLength: 256 } })),
176
+ charter('businessModel', question('business-model', 'text', 'Business model', 'Commercial facts must come from the decision owner and are never inferred from source code.', { required: true, validation: { minLength: 1, maxLength: 512 } })),
177
+ charter('idealCustomer', question('ideal-customer', 'text', 'Ideal customer profile', 'Customer claims are governance context and are never guessed by advisors.', { required: true, validation: { minLength: 1, maxLength: 1000 } })),
178
+ charter('goals', question('goals', 'repeated-text', 'Current goals', 'Goals bound the operating cycle to outcomes the owner explicitly chose.', { required: true, validation: { minItems: 1, maxItems: 50 } })),
179
+ charter('successMetrics', question('success-metrics', 'repeated-text', 'Success metrics', 'Metrics need explicit units and observation meaning before they can support an outcome.', { required: true, validation: { minItems: 1, maxItems: 50 } })),
180
+ charter('guardrails', question('guardrails', 'repeated-text', 'Human authority and product guardrails', 'Guardrails define what advisors and routes must not do without new human authority.', { required: true, validation: { minItems: 1, maxItems: 50 } })),
181
+ charter('knownUnknowns', question('known-unknowns', 'repeated-text', 'Known unknowns', 'Uncertainty is recorded as a gap instead of being filled with generic model advice.', { required: true, validation: { minItems: 1, maxItems: 50 } })),
182
+ {
183
+ stage: 'review',
184
+ question: question('review-boundary', 'informational', 'Review exact writes before initialization', 'Review is write-free. Applying this preview initializes only the Operating Board and never starts a cycle, calls a provider, invokes PLAN, or invokes SHIP.', { persistence: 'none' }),
185
+ read: () => undefined,
186
+ write: (answers) => answers,
187
+ },
188
+ ];
189
+ }
190
+ //# sourceMappingURL=question-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"question-registry.js","sourceRoot":"","sources":["../../../../src/services/operate/interaction/question-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { type GuidedAnswer, type GuidedQuestionnaire, type GuidedSession, type GuidedSessionState } from '../types.js';
2
+ export declare const GUIDED_SESSION_TTL_MS: number;
3
+ export declare const GUIDED_ANSWER_MAX_BYTES: number;
4
+ export interface GuidedSessionBindings {
5
+ projectIdentity: `sha256:${string}`;
6
+ projectHead: `sha256:${string}`;
7
+ configHead: `sha256:${string}`;
8
+ }
9
+ export declare function createGuidedSessionId(): string;
10
+ export declare function currentGuidedSessionBindings(projectRoot: string): Promise<GuidedSessionBindings>;
11
+ export declare function createGuidedSession(input: {
12
+ projectRoot: string;
13
+ questionnaire: GuidedQuestionnaire;
14
+ persistedAnswers?: GuidedAnswer[];
15
+ localRoot?: string;
16
+ now?: Date;
17
+ }): Promise<GuidedSession>;
18
+ export declare function readGuidedSession(input: {
19
+ projectRoot: string;
20
+ sessionId: string;
21
+ localRoot?: string;
22
+ now?: Date;
23
+ bindings?: GuidedSessionBindings;
24
+ }): Promise<GuidedSession>;
25
+ export declare function updateGuidedSession(input: {
26
+ projectRoot: string;
27
+ session: GuidedSession;
28
+ localRoot?: string;
29
+ }): Promise<void>;
30
+ export declare function cancelGuidedSession(input: {
31
+ projectRoot: string;
32
+ sessionId: string;
33
+ localRoot?: string;
34
+ }): Promise<{
35
+ sessionId: string;
36
+ state: 'cancelled';
37
+ removed: true;
38
+ }>;
39
+ export declare function guidedSessionStatus(input: {
40
+ projectRoot: string;
41
+ localRoot?: string;
42
+ now?: Date;
43
+ }): Promise<{
44
+ active: number;
45
+ expired: number;
46
+ files: number;
47
+ }>;
48
+ export declare function purgeGuidedSessions(input: {
49
+ projectRoot: string;
50
+ localRoot?: string;
51
+ }): Promise<{
52
+ removed: number;
53
+ }>;
54
+ export declare function guidedSessionState(session: GuidedSession, state: GuidedSessionState, now: Date, values?: Partial<GuidedSession>): GuidedSession;
55
+ //# sourceMappingURL=session-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-service.d.ts","sourceRoot":"","sources":["../../../../src/services/operate/interaction/session-service.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EAExB,MAAM,aAAa,CAAC;AAGrB,eAAO,MAAM,qBAAqB,QAAsB,CAAC;AACzD,eAAO,MAAM,uBAAuB,QAAY,CAAC;AAEjD,MAAM,WAAW,qBAAqB;IACpC,eAAe,EAAE,UAAU,MAAM,EAAE,CAAC;IACpC,WAAW,EAAE,UAAU,MAAM,EAAE,CAAC;IAChC,UAAU,EAAE,UAAU,MAAM,EAAE,CAAC;CAChC;AAKD,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAsB,4BAA4B,CAChD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,qBAAqB,CAAC,CAyChC;AA4ED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,mBAAmB,CAAC;IACnC,gBAAgB,CAAC,EAAE,YAAY,EAAE,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,GAAG,OAAO,CAAC,aAAa,CAAC,CA8BzB;AAiCD,wBAAsB,iBAAiB,CAAC,KAAK,EAAE;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAClC,GAAG,OAAO,CAAC,aAAa,CAAC,CA8FzB;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhB;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,CAAC,CAQpE;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB9D;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAiB/B;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,kBAAkB,EACzB,GAAG,EAAE,IAAI,EACT,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM,GAClC,aAAa,CAEf"}
@@ -0,0 +1,272 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { createHmac, randomBytes, randomUUID, timingSafeEqual } from 'node:crypto';
3
+ import { chmod, mkdir, readdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import { promisify } from 'node:util';
6
+ import { resolveGuidedInteractionValidators } from '../../pipeline-package-service.js';
7
+ import { canonicalDigest, canonicalize, sha256Digest } from '../canonical.js';
8
+ import { parseStrictJson } from '../evidence-import.js';
9
+ import { OperateError, } from '../types.js';
10
+ import { resolveOperatingPaths, resolveOperatingProject } from '../workspace.js';
11
+ export const GUIDED_SESSION_TTL_MS = 24 * 60 * 60 * 1000;
12
+ export const GUIDED_ANSWER_MAX_BYTES = 64 * 1024;
13
+ const SESSION_ID = /^GIS-[A-Za-z0-9._-]{8,128}$/;
14
+ const execFileAsync = promisify(execFile);
15
+ export function createGuidedSessionId() {
16
+ return `GIS-${randomBytes(18).toString('base64url')}`;
17
+ }
18
+ export async function currentGuidedSessionBindings(projectRoot) {
19
+ const resolved = await resolveOperatingProject(projectRoot).catch(() => path.resolve(projectRoot));
20
+ const paths = resolveOperatingPaths(resolved);
21
+ const [config, events] = await Promise.all([
22
+ readFile(paths.config).catch(() => null),
23
+ readFile(paths.events).catch(() => null),
24
+ ]);
25
+ const [revision, status] = await Promise.all([
26
+ execFileAsync('git', ['rev-parse', '--verify', 'HEAD'], {
27
+ cwd: resolved,
28
+ env: { PATH: process.env.PATH ?? '' },
29
+ timeout: 10_000,
30
+ }).then(({ stdout }) => stdout.trim(), () => null),
31
+ execFileAsync('git', ['status', '--porcelain=v1', '--untracked-files=all'], {
32
+ cwd: resolved,
33
+ env: { PATH: process.env.PATH ?? '' },
34
+ timeout: 10_000,
35
+ maxBuffer: 5 * 1024 * 1024,
36
+ }).then(({ stdout }) => stdout.trim(), () => null),
37
+ ]);
38
+ const projectIdentity = canonicalDigest({ projectRoot: resolved });
39
+ const configHead = config ? sha256Digest(config) : canonicalDigest({ config: null });
40
+ return {
41
+ projectIdentity,
42
+ configHead,
43
+ projectHead: canonicalDigest({
44
+ projectIdentity,
45
+ configHead,
46
+ eventHead: events ? sha256Digest(events) : null,
47
+ revision,
48
+ dirtyFingerprint: status ? sha256Digest(status) : null,
49
+ }),
50
+ };
51
+ }
52
+ function sessionPath(projectRoot, sessionId, localRoot) {
53
+ if (!SESSION_ID.test(sessionId)) {
54
+ throw new OperateError('E_OPERATE_SESSION_INVALID', 'Guided session ID is invalid.');
55
+ }
56
+ return path.join(resolveOperatingPaths(projectRoot, { localRoot }).sessions, `${sessionId}.json`);
57
+ }
58
+ function sessionMacPath(projectRoot, sessionId, localRoot) {
59
+ return `${sessionPath(projectRoot, sessionId, localRoot)}.mac`;
60
+ }
61
+ function sessionKeyPath(projectRoot, localRoot) {
62
+ return path.join(resolveOperatingPaths(projectRoot, { localRoot }).sessions, '.integrity-key');
63
+ }
64
+ async function loadOrCreateSessionKey(projectRoot, localRoot) {
65
+ const target = sessionKeyPath(projectRoot, localRoot);
66
+ const existing = await readFile(target).catch(() => null);
67
+ if (existing)
68
+ return existing;
69
+ await mkdir(path.dirname(target), { recursive: true, mode: 0o700 });
70
+ const key = randomBytes(32);
71
+ await writeFile(target, key, { mode: 0o600, flag: 'wx' }).catch(async (error) => {
72
+ if (error.code !== 'EEXIST')
73
+ throw error;
74
+ });
75
+ return (await readFile(target).catch(() => key));
76
+ }
77
+ function sessionMac(raw, key) {
78
+ return createHmac('sha256', key).update(raw).digest('base64url');
79
+ }
80
+ async function validateSession(session) {
81
+ try {
82
+ const errors = (await resolveGuidedInteractionValidators()).validateGuidedSession(session);
83
+ if (errors.length > 0) {
84
+ throw new OperateError('E_OPERATE_SESSION_INVALID', 'Guided session failed Protocol v1.2 validation.');
85
+ }
86
+ }
87
+ catch (error) {
88
+ if (error instanceof OperateError)
89
+ throw error;
90
+ throw new OperateError(error instanceof Error && error.name === 'E_PIPELINE_NOT_INSTALLED'
91
+ ? 'E_PIPELINE_NOT_INSTALLED'
92
+ : 'E_PIPELINE_VERSION_INCOMPATIBLE', error instanceof Error ? error.message : 'Guided session validators are unavailable.');
93
+ }
94
+ }
95
+ async function atomicSessionWrite(projectRoot, session, localRoot) {
96
+ await validateSession(session);
97
+ const target = sessionPath(projectRoot, session.sessionId, localRoot);
98
+ await mkdir(path.dirname(target), { recursive: true, mode: 0o700 });
99
+ const raw = `${canonicalize(session)}\n`;
100
+ const key = await loadOrCreateSessionKey(projectRoot, localRoot);
101
+ const temporary = `${target}.${process.pid}.${randomUUID()}.tmp`;
102
+ const macTarget = sessionMacPath(projectRoot, session.sessionId, localRoot);
103
+ const macTemporary = `${macTarget}.${process.pid}.${randomUUID()}.tmp`;
104
+ await writeFile(temporary, raw, { mode: 0o600, flag: 'wx' });
105
+ await writeFile(macTemporary, `${sessionMac(raw, key)}\n`, { mode: 0o600, flag: 'wx' });
106
+ await rename(temporary, target);
107
+ await rename(macTemporary, macTarget);
108
+ await chmod(target, 0o600);
109
+ await chmod(macTarget, 0o600);
110
+ }
111
+ export async function createGuidedSession(input) {
112
+ const now = input.now ?? new Date();
113
+ const session = {
114
+ kind: 'guided-session',
115
+ schemaVersion: '1.0.0',
116
+ protocolVersion: '1.2.0',
117
+ sessionId: input.questionnaire.sessionId,
118
+ state: 'awaiting-input',
119
+ command: input.questionnaire.command,
120
+ projectIdentity: input.questionnaire.projectIdentity,
121
+ projectHead: input.questionnaire.projectHead,
122
+ configHead: input.questionnaire.configHead,
123
+ questionnaireDigest: input.questionnaire.digest,
124
+ questionnaireVersion: input.questionnaire.questionnaireVersion,
125
+ adapter: input.questionnaire.adapter,
126
+ persistedAnswers: (input.persistedAnswers ?? [])
127
+ .filter((answer) => answer.sensitivity !== 'sensitive')
128
+ .map((answer) => structuredClone(answer)),
129
+ createdAt: input.questionnaire.createdAt,
130
+ updatedAt: now.toISOString(),
131
+ expiresAt: input.questionnaire.expiresAt,
132
+ };
133
+ await atomicSessionWrite(input.projectRoot, session, input.localRoot);
134
+ return session;
135
+ }
136
+ function terminalSessionError(session) {
137
+ switch (session.state) {
138
+ case 'cancelled':
139
+ return new OperateError('E_OPERATE_SESSION_CANCELLED', 'Guided session was cancelled. Start a new initialization session.', { state: session.state, recoveryCommand: 'planr operate init --json' });
140
+ case 'expired':
141
+ return new OperateError('E_OPERATE_SESSION_EXPIRED', 'Guided session expired after 24 hours. Start a new initialization session.', { state: session.state, recoveryCommand: 'planr operate init --json' });
142
+ case 'stale':
143
+ return new OperateError('E_OPERATE_SESSION_STALE', 'Guided session no longer matches the project or configuration head.', { state: session.state, recoveryCommand: 'planr operate init --json' });
144
+ case 'invalid':
145
+ return new OperateError('E_OPERATE_SESSION_INVALID', 'Guided session is invalid or was tampered with.', { state: session.state, recoveryCommand: 'planr operate init --json' });
146
+ default:
147
+ return null;
148
+ }
149
+ }
150
+ export async function readGuidedSession(input) {
151
+ const target = sessionPath(input.projectRoot, input.sessionId, input.localRoot);
152
+ let raw;
153
+ try {
154
+ raw = await readFile(target, 'utf8');
155
+ }
156
+ catch {
157
+ throw new OperateError('E_OPERATE_SESSION_INVALID', 'Guided session does not exist or was already purged.', { state: 'invalid', recoveryCommand: 'planr operate init --json' });
158
+ }
159
+ try {
160
+ const info = await stat(target);
161
+ // POSIX mode bits are not meaningful on Windows (Node reports the
162
+ // synthesized 0o666 value even after chmod). Windows relies on the
163
+ // machine-local user profile ACL and the integrity MAC instead.
164
+ if (process.platform !== 'win32' && (info.mode & 0o077) !== 0) {
165
+ throw new OperateError('E_OPERATE_SESSION_INVALID', 'Guided session permissions are unsafe; the session was rejected.', { state: 'invalid', recoveryCommand: 'planr operate init --json' });
166
+ }
167
+ const key = await readFile(sessionKeyPath(input.projectRoot, input.localRoot));
168
+ const expected = Buffer.from(sessionMac(raw, key));
169
+ const actual = Buffer.from((await readFile(sessionMacPath(input.projectRoot, input.sessionId, input.localRoot), 'utf8')).trim());
170
+ if (expected.length !== actual.length || !timingSafeEqual(expected, actual)) {
171
+ throw new OperateError('E_OPERATE_SESSION_INVALID', 'Guided session integrity verification failed.', { state: 'invalid', recoveryCommand: 'planr operate init --json' });
172
+ }
173
+ const parsed = parseStrictJson(raw, {
174
+ maxBytes: GUIDED_ANSWER_MAX_BYTES,
175
+ maxDepth: 16,
176
+ maxScalars: 500,
177
+ maxStringLength: 4096,
178
+ });
179
+ await validateSession(parsed);
180
+ if (parsed.sessionId !== input.sessionId) {
181
+ throw new OperateError('E_OPERATE_SESSION_INVALID', 'Guided session identity does not match its machine-local record.');
182
+ }
183
+ const terminal = terminalSessionError(parsed);
184
+ if (terminal)
185
+ throw terminal;
186
+ const now = input.now ?? new Date();
187
+ if (now.getTime() >= Date.parse(parsed.expiresAt)) {
188
+ await updateGuidedSession({
189
+ projectRoot: input.projectRoot,
190
+ session: {
191
+ ...parsed,
192
+ state: 'expired',
193
+ updatedAt: now.toISOString(),
194
+ terminalReason: 'The 24-hour guided session lifetime elapsed.',
195
+ },
196
+ localRoot: input.localRoot,
197
+ });
198
+ throw terminalSessionError({ ...parsed, state: 'expired' });
199
+ }
200
+ const bindings = input.bindings ?? (await currentGuidedSessionBindings(input.projectRoot));
201
+ if (parsed.projectIdentity !== bindings.projectIdentity ||
202
+ parsed.projectHead !== bindings.projectHead ||
203
+ parsed.configHead !== bindings.configHead) {
204
+ await updateGuidedSession({
205
+ projectRoot: input.projectRoot,
206
+ session: {
207
+ ...parsed,
208
+ state: 'stale',
209
+ updatedAt: now.toISOString(),
210
+ terminalReason: 'Project identity, configuration, or event head changed.',
211
+ },
212
+ localRoot: input.localRoot,
213
+ });
214
+ throw terminalSessionError({ ...parsed, state: 'stale' });
215
+ }
216
+ return parsed;
217
+ }
218
+ catch (error) {
219
+ if (error instanceof OperateError)
220
+ throw error;
221
+ throw new OperateError('E_OPERATE_SESSION_INVALID', 'Guided session is invalid or was tampered with.', { state: 'invalid', recoveryCommand: 'planr operate init --json' });
222
+ }
223
+ }
224
+ export async function updateGuidedSession(input) {
225
+ await atomicSessionWrite(input.projectRoot, input.session, input.localRoot);
226
+ }
227
+ export async function cancelGuidedSession(input) {
228
+ const target = sessionPath(input.projectRoot, input.sessionId, input.localRoot);
229
+ await Promise.all([
230
+ rm(target, { force: true }),
231
+ rm(sessionMacPath(input.projectRoot, input.sessionId, input.localRoot), { force: true }),
232
+ rm(path.join(path.dirname(target), `${input.sessionId}.replays`), { force: true }),
233
+ ]);
234
+ return { sessionId: input.sessionId, state: 'cancelled', removed: true };
235
+ }
236
+ export async function guidedSessionStatus(input) {
237
+ const directory = resolveOperatingPaths(input.projectRoot, {
238
+ localRoot: input.localRoot,
239
+ }).sessions;
240
+ const names = await readdir(directory).catch(() => []);
241
+ const now = (input.now ?? new Date()).getTime();
242
+ let active = 0;
243
+ let expired = 0;
244
+ for (const name of names.filter((entry) => entry.endsWith('.json'))) {
245
+ const record = await readFile(path.join(directory, name), 'utf8')
246
+ .then((raw) => JSON.parse(raw))
247
+ .catch(() => null);
248
+ if (record?.expiresAt && Date.parse(record.expiresAt) <= now)
249
+ expired += 1;
250
+ else
251
+ active += 1;
252
+ }
253
+ return { active, expired, files: active + expired };
254
+ }
255
+ export async function purgeGuidedSessions(input) {
256
+ const directory = resolveOperatingPaths(input.projectRoot, {
257
+ localRoot: input.localRoot,
258
+ }).sessions;
259
+ const names = await readdir(directory).catch(() => []);
260
+ await Promise.all(names
261
+ .filter((entry) => entry.startsWith('GIS-'))
262
+ .map((entry) => rm(path.join(directory, entry), { force: true })));
263
+ return {
264
+ removed: new Set(names
265
+ .filter((entry) => entry.startsWith('GIS-'))
266
+ .map((entry) => entry.replace(/\.json(?:\.mac)?$|\.replays$/, ''))).size,
267
+ };
268
+ }
269
+ export function guidedSessionState(session, state, now, values = {}) {
270
+ return { ...session, ...values, state, updatedAt: now.toISOString() };
271
+ }
272
+ //# sourceMappingURL=session-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-service.js","sourceRoot":"","sources":["../../../../src/services/operate/interaction/session-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { OperatingInitAnswers } from '../types.js';
2
+ import { type OperatingQuestionEngineContext } from './question-engine.js';
3
+ export declare function detectOperatingQuestionContext(projectRoot: string): Promise<OperatingQuestionEngineContext>;
4
+ export declare function renderOperatingInitQuestions(input: {
5
+ initialAnswers?: OperatingInitAnswers;
6
+ context: OperatingQuestionEngineContext;
7
+ }): Promise<OperatingInitAnswers>;
8
+ //# sourceMappingURL=terminal-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-renderer.d.ts","sourceRoot":"","sources":["../../../../src/services/operate/interaction/terminal-renderer.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAuC,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,EAGL,KAAK,8BAA8B,EACpC,MAAM,sBAAsB,CAAC;AAW9B,wBAAsB,8BAA8B,CAClD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,8BAA8B,CAAC,CAkBzC;AAmED,wBAAsB,4BAA4B,CAAC,KAAK,EAAE;IACxD,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,OAAO,EAAE,8BAA8B,CAAC;CACzC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAmBhC"}