@urateam/core 0.1.42 → 0.1.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/bitbucket-webhook.test.d.ts +13 -0
- package/dist/__tests__/bitbucket-webhook.test.d.ts.map +1 -0
- package/dist/__tests__/bitbucket-webhook.test.js +379 -0
- package/dist/__tests__/bitbucket-webhook.test.js.map +1 -0
- package/dist/__tests__/bitbucket.test.d.ts +15 -0
- package/dist/__tests__/bitbucket.test.d.ts.map +1 -0
- package/dist/__tests__/bitbucket.test.js +237 -0
- package/dist/__tests__/bitbucket.test.js.map +1 -0
- package/dist/__tests__/gitlab-webhook.test.d.ts +13 -0
- package/dist/__tests__/gitlab-webhook.test.d.ts.map +1 -0
- package/dist/__tests__/gitlab-webhook.test.js +388 -0
- package/dist/__tests__/gitlab-webhook.test.js.map +1 -0
- package/dist/__tests__/runner-multi-vcs.test.d.ts +19 -0
- package/dist/__tests__/runner-multi-vcs.test.d.ts.map +1 -0
- package/dist/__tests__/runner-multi-vcs.test.js +346 -0
- package/dist/__tests__/runner-multi-vcs.test.js.map +1 -0
- package/dist/__tests__/triage-v2-prediction.test.d.ts +2 -0
- package/dist/__tests__/triage-v2-prediction.test.d.ts.map +1 -0
- package/dist/__tests__/triage-v2-prediction.test.js +70 -0
- package/dist/__tests__/triage-v2-prediction.test.js.map +1 -0
- package/dist/__tests__/triage-v2-prompt.test.d.ts +2 -0
- package/dist/__tests__/triage-v2-prompt.test.d.ts.map +1 -0
- package/dist/__tests__/triage-v2-prompt.test.js +127 -0
- package/dist/__tests__/triage-v2-prompt.test.js.map +1 -0
- package/dist/__tests__/triage-v2-render.test.d.ts +2 -0
- package/dist/__tests__/triage-v2-render.test.d.ts.map +1 -0
- package/dist/__tests__/triage-v2-render.test.js +200 -0
- package/dist/__tests__/triage-v2-render.test.js.map +1 -0
- package/dist/__tests__/triage-v2-schema.test.d.ts +2 -0
- package/dist/__tests__/triage-v2-schema.test.d.ts.map +1 -0
- package/dist/__tests__/triage-v2-schema.test.js +115 -0
- package/dist/__tests__/triage-v2-schema.test.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/pipeline/feedback-pipeline.d.ts +2 -0
- package/dist/pipeline/feedback-pipeline.d.ts.map +1 -1
- package/dist/pipeline/feedback-pipeline.js +4 -1
- package/dist/pipeline/feedback-pipeline.js.map +1 -1
- package/dist/pipeline/runner.d.ts +11 -0
- package/dist/pipeline/runner.d.ts.map +1 -1
- package/dist/pipeline/runner.js +314 -114
- package/dist/pipeline/runner.js.map +1 -1
- package/dist/pm/actions/triage-prompt.d.ts +42 -0
- package/dist/pm/actions/triage-prompt.d.ts.map +1 -0
- package/dist/pm/actions/triage-prompt.js +192 -0
- package/dist/pm/actions/triage-prompt.js.map +1 -0
- package/dist/pm/actions/triage-render.d.ts +39 -0
- package/dist/pm/actions/triage-render.d.ts.map +1 -0
- package/dist/pm/actions/triage-render.js +158 -0
- package/dist/pm/actions/triage-render.js.map +1 -0
- package/dist/pm/actions/triage.d.ts +2 -1
- package/dist/pm/actions/triage.d.ts.map +1 -1
- package/dist/pm/actions/triage.js +44 -58
- package/dist/pm/actions/triage.js.map +1 -1
- package/dist/pm/triage-prediction-quality.d.ts +26 -0
- package/dist/pm/triage-prediction-quality.d.ts.map +1 -0
- package/dist/pm/triage-prediction-quality.js +41 -0
- package/dist/pm/triage-prediction-quality.js.map +1 -0
- package/dist/pm/types.d.ts +60 -0
- package/dist/pm/types.d.ts.map +1 -1
- package/dist/pm/types.js +119 -0
- package/dist/pm/types.js.map +1 -1
- package/dist/repo/bitbucket.d.ts +136 -0
- package/dist/repo/bitbucket.d.ts.map +1 -0
- package/dist/repo/bitbucket.js +237 -0
- package/dist/repo/bitbucket.js.map +1 -0
- package/dist/repo/gitlab.d.ts +11 -0
- package/dist/repo/gitlab.d.ts.map +1 -1
- package/dist/repo/gitlab.js +37 -0
- package/dist/repo/gitlab.js.map +1 -1
- package/dist/repo/index.d.ts +3 -1
- package/dist/repo/index.d.ts.map +1 -1
- package/dist/repo/index.js +2 -1
- package/dist/repo/index.js.map +1 -1
- package/dist/server.d.ts +14 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +32 -0
- package/dist/server.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/dist/types.js.map +1 -1
- package/dist/webhook/bitbucket-handler.d.ts +65 -0
- package/dist/webhook/bitbucket-handler.d.ts.map +1 -0
- package/dist/webhook/bitbucket-handler.js +153 -0
- package/dist/webhook/bitbucket-handler.js.map +1 -0
- package/dist/webhook/gitlab-handler.d.ts +66 -0
- package/dist/webhook/gitlab-handler.d.ts.map +1 -0
- package/dist/webhook/gitlab-handler.js +159 -0
- package/dist/webhook/gitlab-handler.js.map +1 -0
- package/dist/webhook/index.d.ts +3 -0
- package/dist/webhook/index.d.ts.map +1 -1
- package/dist/webhook/index.js +3 -0
- package/dist/webhook/index.js.map +1 -1
- package/dist/webhook/shared-handlers.d.ts +110 -0
- package/dist/webhook/shared-handlers.d.ts.map +1 -0
- package/dist/webhook/shared-handlers.js +251 -0
- package/dist/webhook/shared-handlers.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage-prompt.js","sourceRoot":"","sources":["../../../src/pm/actions/triage-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAQH;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC/D,OAAO,GAAG,CAAC,yBAAyB,KAAK,MAAM,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAwB,EACxB,QAAkC;IAElC,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACxD,OAAO,CACL,2IAA2I;QAC3I,UAAU,KAAK,CAAC,UAAU,IAAI;QAC9B,UAAU,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI;QACnC,gBAAgB,aAAa,MAAM;QACnC,uDAAuD;QACvD,8RAA8R;QAC9R,kOAAkO;QAClO,oHAAoH;QACpH,8IAA8I;QAC9I,+BAA+B;QAC/B,kOAAkO;QAClO,yTAAyT;QACzT,6OAA6O;QAC7O,uSAAuS;QACvS,udAAud,CACxd,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwD1B,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAwB,EACxB,QAAkC;IAElC,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE7C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2CP,kBAAkB,CAAC,IAAI,EAAE;;;;MAIrB,KAAK,CAAC,UAAU;SACb,cAAc;eACR,aAAa;;;;;;;;;;EAU1B,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,kEAAkE;AAClE,mBAAmB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Triage v2 rendering — Linear comment + issue description appender.
|
|
3
|
+
*
|
|
4
|
+
* Pure functions. No I/O. Two exports:
|
|
5
|
+
* - `renderTriageComment(result, opts)` → markdown body for
|
|
6
|
+
* `linearClient.createComment`. Renders v1 sections always; v2 sections
|
|
7
|
+
* only when at least one v2 field is present on `result`.
|
|
8
|
+
* - `appendTriageSectionsToDescription(existingDesc, result)` → mutated
|
|
9
|
+
* description with new sections appended. Idempotent (skips sections
|
|
10
|
+
* whose `**Label:**` marker already appears).
|
|
11
|
+
*
|
|
12
|
+
* Contract reference: specs/001-triage-v2/contracts/triage-result.schema.md
|
|
13
|
+
*/
|
|
14
|
+
import type { TriageResult } from "../types.js";
|
|
15
|
+
interface RenderOpts {
|
|
16
|
+
forceNeedsDesign: boolean;
|
|
17
|
+
pipelineLabel: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Render the markdown body posted to the Linear issue by triage.
|
|
21
|
+
*
|
|
22
|
+
* Order of sections:
|
|
23
|
+
* 1. Header with priority / complexity / labels / pipeline / rationale
|
|
24
|
+
* 2. v1: Acceptance Criteria, Approach (Tier 4), Open Questions, Anti-AC
|
|
25
|
+
* 3. v2 (only if any v2 field present): Assumptions, Examples,
|
|
26
|
+
* Affected Files, Test Strategy, Risk Assessment
|
|
27
|
+
*/
|
|
28
|
+
export declare function renderTriageComment(result: TriageResult, opts: RenderOpts): string;
|
|
29
|
+
/**
|
|
30
|
+
* Append triage sections to the issue description. Idempotent — skips any
|
|
31
|
+
* section whose `**Label:**` marker already appears in `existingDesc`.
|
|
32
|
+
*
|
|
33
|
+
* Section order (matches the comment): Acceptance Criteria, Examples,
|
|
34
|
+
* Affected Files, Test Strategy, Risk Assessment. The order is important
|
|
35
|
+
* for the future schema-mapper extension that will parse these out.
|
|
36
|
+
*/
|
|
37
|
+
export declare function appendTriageSectionsToDescription(existingDesc: string, result: TriageResult): string;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=triage-render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage-render.d.ts","sourceRoot":"","sources":["../../../src/pm/actions/triage-render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,UAAU,UAAU;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB;AA6GD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,UAAU,GACf,MAAM,CAUR;AAMD;;;;;;;GAOG;AACH,wBAAgB,iCAAiC,CAC/C,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,YAAY,GACnB,MAAM,CA6DR"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* True iff `result` carries at least one non-empty Tier-6b field.
|
|
3
|
+
*
|
|
4
|
+
* Uses `?.length` rather than `?? `null-coalescing because an empty array
|
|
5
|
+
* is truthy in a boolean context — `[] ?? next` short-circuits to `[]` and
|
|
6
|
+
* `Boolean([]) === true`. We treat empty arrays as "no v2 content" so a
|
|
7
|
+
* caller who constructs `{assumptions: []}` doesn't get a Tier-6b block of
|
|
8
|
+
* five `(none)` placeholders.
|
|
9
|
+
*/
|
|
10
|
+
function hasV2Fields(result) {
|
|
11
|
+
return Boolean(result.assumptions?.length ||
|
|
12
|
+
result.examples?.length ||
|
|
13
|
+
result.affectedFiles?.length ||
|
|
14
|
+
result.testStrategy ||
|
|
15
|
+
result.riskAssessment);
|
|
16
|
+
}
|
|
17
|
+
/** Render `(none)` placeholder for an absent v2 field; render the formatter otherwise. */
|
|
18
|
+
function renderOr(value, formatter) {
|
|
19
|
+
return value ? formatter() : "(none)";
|
|
20
|
+
}
|
|
21
|
+
function renderAssumptions(result) {
|
|
22
|
+
return renderOr(result.assumptions?.length ? result.assumptions : undefined, () => result.assumptions.map((a) => `- ${a}`).join("\n"));
|
|
23
|
+
}
|
|
24
|
+
function renderExamples(result) {
|
|
25
|
+
return renderOr(result.examples?.length ? result.examples : undefined, () => result.examples
|
|
26
|
+
.map((e, i) => `${i + 1}. **Scenario:** ${e.scenario}\n **Expected:** ${e.expected}`)
|
|
27
|
+
.join("\n"));
|
|
28
|
+
}
|
|
29
|
+
function renderAffectedFiles(result) {
|
|
30
|
+
return renderOr(result.affectedFiles?.length ? result.affectedFiles : undefined, () => result.affectedFiles.map((f) => `- ${f}`).join("\n"));
|
|
31
|
+
}
|
|
32
|
+
function renderTestStrategy(result) {
|
|
33
|
+
return renderOr(result.testStrategy, () => {
|
|
34
|
+
const lines = [];
|
|
35
|
+
if (result.testStrategy.unit) {
|
|
36
|
+
lines.push(`- **Unit:** ${result.testStrategy.unit}`);
|
|
37
|
+
}
|
|
38
|
+
if (result.testStrategy.integration) {
|
|
39
|
+
lines.push(`- **Integration:** ${result.testStrategy.integration}`);
|
|
40
|
+
}
|
|
41
|
+
return lines.length > 0 ? lines.join("\n") : "(none)";
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function renderRiskAssessment(result) {
|
|
45
|
+
return renderOr(result.riskAssessment, () => `**Severity:** ${result.riskAssessment.severity} | **Areas:** ${result.riskAssessment.areas.join(", ") || "(none)"}`);
|
|
46
|
+
}
|
|
47
|
+
/** Render the v1 (Tier-4-aware) portion of the comment. */
|
|
48
|
+
function renderV1Sections(result) {
|
|
49
|
+
const parts = [];
|
|
50
|
+
if (result.acceptanceCriteria.length > 0) {
|
|
51
|
+
parts.push(`\n\n**Generated Acceptance Criteria:**\n${result.acceptanceCriteria.map((c) => `- ${c}`).join("\n")}`);
|
|
52
|
+
}
|
|
53
|
+
if (result.approachSummary) {
|
|
54
|
+
parts.push(`\n\n**Approach (Tier 4):**\n${result.approachSummary}`);
|
|
55
|
+
}
|
|
56
|
+
if (result.openQuestions?.length) {
|
|
57
|
+
parts.push(`\n\n**Open questions (must be answered before implement):**\n${result.openQuestions.map((q) => `- ${q}`).join("\n")}`);
|
|
58
|
+
}
|
|
59
|
+
if (result.antiAcceptanceCriteria?.length) {
|
|
60
|
+
parts.push(`\n\n**Anti-acceptance criteria (this should NOT do):**\n${result.antiAcceptanceCriteria.map((q) => `- ${q}`).join("\n")}`);
|
|
61
|
+
}
|
|
62
|
+
return parts.join("");
|
|
63
|
+
}
|
|
64
|
+
/** Render the v2 Tier-6b block. Only called when at least one v2 field is set. */
|
|
65
|
+
function renderV2Block(result) {
|
|
66
|
+
return (`\n\n### Assumptions\n${renderAssumptions(result)}` +
|
|
67
|
+
`\n\n### Examples\n${renderExamples(result)}` +
|
|
68
|
+
`\n\n### Affected Files\n${renderAffectedFiles(result)}` +
|
|
69
|
+
`\n\n### Test Strategy\n${renderTestStrategy(result)}` +
|
|
70
|
+
`\n\n### Risk Assessment\n${renderRiskAssessment(result)}`);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Render the markdown body posted to the Linear issue by triage.
|
|
74
|
+
*
|
|
75
|
+
* Order of sections:
|
|
76
|
+
* 1. Header with priority / complexity / labels / pipeline / rationale
|
|
77
|
+
* 2. v1: Acceptance Criteria, Approach (Tier 4), Open Questions, Anti-AC
|
|
78
|
+
* 3. v2 (only if any v2 field present): Assumptions, Examples,
|
|
79
|
+
* Affected Files, Test Strategy, Risk Assessment
|
|
80
|
+
*/
|
|
81
|
+
export function renderTriageComment(result, opts) {
|
|
82
|
+
const labelsDedup = Array.from(new Set(result.labels));
|
|
83
|
+
const header = `🤖 **PM Agent — Triaged**${opts.forceNeedsDesign ? " (routed to needs-design)" : ""}\n\n` +
|
|
84
|
+
`**Priority:** ${result.priority} | **Complexity:** ${result.complexity}\n` +
|
|
85
|
+
`**Labels:** ${labelsDedup.join(", ")}\n` +
|
|
86
|
+
`**Pipeline:** ${opts.pipelineLabel}\n` +
|
|
87
|
+
`**Rationale:** ${result.rationale}`;
|
|
88
|
+
return header + renderV1Sections(result) + (hasV2Fields(result) ? renderV2Block(result) : "");
|
|
89
|
+
}
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
// Issue-description appender.
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
/**
|
|
94
|
+
* Append triage sections to the issue description. Idempotent — skips any
|
|
95
|
+
* section whose `**Label:**` marker already appears in `existingDesc`.
|
|
96
|
+
*
|
|
97
|
+
* Section order (matches the comment): Acceptance Criteria, Examples,
|
|
98
|
+
* Affected Files, Test Strategy, Risk Assessment. The order is important
|
|
99
|
+
* for the future schema-mapper extension that will parse these out.
|
|
100
|
+
*/
|
|
101
|
+
export function appendTriageSectionsToDescription(existingDesc, result) {
|
|
102
|
+
const sections = [
|
|
103
|
+
{
|
|
104
|
+
marker: "**Acceptance Criteria:**",
|
|
105
|
+
render: () => result.acceptanceCriteria.length > 0
|
|
106
|
+
? `**Acceptance Criteria:**\n${result.acceptanceCriteria.map((c) => `- [ ] ${c}`).join("\n")}`
|
|
107
|
+
: null,
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
marker: "**Examples:**",
|
|
111
|
+
render: () => result.examples?.length
|
|
112
|
+
? `**Examples:**\n${result.examples
|
|
113
|
+
.map((e, i) => `${i + 1}. **Scenario:** ${e.scenario}\n **Expected:** ${e.expected}`)
|
|
114
|
+
.join("\n")}`
|
|
115
|
+
: null,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
marker: "**Affected Files:**",
|
|
119
|
+
render: () => result.affectedFiles?.length
|
|
120
|
+
? `**Affected Files:**\n${result.affectedFiles.map((f) => `- ${f}`).join("\n")}`
|
|
121
|
+
: null,
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
marker: "**Test Strategy:**",
|
|
125
|
+
render: () => {
|
|
126
|
+
if (!result.testStrategy)
|
|
127
|
+
return null;
|
|
128
|
+
const lines = [];
|
|
129
|
+
if (result.testStrategy.unit) {
|
|
130
|
+
lines.push(`- **Unit:** ${result.testStrategy.unit}`);
|
|
131
|
+
}
|
|
132
|
+
if (result.testStrategy.integration) {
|
|
133
|
+
lines.push(`- **Integration:** ${result.testStrategy.integration}`);
|
|
134
|
+
}
|
|
135
|
+
return lines.length > 0
|
|
136
|
+
? `**Test Strategy:**\n${lines.join("\n")}`
|
|
137
|
+
: null;
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
marker: "**Risk Assessment:**",
|
|
142
|
+
render: () => result.riskAssessment
|
|
143
|
+
? `**Risk Assessment:**\n- **Severity:** ${result.riskAssessment.severity}\n- **Areas:** ${result.riskAssessment.areas.join(", ") || "(none)"}`
|
|
144
|
+
: null,
|
|
145
|
+
},
|
|
146
|
+
];
|
|
147
|
+
let out = existingDesc;
|
|
148
|
+
for (const section of sections) {
|
|
149
|
+
if (out.includes(section.marker))
|
|
150
|
+
continue;
|
|
151
|
+
const rendered = section.render();
|
|
152
|
+
if (rendered === null)
|
|
153
|
+
continue;
|
|
154
|
+
out = `${out}\n\n${rendered}`;
|
|
155
|
+
}
|
|
156
|
+
return out;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=triage-render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage-render.js","sourceRoot":"","sources":["../../../src/pm/actions/triage-render.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import type { LinearClient } from "@linear/sdk";
|
|
1
2
|
import type { TriageResult } from "../types.js";
|
|
2
3
|
import type { AnyDb } from "../../db/client.js";
|
|
3
4
|
export interface TriageInput {
|
|
4
|
-
linearClient:
|
|
5
|
+
linearClient: LinearClient;
|
|
5
6
|
teamIds: string[];
|
|
6
7
|
callClaude: (prompt: string) => Promise<string>;
|
|
7
8
|
sanitize: (text: string) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../../src/pm/actions/triage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../../src/pm/actions/triage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAwChD,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oGAAoG;IACpG,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,uFAAuF;IACvF,EAAE,CAAC,EAAE,KAAK,CAAC;CACZ;AAoBD,wBAAsB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAwOjF"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import { parseTriageV2Extensions } from "../types.js";
|
|
1
2
|
import { parseJsonObject } from "../../executor/agent-stream.js";
|
|
2
3
|
import { resolveWorkflowStates } from "../linear-helpers.js";
|
|
3
4
|
import { resolveIssueRelations } from "../../util/linear.js";
|
|
4
5
|
import { createLogger } from "../../logger.js";
|
|
5
6
|
import { logAuditEventUnchecked, pmTriageClassifiedEvent } from "../../audit/index.js";
|
|
7
|
+
import { buildTriageV1Prompt, buildTriageV2Prompt, isV2Disabled, } from "./triage-prompt.js";
|
|
8
|
+
import { renderTriageComment, appendTriageSectionsToDescription, } from "./triage-render.js";
|
|
6
9
|
const log = createLogger({ component: "PmAgent:triage" });
|
|
7
10
|
const MAX_ISSUES_PER_TICK = 10;
|
|
8
11
|
const DEFAULT_BATCH_SIZE = 3;
|
|
@@ -102,22 +105,19 @@ export async function triageNewIssues(input) {
|
|
|
102
105
|
log.info({ issueId: issue.identifier, pipelineLabel: OBSERVER_PIPELINE_LABEL }, "triaged observer-origin issue (skipped Claude classification)");
|
|
103
106
|
return result;
|
|
104
107
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
`- antiAcceptanceCriteria: list of "things this should NOT do" — explicit out-of-scope items so the agent doesn't drift (e.g. "must NOT change other pipelines' configs", "must NOT add new dependencies"). Helps the agent stay narrow.\n\n` +
|
|
119
|
-
`Respond with exactly this JSON format (no markdown, no explanation, just the JSON). The canonical form for openQuestions is the EMPTY array \`[]\` — only populate it when the issue is genuinely ambiguous and you cannot proceed without operator input. Do not invent questions for clear specs.\n` +
|
|
120
|
-
`{"priority": <1-4 where 1=urgent>, "labels": [<"bug"|"feature"|"backend"|"frontend"|"infra"|"docs">], "complexity": <"trivial"|"small"|"medium"|"large">, "rationale": "<one sentence>", "approachSummary": "<3-5 lines>", "openQuestions": [], "antiAcceptanceCriteria": ["<not-this>", ...], "acceptanceCriteria": ["<integration criterion — specifies call site in existing code>", "<behavior criterion — testable outcome>", "<documentation criterion — if applicable>", ...]}`;
|
|
108
|
+
// Tier 6a — pick v2 prompt by default; fall back to v1 when the
|
|
109
|
+
// operator has set URATEAM_DISABLE_TRIAGE_V2=true. Reads env at
|
|
110
|
+
// call time so flipping the var takes effect on the next PM tick
|
|
111
|
+
// without a daemon restart.
|
|
112
|
+
const useV2 = !isV2Disabled();
|
|
113
|
+
const promptInput = {
|
|
114
|
+
identifier: issue.identifier,
|
|
115
|
+
title: issue.title,
|
|
116
|
+
description: issue.description ?? "",
|
|
117
|
+
};
|
|
118
|
+
const prompt = useV2
|
|
119
|
+
? buildTriageV2Prompt(promptInput, sanitize)
|
|
120
|
+
: buildTriageV1Prompt(promptInput, sanitize);
|
|
121
121
|
const response = await callClaude(prompt);
|
|
122
122
|
const parsed = parseJsonObject(response);
|
|
123
123
|
if (!parsed) {
|
|
@@ -181,48 +181,12 @@ export async function triageNewIssues(input) {
|
|
|
181
181
|
const acceptanceCriteria = Array.isArray(parsed.acceptanceCriteria)
|
|
182
182
|
? parsed.acceptanceCriteria.filter((c) => typeof c === "string" && c.length > 0)
|
|
183
183
|
: [];
|
|
184
|
-
//
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
const existingDesc = issue.description ?? "";
|
|
191
|
-
if (acceptanceCriteria.length > 0 && !existingDesc.includes("**Acceptance Criteria:**")) {
|
|
192
|
-
const criteriaSection = `\n\n**Acceptance Criteria:**\n${acceptanceCriteria.map((c) => `- [ ] ${c}`).join("\n")}`;
|
|
193
|
-
updatePayload.description = existingDesc + criteriaSection;
|
|
194
|
-
}
|
|
195
|
-
await linearClient.updateIssue(issue.id, updatePayload);
|
|
196
|
-
// Tier 4 — comment includes the new design-doc fields so operators
|
|
197
|
-
// see the approach, open questions, and anti-scope before
|
|
198
|
-
// approving / unblocking a needs-design ticket.
|
|
199
|
-
const designDocBlock = [
|
|
200
|
-
approachSummary
|
|
201
|
-
? `\n\n**Approach (Tier 4):**\n${approachSummary}`
|
|
202
|
-
: "",
|
|
203
|
-
openQuestions.length > 0
|
|
204
|
-
? `\n\n**Open questions (must be answered before implement):**\n${openQuestions
|
|
205
|
-
.map((q) => `- ${q}`)
|
|
206
|
-
.join("\n")}`
|
|
207
|
-
: "",
|
|
208
|
-
antiAcceptanceCriteria.length > 0
|
|
209
|
-
? `\n\n**Anti-acceptance criteria (this should NOT do):**\n${antiAcceptanceCriteria
|
|
210
|
-
.map((q) => `- ${q}`)
|
|
211
|
-
.join("\n")}`
|
|
212
|
-
: "",
|
|
213
|
-
].join("");
|
|
214
|
-
await linearClient.createComment({
|
|
215
|
-
issueId: issue.id,
|
|
216
|
-
body: `🤖 **PM Agent — Triaged**${forceNeedsDesign ? " (routed to needs-design)" : ""}\n\n` +
|
|
217
|
-
`**Priority:** ${priority} | **Complexity:** ${complexity}\n` +
|
|
218
|
-
`**Labels:** ${issueLabels.join(", ")}\n` +
|
|
219
|
-
`**Pipeline:** ${pipelineLabel}\n` +
|
|
220
|
-
`**Rationale:** ${rationale}` +
|
|
221
|
-
(acceptanceCriteria.length > 0
|
|
222
|
-
? `\n\n**Generated Acceptance Criteria:**\n${acceptanceCriteria.map((c) => `- ${c}`).join("\n")}`
|
|
223
|
-
: "") +
|
|
224
|
-
designDocBlock,
|
|
225
|
-
});
|
|
184
|
+
// Tier 6b — extract optional v2 fields when v2 is active. When v1
|
|
185
|
+
// is forced (env var), skip the extraction so the result shape
|
|
186
|
+
// stays bit-compatible with v1.
|
|
187
|
+
const v2Fields = useV2 ? parseTriageV2Extensions(parsed) : {};
|
|
188
|
+
// Build the TriageResult once so both the description appender
|
|
189
|
+
// and the comment renderer consume the same source of truth.
|
|
226
190
|
const result = {
|
|
227
191
|
issueId: issue.identifier,
|
|
228
192
|
priority,
|
|
@@ -233,7 +197,29 @@ export async function triageNewIssues(input) {
|
|
|
233
197
|
...(approachSummary && { approachSummary }),
|
|
234
198
|
...(openQuestions.length > 0 && { openQuestions }),
|
|
235
199
|
...(antiAcceptanceCriteria.length > 0 && { antiAcceptanceCriteria }),
|
|
200
|
+
...v2Fields,
|
|
236
201
|
};
|
|
202
|
+
const updatePayload = { priority };
|
|
203
|
+
if (labelIds.length > 0)
|
|
204
|
+
updatePayload.labelIds = labelIds;
|
|
205
|
+
if (backlogStateId)
|
|
206
|
+
updatePayload.stateId = backlogStateId;
|
|
207
|
+
// Tier 6b — append all triage sections (AC + v2 fields) via the
|
|
208
|
+
// idempotent renderer. The function preserves existing sections
|
|
209
|
+
// already in the description (re-triage doesn't duplicate).
|
|
210
|
+
const existingDesc = issue.description ?? "";
|
|
211
|
+
const updatedDesc = appendTriageSectionsToDescription(existingDesc, result);
|
|
212
|
+
if (updatedDesc !== existingDesc) {
|
|
213
|
+
updatePayload.description = updatedDesc;
|
|
214
|
+
}
|
|
215
|
+
await linearClient.updateIssue(issue.id, updatePayload);
|
|
216
|
+
await linearClient.createComment({
|
|
217
|
+
issueId: issue.id,
|
|
218
|
+
body: renderTriageComment(result, {
|
|
219
|
+
forceNeedsDesign,
|
|
220
|
+
pipelineLabel,
|
|
221
|
+
}),
|
|
222
|
+
});
|
|
237
223
|
if (input.db) {
|
|
238
224
|
void logAuditEventUnchecked(input.db, pmTriageClassifiedEvent({
|
|
239
225
|
issueId: issue.identifier,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triage.js","sourceRoot":"","sources":["../../../src/pm/actions/triage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"triage.js","sourceRoot":"","sources":["../../../src/pm/actions/triage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Triage prediction quality (Tier 6b foundation for Tier 6e).
|
|
3
|
+
*
|
|
4
|
+
* Pure function. No I/O, no DB writes. Compares triage's `affectedFiles`
|
|
5
|
+
* prediction against the actual diff at run-completion time.
|
|
6
|
+
*
|
|
7
|
+
* Caller is responsible for providing consistent path shapes — this
|
|
8
|
+
* function does string equality only. The output shape is the contract
|
|
9
|
+
* Tier 6e will consume to write `pm.triage_quality_score` audit events.
|
|
10
|
+
*/
|
|
11
|
+
export interface PredictionQualityResult {
|
|
12
|
+
/** True iff `predicted` was supplied (i.e., triage v2 ran). */
|
|
13
|
+
hasV2Prediction: boolean;
|
|
14
|
+
/** Number of unique predicted paths. */
|
|
15
|
+
predicted: number;
|
|
16
|
+
/** Number of unique actual paths. */
|
|
17
|
+
actual: number;
|
|
18
|
+
/** Number of paths in both sets. */
|
|
19
|
+
intersection: number;
|
|
20
|
+
/** Predicted but not actually touched — sorted alphabetically. */
|
|
21
|
+
missed: string[];
|
|
22
|
+
/** Touched but not predicted — sorted alphabetically. */
|
|
23
|
+
unexpected: string[];
|
|
24
|
+
}
|
|
25
|
+
export declare function computeAffectedFilesPredictionQuality(predicted: string[] | undefined, actualDiff: string[]): PredictionQualityResult;
|
|
26
|
+
//# sourceMappingURL=triage-prediction-quality.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage-prediction-quality.d.ts","sourceRoot":"","sources":["../../src/pm/triage-prediction-quality.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,uBAAuB;IACtC,+DAA+D;IAC/D,eAAe,EAAE,OAAO,CAAC;IACzB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,yDAAyD;IACzD,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,wBAAgB,qCAAqC,CACnD,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,EAC/B,UAAU,EAAE,MAAM,EAAE,GACnB,uBAAuB,CA+BzB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Triage prediction quality (Tier 6b foundation for Tier 6e).
|
|
3
|
+
*
|
|
4
|
+
* Pure function. No I/O, no DB writes. Compares triage's `affectedFiles`
|
|
5
|
+
* prediction against the actual diff at run-completion time.
|
|
6
|
+
*
|
|
7
|
+
* Caller is responsible for providing consistent path shapes — this
|
|
8
|
+
* function does string equality only. The output shape is the contract
|
|
9
|
+
* Tier 6e will consume to write `pm.triage_quality_score` audit events.
|
|
10
|
+
*/
|
|
11
|
+
export function computeAffectedFilesPredictionQuality(predicted, actualDiff) {
|
|
12
|
+
const hasV2Prediction = Array.isArray(predicted);
|
|
13
|
+
const predictedSet = new Set(predicted ?? []);
|
|
14
|
+
const actualSet = new Set(actualDiff);
|
|
15
|
+
const intersection = new Set();
|
|
16
|
+
for (const p of predictedSet) {
|
|
17
|
+
if (actualSet.has(p))
|
|
18
|
+
intersection.add(p);
|
|
19
|
+
}
|
|
20
|
+
const missed = [];
|
|
21
|
+
for (const p of predictedSet) {
|
|
22
|
+
if (!actualSet.has(p))
|
|
23
|
+
missed.push(p);
|
|
24
|
+
}
|
|
25
|
+
missed.sort();
|
|
26
|
+
const unexpected = [];
|
|
27
|
+
for (const a of actualSet) {
|
|
28
|
+
if (!predictedSet.has(a))
|
|
29
|
+
unexpected.push(a);
|
|
30
|
+
}
|
|
31
|
+
unexpected.sort();
|
|
32
|
+
return {
|
|
33
|
+
hasV2Prediction,
|
|
34
|
+
predicted: predictedSet.size,
|
|
35
|
+
actual: actualSet.size,
|
|
36
|
+
intersection: intersection.size,
|
|
37
|
+
missed,
|
|
38
|
+
unexpected,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=triage-prediction-quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage-prediction-quality.js","sourceRoot":"","sources":["../../src/pm/triage-prediction-quality.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiBH,MAAM,UAAU,qCAAqC,CACnD,SAA+B,EAC/B,UAAoB;IAEpB,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEjD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAEtC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,CAAC,IAAI,EAAE,CAAC;IAEd,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,UAAU,CAAC,IAAI,EAAE,CAAC;IAElB,OAAO;QACL,eAAe;QACf,SAAS,EAAE,YAAY,CAAC,IAAI;QAC5B,MAAM,EAAE,SAAS,CAAC,IAAI;QACtB,YAAY,EAAE,YAAY,CAAC,IAAI;QAC/B,MAAM;QACN,UAAU;KACX,CAAC;AACJ,CAAC"}
|
package/dist/pm/types.d.ts
CHANGED
|
@@ -75,7 +75,67 @@ export interface TriageResult {
|
|
|
75
75
|
/** Tier 4 — "things this should NOT do" — anti-acceptance criteria the
|
|
76
76
|
* agent must respect to stay in scope. */
|
|
77
77
|
antiAcceptanceCriteria?: string[];
|
|
78
|
+
/** Tier 6b — assumptions the agent will take for granted. Operator-
|
|
79
|
+
* correctable via the Linear comment before implement burns tokens.
|
|
80
|
+
* Max 10. */
|
|
81
|
+
assumptions?: string[];
|
|
82
|
+
/** Tier 6b — concrete input/output pairs that ground the implement
|
|
83
|
+
* agent's generation. Max 3. */
|
|
84
|
+
examples?: Array<{
|
|
85
|
+
scenario: string;
|
|
86
|
+
expected: string;
|
|
87
|
+
}>;
|
|
88
|
+
/** Tier 6b — best-guess paths the implementation will touch. Compared
|
|
89
|
+
* against the actual diff at review time as a quality signal (Tier 6e
|
|
90
|
+
* consumer). Max 20. */
|
|
91
|
+
affectedFiles?: string[];
|
|
92
|
+
/** Tier 6b — which test file(s) the implement agent should start from
|
|
93
|
+
* and what shape of assertions to write. */
|
|
94
|
+
testStrategy?: {
|
|
95
|
+
unit?: string;
|
|
96
|
+
integration?: string;
|
|
97
|
+
};
|
|
98
|
+
/** Tier 6b — severity classification + the subsystems triage thinks
|
|
99
|
+
* the change touches. Feeds the cost gate and the auto-deep-review
|
|
100
|
+
* default. `areas` max 5. */
|
|
101
|
+
riskAssessment?: {
|
|
102
|
+
severity: "low" | "medium" | "high";
|
|
103
|
+
areas: string[];
|
|
104
|
+
};
|
|
78
105
|
}
|
|
106
|
+
export declare const TriageV2ExtensionsSchema: z.ZodObject<{
|
|
107
|
+
assumptions: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
108
|
+
examples: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
109
|
+
scenario: z.ZodString;
|
|
110
|
+
expected: z.ZodString;
|
|
111
|
+
}, z.core.$strip>>>;
|
|
112
|
+
affectedFiles: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
113
|
+
testStrategy: z.ZodOptional<z.ZodObject<{
|
|
114
|
+
unit: z.ZodOptional<z.ZodString>;
|
|
115
|
+
integration: z.ZodOptional<z.ZodString>;
|
|
116
|
+
}, z.core.$strip>>;
|
|
117
|
+
riskAssessment: z.ZodOptional<z.ZodObject<{
|
|
118
|
+
severity: z.ZodEnum<{
|
|
119
|
+
medium: "medium";
|
|
120
|
+
low: "low";
|
|
121
|
+
high: "high";
|
|
122
|
+
}>;
|
|
123
|
+
areas: z.ZodArray<z.ZodString>;
|
|
124
|
+
}, z.core.$strip>>;
|
|
125
|
+
}, z.core.$strict>;
|
|
126
|
+
export type TriageV2Extensions = z.infer<typeof TriageV2ExtensionsSchema>;
|
|
127
|
+
/**
|
|
128
|
+
* Tolerant pre-zod normaliser. Filters non-string elements from string
|
|
129
|
+
* arrays, drops examples missing `scenario` or `expected`, truncates list
|
|
130
|
+
* fields to their caps, and trims whitespace. Returns only the v2 fields
|
|
131
|
+
* present in `raw`; absent fields are absent from the result (not set to
|
|
132
|
+
* empty arrays).
|
|
133
|
+
*
|
|
134
|
+
* Drops the entire `riskAssessment` block when the severity enum fails so
|
|
135
|
+
* the caller falls back to the v1 shape rather than partially-populated
|
|
136
|
+
* v2.
|
|
137
|
+
*/
|
|
138
|
+
export declare function parseTriageV2Extensions(raw: unknown): TriageV2Extensions;
|
|
79
139
|
export interface ConflictCheckResult {
|
|
80
140
|
overlapRisk: "none" | "low" | "high";
|
|
81
141
|
likelyFiles: string[];
|
package/dist/pm/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/pm/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;iBAsC9B,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC;AAEtE,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,WAAW,CAAC;IACnB,gHAAgH;IAChH,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,SAAS,EAAE,UAAU,CAAC;IACtB,mDAAmD;IACnD,cAAc,EAAE,OAAO,CAAC;IACxB,sGAAsG;IACtG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B;qEACiE;IACjE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;6EAEyE;IACzE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;+CAC2C;IAC3C,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/pm/types.ts"],"names":[],"mappings":"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"}
|