@telora/daemon 0.17.8 → 0.17.15

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 (42) hide show
  1. package/build-info.json +5 -3
  2. package/dist/assembly-engine.d.ts +8 -0
  3. package/dist/assembly-engine.d.ts.map +1 -1
  4. package/dist/assembly-engine.js.map +1 -1
  5. package/dist/focus-engine.js +2 -2
  6. package/dist/focus-engine.js.map +1 -1
  7. package/dist/focus-executor.d.ts.map +1 -1
  8. package/dist/focus-executor.js +27 -0
  9. package/dist/focus-executor.js.map +1 -1
  10. package/dist/prd-controller.d.ts +37 -14
  11. package/dist/prd-controller.d.ts.map +1 -1
  12. package/dist/prd-controller.js +177 -66
  13. package/dist/prd-controller.js.map +1 -1
  14. package/dist/prd-focus-pushdown.d.ts +42 -0
  15. package/dist/prd-focus-pushdown.d.ts.map +1 -0
  16. package/dist/prd-focus-pushdown.js +47 -0
  17. package/dist/prd-focus-pushdown.js.map +1 -0
  18. package/dist/prd-frontier.d.ts +27 -0
  19. package/dist/prd-frontier.d.ts.map +1 -0
  20. package/dist/prd-frontier.js +46 -0
  21. package/dist/prd-frontier.js.map +1 -0
  22. package/dist/prd-steward.d.ts +94 -0
  23. package/dist/prd-steward.d.ts.map +1 -0
  24. package/dist/prd-steward.js +173 -0
  25. package/dist/prd-steward.js.map +1 -0
  26. package/dist/queries/prd.d.ts +48 -0
  27. package/dist/queries/prd.d.ts.map +1 -1
  28. package/dist/queries/prd.js +42 -0
  29. package/dist/queries/prd.js.map +1 -1
  30. package/dist/resolvers/index.d.ts +2 -0
  31. package/dist/resolvers/index.d.ts.map +1 -1
  32. package/dist/resolvers/index.js +2 -0
  33. package/dist/resolvers/index.js.map +1 -1
  34. package/dist/resolvers/prd-context.d.ts +30 -0
  35. package/dist/resolvers/prd-context.d.ts.map +1 -0
  36. package/dist/resolvers/prd-context.js +100 -0
  37. package/dist/resolvers/prd-context.js.map +1 -0
  38. package/dist/resolvers/prd-persona.d.ts +20 -0
  39. package/dist/resolvers/prd-persona.d.ts.map +1 -0
  40. package/dist/resolvers/prd-persona.js +45 -0
  41. package/dist/resolvers/prd-persona.js.map +1 -0
  42. package/package.json +2 -2
