@principles/core 1.287.6 → 1.287.8

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 (70) hide show
  1. package/dist/principle-tree-ledger.d.ts +50 -0
  2. package/dist/principle-tree-ledger.d.ts.map +1 -1
  3. package/dist/principle-tree-ledger.js +133 -1
  4. package/dist/principle-tree-ledger.js.map +1 -1
  5. package/dist/runtime-v2/adapter/principle-tree-ledger-adapter.d.ts +24 -0
  6. package/dist/runtime-v2/adapter/principle-tree-ledger-adapter.d.ts.map +1 -1
  7. package/dist/runtime-v2/adapter/principle-tree-ledger-adapter.js +36 -1
  8. package/dist/runtime-v2/adapter/principle-tree-ledger-adapter.js.map +1 -1
  9. package/dist/runtime-v2/candidate-intake-service.d.ts +102 -3
  10. package/dist/runtime-v2/candidate-intake-service.d.ts.map +1 -1
  11. package/dist/runtime-v2/candidate-intake-service.js +280 -47
  12. package/dist/runtime-v2/candidate-intake-service.js.map +1 -1
  13. package/dist/runtime-v2/candidate-intake.d.ts +44 -0
  14. package/dist/runtime-v2/candidate-intake.d.ts.map +1 -1
  15. package/dist/runtime-v2/candidate-intake.js +7 -0
  16. package/dist/runtime-v2/candidate-intake.js.map +1 -1
  17. package/dist/runtime-v2/index.d.ts +14 -2
  18. package/dist/runtime-v2/index.d.ts.map +1 -1
  19. package/dist/runtime-v2/index.js +15 -2
  20. package/dist/runtime-v2/index.js.map +1 -1
  21. package/dist/runtime-v2/pain-signal-bridge.d.ts +26 -11
  22. package/dist/runtime-v2/pain-signal-bridge.d.ts.map +1 -1
  23. package/dist/runtime-v2/pain-signal-bridge.js +73 -53
  24. package/dist/runtime-v2/pain-signal-bridge.js.map +1 -1
  25. package/dist/runtime-v2/pain-signal-runtime-factory.d.ts +9 -0
  26. package/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
  27. package/dist/runtime-v2/pain-signal-runtime-factory.js +17 -8
  28. package/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
  29. package/dist/runtime-v2/principle-reuse/reuse-domain.d.ts +89 -0
  30. package/dist/runtime-v2/principle-reuse/reuse-domain.d.ts.map +1 -0
  31. package/dist/runtime-v2/principle-reuse/reuse-domain.js +16 -0
  32. package/dist/runtime-v2/principle-reuse/reuse-domain.js.map +1 -0
  33. package/dist/runtime-v2/principle-reuse/reuse-proposal.d.ts +87 -0
  34. package/dist/runtime-v2/principle-reuse/reuse-proposal.d.ts.map +1 -0
  35. package/dist/runtime-v2/principle-reuse/reuse-proposal.js +99 -0
  36. package/dist/runtime-v2/principle-reuse/reuse-proposal.js.map +1 -0
  37. package/dist/runtime-v2/principle-reuse/reuse-retrieval.d.ts +36 -0
  38. package/dist/runtime-v2/principle-reuse/reuse-retrieval.d.ts.map +1 -0
  39. package/dist/runtime-v2/principle-reuse/reuse-retrieval.js +118 -0
  40. package/dist/runtime-v2/principle-reuse/reuse-retrieval.js.map +1 -0
  41. package/dist/runtime-v2/principle-reuse/reuse-shortlist.d.ts +40 -0
  42. package/dist/runtime-v2/principle-reuse/reuse-shortlist.d.ts.map +1 -0
  43. package/dist/runtime-v2/principle-reuse/reuse-shortlist.js +184 -0
  44. package/dist/runtime-v2/principle-reuse/reuse-shortlist.js.map +1 -0
  45. package/dist/runtime-v2/recovery-sweep-service.d.ts +13 -0
  46. package/dist/runtime-v2/recovery-sweep-service.d.ts.map +1 -1
  47. package/dist/runtime-v2/recovery-sweep-service.js +43 -29
  48. package/dist/runtime-v2/recovery-sweep-service.js.map +1 -1
  49. package/dist/runtime-v2/store/pain-diagnosis/pain-diagnosis-store.d.ts +7 -0
  50. package/dist/runtime-v2/store/pain-diagnosis/pain-diagnosis-store.d.ts.map +1 -1
  51. package/dist/runtime-v2/store/pain-diagnosis/pain-diagnosis-store.js.map +1 -1
  52. package/dist/runtime-v2/store/pain-diagnosis/sqlite-pain-diagnosis-store.d.ts +1 -0
  53. package/dist/runtime-v2/store/pain-diagnosis/sqlite-pain-diagnosis-store.d.ts.map +1 -1
  54. package/dist/runtime-v2/store/pain-diagnosis/sqlite-pain-diagnosis-store.js +12 -0
  55. package/dist/runtime-v2/store/pain-diagnosis/sqlite-pain-diagnosis-store.js.map +1 -1
  56. package/dist/runtime-v2/store/runtime-state-manager.d.ts +5 -0
  57. package/dist/runtime-v2/store/runtime-state-manager.d.ts.map +1 -1
  58. package/dist/runtime-v2/store/runtime-state-manager.js +8 -0
  59. package/dist/runtime-v2/store/runtime-state-manager.js.map +1 -1
  60. package/dist/runtime-v2/types/principle-schema.d.ts +65 -0
  61. package/dist/runtime-v2/types/principle-schema.d.ts.map +1 -1
  62. package/dist/runtime-v2/types/principle-schema.js +14 -0
  63. package/dist/runtime-v2/types/principle-schema.js.map +1 -1
  64. package/dist/runtime-v2/types/principle-tree-store.d.ts +12 -0
  65. package/dist/runtime-v2/types/principle-tree-store.d.ts.map +1 -1
  66. package/dist/telemetry-event.d.ts +2 -2
  67. package/dist/telemetry-event.d.ts.map +1 -1
  68. package/dist/telemetry-event.js +2 -0
  69. package/dist/telemetry-event.js.map +1 -1
  70. package/package.json +2 -2