@@ -0,0 +1,94 @@
1
+ /**
2
+ * PRD steward -- the CORTEX of the reflex/cortex PRD control loop.
3
+ *
4
+ * The deterministic prd-controller is the REFLEX: it computes the frontier,
5
+ * clears obstacles, and arms foci. It is fast, safe, and mechanical, and stays
6
+ * exactly as-is. The steward is the CORTEX: a milestone-altitude differential
7
+ * receiver that, on divergence, reads the tree + prd.context + prd.persona,
8
+ * computes milestone variance, and makes the re-capture-or-escalate JUDGMENT
9
+ * the controller would otherwise hardcode in selectSurvivingPath.
10
+ *
11
+ * Like loop-engine, the steward is MONITORING-ONLY: it calls an LLM (no Claude
12
+ * coder process is spawned) and its ONLY outputs are a pathway re-commit, an
13
+ * escalation, or a hold. It NEVER takes over arming/clearance (the reflex), and
14
+ * it NEVER reverts merged work on an abandoned pathway or lowers the goal --
15
+ * when no pathway survives it hands control up to the human (escalate).
16
+ *
17
+ * Activated under PRD Play (prds.assigned_agent_role_id): a Played PRD runs its
18
+ * milestone with the steward as cortex and the controller as reflexes. With no
19
+ * steward wired (or the LLM unavailable), runStewardJudgment returns null and
20
+ * the controller falls back to the deterministic reflex unchanged.
21
+ */
22
+ import type { Prd, PrtNode, PrtEdge } from './queries/prd.js';
23
+ import type { DivergenceSignal, PathwayState } from './prd-divergence.js';
24
+ import type { DaemonConfig } from './types.js';
25
+ /** The judgment the steward returns to the controller. */
26
+ export interface StewardDecision {
27
+ /**
28
+ * recommit -> re-point the committed pathway to `pathwayId` (PLL re-capture).
29
+ * escalate -> hand control to the human (no surviving path / out of bounds).
30
+ * hold -> the milestone still tracks intent; take no action this tick.
31
+ */
32
+ action: 'recommit' | 'escalate' | 'hold';
33
+ /** The pathway to re-commit to (recommit only). */
34
+ pathwayId?: string | null;
35
+ /** The steward's reasoning -- surfaced on escalations / path switches. */
36
+ rationale: string;
37
+ }
38
+ export interface StewardJudgmentInput {
39
+ prd: Prd;
40
+ nodes: PrtNode[];
41
+ edges: PrtEdge[];
42
+ signals: DivergenceSignal[];
43
+ pathwayStates: PathwayState[];
44
+ /** Deterministic viability oracle (from the controller) the cortex is informed by. */
45
+ isPathwayViable: (pathwayId: string) => boolean;
46
+ }
47
+ export interface StewardDeps {
48
+ /** Resolve the PRD's milestone framing: prd.persona (system) + prd.context (user). */
49
+ resolveMilestoneFraming: (prd: Prd) => Promise<{
50
+ persona: string;
51
+ context: string;
52
+ }>;
53
+ /** Call the judgment LLM; raw text response, or null when unavailable. */
54
+ callLLM: (prompt: {
55
+ system: string;
56
+ user: string;
57
+ }) => Promise<string | null>;
58
+ }
59
+ /**
60
+ * Parse a StewardDecision out of the LLM's raw text. Lenient: extracts the
61
+ * first JSON object in the text (the model may wrap it in prose) and validates
62
+ * the action enum. Returns null when no valid decision can be parsed -- the
63
+ * caller treats null as "cortex unavailable" and falls back to the reflex.
64
+ */
65
+ export declare function parseStewardDecision(raw: string | null): StewardDecision | null;
66
+ /** Build the steward judgment prompt: persona framing (system) + the milestone
67
+ * state, divergence signals, and pathway options (user). */
68
+ export declare function buildStewardPrompt(framing: {
69
+ persona: string;
70
+ context: string;
71
+ }, input: StewardJudgmentInput): {
72
+ system: string;
73
+ user: string;
74
+ };
75
+ /**
76
+ * Run the steward's judgment for a diverged, committed PRD. Returns the decision
77
+ * the controller should enact, or null to fall back to the deterministic reflex.
78
+ *
79
+ * Safety rails enforced here (so the controller can trust the decision):
80
+ * - A `recommit` is honored ONLY if the target pathway exists, is not the
81
+ * already-committed path, and passes the deterministic viability oracle.
82
+ * An LLM that picks an unknown or non-viable pathway is converted to an
83
+ * `escalate` -- we never commit to a dead path or improvise the goal.
84
+ * - LLM/parse failure -> null (reflex fallback), never a silent bad action.
85
+ */
86
+ export declare function runStewardJudgment(input: StewardJudgmentInput, deps: StewardDeps): Promise<StewardDecision | null>;
87
+ /**
88
+ * Default steward deps wired to the live assembly engine + LLM client. The
89
+ * resolver registration and LLM client are dynamically imported so this heavy
90
+ * graph is only pulled in when the steward actually runs (a Played PRD that
91
+ * diverged) -- runStewardJudgment's pure core stays light for tests.
92
+ */
93
+ export declare function defaultStewardDeps(config: DaemonConfig): StewardDeps;
94
+ //# sourceMappingURL=prd-steward.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prd-steward.d.ts","sourceRoot":"","sources":["../src/prd-steward.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,0DAA0D;AAC1D,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;IACzC,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,sFAAsF;IACtF,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;CACjD;AAED,MAAM,WAAW,WAAW;IAC1B,sFAAsF;IACtF,uBAAuB,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrF,0EAA0E;IAC1E,OAAO,EAAE,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC/E;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,eAAe,GAAG,IAAI,CAsB/E;AAED;6DAC6D;AAC7D,wBAAgB,kBAAkB,CAChC,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAC7C,KAAK,EAAE,oBAAoB,GAC1B;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAkDlC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,oBAAoB,EAC3B,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CA8BjC;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,WAAW,CA0BpE"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * PRD steward -- the CORTEX of the reflex/cortex PRD control loop.
3
+ *
4
+ * The deterministic prd-controller is the REFLEX: it computes the frontier,
5
+ * clears obstacles, and arms foci. It is fast, safe, and mechanical, and stays
6
+ * exactly as-is. The steward is the CORTEX: a milestone-altitude differential
7
+ * receiver that, on divergence, reads the tree + prd.context + prd.persona,
8
+ * computes milestone variance, and makes the re-capture-or-escalate JUDGMENT
9
+ * the controller would otherwise hardcode in selectSurvivingPath.
10
+ *
11
+ * Like loop-engine, the steward is MONITORING-ONLY: it calls an LLM (no Claude
12
+ * coder process is spawned) and its ONLY outputs are a pathway re-commit, an
13
+ * escalation, or a hold. It NEVER takes over arming/clearance (the reflex), and
14
+ * it NEVER reverts merged work on an abandoned pathway or lowers the goal --
15
+ * when no pathway survives it hands control up to the human (escalate).
16
+ *
17
+ * Activated under PRD Play (prds.assigned_agent_role_id): a Played PRD runs its
18
+ * milestone with the steward as cortex and the controller as reflexes. With no
19
+ * steward wired (or the LLM unavailable), runStewardJudgment returns null and
20
+ * the controller falls back to the deterministic reflex unchanged.
21
+ */
22
+ /**
23
+ * Parse a StewardDecision out of the LLM's raw text. Lenient: extracts the
24
+ * first JSON object in the text (the model may wrap it in prose) and validates
25
+ * the action enum. Returns null when no valid decision can be parsed -- the
26
+ * caller treats null as "cortex unavailable" and falls back to the reflex.
27
+ */
28
+ export function parseStewardDecision(raw) {
29
+ if (!raw)
30
+ return null;
31
+ const start = raw.indexOf('{');
32
+ const end = raw.lastIndexOf('}');
33
+ if (start === -1 || end === -1 || end <= start)
34
+ return null;
35
+ let parsed;
36
+ try {
37
+ parsed = JSON.parse(raw.slice(start, end + 1));
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ if (!parsed || typeof parsed !== 'object')
43
+ return null;
44
+ const obj = parsed;
45
+ const action = obj.action;
46
+ if (action !== 'recommit' && action !== 'escalate' && action !== 'hold') {
47
+ return null;
48
+ }
49
+ return {
50
+ action,
51
+ pathwayId: typeof obj.pathwayId === 'string' ? obj.pathwayId : null,
52
+ rationale: typeof obj.rationale === 'string' ? obj.rationale : '',
53
+ };
54
+ }
55
+ /** Build the steward judgment prompt: persona framing (system) + the milestone
56
+ * state, divergence signals, and pathway options (user). */
57
+ export function buildStewardPrompt(framing, input) {
58
+ const { signals, pathwayStates, prd, isPathwayViable } = input;
59
+ const protocol = [
60
+ '',
61
+ '---',
62
+ '',
63
+ 'You are judging whether this milestone still tracks its committed intent after a divergence.',
64
+ 'Decide ONE action and return it as a single JSON object (no prose around it):',
65
+ ' {"action":"recommit","pathwayId":"<id>","rationale":"..."} -- re-acquire a viable surviving pathway',
66
+ ' {"action":"escalate","rationale":"..."} -- no pathway can still reach the goal; hand up',
67
+ ' {"action":"hold","rationale":"..."} -- the milestone still tracks; take no action',
68
+ '',
69
+ 'Rules (asymmetry -- non-negotiable):',
70
+ '- NEVER lower or redefine the goal to make the signal look better.',
71
+ '- NEVER revert work already merged on an abandoned pathway -- that reality is the new fact.',
72
+ '- Prefer re-acquiring a VIABLE surviving pathway over forcing the original.',
73
+ '- Only recommit to a pathway listed as viable below. If none is viable, escalate.',
74
+ ].join('\n');
75
+ const system = `${framing.persona}${protocol}`;
76
+ const signalLines = signals.length
77
+ ? signals.map((s) => `- [${s.form}] node ${s.nodeId}: ${s.detail}`).join('\n')
78
+ : '- (none)';
79
+ const pathwayLines = pathwayStates.length
80
+ ? pathwayStates
81
+ .map((p) => `- ${p.id} (status: ${p.status}${p.id === prd.committedPathId ? ', COMMITTED' : ''}) -- ` +
82
+ `${isPathwayViable(p.id) ? 'viable' : 'NOT viable'}`)
83
+ .join('\n')
84
+ : '- (none held)';
85
+ const user = [
86
+ framing.context || '## PRD Milestone Context\n\n(context unavailable)',
87
+ '',
88
+ '## Divergence Signals',
89
+ '',
90
+ signalLines,
91
+ '',
92
+ '## Pathways',
93
+ '',
94
+ pathwayLines,
95
+ '',
96
+ `Committed pathway: ${prd.committedPathId ?? '(none)'}`,
97
+ ].join('\n');
98
+ return { system, user };
99
+ }
100
+ /**
101
+ * Run the steward's judgment for a diverged, committed PRD. Returns the decision
102
+ * the controller should enact, or null to fall back to the deterministic reflex.
103
+ *
104
+ * Safety rails enforced here (so the controller can trust the decision):
105
+ * - A `recommit` is honored ONLY if the target pathway exists, is not the
106
+ * already-committed path, and passes the deterministic viability oracle.
107
+ * An LLM that picks an unknown or non-viable pathway is converted to an
108
+ * `escalate` -- we never commit to a dead path or improvise the goal.
109
+ * - LLM/parse failure -> null (reflex fallback), never a silent bad action.
110
+ */
111
+ export async function runStewardJudgment(input, deps) {
112
+ let framing;
113
+ try {
114
+ framing = await deps.resolveMilestoneFraming(input.prd);
115
+ }
116
+ catch {
117
+ return null;
118
+ }
119
+ const prompt = buildStewardPrompt(framing, input);
120
+ const raw = await deps.callLLM(prompt);
121
+ const decision = parseStewardDecision(raw);
122
+ if (!decision)
123
+ return null;
124
+ if (decision.action === 'recommit') {
125
+ const target = decision.pathwayId;
126
+ const known = target ? input.pathwayStates.some((p) => p.id === target) : false;
127
+ const isCurrent = target === input.prd.committedPathId;
128
+ if (!target || !known || isCurrent || !input.isPathwayViable(target)) {
129
+ // The cortex chose an unknown / current / non-viable path. Asymmetry:
130
+ // never commit to a dead path -- hand control up instead.
131
+ return {
132
+ action: 'escalate',
133
+ rationale: `Steward proposed recommit to ${target ?? '(none)'} which is not a viable surviving pathway; ` +
134
+ `escalating rather than committing to a dead path. ${decision.rationale}`.trim(),
135
+ };
136
+ }
137
+ }
138
+ return decision;
139
+ }
140
+ /**
141
+ * Default steward deps wired to the live assembly engine + LLM client. The
142
+ * resolver registration and LLM client are dynamically imported so this heavy
143
+ * graph is only pulled in when the steward actually runs (a Played PRD that
144
+ * diverged) -- runStewardJudgment's pure core stays light for tests.
145
+ */
146
+ export function defaultStewardDeps(config) {
147
+ return {
148
+ resolveMilestoneFraming: async (prd) => {
149
+ // Register resolvers (side effect) then resolve persona + context.
150
+ await import('./assembly-resolvers.js');
151
+ const { resolveAssemblyRecipe } = await import('./assembly-engine.js');
152
+ const ctx = {
153
+ focusId: '',
154
+ deliveryIds: [],
155
+ worktreePath: null,
156
+ config,
157
+ organizationId: config.organizationId,
158
+ productId: prd.productId,
159
+ prdId: prd.id,
160
+ };
161
+ const [persona, context] = await Promise.all([
162
+ resolveAssemblyRecipe(['prd.persona'], ctx),
163
+ resolveAssemblyRecipe(['prd.context'], ctx),
164
+ ]);
165
+ return { persona, context };
166
+ },
167
+ callLLM: async (prompt) => {
168
+ const { callLoopLLM } = await import('./loop-llm-client.js');
169
+ return callLoopLLM(config.organizationId, prompt, null, 'prd_steward');
170
+ },
171
+ };
172
+ }
173
+ //# sourceMappingURL=prd-steward.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prd-steward.js","sourceRoot":"","sources":["../src/prd-steward.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,8 @@ export interface PrtNode {
18
18
  status: 'open' | 'cleared';
19
19
  clearancePredicate: ClearancePredicate | null;
20
20
  focusId: string | null;
21
+ /** The node assertion text (goal/obstacle/overcome statement). May be ''. */
22
+ statement: string;
21
23
  }