@@ -0,0 +1,118 @@
1
+ /**
2
+ * PRI-917 Slice 1 — read-only reuse retrieval over the existing Principle
3
+ * Ledger.
4
+ *
5
+ * Reuses `loadLedger` (the single ledger authority) and the existing
6
+ * principle-kind guard. Creates no repository, no database, no index, no
7
+ * vector store, and no embedding service. It never writes: `derivedFromPainIds`,
8
+ * the ledger schema, and `activation_decisions` are all untouched.
9
+ *
10
+ * @see docs/specs/PRI-917-reuse-before-create-v0.1.md (SPEC v0.2)
11
+ */
12
+ import { existsSync, readFileSync } from 'fs';
13
+ import { getLedgerFilePathPublic, loadLedger } from '../../principle-tree-ledger.js';
14
+ import { isPrincipleLedgerEligibleKind } from '../store/candidate/recommendation-kind-resolver.js';
15
+ import { PRINCIPLE_STATUSES } from '../types/principle-enums.js';
16
+ import { isRecord } from '../candidate-intake.js';
17
+ import { selectReuseShortlist } from './reuse-shortlist.js';
18
+ /**
19
+ * Statuses a Principle may be reused into (SPEC §15).
20
+ *
21
+ * `active` and `candidate`/`probation` are included because that is where real
22
+ * reusable knowledge lives — excluding `candidate` would leave almost nothing,
23
+ * as the live ledger is overwhelmingly `candidate`. `archived` and `deprecated`
24
+ * are excluded: reusing into a retired Principle would revive withdrawn
25
+ * knowledge. Any unrecognised status is excluded fail-closed.
26
+ */
27
+ export const REUSABLE_PRINCIPLE_STATUSES = new Set([
28
+ 'active',
29
+ 'candidate',
30
+ 'probation',
31
+ ]);
32
+ export function isReusablePrincipleStatus(status) {
33
+ if (typeof status !== 'string')
34
+ return false;
35
+ // Fail closed on a status outside the known enum: an unrecognised value is
36
+ // treated as not reusable rather than optimistically reusable.
37
+ if (!PRINCIPLE_STATUSES.includes(status))
38
+ return false;
39
+ return REUSABLE_PRINCIPLE_STATUSES.has(status);
40
+ }
41
+ function assertLedgerReadable(stateDir) {
42
+ const filePath = getLedgerFilePathPublic(stateDir);
43
+ if (!existsSync(filePath))
44
+ return; // no corpus yet — nothing to reuse
45
+ const raw = readFileSync(filePath, 'utf-8');
46
+ if (raw.trim() === '')
47
+ return; // an empty document is an empty corpus
48
+ // Throws on malformed JSON so the caller fails the gate rather than silently
49
+ // treating unreadable knowledge as absent knowledge.
50
+ JSON.parse(raw);
51
+ }
52
+ /**
53
+ * Read every reusable Principle from the canonical ledger.
54
+ *
55
+ * Read-only: opens the ledger document and filters in memory. No caching is
56
+ * introduced here — the corpus is small (order 10^2) and a cache would be a
57
+ * second place where ledger truth could go stale.
58
+ *
59
+ * Fail-closed on an UNREADABLE corpus. The shared `loadLedger` deliberately
60
+ * swallows a parse error and returns an empty store, which is indistinguishable
61
+ * from "nothing has been learned yet" — and the write that follows would then
62
+ * overwrite the unreadable file. Reporting that as an empty candidate set is
63
+ * precisely the silent duplicate this whole path exists to prevent, so an
64
+ * existing-but-unparseable ledger throws here instead.
65
+ *
66
+ * A genuinely MISSING ledger is not a failure: there is simply nothing to
67
+ * reuse yet, and blocking the first write of a fresh workspace would be wrong.
68
+ */
69
+ function normalizeLedgerEntry(entry) {
70
+ if (!isRecord(entry))
71
+ return null;
72
+ const { id, text, triggerPattern, action, status } = entry;
73
+ if (typeof id !== 'string' || id.length === 0)
74
+ return null;
75
+ return {
76
+ id,
77
+ text: typeof text === 'string' ? text : '',
78
+ triggerPattern: typeof triggerPattern === 'string' ? triggerPattern : '',
79
+ action: typeof action === 'string' ? action : '',
80
+ status: typeof status === 'string' ? status : '',
81
+ };
82
+ }
83
+ export function readReusablePrinciples(stateDir) {
84
+ assertLedgerReadable(stateDir);
85
+ const store = loadLedger(stateDir);
86
+ // The ledger is an untrusted document (rc-1/rc-2): validate each entry's
87
+ // fields instead of asserting the shape, so a malformed entry is skipped
88
+ // rather than flowing a non-string into the tokenizer as if it were text.
89
+ const entries = Object.values(store.tree.principles);
90
+ const reusable = [];
91
+ for (const entry of entries) {
92
+ const normalized = normalizeLedgerEntry(entry);
93
+ if (normalized && isReusablePrincipleStatus(normalized.status))
94
+ reusable.push(normalized);
95
+ }
96
+ return reusable;
97
+ }
98
+ /**
99
+ * Build the reuse shortlist for a candidate, from the canonical ledger.
100
+ *
101
+ * `recommendationKind` is checked with the SAME guard the intake write boundary
102
+ * uses, so a non-principle candidate can never reach the reuse path (SPEC T6 —
103
+ * the #1851 refusal semantics stay exactly as they are; this only makes the
104
+ * reuse path refuse them too).
105
+ */
106
+ export function buildReuseShortlist(input, stateDir, options = {}) {
107
+ const { recommendationKind, ...shortlistOptions } = options;
108
+ if (recommendationKind !== undefined && !isPrincipleLedgerEligibleKind(recommendationKind)) {
109
+ return {
110
+ candidates: [],
111
+ eligibleCount: 0,
112
+ consideredCount: 0,
113
+ candidateKindEligible: false,
114
+ };
115
+ }
116
+ return selectReuseShortlist(input, readReusablePrinciples(stateDir), shortlistOptions);
117
+ }
118
+ //# sourceMappingURL=reuse-retrieval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reuse-retrieval.js","sourceRoot":"","sources":["../../../src/runtime-v2/principle-reuse/reuse-retrieval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * PRI-917 Slice 1 — deterministic shortlist scoring (pure, no LLM, no I/O).
3
+ *
4
+ * Why a hand-rolled tokenizer: the Principle corpus is Chinese prose, so
5
+ * whitespace tokenization collapses a sentence into one useless token.
6
+ * This module therefore emits CJK character bigrams plus lower-cased latin /
7
+ * numeric word runs. The result is deterministic, dependency-free, and
8
+ * explainable — every score decomposes into named shared terms.
9
+ *
10
+ * Explicit non-goals (SPEC §6): no embedding, no vector store, no semantic
11
+ * search service, no background process, no clock, no randomness.
12
+ */
13
+ import type { ReuseCandidate, ReuseCandidateInput, ReusablePrinciple, ReuseShortlist, ReuseShortlistOptions } from './reuse-domain.js';
14
+ /**
15
+ * Deterministic, dependency-free tokenizer.
16
+ *
17
+ * - latin / numeric runs → lower-cased word tokens (length >= 2)
18
+ * - CJK runs → character bigrams (single char when the run is length 1)
19
+ * - everything else is a separator
20
+ *
21
+ * The output is sorted, so two equal texts always tokenize identically.
22
+ */
23
+ export declare function tokenizeForReuse(input: string): string[];
24
+ /**
25
+ * Score one existing Principle against the candidate.
26
+ *
27
+ * Returns `null` when no field pair shares anything — an entry with no
28
+ * evidence is not a proposal.
29
+ */
30
+ export declare function scoreReuseCandidate(input: ReuseCandidateInput, principle: ReusablePrinciple, maxEvidenceTerms?: number): ReuseCandidate | null;
31
+ /**
32
+ * Build a deterministic, bounded shortlist of existing Principles that may
33
+ * already cover the candidate.
34
+ *
35
+ * Pure: no I/O, no clock, no randomness. Total order is `score` desc then
36
+ * `principleId` asc, so identical input always yields identical output
37
+ * regardless of ledger insertion order.
38
+ */
39
+ export declare function selectReuseShortlist(input: ReuseCandidateInput, principles: readonly ReusablePrinciple[], options?: ReuseShortlistOptions): ReuseShortlist;
40
+ //# sourceMappingURL=reuse-shortlist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reuse-shortlist.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/principle-reuse/reuse-shortlist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,mBAAmB,EAGnB,iBAAiB,EAEjB,cAAc,EACd,qBAAqB,EACtB,MAAM,mBAAmB,CAAC;AA0C3B;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAqCxD;AAQD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,mBAAmB,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,gBAAgB,GAAE,MAAmC,GACpD,cAAc,GAAG,IAAI,CAoDvB;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,mBAAmB,EAC1B,UAAU,EAAE,SAAS,iBAAiB,EAAE,EACxC,OAAO,GAAE,qBAA0B,GAClC,cAAc,CAkBhB"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * PRI-917 Slice 1 — deterministic shortlist scoring (pure, no LLM, no I/O).
3
+ *
4
+ * Why a hand-rolled tokenizer: the Principle corpus is Chinese prose, so
5
+ * whitespace tokenization collapses a sentence into one useless token.
6
+ * This module therefore emits CJK character bigrams plus lower-cased latin /
7
+ * numeric word runs. The result is deterministic, dependency-free, and
8
+ * explainable — every score decomposes into named shared terms.
9
+ *
10
+ * Explicit non-goals (SPEC §6): no embedding, no vector store, no semantic
11
+ * search service, no background process, no clock, no randomness.
12
+ */
13
+ const DEFAULT_TOP_K = 3;
14
+ const DEFAULT_MIN_SCORE = 0.15;
15
+ const DEFAULT_MAX_EVIDENCE_TERMS = 8;
16
+ /**
17
+ * Field-pair weights. Same-field agreement is the strong signal; a
18
+ * cross-field pair catches a candidate that states the claim in `action` where
19
+ * the existing Principle states it in `text`.
20
+ */
21
+ const FIELD_PAIR_WEIGHTS = [
22
+ { from: 'text', to: 'text', weight: 3 },
23
+ { from: 'action', to: 'action', weight: 3 },
24
+ { from: 'triggerPattern', to: 'triggerPattern', weight: 2 },
25
+ { from: 'text', to: 'action', weight: 1 },
26
+ { from: 'action', to: 'text', weight: 1 },
27
+ ];
28
+ /**
29
+ * Minimal Chinese function-word stop list. Kept deliberately small: over-pruning
30
+ * would erase real signal, and the scoring is advisory (a human/AI Owner
31
+ * decides), not authoritative.
32
+ */
33
+ const CJK_STOP_TERMS = new Set([
34
+ '的', '了', '是', '在', '和', '与', '或', '及', '对', '为', '以', '等', '中',
35
+ '上', '下', '时', '后', '前', '将', '被', '把', '就', '都', '也', '而', '但',
36
+ '并', '不', '有', '无', '一', '个', '这', '那', '其', '之', '所', '使', '由',
37
+ '如', '若', '则', '于', '从', '到', '向', '再', '更', '最', '很', '会', '能',
38
+ '应', '须', '要', '可', '个', '种', '些', '之', '者', '此', '该', '某',
39
+ ]);
40
+ const CJK_RANGE = /[㐀-䶿一-鿿]/;
41
+ function isCjk(ch) {
42
+ return CJK_RANGE.test(ch);
43
+ }
44
+ /**
45
+ * Deterministic, dependency-free tokenizer.
46
+ *
47
+ * - latin / numeric runs → lower-cased word tokens (length >= 2)
48
+ * - CJK runs → character bigrams (single char when the run is length 1)
49
+ * - everything else is a separator
50
+ *
51
+ * The output is sorted, so two equal texts always tokenize identically.
52
+ */
53
+ export function tokenizeForReuse(input) {
54
+ const normalized = input.normalize('NFKC').toLowerCase();
55
+ const tokens = [];
56
+ let latinRun = '';
57
+ let cjkRun = '';
58
+ const flushLatin = () => {
59
+ if (latinRun.length >= 2)
60
+ tokens.push(latinRun);
61
+ latinRun = '';
62
+ };
63
+ const flushCjk = () => {
64
+ if (cjkRun.length === 1) {
65
+ tokens.push(cjkRun);
66
+ }
67
+ else {
68
+ for (let i = 0; i + 1 < cjkRun.length; i++)
69
+ tokens.push(cjkRun.slice(i, i + 2));
70
+ }
71
+ cjkRun = '';
72
+ };
73
+ for (const ch of normalized) {
74
+ if (isCjk(ch)) {
75
+ flushLatin();
76
+ cjkRun += ch;
77
+ }
78
+ else if (/[a-z0-9]/.test(ch)) {
79
+ flushCjk();
80
+ latinRun += ch;
81
+ }
82
+ else {
83
+ flushLatin();
84
+ flushCjk();
85
+ }
86
+ }
87
+ flushLatin();
88
+ flushCjk();
89
+ const deduped = new Set(tokens);
90
+ for (const stop of CJK_STOP_TERMS)
91
+ deduped.delete(stop);
92
+ return [...deduped].sort();
93
+ }
94
+ function intersect(a, b) {
95
+ const shared = [];
96
+ for (const term of a)
97
+ if (b.has(term))
98
+ shared.push(term);
99
+ return shared.sort();
100
+ }
101
+ /**
102
+ * Score one existing Principle against the candidate.
103
+ *
104
+ * Returns `null` when no field pair shares anything — an entry with no
105
+ * evidence is not a proposal.
106
+ */
107
+ export function scoreReuseCandidate(input, principle, maxEvidenceTerms = DEFAULT_MAX_EVIDENCE_TERMS) {
108
+ const inputTerms = {
109
+ text: new Set(tokenizeForReuse(input.text)),
110
+ triggerPattern: new Set(tokenizeForReuse(input.triggerPattern)),
111
+ action: new Set(tokenizeForReuse(input.action)),
112
+ };
113
+ const principleTerms = {
114
+ text: new Set(tokenizeForReuse(principle.text)),
115
+ triggerPattern: new Set(tokenizeForReuse(principle.triggerPattern)),
116
+ action: new Set(tokenizeForReuse(principle.action)),
117
+ };
118
+ const evidence = [];
119
+ let weighted = 0;
120
+ let totalWeight = 0;
121
+ for (const pair of FIELD_PAIR_WEIGHTS) {
122
+ const from = inputTerms[pair.from];
123
+ const to = principleTerms[pair.to];
124
+ const smaller = Math.min(from.size, to.size);
125
+ // An empty side can never produce evidence.
126
+ if (smaller === 0)
127
+ continue;
128
+ totalWeight += pair.weight;
129
+ const shared = intersect(from, to);
130
+ if (shared.length === 0)
131
+ continue;
132
+ const coverage = shared.length / smaller;
133
+ weighted += pair.weight * coverage;
134
+ const field = pair.from === pair.to ? pair.from : `${pair.from}~${pair.to}`;
135
+ evidence.push({
136
+ field,
137
+ sharedTerms: shared.slice(0, maxEvidenceTerms),
138
+ coverage,
139
+ });
140
+ }
141
+ if (evidence.length === 0 || totalWeight === 0)
142
+ return null;
143
+ const score = weighted / totalWeight;
144
+ const [top] = evidence
145
+ .slice()
146
+ .sort((a, b) => b.coverage - a.coverage || a.field.localeCompare(b.field));
147
+ const reason = top
148
+ ? `shares ${top.sharedTerms.slice(0, 5).join('、')} on ${top.field} (coverage ${(top.coverage * 100).toFixed(0)}%)`
149
+ : 'no field overlap';
150
+ return {
151
+ principleId: principle.id,
152
+ principleText: principle.text,
153
+ score,
154
+ evidence,
155
+ similarityReason: reason,
156
+ };
157
+ }
158
+ /**
159
+ * Build a deterministic, bounded shortlist of existing Principles that may
160
+ * already cover the candidate.
161
+ *
162
+ * Pure: no I/O, no clock, no randomness. Total order is `score` desc then
163
+ * `principleId` asc, so identical input always yields identical output
164
+ * regardless of ledger insertion order.
165
+ */
166
+ export function selectReuseShortlist(input, principles, options = {}) {
167
+ const topK = options.topK ?? DEFAULT_TOP_K;
168
+ const minScore = options.minScore ?? DEFAULT_MIN_SCORE;
169
+ const maxEvidenceTerms = options.maxEvidenceTerms ?? DEFAULT_MAX_EVIDENCE_TERMS;
170
+ const scored = [];
171
+ for (const principle of principles) {
172
+ const candidate = scoreReuseCandidate(input, principle, maxEvidenceTerms);
173
+ if (candidate && candidate.score >= minScore)
174
+ scored.push(candidate);
175
+ }
176
+ scored.sort((a, b) => b.score - a.score || a.principleId.localeCompare(b.principleId));
177
+ return {
178
+ candidates: scored.slice(0, topK),
179
+ eligibleCount: principles.length,
180
+ consideredCount: scored.length,
181
+ candidateKindEligible: true,
182
+ };
183
+ }
184
+ //# sourceMappingURL=reuse-shortlist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reuse-shortlist.js","sourceRoot":"","sources":["../../../src/runtime-v2/principle-reuse/reuse-shortlist.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { RuntimeStateHandle } from './runtime-state-handle.js';
1
2
  import type { RecoveryResult } from './store/lifecycle/recovery-sweep.js';