22
24
  export interface PrtEdge {
23
25
  id: string;
@@ -32,6 +34,13 @@ export interface Prd {
32
34
  title: string;
33
35
  /** The pathway currently committed (locked) for this PRD, or null if none. */
34
36
  committedPathId: string | null;
37
+ /**
38
+ * The PRD "Play": the agent role the controller arms frontier foci with, or
39
+ * null if the PRD is paused (mirrors product_focuses.assigned_agent_role_id).
40
+ * Set = run all frontier foci; null = no foci arm. This is the per-entity
41
+ * signal that replaced the global TELORA_PRD_ARM_ROLE_ID env var.
42
+ */
43
+ assignedAgentRoleId: string | null;
35
44
  }
36
45
  /** A held alternative pathway under a PRD (option / committed / abandoned). */
37
46
  export interface Pathway {
@@ -76,4 +85,43 @@ export declare function loadPathways(prdId: string): Promise<Pathway[]>;
76
85
  * NO revert: this never undoes work already done on a prior pathway.
77
86
  */
78
87
  export declare function commitPathway(prdId: string, pathwayId: string): Promise<void>;
88
+ /**
89
+ * Resolve the PRD a focus belongs to, if any. A focus materialized from a PRD
90
+ * overcome node carries back-reference data the controller exposes via
91
+ * prd_context_for_focus (items: { focusId, prd: { id, title }, overcome }).
92
+ * Returns the parent PRD id, or null when the focus was not materialized by a
93
+ * PRD (an ordinary focus). Used to decide whether to push milestone context
94
+ * into a spawned focus team.
95
+ */
96
+ export declare function findPrdIdForFocus(focusId: string): Promise<string | null>;
97
+ /**
98
+ * The milestone-context view of a PRD: the narrow controller-facing `Prd`
99
+ * fields PLUS the rich milestone-intent fields (goal / expansion / vision
100
+ * snapshot) that the prd.context assembly resolver renders into a focus/steward
101
+ * prompt. Kept separate from `Prd` so the hot controller path stays lean.
102
+ */
103
+ export interface PrdDetail {
104
+ id: string;
105
+ productId: string;
106
+ status: string;
107
+ title: string;
108
+ goal: string | null;
109
+ expansion: string | null;
110
+ visionSnapshot: string | null;
111
+ committedPathId: string | null;
112
+ assignedAgentRoleId: string | null;
113
+ }
114
+ /**
115
+ * Load a PRD's full milestone-context bundle: the rich PRD fields plus its PRT
116
+ * nodes, edges, and pathways, in one prd_get call. Feeds the prd.context
117
+ * resolver (milestone facts + frontier state). prd_get returns
118
+ * { prd: { ...prd, nodes, edges, pathways } } -- transformPrd already camelCases
119
+ * goal/expansion/visionSnapshot, so we re-shape into the narrow detail type.
120
+ */
121
+ export declare function loadPrdDetail(prdId: string): Promise<{
122
+ prd: PrdDetail;
123
+ nodes: PrtNode[];
124
+ edges: PrtEdge[];
125
+ pathways: Pathway[];
126
+ }>;
79
127
  //# sourceMappingURL=prd.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prd.d.ts","sourceRoot":"","sources":["../../src/queries/prd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAErE,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC3C,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC9C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,cAAc,GAAG,WAAW,CAAC;CACxC;AAED,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,+EAA+E;AAC/E,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;IAC7C,IAAI,EAAE,MAAM,CAAC;CACd;AA0ED,mEAAmE;AACnE,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAMtE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAAC,KAAK,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,CAUjD;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAStF;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKlF;AAED,qEAAqE;AACrE,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE;AAED,mDAAmD;AACnD,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9D;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAKpE;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnF"}
1
+ {"version":3,"file":"prd.d.ts","sourceRoot":"","sources":["../../src/queries/prd.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,7 @@ function mapPrd(row) {
18
18
  status: row.status,
19
19
  title: row.title,
20
20
  committedPathId: row.committedPathId ?? null,
21
+ assignedAgentRoleId: row.assignedAgentRoleId ?? null,
21
22
  };
22
23
  }
23
24
  function mapPathway(row) {
@@ -36,6 +37,7 @@ function mapNode(row) {
36
37
  status: row.status,
37
38
  clearancePredicate: row.clearancePredicate ?? null,
38
39
  focusId: row.focusId ?? null,
40
+ statement: row.statement ?? '',
39
41
  };
40
42
  }
41
43
  function mapEdge(row) {
@@ -113,4 +115,44 @@ export async function loadPathways(prdId) {
113
115
  export async function commitPathway(prdId, pathwayId) {
114
116
  await callApi('prd_pathway_commit', { prdId, pathwayId });
115
117
  }
118
+ /**
119
+ * Resolve the PRD a focus belongs to, if any. A focus materialized from a PRD
120
+ * overcome node carries back-reference data the controller exposes via
121
+ * prd_context_for_focus (items: { focusId, prd: { id, title }, overcome }).
122
+ * Returns the parent PRD id, or null when the focus was not materialized by a
123
+ * PRD (an ordinary focus). Used to decide whether to push milestone context
124
+ * into a spawned focus team.
125
+ */
126
+ export async function findPrdIdForFocus(focusId) {
127
+ const body = await callApi('prd_context_for_focus', { focusIds: [focusId] });
128
+ const match = (body.items ?? []).find((i) => i.focusId === focusId && i.prd?.id);
129
+ return match?.prd?.id ?? null;
130
+ }
131
+ /**
132
+ * Load a PRD's full milestone-context bundle: the rich PRD fields plus its PRT
133
+ * nodes, edges, and pathways, in one prd_get call. Feeds the prd.context
134
+ * resolver (milestone facts + frontier state). prd_get returns
135
+ * { prd: { ...prd, nodes, edges, pathways } } -- transformPrd already camelCases
136
+ * goal/expansion/visionSnapshot, so we re-shape into the narrow detail type.
137
+ */
138
+ export async function loadPrdDetail(prdId) {
139
+ const body = await callApi('prd_get', { prdId });
140
+ const row = body.prd;
141
+ return {
142
+ prd: {
143
+ id: row.id,
144
+ productId: row.productId,
145
+ status: row.status,
146
+ title: row.title,
147
+ goal: row.goal ?? null,
148
+ expansion: row.expansion ?? null,
149
+ visionSnapshot: row.visionSnapshot ?? null,
150
+ committedPathId: row.committedPathId ?? null,
151
+ assignedAgentRoleId: row.assignedAgentRoleId ?? null,
152
+ },
153
+ nodes: (row.nodes ?? []).map(mapNode),
154
+ edges: (row.edges ?? []).map(mapEdge),
155
+ pathways: (row.pathways ?? []).map(mapPathway),
156
+ };
157
+ }
116
158
  //# sourceMappingURL=prd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prd.js","sourceRoot":"","sources":["../../src/queries/prd.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prd.js","sourceRoot":"","sources":["../../src/queries/prd.ts"],"names":[],"mappings":"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"}
@@ -44,6 +44,8 @@ import './retired-injections.js';
44
44
  import './agent-session-summaries.js';
45
45
  import './agent-escalations.js';
46
46
  import './reality-tree-snapshot.js';
47
+ import './prd-persona.js';
48
+ import './prd-context.js';
47
49
  export { MAX_DIFF_BYTES, getGitDiff } from './shared/git-diff.js';
48
50
  export { CRT_DUMP_BUDGET_CHARS, renderRealityTreeDump, FOCUS_REALITY_TREE_EMPTY_STATE, } from './shared/reality-tree.js';
49
51
  export type { RealityTreeRow, RealityTreeListResponse, RealityNodeRow, RealityEdgeRow, NodeListResponse, EdgeListResponse, } from './shared/reality-tree.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,mCAAmC,CAAC;AAC3C,OAAO,2BAA2B,CAAC;AACnC,OAAO,sBAAsB,CAAC;AAC9B,OAAO,oBAAoB,CAAC;AAC5B,OAAO,+BAA+B,CAAC;AACvC,OAAO,wBAAwB,CAAC;AAChC,OAAO,kBAAkB,CAAC;AAC1B,OAAO,iBAAiB,CAAC;AACzB,OAAO,4BAA4B,CAAC;AACpC,OAAO,gCAAgC,CAAC;AACxC,OAAO,sBAAsB,CAAC;AAC9B,OAAO,yBAAyB,CAAC;AACjC,OAAO,uBAAuB,CAAC;AAC/B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,sBAAsB,CAAC;AAC9B,OAAO,iCAAiC,CAAC;AACzC,OAAO,sBAAsB,CAAC;AAC9B,OAAO,0BAA0B,CAAC;AAClC,OAAO,qBAAqB,CAAC;AAC7B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,4BAA4B,CAAC;AACpC,OAAO,yBAAyB,CAAC;AACjC,OAAO,qBAAqB,CAAC;AAC7B,OAAO,yBAAyB,CAAC;AACjC,OAAO,4BAA4B,CAAC;AACpC,OAAO,yBAAyB,CAAC;AACjC,OAAO,0BAA0B,CAAC;AAClC,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AACtC,OAAO,wBAAwB,CAAC;AAChC,OAAO,4BAA4B,CAAC;AAGpC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,8BAA8B,GAC/B,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,cAAc,EACd,uBAAuB,EACvB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,mCAAmC,CAAC;AAC3C,OAAO,2BAA2B,CAAC;AACnC,OAAO,sBAAsB,CAAC;AAC9B,OAAO,oBAAoB,CAAC;AAC5B,OAAO,+BAA+B,CAAC;AACvC,OAAO,wBAAwB,CAAC;AAChC,OAAO,kBAAkB,CAAC;AAC1B,OAAO,iBAAiB,CAAC;AACzB,OAAO,4BAA4B,CAAC;AACpC,OAAO,gCAAgC,CAAC;AACxC,OAAO,sBAAsB,CAAC;AAC9B,OAAO,yBAAyB,CAAC;AACjC,OAAO,uBAAuB,CAAC;AAC/B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,sBAAsB,CAAC;AAC9B,OAAO,iCAAiC,CAAC;AACzC,OAAO,sBAAsB,CAAC;AAC9B,OAAO,0BAA0B,CAAC;AAClC,OAAO,qBAAqB,CAAC;AAC7B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,4BAA4B,CAAC;AACpC,OAAO,yBAAyB,CAAC;AACjC,OAAO,qBAAqB,CAAC;AAC7B,OAAO,yBAAyB,CAAC;AACjC,OAAO,4BAA4B,CAAC;AACpC,OAAO,yBAAyB,CAAC;AACjC,OAAO,0BAA0B,CAAC;AAClC,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AACtC,OAAO,wBAAwB,CAAC;AAChC,OAAO,4BAA4B,CAAC;AACpC,OAAO,kBAAkB,CAAC;AAC1B,OAAO,kBAAkB,CAAC;AAG1B,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,8BAA8B,GAC/B,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,cAAc,EACd,uBAAuB,EACvB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC"}
@@ -45,6 +45,8 @@ import './retired-injections.js';
45
45
  import './agent-session-summaries.js';
46
46
  import './agent-escalations.js';
47
47
  import './reality-tree-snapshot.js';
48
+ import './prd-persona.js';
49
+ import './prd-context.js';
48
50
  // ── Shared public surface (re-exports for external consumers) ─────────
49
51
  export { MAX_DIFF_BYTES, getGitDiff } from './shared/git-diff.js';
50
52
  export { CRT_DUMP_BUDGET_CHARS, renderRealityTreeDump, FOCUS_REALITY_TREE_EMPTY_STATE, } from './shared/reality-tree.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,wEAAwE;AACxE,OAAO,mCAAmC,CAAC;AAC3C,OAAO,2BAA2B,CAAC;AACnC,OAAO,sBAAsB,CAAC;AAC9B,OAAO,oBAAoB,CAAC;AAC5B,OAAO,+BAA+B,CAAC;AACvC,OAAO,wBAAwB,CAAC;AAChC,OAAO,kBAAkB,CAAC;AAC1B,OAAO,iBAAiB,CAAC;AACzB,OAAO,4BAA4B,CAAC;AACpC,OAAO,gCAAgC,CAAC;AACxC,OAAO,sBAAsB,CAAC;AAC9B,OAAO,yBAAyB,CAAC;AACjC,OAAO,uBAAuB,CAAC;AAC/B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,sBAAsB,CAAC;AAC9B,OAAO,iCAAiC,CAAC;AACzC,OAAO,sBAAsB,CAAC;AAC9B,OAAO,0BAA0B,CAAC;AAClC,OAAO,qBAAqB,CAAC;AAC7B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,4BAA4B,CAAC;AACpC,OAAO,yBAAyB,CAAC;AACjC,OAAO,qBAAqB,CAAC;AAC7B,OAAO,yBAAyB,CAAC;AACjC,OAAO,4BAA4B,CAAC;AACpC,OAAO,yBAAyB,CAAC;AACjC,OAAO,0BAA0B,CAAC;AAClC,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AACtC,OAAO,wBAAwB,CAAC;AAChC,OAAO,4BAA4B,CAAC;AAEpC,yEAAyE;AACzE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,8BAA8B,GAC/B,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,wEAAwE;AACxE,OAAO,mCAAmC,CAAC;AAC3C,OAAO,2BAA2B,CAAC;AACnC,OAAO,sBAAsB,CAAC;AAC9B,OAAO,oBAAoB,CAAC;AAC5B,OAAO,+BAA+B,CAAC;AACvC,OAAO,wBAAwB,CAAC;AAChC,OAAO,kBAAkB,CAAC;AAC1B,OAAO,iBAAiB,CAAC;AACzB,OAAO,4BAA4B,CAAC;AACpC,OAAO,gCAAgC,CAAC;AACxC,OAAO,sBAAsB,CAAC;AAC9B,OAAO,yBAAyB,CAAC;AACjC,OAAO,uBAAuB,CAAC;AAC/B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,sBAAsB,CAAC;AAC9B,OAAO,iCAAiC,CAAC;AACzC,OAAO,sBAAsB,CAAC;AAC9B,OAAO,0BAA0B,CAAC;AAClC,OAAO,qBAAqB,CAAC;AAC7B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,4BAA4B,CAAC;AACpC,OAAO,yBAAyB,CAAC;AACjC,OAAO,qBAAqB,CAAC;AAC7B,OAAO,yBAAyB,CAAC;AACjC,OAAO,4BAA4B,CAAC;AACpC,OAAO,yBAAyB,CAAC;AACjC,OAAO,0BAA0B,CAAC;AAClC,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AACtC,OAAO,wBAAwB,CAAC;AAChC,OAAO,4BAA4B,CAAC;AACpC,OAAO,kBAAkB,CAAC;AAC1B,OAAO,kBAAkB,CAAC;AAE1B,yEAAyE;AACzE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,8BAA8B,GAC/B,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { type PrdDetail, type PrtNode, type PrtEdge, type Pathway } from '../queries/prd.js';
2
+ /**
3
+ * prd.context
4
+ *
5
+ * The milestone facts an entity under a PRD needs: the goal + AI expansion +
6
+ * vision snapshot, plus the LIVE frontier state (cleared obstacles, the overcome
7
+ * currently arming, the committed pathway position). Pushed down to every armed
8
+ * focus team (so each focus inherits coherent milestone intent instead of
9
+ * rediscovering it from its own deliveries) and read by the PRD steward.
10
+ *
11
+ * The PRD is identified by params.prdId or context.prdId; with neither, this is
12
+ * a no-op (empty string) so the resolver is safe in any non-PRD assembly.
13
+ *
14
+ * Token-budgeted like the other large resolvers: the expansion (which can be
15
+ * very large) and vision snapshot are truncated to fit the section budget.
16
+ */
17
+ /** Per-section budget, matching the wiki/diff resolver budgets (~10k chars). */
18
+ export declare const PRD_CONTEXT_BUDGET_CHARS = 10000;
19
+ /**
20
+ * Render the milestone context markdown from already-loaded PRD detail + tree.
21
+ * Pure: no I/O, so the frontier computation and budgeting are unit-testable
22
+ * directly with injected fixtures.
23
+ */
24
+ export declare function renderPrdMilestoneContext(input: {
25
+ prd: PrdDetail;
26
+ nodes: PrtNode[];
27
+ edges: PrtEdge[];
28
+ pathways: Pathway[];
29
+ }): string;
30
+ //# sourceMappingURL=prd-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prd-context.d.ts","sourceRoot":"","sources":["../../src/resolvers/prd-context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,SAAS,EAAE,KAAK,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG5G;;;;;;;;;;;;;;GAcG;AAEH,gFAAgF;AAChF,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAW/C;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,GAAG,EAAE,SAAS,CAAC;IACf,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,GAAG,MAAM,CAuET"}
@@ -0,0 +1,100 @@
1
+ import { registerSourceResolver } from '../assembly-engine.js';
2
+ import { loadPrdDetail } from '../queries/prd.js';
3
+ import { computePrtFrontier } from '../prd-frontier.js';
4
+ /**
5
+ * prd.context
6
+ *
7
+ * The milestone facts an entity under a PRD needs: the goal + AI expansion +
8
+ * vision snapshot, plus the LIVE frontier state (cleared obstacles, the overcome
9
+ * currently arming, the committed pathway position). Pushed down to every armed
10
+ * focus team (so each focus inherits coherent milestone intent instead of
11
+ * rediscovering it from its own deliveries) and read by the PRD steward.
12
+ *
13
+ * The PRD is identified by params.prdId or context.prdId; with neither, this is
14
+ * a no-op (empty string) so the resolver is safe in any non-PRD assembly.
15
+ *
16
+ * Token-budgeted like the other large resolvers: the expansion (which can be
17
+ * very large) and vision snapshot are truncated to fit the section budget.
18
+ */
19
+ /** Per-section budget, matching the wiki/diff resolver budgets (~10k chars). */
20
+ export const PRD_CONTEXT_BUDGET_CHARS = 10_000;
21
+ const GOAL_BUDGET_CHARS = 2_000;
22
+ const VISION_BUDGET_CHARS = 2_000;
23
+ const EXPANSION_BUDGET_CHARS = 5_000;
24
+ function truncate(text, max) {
25
+ const t = text.trim();
26
+ if (t.length <= max)
27
+ return t;
28
+ return `${t.slice(0, max).trimEnd()}\n...[truncated]`;
29
+ }
30
+ /**
31
+ * Render the milestone context markdown from already-loaded PRD detail + tree.
32
+ * Pure: no I/O, so the frontier computation and budgeting are unit-testable
33
+ * directly with injected fixtures.
34
+ */
35
+ export function renderPrdMilestoneContext(input) {
36
+ const { prd, nodes, edges, pathways } = input;
37
+ const parts = [];
38
+ parts.push(`## PRD Milestone Context`);
39
+ parts.push(`**Milestone:** ${prd.title || '(untitled)'} (status: ${prd.status})`);
40
+ if (prd.goal && prd.goal.trim()) {
41
+ parts.push(`### Goal\n\n${truncate(prd.goal, GOAL_BUDGET_CHARS)}`);
42
+ }
43
+ if (prd.visionSnapshot && prd.visionSnapshot.trim()) {
44
+ parts.push(`### Vision\n\n${truncate(prd.visionSnapshot, VISION_BUDGET_CHARS)}`);
45
+ }
46
+ if (prd.expansion && prd.expansion.trim()) {
47
+ parts.push(`### Expansion (the realized product)\n\n${truncate(prd.expansion, EXPANSION_BUDGET_CHARS)}`);
48
+ }
49
+ // --- Frontier state -------------------------------------------------------
50
+ // Cleared node ids come straight off the persisted node status (the controller
51
+ // marks obstacles/overcomes cleared as the milestone advances); the frontier
52
+ // (overcomes ready to arm/materialize) is computed from that exactly as the
53
+ // controller does, so the prompt shows the same frontier the controller acts on.
54
+ const clearedNodeIds = new Set(nodes.filter((n) => n.status === 'cleared').map((n) => n.id));
55
+ const { needsMaterialize, needsArm } = computePrtFrontier(nodes, edges, clearedNodeIds);
56
+ const frontierLines = [];
57
+ const clearedObstacles = nodes.filter((n) => n.nodeType === 'obstacle' && clearedNodeIds.has(n.id));
58
+ const openObstacles = nodes.filter((n) => n.nodeType === 'obstacle' && !clearedNodeIds.has(n.id));
59
+ frontierLines.push(`- Obstacles: ${clearedObstacles.length} cleared, ${openObstacles.length} open`);
60
+ if (clearedObstacles.length > 0) {
61
+ frontierLines.push(`- Cleared:\n${clearedObstacles.map((n) => ` - ${n.statement || n.id}`).join('\n')}`);
62
+ }
63
+ const armingOvercomes = [...needsArm, ...needsMaterialize];
64
+ if (armingOvercomes.length > 0) {
65
+ frontierLines.push(`- Arming overcome(s) (the live frontier):\n${armingOvercomes
66
+ .map((n) => ` - ${n.statement || n.id}`)
67
+ .join('\n')}`);
68
+ }
69
+ else {
70
+ frontierLines.push(`- Arming overcome(s): none ready (frontier blocked or milestone complete)`);
71
+ }
72
+ const committed = pathways.find((p) => p.id === prd.committedPathId) ??
73
+ pathways.find((p) => p.status === 'committed') ??
74
+ null;
75
+ if (committed) {
76
+ frontierLines.push(`- Committed pathway: ${committed.name}`);
77
+ }
78
+ else if (pathways.length > 0) {
79
+ frontierLines.push(`- Committed pathway: none committed (${pathways.length} option(s) held)`);
80
+ }
81
+ parts.push(`### Frontier\n\n${frontierLines.join('\n')}`);
82
+ const composed = parts.join('\n\n');
83
+ return composed.length > PRD_CONTEXT_BUDGET_CHARS
84
+ ? `${composed.slice(0, PRD_CONTEXT_BUDGET_CHARS).trimEnd()}\n...[truncated]`
85
+ : composed;
86
+ }
87
+ registerSourceResolver('prd.context', async (context, params) => {
88
+ const prdId = params.prdId || context.prdId;
89
+ if (!prdId)
90
+ return '';
91
+ try {
92
+ const { prd, nodes, edges, pathways } = await loadPrdDetail(prdId);
93
+ return renderPrdMilestoneContext({ prd, nodes, edges, pathways });
94
+ }
95
+ catch (err) {
96
+ console.warn(`[assembly-engine] prd.context: failed: ${err.message}`);
97
+ return '';
98
+ }
99
+ });
100
+ //# sourceMappingURL=prd-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prd-context.js","sourceRoot":"","sources":["../../src/resolvers/prd-context.ts"],"names":[],"mappings":"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"}