2
3
  import type { OwnerRetryOutcome } from './internalization/owner-retry.js';
3
4
  export interface FailedTaskRecoveryInfo {
@@ -43,6 +44,18 @@ export interface RecoverySweepServiceHandle {
43
44
  service: RecoverySweepService;
44
45
  close: () => Promise<void>;
45
46
  }
47
+ /**
48
+ * Recover a failed task to `pending` — the single recovery authority for the
49
+ * failed→pending reset semantics (PRI-674), shared by the recovery sweep
50
+ * service and `pd pain retry` (PRI-934). Callers must not re-implement this
51
+ * transition: attempt-budget handling (exhausted + force → +3) and lease/
52
+ * result clearing live here only.
53
+ *
54
+ * Returns null (no mutation) when the task is absent or not in `failed`
55
+ * status; throws `input_invalid` when the budget is exhausted and force is
56
+ * not supplied.
57
+ */
58
+ export declare function recoverFailedTask(stateManager: RuntimeStateHandle['stateManager'], taskId: string, force?: boolean): Promise<FailedTaskRecoveryResult | null>;
46
59
  export declare function createRecoverySweepService(opts: {
47
60
  workspaceDir: string;
48
61
  }): Promise<RecoverySweepServiceHandle>;
@@ -1 +1 @@
1
- {"version":3,"file":"recovery-sweep-service.d.ts","sourceRoot":"","sources":["../../src/runtime-v2/recovery-sweep-service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAI1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAE1E,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;OAOG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC5D,iBAAiB,IAAI,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;IACvD,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAAC;IAC7F;;;;;OAKG;IACH,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AA+ED,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,0BAA0B,CAAC,CAOrC"}
1
+ {"version":3,"file":"recovery-sweep-service.d.ts","sourceRoot":"","sources":["../../src/runtime-v2/recovery-sweep-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAI1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAE1E,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;OAOG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC5D,iBAAiB,IAAI,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;IACvD,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAAC;IAC7F;;;;;OAKG;IACH,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,kBAAkB,CAAC,cAAc,CAAC,EAChD,MAAM,EAAE,MAAM,EACd,KAAK,UAAQ,GACZ,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAmC1C;AA8CD,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,0BAA0B,CAAC,CAOrC"}
@@ -2,6 +2,48 @@ import { createRuntimeStateHandle } from './runtime-state-handle.js';
2
2
  import { PDRuntimeError } from './error-categories.js';
3
3
  import { isRunnerKind } from './internalization/peer-runner-contracts.js';
4
4
  import { ownerRetryNeedsHumanReviewTask } from './internalization/owner-retry.js';
5
+ /**
6
+ * Recover a failed task to `pending` — the single recovery authority for the
7
+ * failed→pending reset semantics (PRI-674), shared by the recovery sweep
8
+ * service and `pd pain retry` (PRI-934). Callers must not re-implement this
9
+ * transition: attempt-budget handling (exhausted + force → +3) and lease/
10
+ * result clearing live here only.
11
+ *
12
+ * Returns null (no mutation) when the task is absent or not in `failed`
13
+ * status; throws `input_invalid` when the budget is exhausted and force is
14
+ * not supplied.
15
+ */
16
+ export async function recoverFailedTask(stateManager, taskId, force = false) {
17
+ const task = await stateManager.getTask(taskId);
18
+ if (!task)
19
+ return null;
20
+ if (task.status !== 'failed')
21
+ return null;
22
+ const isExhausted = task.attemptCount >= task.maxAttempts;
23
+ if (isExhausted && !force) {
24
+ throw new PDRuntimeError('input_invalid', `Task ${taskId} has exhausted max attempts (${task.attemptCount}/${task.maxAttempts}). Use force to recover.`);
25
+ }
26
+ const newMaxAttempts = isExhausted && force
27
+ ? Math.max(task.maxAttempts, task.attemptCount) + 3
28
+ : task.maxAttempts;
29
+ const updated = await stateManager.updateTask(taskId, {
30
+ status: 'pending',
31
+ attemptCount: 0,
32
+ maxAttempts: newMaxAttempts,
33
+ lastError: null,
34
+ leaseOwner: null,
35
+ leaseExpiresAt: null,
36
+ resultRef: null,
37
+ });
38
+ return {
39
+ taskId: updated.taskId,
40
+ previousStatus: 'failed',
41
+ newStatus: updated.status,
42
+ attemptCount: updated.attemptCount,
43
+ maxAttempts: updated.maxAttempts,
44
+ forceApplied: isExhausted && force,
45
+ };
46
+ }
5
47
  class RecoverySweepServiceImpl {
6
48
  stateManager;
7
49
  constructor(stateManager) {
@@ -32,35 +74,7 @@ class RecoverySweepServiceImpl {
32
74
  }));
33
75
  }
34
76
  async recoverFailedTask(taskId, force = false) {
35
- const task = await this.stateManager.getTask(taskId);
36
- if (!task)
37
- return null;
38
- if (task.status !== 'failed')
39
- return null;
40
- const isExhausted = task.attemptCount >= task.maxAttempts;
41
- if (isExhausted && !force) {
42
- throw new PDRuntimeError('input_invalid', `Task ${taskId} has exhausted max attempts (${task.attemptCount}/${task.maxAttempts}). Use force to recover.`);
43
- }
44
- const newMaxAttempts = isExhausted && force
45
- ? Math.max(task.maxAttempts, task.attemptCount) + 3
46
- : task.maxAttempts;
47
- const updated = await this.stateManager.updateTask(taskId, {
48
- status: 'pending',
49
- attemptCount: 0,
50
- maxAttempts: newMaxAttempts,
51
- lastError: null,
52
- leaseOwner: null,
53
- leaseExpiresAt: null,
54
- resultRef: null,
55
- });
56
- return {
57
- taskId: updated.taskId,
58
- previousStatus: 'failed',
59
- newStatus: updated.status,
60
- attemptCount: updated.attemptCount,
61
- maxAttempts: updated.maxAttempts,
62
- forceApplied: isExhausted && force,
63
- };
77
+ return recoverFailedTask(this.stateManager, taskId, force);
64
78
  }
65
79
  async recoverNeedsHumanReviewTask(taskId) {
66
80
  return ownerRetryNeedsHumanReviewTask(this.stateManager, taskId);
@@ -1 +1 @@
1
- {"version":3,"file":"recovery-sweep-service.js","sourceRoot":"","sources":["../../src/runtime-v2/recovery-sweep-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recovery-sweep-service.js","sourceRoot":"","sources":["../../src/runtime-v2/recovery-sweep-service.ts"],"names":[],"mappings":"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"}
@@ -58,6 +58,13 @@ export interface PainDiagnosisStore {
58
58
  recordPainDiagnosis(input: PainDiagnosisWriteInput): Promise<PainDiagnosisRecord>;
59
59
  /** All diagnosis rows for a pain, oldest first. */
60
60
  getDiagnosesByPainId(painId: string): Promise<PainDiagnosisRecord[]>;
61
+ /**
62
+ * All diagnosis rows produced by one diagnostician task, oldest first
63
+ * (PRI-917 PR3B Phase 2: the candidate → pain bridge for reuse evidence —
64
+ * a candidate knows only its task; its Pain resolves through this query).
65
+ * Uses the existing idx_pain_diagnoses_task_id index; no schema change.
66
+ */
67
+ getDiagnosesByTaskId(taskId: string): Promise<PainDiagnosisRecord[]>;
61
68
  }
62
69
  export declare function isRootCauseCategory(value: unknown): value is RootCauseCategory;
63
70
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"pain-diagnosis-store.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/store/pain-diagnosis/pain-diagnosis-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AAEtF,8FAA8F;AAC9F,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,kDAAkD;AAClD,MAAM,WAAW,mBAAmB;IAClC,kEAAkE;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,+FAA+F;IAC/F,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,QAAQ,EAAE,qBAAqB,EAAE,CAAC;IAClC,+EAA+E;IAC/E,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,mFAAmF;IACnF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,gEAAgE;AAChE,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC3C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,mBAAmB,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAElF,mDAAmD;IACnD,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;CACtE;AAID,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAE9E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAKlF;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEhF"}
1
+ {"version":3,"file":"pain-diagnosis-store.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/store/pain-diagnosis/pain-diagnosis-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AAEtF,8FAA8F;AAC9F,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,kDAAkD;AAClD,MAAM,WAAW,mBAAmB;IAClC,kEAAkE;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,+FAA+F;IAC/F,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,QAAQ,EAAE,qBAAqB,EAAE,CAAC;IAClC,+EAA+E;IAC/E,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,mFAAmF;IACnF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,gEAAgE;AAChE,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC3C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,mBAAmB,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAElF,mDAAmD;IACnD,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAErE;;;;;OAKG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;CACtE;AAID,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAE9E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAKlF;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEhF"}
@@ -1 +1 @@
1
- {"version":3,"file":"pain-diagnosis-store.js","sourceRoot":"","sources":["../../../../src/runtime-v2/store/pain-diagnosis/pain-diagnosis-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAwDH,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;AAErG,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,KAAK,MAAM,QAAQ,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAU,EAAE,CAAC;QAC9E,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,QAAQ,IAAI,CAAC;YAAE,OAAO,QAAQ,CAAC;IAC7D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,WAAmB;IACtE,OAAO,GAAG,MAAM,KAAK,WAAW,EAAE,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"pain-diagnosis-store.js","sourceRoot":"","sources":["../../../../src/runtime-v2/store/pain-diagnosis/pain-diagnosis-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAgEH,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;AAErG,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,KAAK,MAAM,QAAQ,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAU,EAAE,CAAC;QAC9E,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,QAAQ,IAAI,CAAC;YAAE,OAAO,QAAQ,CAAC;IAC7D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,WAAmB;IACtE,OAAO,GAAG,MAAM,KAAK,WAAW,EAAE,CAAC;AACrC,CAAC"}
@@ -5,5 +5,6 @@ export declare class SqlitePainDiagnosisStore implements PainDiagnosisStore {
5
5
  constructor(connection: SqliteConnection);
6
6
  recordPainDiagnosis(input: PainDiagnosisWriteInput): Promise<PainDiagnosisRecord>;
7
7
  getDiagnosesByPainId(painId: string): Promise<PainDiagnosisRecord[]>;
8
+ getDiagnosesByTaskId(taskId: string): Promise<PainDiagnosisRecord[]>;
8
9
  }
9
10
  //# sourceMappingURL=sqlite-pain-diagnosis-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-pain-diagnosis-store.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/store/pain-diagnosis/sqlite-pain-diagnosis-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAEV,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,2BAA2B,CAAC;AAiFnC,qBAAa,wBAAyB,YAAW,kBAAkB;IAAgB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAAvC,YAA6B,UAAU,EAAE,gBAAgB,EAAI;IAE5H,mBAAmB,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAkCtF;IAEK,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAazE;CACF"}
1
+ {"version":3,"file":"sqlite-pain-diagnosis-store.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/store/pain-diagnosis/sqlite-pain-diagnosis-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAEV,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,2BAA2B,CAAC;AAiFnC,qBAAa,wBAAyB,YAAW,kBAAkB;IAAgB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAAvC,YAA6B,UAAU,EAAE,gBAAgB,EAAI;IAE5H,mBAAmB,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAkCtF;IAEK,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAazE;IAEK,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAWzE;CACF"}
@@ -114,5 +114,17 @@ export class SqlitePainDiagnosisStore {
114
114
  }
115
115
  return rows.map(mapRow);
116
116
  }
117
+ async getDiagnosesByTaskId(taskId) {
118
+ const db = this.connection.getDb();
119
+ const rawRows = db.prepare('SELECT id, pain_id, task_id, diagnosis_id, category, root_cause, evidence_json, confidence, artifact_id, created_at FROM pain_diagnoses WHERE task_id = ? ORDER BY created_at ASC, id ASC').all(taskId);
120
+ const rows = rawRows.filter(isPainDiagnosisRow);
121
+ // Same fail-loud posture as getDiagnosesByPainId (rc-3/rc-9).
122
+ if (rows.length !== rawRows.length) {
123
+ throw new PDRuntimeError('storage_unavailable', `task ${taskId} has malformed pain diagnosis row(s)`, {
124
+ nextAction: 'Inspect state.db pain_diagnoses for externally modified rows.',
125
+ });
126
+ }
127
+ return rows.map(mapRow);
128
+ }
117
129
  }
118
130
  //# sourceMappingURL=sqlite-pain-diagnosis-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-pain-diagnosis-store.js","sourceRoot":"","sources":["../../../../src/runtime-v2/store/pain-diagnosis/sqlite-pain-diagnosis-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sqlite-pain-diagnosis-store.js","sourceRoot":"","sources":["../../../../src/runtime-v2/store/pain-diagnosis/sqlite-pain-diagnosis-store.ts"],"names":[],"mappings":"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"}
@@ -156,6 +156,11 @@ export declare class RuntimeStateManager {
156
156
  recordPainDiagnosis(input: PainDiagnosisWriteInput): Promise<PainDiagnosisRecord>;
157
157
  /** All persisted diagnoses for a pain (multiple rows = re-diagnosis / mixed attribution). */
158
158
  getDiagnosesByPainId(painId: string): Promise<PainDiagnosisRecord[]>;
159
+ /**
160
+ * All persisted diagnoses produced by one diagnostician task (PRI-917 PR3B
161
+ * Phase 2: the candidate → pain bridge for reuse evidence resolution).
162
+ */
163
+ getDiagnosesByTaskId(taskId: string): Promise<PainDiagnosisRecord[]>;
159
164
  getArtifactWithCandidates(artifactId: string): Promise<ArtifactWithCandidates | null>;
160
165
  }
161
166
  //# sourceMappingURL=runtime-state-manager.d.ts.map