@dendelion/paper-camp 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/assets/{index-DGXi8vpJ.js → index-C0wWs5ba.js} +2 -2
- package/dist/app/assets/index-C0wWs5ba.js.map +1 -0
- package/dist/app/assets/{index-CF8jC3IN.js → index-D-nmg_4I.js} +2 -2
- package/dist/app/assets/{index-CF8jC3IN.js.map → index-D-nmg_4I.js.map} +1 -1
- package/dist/app/assets/index-Djq8LvrZ.js +3 -0
- package/dist/app/assets/index-Djq8LvrZ.js.map +1 -0
- package/dist/app/assets/main-BA1w2y_E.css +1 -0
- package/dist/app/assets/main-DUy5DFoq.js +218 -0
- package/dist/app/assets/main-DUy5DFoq.js.map +1 -0
- package/dist/app/assets/{sidebar-section-C2j12TzE.js → sidebar-section-mXpllayv.js} +2 -2
- package/dist/app/assets/{sidebar-section-C2j12TzE.js.map → sidebar-section-mXpllayv.js.map} +1 -1
- package/dist/app/index.html +2 -2
- package/dist/chunks/{serializer.BfH7zTwv.js → serializer.DqcFa2e1.js} +75 -66
- package/dist/chunks/serializer.DqcFa2e1.js.map +1 -0
- package/dist/cli/index.js +6187 -6079
- package/dist/cli/index.js.map +1 -1
- package/dist/core/env.d.ts +0 -5
- package/dist/core/env.d.ts.map +1 -1
- package/dist/core/git-pr/branch.d.ts +2 -6
- package/dist/core/git-pr/branch.d.ts.map +1 -1
- package/dist/core/git-pr/pr-lookup.d.ts +3 -44
- package/dist/core/git-pr/pr-lookup.d.ts.map +1 -1
- package/dist/core/git-pr/pr.d.ts +0 -76
- package/dist/core/git-pr/pr.d.ts.map +1 -1
- package/dist/core/git-pr/scopes.d.ts +0 -6
- package/dist/core/git-pr/scopes.d.ts.map +1 -1
- package/dist/core/index.js +36 -35
- package/dist/core/parse/frontmatter-schemas.d.ts +0 -8
- package/dist/core/parse/frontmatter-schemas.d.ts.map +1 -1
- package/dist/core/parse/parser.d.ts +3 -31
- package/dist/core/parse/parser.d.ts.map +1 -1
- package/dist/core/parse/schemas.d.ts.map +1 -1
- package/dist/core/readers.d.ts +0 -27
- package/dist/core/readers.d.ts.map +1 -1
- package/dist/core/scaffold/scaffold.d.ts +0 -6
- package/dist/core/scaffold/scaffold.d.ts.map +1 -1
- package/dist/core/scaffold/templates.d.ts +0 -6
- package/dist/core/scaffold/templates.d.ts.map +1 -1
- package/dist/core/serialize/content-hash.d.ts +0 -6
- package/dist/core/serialize/content-hash.d.ts.map +1 -1
- package/dist/core/serialize/serializer.d.ts +0 -60
- package/dist/core/serialize/serializer.d.ts.map +1 -1
- package/dist/core/status/status.d.ts +0 -19
- package/dist/core/status/status.d.ts.map +1 -1
- package/dist/types/index.d.ts +12 -29
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/app/assets/index-DGXi8vpJ.js.map +0 -1
- package/dist/app/assets/main-D66GnCKz.css +0 -1
- package/dist/app/assets/main-DJDNx4Xs.js +0 -218
- package/dist/app/assets/main-DJDNx4Xs.js.map +0 -1
- package/dist/chunks/serializer.BfH7zTwv.js.map +0 -1
|
@@ -1,13 +1,5 @@
|
|
|
1
1
|
import { EntityEntry, LogEntry, PhaseItem, SuggestionEntry } from '../../types/index';
|
|
2
2
|
export declare function todayDateString(): string;
|
|
3
|
-
/**
|
|
4
|
-
* Mints the next `<KIND>-<N>` plan ID from the persistent counter in `papercamp/config.json`,
|
|
5
|
-
* incrementing and writing it back. Calls are chained through a module-level promise so two
|
|
6
|
-
* near-simultaneous calls within this process never read the same counter value and mint a
|
|
7
|
-
* duplicate ID — this does not protect against a concurrent call from a separate process (e.g.
|
|
8
|
-
* the CLI racing the dev server), which is an accepted gap for a local single-user tool.
|
|
9
|
-
* Returns undefined if the config file is missing or has no `nextId` counters yet.
|
|
10
|
-
*/
|
|
11
3
|
export declare function assignPlanId(configPath: string, kind: string): Promise<string | undefined>;
|
|
12
4
|
interface NewPlanInput {
|
|
13
5
|
title: string;
|
|
@@ -43,18 +35,9 @@ interface NewOpenQuestionInput {
|
|
|
43
35
|
}
|
|
44
36
|
export declare function formatOpenQuestionEntry(input: NewOpenQuestionInput): string;
|
|
45
37
|
export declare function formatProgressEntry(date: string, items: string[]): string;
|
|
46
|
-
/**
|
|
47
|
-
* Prepends a single bullet under today's `## YYYY-MM-DD` heading at the top of a
|
|
48
|
-
* progress.md file, creating the heading if today's isn't already there (newest
|
|
49
|
-
* day stays first). Shared by the agent's progress hook and the PostToolUse
|
|
50
|
-
* new-file logger so both write the same grammar.
|
|
51
|
-
*/
|
|
52
38
|
export declare function prependProgressItem(progressPath: string, item: string): Promise<void>;
|
|
53
|
-
/** Serializes an array of plan entries back to a plans.md file. */
|
|
54
39
|
export declare function formatPlans(entries: NewPlanInput[]): string;
|
|
55
|
-
/** Serializes an array of open-question entries back to an open-questions.md file. */
|
|
56
40
|
export declare function formatOpenQuestions(entries: NewOpenQuestionInput[]): string;
|
|
57
|
-
/** Appends a pre-formatted block to a papercamp file, separated by a single blank line. */
|
|
58
41
|
export declare function appendBlock(filePath: string, block: string): Promise<void>;
|
|
59
42
|
export declare function serializeFrontmatter(data: Record<string, unknown>): string;
|
|
60
43
|
interface NewPlanFileInput {
|
|
@@ -74,19 +57,6 @@ interface NewPlanFileInput {
|
|
|
74
57
|
log?: LogEntry[];
|
|
75
58
|
clarifications?: LogEntry[];
|
|
76
59
|
}
|
|
77
|
-
/**
|
|
78
|
-
* Serializes a plan entry as a standalone file with YAML frontmatter.
|
|
79
|
-
* Output format:
|
|
80
|
-
* ---
|
|
81
|
-
* id: FEAT-24
|
|
82
|
-
* kind: feat
|
|
83
|
-
* ...
|
|
84
|
-
* ---
|
|
85
|
-
* body...
|
|
86
|
-
*
|
|
87
|
-
* ### Phases
|
|
88
|
-
* ...
|
|
89
|
-
*/
|
|
90
60
|
export declare function formatPlanFile(input: NewPlanFileInput): string;
|
|
91
61
|
interface NewEntityFileInput {
|
|
92
62
|
id: string;
|
|
@@ -105,18 +75,7 @@ interface NewEntityFileInput {
|
|
|
105
75
|
log?: LogEntry[];
|
|
106
76
|
clarifications?: LogEntry[];
|
|
107
77
|
}
|
|
108
|
-
/**
|
|
109
|
-
* Serializes a unified entity file — same body sections as formatPlanFile
|
|
110
|
-
* (Clarifications/Phases/Log), but `type` instead of `kind`, no `idea:`
|
|
111
|
-
* backlink, and no `## id: title` body heading (title lives in frontmatter
|
|
112
|
-
* only).
|
|
113
|
-
*/
|
|
114
78
|
export declare function formatEntityFile(input: NewEntityFileInput): string;
|
|
115
|
-
/**
|
|
116
|
-
* Mints the next lifetime IDEA-N entity id from the unified `nextId.idea`
|
|
117
|
-
* counter — the single id space every entity lives in. Same
|
|
118
|
-
* chaining/guarantees as assignPlanId (which it delegates to).
|
|
119
|
-
*/
|
|
120
79
|
export declare function assignEntityId(configPath: string): Promise<string | undefined>;
|
|
121
80
|
interface NewIdeaFileInput {
|
|
122
81
|
id: string;
|
|
@@ -126,28 +85,9 @@ interface NewIdeaFileInput {
|
|
|
126
85
|
body?: string;
|
|
127
86
|
log?: LogEntry[];
|
|
128
87
|
}
|
|
129
|
-
/**
|
|
130
|
-
* Serializes an idea entry as a standalone file with YAML frontmatter.
|
|
131
|
-
*/
|
|
132
88
|
export declare function formatIdeaFile(input: NewIdeaFileInput): string;
|
|
133
|
-
/**
|
|
134
|
-
* Moves an entity from papercamp/ideas/<id>.md to papercamp/ideas/archive/<id>.md.
|
|
135
|
-
* This is a pure file move — no parse-and-re-serialize step.
|
|
136
|
-
* Returns true if the file was moved, false if no file exists for this entity.
|
|
137
|
-
*/
|
|
138
89
|
export declare function archiveEntityFile(root: string, entityId: string): Promise<boolean>;
|
|
139
|
-
/**
|
|
140
|
-
* Removes one line from suggestions.md's flat log. Re-parses each candidate
|
|
141
|
-
* line with parseSuggestions' own grammar and compares the parsed fields —
|
|
142
|
-
* not a reconstructed literal string — since parseSuggestions trims title/
|
|
143
|
-
* description and a reconstruction would miss extra internal whitespace an
|
|
144
|
-
* LLM-authored line might contain. Only the first match is removed —
|
|
145
|
-
* suggestions carry no id, so field matching is the only way to address a
|
|
146
|
-
* specific line (see IDEA-62's promote/dismiss routes, both of which call
|
|
147
|
-
* this before writing the file back).
|
|
148
|
-
*/
|
|
149
90
|
export declare function removeSuggestionLine(markdown: string, target: SuggestionEntry): string;
|
|
150
|
-
/** Generates papercamp/ideas/index.md, the one unified table. */
|
|
151
91
|
export declare function formatEntitiesIndex(entities: EntityEntry[]): string;
|
|
152
92
|
export {};
|
|
153
93
|
//# sourceMappingURL=serializer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../../../src/core/serialize/serializer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAG3F,wBAAgB,eAAe,IAAI,MAAM,CAExC;
|
|
1
|
+
{"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../../../src/core/serialize/serializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +1,8 @@
|
|
|
1
1
|
import { EntityStatus, PhaseItem, PrInfo } from '../../types/index';
|
|
2
|
-
/** The subset of an entity's shape the status ladder needs to look at. */
|
|
3
2
|
export interface StatusDerivationInput {
|
|
4
3
|
kind?: 'note';
|
|
5
4
|
status?: EntityStatus;
|
|
6
5
|
phases: PhaseItem[];
|
|
7
6
|
}
|
|
8
|
-
/**
|
|
9
|
-
* Derives lifecycle status from the entity's phases and its GitHub PR instead of
|
|
10
|
-
* trusting the stored `status` field, so it can't drift from reality. Tracking
|
|
11
|
-
* keys off the PR (matched by id), not a local branch: the PR is canonical
|
|
12
|
-
* across clones and survives the branch being deleted after merge.
|
|
13
|
-
*
|
|
14
|
-
* Ladder: idea (no phases) -> planned (phases, no PR) -> in-progress (PR open or
|
|
15
|
-
* draft) -> review (PR open/draft AND every phase checked) -> done (PR merged).
|
|
16
|
-
* A closed-unmerged PR reads as `dropped`. `dropped` can never be derived
|
|
17
|
-
* (abandonment leaves no trace), so a stored `dropped` always passes through;
|
|
18
|
-
* notes track open/done/dropped by hand and pass through unchanged.
|
|
19
|
-
*
|
|
20
|
-
* `pr` is the entity's resolved PR, or `undefined` when it has none / the lookup
|
|
21
|
-
* couldn't run. `prLookupResolved` says which: `false` (no `gh`, offline) falls
|
|
22
|
-
* the PR-backed rungs back to the stored override or a phases-only `planned`;
|
|
23
|
-
* `true` with no PR is a confirmed "no PR", so it derives `planned`/`idea` (a
|
|
24
|
-
* stored terminal `done` from an unmatchable legacy PR is still trusted).
|
|
25
|
-
*/
|
|
26
7
|
export declare function deriveStatus(entity: StatusDerivationInput, pr: PrInfo | undefined, prLookupResolved: boolean): EntityStatus | undefined;
|
|
27
8
|
//# sourceMappingURL=status.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/core/status/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEzE,
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/core/status/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEzE,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAQD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,qBAAqB,EAC7B,EAAE,EAAE,MAAM,GAAG,SAAS,EACtB,gBAAgB,EAAE,OAAO,GACxB,YAAY,GAAG,SAAS,CAgB1B"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -17,7 +17,6 @@ export interface PhaseItem {
|
|
|
17
17
|
description?: string;
|
|
18
18
|
source?: 'review';
|
|
19
19
|
}
|
|
20
|
-
/** Raw shape produced by the generic heading-block parser, before per-file validation. */
|
|
21
20
|
export interface RawEntry {
|
|
22
21
|
title: string;
|
|
23
22
|
fields: Record<string, string>;
|
|
@@ -38,12 +37,6 @@ export interface ParseResult<T> {
|
|
|
38
37
|
export type PrState = 'draft' | 'open' | 'closed' | 'merged';
|
|
39
38
|
/** GitHub's PR review decision, as surfaced by `gh pr list --json reviewDecision`. */
|
|
40
39
|
export type ReviewDecision = 'approved' | 'changes-requested' | 'review-required';
|
|
41
|
-
/**
|
|
42
|
-
* A single unresolved review comment/thread on a PR — the per-comment detail
|
|
43
|
-
* `PrInfo.unresolvedThreadCount` only counts. Fetched by the fix-review launch
|
|
44
|
-
* path (not `core/pr.ts`'s worklist resolver, which only needs the count) and
|
|
45
|
-
* fed to `buildFixReviewPrompt` in `prompts.ts`.
|
|
46
|
-
*/
|
|
47
40
|
export interface ReviewThread {
|
|
48
41
|
/** GraphQL node id — what `resolveReviewThread`/`replyToReviewThread` address. */
|
|
49
42
|
id: string;
|
|
@@ -53,21 +46,12 @@ export interface ReviewThread {
|
|
|
53
46
|
author?: string;
|
|
54
47
|
body: string;
|
|
55
48
|
}
|
|
56
|
-
/**
|
|
57
|
-
* What a fix-review agent reports back, parsed from the JSON object its prompt
|
|
58
|
-
* requires as its final line. The agent no longer commits — a human does — so
|
|
59
|
-
* this carries the message it proposes plus its per-comment verdicts, which drive
|
|
60
|
-
* which PR threads get resolved (once the fix is pushed) and which get a reply
|
|
61
|
-
* explaining why they were left alone.
|
|
62
|
-
*/
|
|
63
49
|
export interface FixReviewResult {
|
|
64
50
|
commit: {
|
|
65
51
|
title: string;
|
|
66
52
|
message: string;
|
|
67
53
|
};
|
|
68
|
-
/** Thread ids the agent says its changes settle. */
|
|
69
54
|
addressed: string[];
|
|
70
|
-
/** Thread ids it deliberately left alone, each with the reason to post back. */
|
|
71
55
|
skipped: {
|
|
72
56
|
threadId: string;
|
|
73
57
|
why: string;
|
|
@@ -101,7 +85,6 @@ export interface PlanEntry {
|
|
|
101
85
|
phases: PhaseItem[];
|
|
102
86
|
log?: LogEntry[];
|
|
103
87
|
clarifications?: LogEntry[];
|
|
104
|
-
/** Live-resolved PR for this entity's branch, when one exists — see `core/pr.ts`. */
|
|
105
88
|
pr?: PrInfo;
|
|
106
89
|
}
|
|
107
90
|
export interface DecisionEntry {
|
|
@@ -165,11 +148,6 @@ export interface ProgressEntry {
|
|
|
165
148
|
date: string;
|
|
166
149
|
items: string[];
|
|
167
150
|
}
|
|
168
|
-
/**
|
|
169
|
-
* A single line in `papercamp/suggestions.md` — an agent's disposable "you
|
|
170
|
-
* might want to do X" hunch. No `id`, no `status`: it only becomes a real
|
|
171
|
-
* idea if a human promotes it (see IDEA-62).
|
|
172
|
-
*/
|
|
173
151
|
export interface SuggestionEntry {
|
|
174
152
|
date: string;
|
|
175
153
|
title: string;
|
|
@@ -178,8 +156,7 @@ export interface SuggestionEntry {
|
|
|
178
156
|
export interface EnvEntry {
|
|
179
157
|
key: string;
|
|
180
158
|
value: string;
|
|
181
|
-
/** Set on GET responses
|
|
182
|
-
* (secrets are never sent to the client). Absent when writing. */
|
|
159
|
+
/** Set on GET responses when the value is withheld — secrets never reach the client. */
|
|
183
160
|
isSet?: boolean;
|
|
184
161
|
}
|
|
185
162
|
export interface AgentConfig {
|
|
@@ -238,7 +215,18 @@ export interface GitStatusResponse {
|
|
|
238
215
|
export type BranchHygieneStatus = 'clean-on-main' | 'stale-merged' | 'stale-no-upstream' | 'dirty' | 'fine';
|
|
239
216
|
export type AgentTaskStatus = 'starting' | 'running' | 'stopping' | 'done' | 'error';
|
|
240
217
|
export type TaskKind = 'phase' | 'audit' | 'batch-reconcile' | 'run-all' | 'draft' | 'extend' | 'suggest' | 'commit-suggest' | 'overlap-check' | 'sync' | 'reconcile' | 'fix-review';
|
|
218
|
+
export interface TaskLogEntry {
|
|
219
|
+
id: string;
|
|
220
|
+
taskKind: TaskKind;
|
|
221
|
+
planId?: string;
|
|
222
|
+
planTitle: string;
|
|
223
|
+
agentId: AgentId;
|
|
224
|
+
startedAt: string;
|
|
225
|
+
endedAt: string;
|
|
226
|
+
outcome: 'done' | 'error';
|
|
227
|
+
}
|
|
241
228
|
export interface AgentTaskState {
|
|
229
|
+
id: string;
|
|
242
230
|
status: AgentTaskStatus;
|
|
243
231
|
taskKind: TaskKind;
|
|
244
232
|
planTitle: string;
|
|
@@ -247,11 +235,6 @@ export interface AgentTaskState {
|
|
|
247
235
|
ideaId?: string;
|
|
248
236
|
agentId: AgentId;
|
|
249
237
|
lines: string[];
|
|
250
|
-
/**
|
|
251
|
-
* fix-review only, once it has reported: the commit message the agent proposes
|
|
252
|
-
* for the work it left uncommitted. The commit form prefills from this — the
|
|
253
|
-
* agent knows the intent behind each fix, which a diff-based suggestion doesn't.
|
|
254
|
-
*/
|
|
255
238
|
suggestedCommit?: {
|
|
256
239
|
title: string;
|
|
257
240
|
message: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAE5F,eAAO,MAAM,aAAa,EAAE,UAAU,EAOrC,CAAC;AAEF,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;AAEtE,eAAO,MAAM,UAAU,EAAE,QAAQ,EAAiD,CAAC;AAEnF,eAAO,MAAM,SAAS,sCAAuC,CAAC;AAE9D,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAGhD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,YAAY,CAAC;AAEtD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,CAAC;AAEjD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB;AAED,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/types/index.ts"],"sourcesContent":["export type PlanStatus = 'idea' | 'planned' | 'in-progress' | 'review' | 'done' | 'dropped';\n\nexport const PLAN_STATUSES: PlanStatus[] = [\n 'idea',\n 'planned',\n 'in-progress',\n 'review',\n 'done',\n 'dropped',\n];\n\nexport interface LogEntry {\n date: string;\n text: string;\n}\n\nexport type PlanKind = 'feat' | 'fix' | 'chore' | 'docs' | 'refactor';\n\nexport const PLAN_KINDS: PlanKind[] = ['feat', 'fix', 'chore', 'docs', 'refactor'];\n\nexport const AGENT_IDS = ['claude-code', 'opencode'] as const;\n\nexport type AgentId = (typeof AGENT_IDS)[number];\n\nexport const AGENT_LABELS: Record<AgentId, string> = {\n 'claude-code': 'Claude Code',\n opencode: 'OpenCode',\n};\n\nexport type DecisionStatus = 'decided' | 'superseded';\n\nexport type QuestionStatus = 'open' | 'resolved';\n\nexport interface PhaseItem {\n done: boolean;\n text: string;\n description?: string;\n source?: 'review';\n}\n\n/** Raw shape produced by the generic heading-block parser, before per-file validation. */\nexport interface RawEntry {\n title: string;\n fields: Record<string, string>;\n body: string;\n phases: PhaseItem[];\n log?: LogEntry[];\n clarifications?: LogEntry[];\n}\n\nexport interface ParseWarning {\n title: string;\n message: string;\n}\n\nexport interface ParseResult<T> {\n entries: T[];\n warnings: ParseWarning[];\n}\n\n/** A PR's reviewable/mergeable state, as surfaced by `gh pr list`. */\nexport type PrState = 'draft' | 'open' | 'closed' | 'merged';\n\n/** GitHub's PR review decision, as surfaced by `gh pr list --json reviewDecision`. */\nexport type ReviewDecision = 'approved' | 'changes-requested' | 'review-required';\n\n/**\n * A single unresolved review comment/thread on a PR — the per-comment detail\n * `PrInfo.unresolvedThreadCount` only counts. Fetched by the fix-review launch\n * path (not `core/pr.ts`'s worklist resolver, which only needs the count) and\n * fed to `buildFixReviewPrompt` in `prompts.ts`.\n */\nexport interface ReviewThread {\n /** GraphQL node id — what `resolveReviewThread`/`replyToReviewThread` address. */\n id: string;\n /** File path the comment is anchored to; absent for a PR-level (not diff-anchored) comment. */\n path?: string;\n line?: number;\n author?: string;\n body: string;\n}\n\n/**\n * What a fix-review agent reports back, parsed from the JSON object its prompt\n * requires as its final line. The agent no longer commits — a human does — so\n * this carries the message it proposes plus its per-comment verdicts, which drive\n * which PR threads get resolved (once the fix is pushed) and which get a reply\n * explaining why they were left alone.\n */\nexport interface FixReviewResult {\n commit: { title: string; message: string };\n /** Thread ids the agent says its changes settle. */\n addressed: string[];\n /** Thread ids it deliberately left alone, each with the reason to post back. */\n skipped: { threadId: string; why: string }[];\n}\n\n/** Live-resolved PR info for an entity's branch — see `core/pr.ts`. */\nexport interface PrInfo {\n number: number;\n url: string;\n state: PrState;\n /** Undefined when no review has been requested/decided, or when unresolved (offline, closed/merged PR). */\n reviewDecision?: ReviewDecision;\n /** Count of unresolved review threads. Only fetched for open/draft PRs; undefined when not fetched or unresolved. */\n unresolvedThreadCount?: number;\n /** Whether a comment or review landed after the PR's last commit — a proxy for \"since the last agent pass\" (a pass ends with a push). Only fetched for open/draft PRs. */\n hasNewCommentsSincePush?: boolean;\n}\n\nexport interface PlanEntry {\n title: string;\n status: PlanStatus;\n kind?: PlanKind;\n id?: string;\n idea?: string;\n agent?: AgentId;\n created: string;\n updated?: string;\n audited?: string;\n auditedHash?: string;\n tags: string[];\n body: string;\n phases: PhaseItem[];\n log?: LogEntry[];\n clarifications?: LogEntry[];\n /** Live-resolved PR for this entity's branch, when one exists — see `core/pr.ts`. */\n pr?: PrInfo;\n}\n\nexport interface DecisionEntry {\n title: string;\n date: string;\n status: DecisionStatus;\n supersededBy?: string;\n body: string;\n}\n\nexport interface OpenQuestionEntry {\n title: string;\n status: QuestionStatus;\n raised: string;\n resolvedBy?: string;\n blocks?: string;\n body: string;\n}\n\nexport type ConsistencyIssueKind =\n | 'dangling-resolved-by'\n | 'dangling-superseded-by'\n | 'blocked-plan-active';\n\nexport interface ConsistencyIssue {\n kind: ConsistencyIssueKind;\n section: 'decisions' | 'open-questions';\n title: string;\n message: string;\n planId?: string;\n}\n\nexport type IdeaKind = 'idea' | 'note';\n\nexport type IdeaStatus = 'open' | 'done' | 'dropped';\n\nexport interface IdeaEntry {\n id: string | null;\n title: string;\n body: string;\n kind?: IdeaKind;\n status?: IdeaStatus;\n log?: LogEntry[];\n}\n\n// ---------------------------------------------------------------------------\n// Unified entity (FEAT-42 phases 7+ — one file per entity: an \"idea\" for its\n// whole life, plan as an optional Phases section. Replaces PlanEntry/IdeaEntry\n// once the migration cutover lands.)\n// ---------------------------------------------------------------------------\n\n/** Work classification — same Conventional-Commits values as PlanKind; `kind` renamed to `type` in the unified schema. */\nexport type EntityType = PlanKind;\n\n/** Plan lifecycle plus the note-only `open`. Notes use open → done/dropped; everything else uses the PlanStatus track. */\nexport type EntityStatus = PlanStatus | 'open';\n\nexport interface EntityEntry {\n id: string;\n title: string;\n /** Absent until the entity is classified (usually when its plan is drafted). */\n type?: EntityType;\n /** \"note\" marks an entity that never grows phases. */\n kind?: 'note';\n /** Stored override, not the source of truth — see entityFrontmatterSchema. */\n status?: EntityStatus;\n agent?: AgentId;\n created: string;\n updated?: string;\n audited?: string;\n auditedHash?: string;\n tags: string[];\n body: string;\n phases: PhaseItem[];\n log?: LogEntry[];\n clarifications?: LogEntry[];\n}\n\nexport interface ProgressEntry {\n date: string;\n items: string[];\n}\n\n/**\n * A single line in `papercamp/suggestions.md` — an agent's disposable \"you\n * might want to do X\" hunch. No `id`, no `status`: it only becomes a real\n * idea if a human promotes it (see IDEA-62).\n */\nexport interface SuggestionEntry {\n date: string;\n title: string;\n description: string;\n}\n\nexport interface EnvEntry {\n key: string;\n value: string;\n /** Set on GET responses: the key exists in .env but its value is withheld\n * (secrets are never sent to the client). Absent when writing. */\n isSet?: boolean;\n}\n\nexport interface AgentConfig {\n agent: AgentId;\n model?: string;\n effort?: string;\n}\n\n/** Model/effort passed to an adapter's buildArgs — the AgentConfig minus the agent id. */\nexport interface AgentRunOptions {\n model?: string;\n effort?: string;\n}\n\n/** Maps option names to a fixed value list (renders a Select) or null (free-text or hidden). */\nexport type AgentOptionsDescriptor = Record<string, string[] | null | undefined>;\n\nexport const AGENT_OPTIONS: Record<AgentId, AgentOptionsDescriptor> = {\n 'claude-code': {\n model: ['opus', 'sonnet', 'fable', 'haiku'],\n effort: ['low', 'medium', 'high', 'xhigh', 'max'],\n },\n opencode: {\n model: null,\n },\n};\n\nexport function coerceAgentConfig(v: unknown): AgentConfig {\n const toAgent = (a: unknown): AgentId =>\n AGENT_IDS.includes(a as AgentId) ? (a as AgentId) : 'claude-code';\n if (typeof v === 'string') return { agent: toAgent(v) };\n // Tolerate null/undefined and partial legacy entries — a missing key must not\n // throw (that would 500 the /api/config read this coercion exists to protect).\n const obj = (v ?? {}) as Record<string, unknown>;\n return {\n agent: toAgent(obj.agent),\n ...(typeof obj.model === 'string' && { model: obj.model }),\n ...(typeof obj.effort === 'string' && { effort: obj.effort }),\n };\n}\n\nexport interface DefaultAgentsMap {\n phase: AgentConfig;\n planDraft: AgentConfig;\n ideaExtend: AgentConfig;\n commitSuggest: AgentConfig;\n}\n\nexport const DEFAULT_AGENTS: DefaultAgentsMap = {\n phase: { agent: 'opencode' },\n planDraft: { agent: 'claude-code' },\n ideaExtend: { agent: 'claude-code' },\n commitSuggest: { agent: 'claude-code' },\n};\n\nexport interface PaperCampConfig {\n version: string;\n projectName: string;\n initializedAt: string;\n /** The unified-entity `idea` counter; the per-kind plan counters are legacy, present only in pre-migration configs. */\n nextId?: Partial<Record<PlanKind, number>> & { idea?: number };\n port?: number;\n defaultAgents?: DefaultAgentsMap;\n /** Off by default. When true, the PostToolUse hook logs new-file creations to progress.md. */\n autoLogNewFiles?: boolean;\n}\n\nexport type CheckStatus = 'stale' | 'running' | 'pass' | 'fail';\n\nexport interface CheckResult {\n status: CheckStatus;\n lastRun: string | null;\n output: string;\n}\n\nexport type CheckName = 'lint' | 'format' | 'test' | 'consistency';\n\nexport interface GitStatusEntry {\n path: string;\n status: string;\n staged: boolean;\n renameSource?: string;\n}\n\nexport interface GitStatusResponse {\n branch: string;\n entries: GitStatusEntry[];\n ahead: number;\n branchHygiene: BranchHygieneStatus;\n}\n\nexport type BranchHygieneStatus =\n | 'clean-on-main'\n | 'stale-merged'\n | 'stale-no-upstream'\n | 'dirty'\n | 'fine';\n\nexport type AgentTaskStatus = 'starting' | 'running' | 'stopping' | 'done' | 'error';\n\nexport type TaskKind =\n | 'phase'\n | 'audit'\n | 'batch-reconcile'\n | 'run-all'\n | 'draft'\n | 'extend'\n | 'suggest'\n | 'commit-suggest'\n | 'overlap-check'\n | 'sync'\n | 'reconcile'\n | 'fix-review';\n\nexport interface AgentTaskState {\n status: AgentTaskStatus;\n taskKind: TaskKind;\n planTitle: string;\n planId?: string;\n phaseIndex?: number;\n ideaId?: string;\n agentId: AgentId;\n lines: string[];\n /**\n * fix-review only, once it has reported: the commit message the agent proposes\n * for the work it left uncommitted. The commit form prefills from this — the\n * agent knows the intent behind each fix, which a diff-based suggestion doesn't.\n */\n suggestedCommit?: { title: string; message: string };\n}\n\n// The AI Check-overlap action's triage result (IDEA-44 Tier 2): does the typed\n// text belong inside an existing idea, extend one, or is it genuinely new?\nexport interface OverlapVerdict {\n verdict: 'existing' | 'extend' | 'new';\n targetId: string | null;\n reasoning: string;\n}\n\n// A single entity's proposed rewrite from a batch reconcile sweep, held server-side\n// (see startBatchReconcile in agent.ts) and served via GET /api/agent/reconcile-queue\n// once the sweep's `before` snapshot for that entity is known to have changed.\nexport interface ReconcileQueueItem {\n planId: string;\n title: string;\n before: { body: string; phases: PhaseItem[] };\n}\n"],"names":["PLAN_STATUSES","PLAN_KINDS","AGENT_IDS","AGENT_LABELS","AGENT_OPTIONS","coerceAgentConfig","v","toAgent","a","obj","DEFAULT_AGENTS"],"mappings":"AAEO,MAAMA,IAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASaC,IAAyB,CAAC,QAAQ,OAAO,SAAS,QAAQ,UAAU,GAEpEC,IAAY,CAAC,eAAe,UAAU,GAItCC,IAAwC;AAAA,EACnD,eAAe;AAAA,EACf,UAAU;AACZ,GA0NaC,IAAyD;AAAA,EACpE,eAAe;AAAA,IACb,OAAO,CAAC,QAAQ,UAAU,SAAS,OAAO;AAAA,IAC1C,QAAQ,CAAC,OAAO,UAAU,QAAQ,SAAS,KAAK;AAAA,EAAA;AAAA,EAElD,UAAU;AAAA,IACR,OAAO;AAAA,EAAA;AAEX;AAEO,SAASC,EAAkBC,GAAyB;AACzD,QAAMC,IAAU,CAACC,MACfN,EAAU,SAASM,CAAY,IAAKA,IAAgB;AACtD,MAAI,OAAOF,KAAM,SAAU,QAAO,EAAE,OAAOC,EAAQD,CAAC,EAAA;AAGpD,QAAMG,IAAOH,KAAK,CAAA;AAClB,SAAO;AAAA,IACL,OAAOC,EAAQE,EAAI,KAAK;AAAA,IACxB,GAAI,OAAOA,EAAI,SAAU,YAAY,EAAE,OAAOA,EAAI,MAAA;AAAA,IAClD,GAAI,OAAOA,EAAI,UAAW,YAAY,EAAE,QAAQA,EAAI,OAAA;AAAA,EAAO;AAE/D;AASO,MAAMC,IAAmC;AAAA,EAC9C,OAAO,EAAE,OAAO,WAAA;AAAA,EAChB,WAAW,EAAE,OAAO,cAAA;AAAA,EACpB,YAAY,EAAE,OAAO,cAAA;AAAA,EACrB,eAAe,EAAE,OAAO,cAAA;AAC1B;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/types/index.ts"],"sourcesContent":["export type PlanStatus = 'idea' | 'planned' | 'in-progress' | 'review' | 'done' | 'dropped';\n\nexport const PLAN_STATUSES: PlanStatus[] = [\n 'idea',\n 'planned',\n 'in-progress',\n 'review',\n 'done',\n 'dropped',\n];\n\nexport interface LogEntry {\n date: string;\n text: string;\n}\n\nexport type PlanKind = 'feat' | 'fix' | 'chore' | 'docs' | 'refactor';\n\nexport const PLAN_KINDS: PlanKind[] = ['feat', 'fix', 'chore', 'docs', 'refactor'];\n\nexport const AGENT_IDS = ['claude-code', 'opencode'] as const;\n\nexport type AgentId = (typeof AGENT_IDS)[number];\n\nexport const AGENT_LABELS: Record<AgentId, string> = {\n 'claude-code': 'Claude Code',\n opencode: 'OpenCode',\n};\n\nexport type DecisionStatus = 'decided' | 'superseded';\n\nexport type QuestionStatus = 'open' | 'resolved';\n\nexport interface PhaseItem {\n done: boolean;\n text: string;\n description?: string;\n source?: 'review';\n}\n\nexport interface RawEntry {\n title: string;\n fields: Record<string, string>;\n body: string;\n phases: PhaseItem[];\n log?: LogEntry[];\n clarifications?: LogEntry[];\n}\n\nexport interface ParseWarning {\n title: string;\n message: string;\n}\n\nexport interface ParseResult<T> {\n entries: T[];\n warnings: ParseWarning[];\n}\n\n/** A PR's reviewable/mergeable state, as surfaced by `gh pr list`. */\nexport type PrState = 'draft' | 'open' | 'closed' | 'merged';\n\n/** GitHub's PR review decision, as surfaced by `gh pr list --json reviewDecision`. */\nexport type ReviewDecision = 'approved' | 'changes-requested' | 'review-required';\n\n// Per-comment detail; PrInfo.unresolvedThreadCount only counts these.\nexport interface ReviewThread {\n /** GraphQL node id — what `resolveReviewThread`/`replyToReviewThread` address. */\n id: string;\n /** File path the comment is anchored to; absent for a PR-level (not diff-anchored) comment. */\n path?: string;\n line?: number;\n author?: string;\n body: string;\n}\n\n// Parsed from the JSON object a fix-review agent's prompt requires as its final line.\nexport interface FixReviewResult {\n commit: { title: string; message: string };\n addressed: string[];\n skipped: { threadId: string; why: string }[];\n}\n\n/** Live-resolved PR info for an entity's branch — see `core/pr.ts`. */\nexport interface PrInfo {\n number: number;\n url: string;\n state: PrState;\n /** Undefined when no review has been requested/decided, or when unresolved (offline, closed/merged PR). */\n reviewDecision?: ReviewDecision;\n /** Count of unresolved review threads. Only fetched for open/draft PRs; undefined when not fetched or unresolved. */\n unresolvedThreadCount?: number;\n /** Whether a comment or review landed after the PR's last commit — a proxy for \"since the last agent pass\" (a pass ends with a push). Only fetched for open/draft PRs. */\n hasNewCommentsSincePush?: boolean;\n}\n\nexport interface PlanEntry {\n title: string;\n status: PlanStatus;\n kind?: PlanKind;\n id?: string;\n idea?: string;\n agent?: AgentId;\n created: string;\n updated?: string;\n audited?: string;\n auditedHash?: string;\n tags: string[];\n body: string;\n phases: PhaseItem[];\n log?: LogEntry[];\n clarifications?: LogEntry[];\n pr?: PrInfo;\n}\n\nexport interface DecisionEntry {\n title: string;\n date: string;\n status: DecisionStatus;\n supersededBy?: string;\n body: string;\n}\n\nexport interface OpenQuestionEntry {\n title: string;\n status: QuestionStatus;\n raised: string;\n resolvedBy?: string;\n blocks?: string;\n body: string;\n}\n\nexport type ConsistencyIssueKind =\n | 'dangling-resolved-by'\n | 'dangling-superseded-by'\n | 'blocked-plan-active';\n\nexport interface ConsistencyIssue {\n kind: ConsistencyIssueKind;\n section: 'decisions' | 'open-questions';\n title: string;\n message: string;\n planId?: string;\n}\n\nexport type IdeaKind = 'idea' | 'note';\n\nexport type IdeaStatus = 'open' | 'done' | 'dropped';\n\nexport interface IdeaEntry {\n id: string | null;\n title: string;\n body: string;\n kind?: IdeaKind;\n status?: IdeaStatus;\n log?: LogEntry[];\n}\n\n// Unified entity — one file per entity, plan as an optional Phases section.\n// Supersedes PlanEntry/IdeaEntry once the migration cutover lands.\n\n/** Work classification — same Conventional-Commits values as PlanKind; `kind` renamed to `type` in the unified schema. */\nexport type EntityType = PlanKind;\n\n/** Plan lifecycle plus the note-only `open`. Notes use open → done/dropped; everything else uses the PlanStatus track. */\nexport type EntityStatus = PlanStatus | 'open';\n\nexport interface EntityEntry {\n id: string;\n title: string;\n /** Absent until the entity is classified (usually when its plan is drafted). */\n type?: EntityType;\n /** \"note\" marks an entity that never grows phases. */\n kind?: 'note';\n /** Stored override, not the source of truth — see entityFrontmatterSchema. */\n status?: EntityStatus;\n agent?: AgentId;\n created: string;\n updated?: string;\n audited?: string;\n auditedHash?: string;\n tags: string[];\n body: string;\n phases: PhaseItem[];\n log?: LogEntry[];\n clarifications?: LogEntry[];\n}\n\nexport interface ProgressEntry {\n date: string;\n items: string[];\n}\n\n// No `id`/`status`: it only becomes a real idea if a human promotes it.\nexport interface SuggestionEntry {\n date: string;\n title: string;\n description: string;\n}\n\nexport interface EnvEntry {\n key: string;\n value: string;\n /** Set on GET responses when the value is withheld — secrets never reach the client. */\n isSet?: boolean;\n}\n\nexport interface AgentConfig {\n agent: AgentId;\n model?: string;\n effort?: string;\n}\n\n/** Model/effort passed to an adapter's buildArgs — the AgentConfig minus the agent id. */\nexport interface AgentRunOptions {\n model?: string;\n effort?: string;\n}\n\n/** Maps option names to a fixed value list (renders a Select) or null (free-text or hidden). */\nexport type AgentOptionsDescriptor = Record<string, string[] | null | undefined>;\n\nexport const AGENT_OPTIONS: Record<AgentId, AgentOptionsDescriptor> = {\n 'claude-code': {\n model: ['opus', 'sonnet', 'fable', 'haiku'],\n effort: ['low', 'medium', 'high', 'xhigh', 'max'],\n },\n opencode: {\n model: null,\n },\n};\n\nexport function coerceAgentConfig(v: unknown): AgentConfig {\n const toAgent = (a: unknown): AgentId =>\n AGENT_IDS.includes(a as AgentId) ? (a as AgentId) : 'claude-code';\n if (typeof v === 'string') return { agent: toAgent(v) };\n // A missing key must not throw — that would 500 the /api/config read this protects.\n const obj = (v ?? {}) as Record<string, unknown>;\n return {\n agent: toAgent(obj.agent),\n ...(typeof obj.model === 'string' && { model: obj.model }),\n ...(typeof obj.effort === 'string' && { effort: obj.effort }),\n };\n}\n\nexport interface DefaultAgentsMap {\n phase: AgentConfig;\n planDraft: AgentConfig;\n ideaExtend: AgentConfig;\n commitSuggest: AgentConfig;\n}\n\nexport const DEFAULT_AGENTS: DefaultAgentsMap = {\n phase: { agent: 'opencode' },\n planDraft: { agent: 'claude-code' },\n ideaExtend: { agent: 'claude-code' },\n commitSuggest: { agent: 'claude-code' },\n};\n\nexport interface PaperCampConfig {\n version: string;\n projectName: string;\n initializedAt: string;\n /** The unified-entity `idea` counter; the per-kind plan counters are legacy, present only in pre-migration configs. */\n nextId?: Partial<Record<PlanKind, number>> & { idea?: number };\n port?: number;\n defaultAgents?: DefaultAgentsMap;\n /** Off by default. When true, the PostToolUse hook logs new-file creations to progress.md. */\n autoLogNewFiles?: boolean;\n}\n\nexport type CheckStatus = 'stale' | 'running' | 'pass' | 'fail';\n\nexport interface CheckResult {\n status: CheckStatus;\n lastRun: string | null;\n output: string;\n}\n\nexport type CheckName = 'lint' | 'format' | 'test' | 'consistency';\n\nexport interface GitStatusEntry {\n path: string;\n status: string;\n staged: boolean;\n renameSource?: string;\n}\n\nexport interface GitStatusResponse {\n branch: string;\n entries: GitStatusEntry[];\n ahead: number;\n branchHygiene: BranchHygieneStatus;\n}\n\nexport type BranchHygieneStatus =\n | 'clean-on-main'\n | 'stale-merged'\n | 'stale-no-upstream'\n | 'dirty'\n | 'fine';\n\nexport type AgentTaskStatus = 'starting' | 'running' | 'stopping' | 'done' | 'error';\n\nexport type TaskKind =\n | 'phase'\n | 'audit'\n | 'batch-reconcile'\n | 'run-all'\n | 'draft'\n | 'extend'\n | 'suggest'\n | 'commit-suggest'\n | 'overlap-check'\n | 'sync'\n | 'reconcile'\n | 'fix-review';\n\n// Persisted to papercamp/tasks.log (JSON Lines) — survives a dev-server restart,\n// unlike the in-memory task registry.\nexport interface TaskLogEntry {\n id: string;\n taskKind: TaskKind;\n planId?: string;\n planTitle: string;\n agentId: AgentId;\n startedAt: string;\n endedAt: string;\n outcome: 'done' | 'error';\n}\n\nexport interface AgentTaskState {\n id: string;\n status: AgentTaskStatus;\n taskKind: TaskKind;\n planTitle: string;\n planId?: string;\n phaseIndex?: number;\n ideaId?: string;\n agentId: AgentId;\n lines: string[];\n // fix-review only: prefills the commit form once the agent has reported.\n suggestedCommit?: { title: string; message: string };\n}\n\nexport interface OverlapVerdict {\n verdict: 'existing' | 'extend' | 'new';\n targetId: string | null;\n reasoning: string;\n}\n\nexport interface ReconcileQueueItem {\n planId: string;\n title: string;\n before: { body: string; phases: PhaseItem[] };\n}\n"],"names":["PLAN_STATUSES","PLAN_KINDS","AGENT_IDS","AGENT_LABELS","AGENT_OPTIONS","coerceAgentConfig","v","toAgent","a","obj","DEFAULT_AGENTS"],"mappings":"AAEO,MAAMA,IAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASaC,IAAyB,CAAC,QAAQ,OAAO,SAAS,QAAQ,UAAU,GAEpEC,IAAY,CAAC,eAAe,UAAU,GAItCC,IAAwC;AAAA,EACnD,eAAe;AAAA,EACf,UAAU;AACZ,GAmMaC,IAAyD;AAAA,EACpE,eAAe;AAAA,IACb,OAAO,CAAC,QAAQ,UAAU,SAAS,OAAO;AAAA,IAC1C,QAAQ,CAAC,OAAO,UAAU,QAAQ,SAAS,KAAK;AAAA,EAAA;AAAA,EAElD,UAAU;AAAA,IACR,OAAO;AAAA,EAAA;AAEX;AAEO,SAASC,EAAkBC,GAAyB;AACzD,QAAMC,IAAU,CAACC,MACfN,EAAU,SAASM,CAAY,IAAKA,IAAgB;AACtD,MAAI,OAAOF,KAAM,SAAU,QAAO,EAAE,OAAOC,EAAQD,CAAC,EAAA;AAEpD,QAAMG,IAAOH,KAAK,CAAA;AAClB,SAAO;AAAA,IACL,OAAOC,EAAQE,EAAI,KAAK;AAAA,IACxB,GAAI,OAAOA,EAAI,SAAU,YAAY,EAAE,OAAOA,EAAI,MAAA;AAAA,IAClD,GAAI,OAAOA,EAAI,UAAW,YAAY,EAAE,QAAQA,EAAI,OAAA;AAAA,EAAO;AAE/D;AASO,MAAMC,IAAmC;AAAA,EAC9C,OAAO,EAAE,OAAO,WAAA;AAAA,EAChB,WAAW,EAAE,OAAO,cAAA;AAAA,EACpB,YAAY,EAAE,OAAO,cAAA;AAAA,EACrB,eAAe,EAAE,OAAO,cAAA;AAC1B;"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-DGXi8vpJ.js","sources":["../../../src/app/services/system/config-api.ts","../../../src/app/services/system/config-files-api.ts","../../../src/app/services/system/env-api.ts","../../../src/app/features/settings/settings-page.tsx","../../../src/app/features/settings/components/settings-sidebar.tsx"],"sourcesContent":["import type { AgentId, DefaultAgentsMap, PaperCampConfig } from '@/types/index';\n\nexport const fetchConfig = async (): Promise<PaperCampConfig | null> => {\n try {\n const response = await fetch('/api/config');\n if (!response.ok) return null;\n return response.json();\n } catch {\n return null;\n }\n};\n\nexport const saveConfig = async (updates: {\n port?: number;\n projectName?: string;\n defaultAgent?: AgentId;\n defaultAgents?: DefaultAgentsMap;\n}): Promise<boolean> => {\n try {\n const response = await fetch('/api/config', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(updates),\n });\n return response.ok;\n } catch {\n return false;\n }\n};\n","export const fetchConfigs = async (): Promise<string[]> => {\n try {\n const response = await fetch('/api/configs');\n if (!response.ok) return [];\n const data = (await response.json()) as { files: string[] };\n return data.files;\n } catch {\n return [];\n }\n};\n\nexport const fetchConfigFile = async (name: string): Promise<string | null> => {\n try {\n const response = await fetch(`/api/configs?name=${encodeURIComponent(name)}`);\n if (!response.ok) return null;\n const data = (await response.json()) as { name: string; content: string };\n return data.content;\n } catch {\n return null;\n }\n};\n","import type { EnvEntry } from '@/types/index';\n\nexport interface EnvFile {\n exists: boolean;\n exampleExists: boolean;\n entries: EnvEntry[];\n missingKeys: string[];\n}\n\nexport const fetchEnv = async (): Promise<EnvFile> => {\n try {\n const response = await fetch('/api/env');\n if (!response.ok) return { exists: false, exampleExists: false, entries: [], missingKeys: [] };\n return await response.json();\n } catch {\n return { exists: false, exampleExists: false, entries: [], missingKeys: [] };\n }\n};\n\n/** `keep` preserves a set key's existing value server-side (the client never has\n * it, since GET withholds secret values). */\nexport type EnvEntryInput = { key: string; value: string; keep?: boolean };\n\nexport const saveEnv = async (entries: EnvEntryInput[]): Promise<boolean> => {\n try {\n const response = await fetch('/api/env', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ entries }),\n });\n return response.ok;\n } catch {\n return false;\n }\n};\n","import { PageTitle } from '@/app/components/page-title';\nimport { useProjectIdentity } from '@/app/hooks';\nimport {\n fetchConfig,\n fetchConfigFile,\n fetchEnv,\n saveConfig,\n saveEnv,\n uploadIcon,\n} from '@/app/services/system';\nimport { useAppStore } from '@/app/stores/app-store';\nimport { color, fontFamily, fontSize, space } from '@/app/styles/tokens';\nimport {\n AGENT_IDS,\n AGENT_LABELS,\n AGENT_OPTIONS,\n type AgentConfig,\n type AgentId,\n DEFAULT_AGENTS,\n type DefaultAgentsMap,\n type EnvEntry,\n type PaperCampConfig,\n} from '@/types/index';\nimport {\n Alert,\n Button,\n Card,\n CloseIcon,\n CodeBlock,\n Divider,\n IconButton,\n Input,\n Select,\n Stamp,\n Table,\n useToast,\n} from '@dendelion/paper-ui';\nimport { useEffect, useRef, useState } from 'react';\n\nconst TASK_TYPE_KEYS = ['phase', 'planDraft', 'ideaExtend', 'commitSuggest'] as const;\ntype TaskTypeKey = (typeof TASK_TYPE_KEYS)[number];\n\nconst TASK_TYPE_LABELS: Record<TaskTypeKey, string> = {\n phase: 'Phase run',\n planDraft: 'Plan draft',\n ideaExtend: 'Idea extend',\n commitSuggest: 'Commit suggest',\n};\n\ninterface AgentTaskRowProps {\n taskKey: TaskTypeKey;\n agentConfig: AgentConfig;\n isLast: boolean;\n onSave: (key: TaskTypeKey, config: AgentConfig) => Promise<void>;\n}\n\nconst TASK_COLUMN_WIDTH = 110;\nconst AGENT_COLUMN_WIDTH = 140;\nconst MODEL_COLUMN_WIDTH = 160;\nconst EFFORT_COLUMN_WIDTH = 110;\n\nconst AgentTaskRowHeader = () => (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: space[3],\n paddingBottom: space[1],\n }}\n >\n <span style={{ width: TASK_COLUMN_WIDTH, flexShrink: 0, fontSize: fontSize.sm, opacity: 0.45 }}>\n Task\n </span>\n <span\n style={{ width: AGENT_COLUMN_WIDTH, flexShrink: 0, fontSize: fontSize.sm, opacity: 0.45 }}\n >\n Agent\n </span>\n <span\n style={{ width: MODEL_COLUMN_WIDTH, flexShrink: 0, fontSize: fontSize.sm, opacity: 0.45 }}\n >\n Model\n </span>\n <span\n style={{ width: EFFORT_COLUMN_WIDTH, flexShrink: 0, fontSize: fontSize.sm, opacity: 0.45 }}\n >\n Effort\n </span>\n </div>\n);\n\nconst AgentTaskRow = ({ taskKey, agentConfig, isLast, onSave }: AgentTaskRowProps) => {\n // Fall back if the config carries an unknown agent id — never white-screen the page.\n const opts = AGENT_OPTIONS[agentConfig.agent] ?? AGENT_OPTIONS['claude-code'];\n const modelOpts = opts.model;\n const effortOpts = opts.effort;\n const [localModel, setLocalModel] = useState(agentConfig.model ?? '');\n\n useEffect(() => {\n setLocalModel(agentConfig.model ?? '');\n }, [agentConfig.model]);\n\n const handleAgentChange = (v: string) => {\n const newId = v as AgentId;\n const newOpts = AGENT_OPTIONS[newId];\n const newConfig: AgentConfig = { agent: newId };\n // Only carry the model over if the new agent accepts it: free-text (null) takes\n // anything, an enumerated list must contain it — otherwise a claude model like\n // 'opus' would leak into opencode and fail at launch.\n if (\n agentConfig.model &&\n (newOpts.model === null || newOpts.model?.includes(agentConfig.model))\n ) {\n newConfig.model = agentConfig.model;\n }\n if (agentConfig.effort && Array.isArray(newOpts.effort)) newConfig.effort = agentConfig.effort;\n onSave(taskKey, newConfig);\n };\n\n const handleModelSelectChange = (v: string) => {\n onSave(taskKey, { ...agentConfig, model: v || undefined });\n };\n\n const handleModelInputBlur = () => {\n onSave(taskKey, { ...agentConfig, model: localModel || undefined });\n };\n\n const handleEffortChange = (v: string) => {\n onSave(taskKey, { ...agentConfig, effort: v || undefined });\n };\n\n return (\n <>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: space[3],\n paddingBottom: space[2],\n paddingTop: space[2],\n }}\n >\n <span\n style={{ width: TASK_COLUMN_WIDTH, flexShrink: 0, fontSize: fontSize.sm, opacity: 0.65 }}\n >\n {TASK_TYPE_LABELS[taskKey]}\n </span>\n <Select\n size=\"small\"\n width={AGENT_COLUMN_WIDTH}\n value={agentConfig.agent}\n onChange={handleAgentChange}\n options={AGENT_IDS.map((id) => ({ value: id, label: AGENT_LABELS[id] }))}\n />\n {Array.isArray(modelOpts) ? (\n <Select\n size=\"small\"\n width={MODEL_COLUMN_WIDTH}\n value={agentConfig.model ?? ''}\n onChange={handleModelSelectChange}\n options={[\n { value: '', label: 'Default' },\n ...modelOpts.map((m) => ({ value: m, label: m })),\n ]}\n />\n ) : modelOpts === null ? (\n <Input\n size=\"small\"\n style={{ width: MODEL_COLUMN_WIDTH }}\n value={localModel}\n placeholder=\"Default model\"\n onChange={(e) => setLocalModel(e.target.value)}\n onBlur={handleModelInputBlur}\n />\n ) : null}\n {/* Reserve the effort slot even when the agent has no effort options, so\n switching agents doesn't change the control count and shift the row. */}\n <div style={{ visibility: Array.isArray(effortOpts) ? 'visible' : 'hidden' }}>\n <Select\n size=\"small\"\n width={EFFORT_COLUMN_WIDTH}\n value={agentConfig.effort ?? ''}\n onChange={handleEffortChange}\n options={[\n { value: '', label: 'Default' },\n ...(Array.isArray(effortOpts) ? effortOpts : []).map((e) => ({ value: e, label: e })),\n ]}\n />\n </div>\n </div>\n {!isLast && <Divider />}\n </>\n );\n};\n\nconst GeneralSection = () => {\n const fileRef = useRef<HTMLInputElement>(null);\n const [config, setConfig] = useState<PaperCampConfig | null | undefined>(undefined);\n const { iconDataUri: fetchedIconDataUri, loading: identityLoading } = useProjectIdentity();\n const [uploadedIconDataUri, setUploadedIconDataUri] = useState<string | null>(null);\n const iconDataUri = uploadedIconDataUri ?? fetchedIconDataUri;\n const [uploading, setUploading] = useState(false);\n const [portInput, setPortInput] = useState('');\n const [nameInput, setNameInput] = useState('');\n const { toast } = useToast();\n\n useEffect(() => {\n fetchConfig().then((c) => {\n setConfig(c);\n if (c?.port !== undefined) setPortInput(String(c.port));\n if (c?.projectName !== undefined) setNameInput(c.projectName);\n });\n }, []);\n\n const handleSaveAgentConfig = async (key: TaskTypeKey, newEntry: AgentConfig) => {\n const current = config?.defaultAgents;\n const updated: DefaultAgentsMap = {\n phase: current?.phase ?? DEFAULT_AGENTS.phase,\n planDraft: current?.planDraft ?? DEFAULT_AGENTS.planDraft,\n ideaExtend: current?.ideaExtend ?? DEFAULT_AGENTS.ideaExtend,\n commitSuggest: current?.commitSuggest ?? DEFAULT_AGENTS.commitSuggest,\n [key]: newEntry,\n };\n const ok = await saveConfig({ defaultAgents: updated });\n if (ok) {\n setConfig((prev) => (prev ? { ...prev, defaultAgents: updated } : prev));\n toast({ title: 'Saved', variant: 'success' });\n } else {\n toast({ title: 'Failed to save', variant: 'error' });\n }\n };\n\n const handleSavePort = async () => {\n const port = Number(portInput);\n if (!config || !Number.isInteger(port) || port <= 0 || port === config.port) return;\n const ok = await saveConfig({ port });\n if (ok) {\n setConfig((prev) => (prev ? { ...prev, port } : prev));\n toast({ title: 'Saved', variant: 'success' });\n } else {\n toast({ title: 'Failed to save', variant: 'error' });\n }\n };\n\n const handleSaveName = async () => {\n const projectName = nameInput.trim();\n if (!config || !projectName || projectName === config.projectName) return;\n const ok = await saveConfig({ projectName });\n if (ok) {\n setConfig((prev) => (prev ? { ...prev, projectName } : prev));\n setNameInput(projectName);\n toast({ title: 'Saved', variant: 'success' });\n } else {\n toast({ title: 'Failed to save', variant: 'error' });\n }\n };\n\n const handleFile = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n setUploading(true);\n const reader = new FileReader();\n reader.onloadend = async () => {\n const dataUri = reader.result as string;\n const ok = await uploadIcon(dataUri);\n setUploading(false);\n if (ok) {\n setUploadedIconDataUri(dataUri);\n toast({ title: 'Saved', variant: 'success' });\n } else {\n toast({ title: 'Failed to save', variant: 'error' });\n }\n };\n reader.readAsDataURL(file);\n };\n\n return (\n <div>\n <div style={{ marginBottom: space[6] }}>\n <h2 style={{ margin: 0 }}>Project Info</h2>\n </div>\n {config === undefined && <p>Loading…</p>}\n {config === null && (\n <Alert variant=\"warning\">\n No papercamp/config.json found — run <code>paper-camp init</code> in this directory first.\n </Alert>\n )}\n {config && (\n <Card size=\"small\">\n <div\n style={{\n display: 'flex',\n alignItems: 'flex-end',\n gap: space[3],\n paddingBottom: space[3],\n }}\n >\n <Input\n value={nameInput}\n onChange={(e) => setNameInput(e.target.value)}\n onBlur={handleSaveName}\n label=\"Project Name\"\n />\n <Stamp\n size=\"small\"\n fillColor=\"rgba(143, 185, 150, 0.25)\"\n textColor={color.accentGreenDark}\n >\n v{config.version}\n </Stamp>\n </div>\n <Divider />\n\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: space[3],\n paddingBottom: space[3],\n paddingTop: space[3],\n }}\n >\n {iconDataUri && (\n <img\n src={iconDataUri}\n alt=\"Project icon\"\n style={{\n width: 40,\n height: 40,\n objectFit: 'contain',\n flexShrink: 0,\n borderRadius: 4,\n }}\n />\n )}\n <div>\n {/* paper-ui has no file-input component, so this raw input is intentional */}\n <input\n ref={fileRef}\n type=\"file\"\n accept=\".svg,.png,.jpg,.jpeg,.gif,.webp\"\n onChange={handleFile}\n style={{ display: 'none' }}\n />\n <Button\n variant=\"secondary\"\n size=\"small\"\n onClick={() => fileRef.current?.click()}\n disabled={uploading}\n >\n {uploading ? 'Uploading…' : 'Choose File'}\n </Button>\n {identityLoading && (\n <p className=\"text-sm\" style={{ opacity: 0.5, margin: `${space[1]} 0 0` }}>\n Loading…\n </p>\n )}\n {!identityLoading && !iconDataUri && !uploading && (\n <p className=\"text-sm\" style={{ opacity: 0.45, margin: `${space[1]} 0 0` }}>\n No icon set.\n </p>\n )}\n </div>\n </div>\n <Divider />\n\n <div\n style={{\n display: 'flex',\n alignItems: 'flex-end',\n gap: space[3],\n paddingBottom: space[3],\n paddingTop: space[3],\n }}\n >\n <Input\n type=\"number\"\n value={portInput}\n onChange={(e) => setPortInput(e.target.value)}\n onBlur={handleSavePort}\n label=\"Port\"\n helperText=\"Default for `paper-camp dev`. Does not affect the running server.\"\n />\n </div>\n <Divider />\n\n <AgentTaskRowHeader />\n {TASK_TYPE_KEYS.map((key, idx) => (\n <AgentTaskRow\n key={key}\n taskKey={key}\n agentConfig={config.defaultAgents?.[key] ?? DEFAULT_AGENTS[key]}\n isLast={idx === TASK_TYPE_KEYS.length - 1}\n onSave={handleSaveAgentConfig}\n />\n ))}\n </Card>\n )}\n\n <p style={{ opacity: 0.45, fontSize: fontSize.sm, marginTop: space[4] }}>\n <strong>Initialized:</strong>{' '}\n {config ? new Date(config.initializedAt).toLocaleString() : '—'}\n </p>\n </div>\n );\n};\n\ninterface ScriptRow {\n name: string;\n command: string;\n}\n\nconst parsePackageScripts = (content: string): ScriptRow[] | null => {\n try {\n const parsed = JSON.parse(content) as { scripts?: Record<string, string> };\n if (!parsed.scripts || typeof parsed.scripts !== 'object') return null;\n return Object.entries(parsed.scripts).map(([name, command]) => ({ name, command }));\n } catch {\n return null;\n }\n};\n\nconst ConfigEditorSection = ({ fileName }: { fileName: string }) => {\n const [content, setContent] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n setLoading(true);\n fetchConfigFile(fileName).then((c) => {\n setContent(c);\n setLoading(false);\n });\n }, [fileName]);\n\n if (loading) return <p>Loading…</p>;\n if (content === null) {\n return <Alert variant=\"warning\">Could not load file — {fileName} not found.</Alert>;\n }\n\n const scripts = fileName === 'package.json' ? parsePackageScripts(content) : null;\n\n return (\n <div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: space[4],\n }}\n >\n <h2 style={{ margin: 0 }}>{fileName}</h2>\n </div>\n {scripts ? (\n <Table\n data={scripts}\n columns={[\n {\n key: 'name',\n header: 'Script',\n cell: (row: ScriptRow) => (\n <span style={{ fontFamily: fontFamily.mono }}>{row.name}</span>\n ),\n width: 4,\n },\n {\n key: 'command',\n header: 'Command',\n cell: (row: ScriptRow) => (\n <span style={{ fontFamily: fontFamily.mono }}>{row.command}</span>\n ),\n },\n ]}\n />\n ) : (\n <CodeBlock code={content} filename={fileName} />\n )}\n </div>\n );\n};\n\nconst isSecretKey = (key: string) => /key|secret|token|password/i.test(key);\n\nconst EnvSection = () => {\n const [loading, setLoading] = useState(true);\n const [rows, setRows] = useState<EnvEntry[]>([]);\n const [missingKeys, setMissingKeys] = useState<string[]>([]);\n const [revealed, setRevealed] = useState<Set<number>>(new Set());\n const [saving, setSaving] = useState(false);\n const [saved, setSaved] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n fetchEnv().then((env) => {\n setRows(env.entries);\n setMissingKeys(env.missingKeys);\n setLoading(false);\n });\n }, []);\n\n const updateRow = (index: number, patch: Partial<EnvEntry>) => {\n setRows((prev) => prev.map((row, i) => (i === index ? { ...row, ...patch } : row)));\n };\n\n const handleAddRow = () => setRows((prev) => [...prev, { key: '', value: '' }]);\n\n const handleAddMissingKey = (key: string) => {\n setRows((prev) => [...prev, { key, value: '' }]);\n setMissingKeys((prev) => prev.filter((k) => k !== key));\n };\n\n const handleDeleteRow = (index: number) => {\n setRows((prev) => prev.filter((_, i) => i !== index));\n setRevealed((prev) => {\n const next = new Set(prev);\n next.delete(index);\n return next;\n });\n };\n\n const toggleReveal = (index: number) =>\n setRevealed((prev) => {\n const next = new Set(prev);\n if (next.has(index)) next.delete(index);\n else next.add(index);\n return next;\n });\n\n const handleSave = async () => {\n const trimmed = rows\n .map((row) => ({ key: row.key.trim(), value: row.value, isSet: row.isSet }))\n .filter((row) => row.key.length > 0);\n const keys = new Set(trimmed.map((row) => row.key));\n if (keys.size !== trimmed.length) {\n setError('Duplicate keys are not allowed');\n return;\n }\n setError(null);\n setSaving(true);\n // A set key left blank keeps its existing (withheld) value; a typed value\n // replaces it. The server never received the old secret, so it backfills.\n const ok = await saveEnv(\n trimmed.map((row) => ({\n key: row.key,\n value: row.value,\n keep: !!row.isSet && row.value === '',\n })),\n );\n setSaving(false);\n if (ok) {\n // Everything just saved now exists with a withheld value — reflect that.\n setRows(trimmed.map((row) => ({ key: row.key, value: '', isSet: true })));\n setSaved(true);\n setTimeout(() => setSaved(false), 2000);\n } else {\n setError('Failed to save .env');\n }\n };\n\n if (loading) return <p>Loading…</p>;\n\n return (\n <div>\n <h2 style={{ margin: 0, marginBottom: space[4] }}>Environment Variables</h2>\n {error && <Alert variant=\"warning\">Could not save — {error}</Alert>}\n {missingKeys.length > 0 && (\n <Card size=\"small\" accent accentColor=\"amber\">\n <p style={{ margin: 0, fontWeight: 600 }}>Missing from .env</p>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: space[2], alignItems: 'center' }}>\n <span>Present in .env.example but not set:</span>\n {missingKeys.map((key) => (\n <Button\n key={key}\n variant=\"secondary\"\n size=\"small\"\n onClick={() => handleAddMissingKey(key)}\n >\n + {key}\n </Button>\n ))}\n </div>\n </Card>\n )}\n <Table\n data={rows}\n columns={[\n {\n key: 'key',\n header: 'Key',\n cell: (row: EnvEntry, index: number) => (\n <Input\n value={row.key}\n placeholder=\"KEY\"\n style={{ fontFamily: fontFamily.mono }}\n onChange={(e) => updateRow(index, { key: e.target.value })}\n />\n ),\n width: 6,\n },\n {\n key: 'value',\n header: 'Value',\n cell: (row: EnvEntry, index: number) => {\n const masked = isSecretKey(row.key) && !revealed.has(index);\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: space[2] }}>\n <Input\n type={masked ? 'password' : 'text'}\n value={row.value}\n placeholder={row.isSet ? '•••••• set — leave blank to keep' : 'value'}\n style={{ fontFamily: fontFamily.mono, flex: 1 }}\n onChange={(e) => updateRow(index, { value: e.target.value })}\n />\n {isSecretKey(row.key) && (\n <Button variant=\"ghost\" size=\"small\" onClick={() => toggleReveal(index)}>\n {masked ? 'Show' : 'Hide'}\n </Button>\n )}\n </div>\n );\n },\n },\n {\n key: 'actions',\n header: '',\n width: 2,\n cell: (_row: EnvEntry, index: number) => (\n <IconButton\n icon={<CloseIcon />}\n variant=\"ghost\"\n size=\"small\"\n label=\"Remove variable\"\n onClick={() => handleDeleteRow(index)}\n />\n ),\n },\n ]}\n />\n <div style={{ display: 'flex', alignItems: 'center', gap: space[3], marginTop: space[4] }}>\n <Button variant=\"secondary\" size=\"small\" onClick={handleAddRow}>\n + Add variable\n </Button>\n <Button variant=\"primary\" size=\"small\" onClick={handleSave} disabled={saving}>\n {saving ? 'Saving…' : 'Save'}\n </Button>\n {saved && (\n <span className=\"text-sm\" style={{ opacity: 0.6 }}>\n Saved\n </span>\n )}\n </div>\n </div>\n );\n};\n\nexport const SettingsPage = () => {\n const activeSection = useAppStore((s) => s.activeSettingsSection);\n\n return (\n <div>\n <PageTitle>Settings</PageTitle>\n {activeSection === 'general' && <GeneralSection />}\n {activeSection === 'env' && <EnvSection />}\n {activeSection.startsWith('config:') && (\n <ConfigEditorSection fileName={activeSection.slice('config:'.length)} />\n )}\n </div>\n );\n};\n","import { fetchConfigs, fetchEnv } from '@/app/services/system';\nimport { useAppStore } from '@/app/stores/app-store';\nimport { ListItem } from '@dendelion/paper-ui';\nimport { useEffect, useState } from 'react';\nimport { SidebarSection } from '../../plans/components/sidebar-section';\n\nexport const SettingsSidebar = () => {\n const activeSection = useAppStore((s) => s.activeSettingsSection);\n const setActiveSection = useAppStore((s) => s.setActiveSettingsSection);\n const configFiles = useAppStore((s) => s.settingsConfigFiles);\n const setConfigFiles = useAppStore((s) => s.setSettingsConfigFiles);\n const [showEnv, setShowEnv] = useState(false);\n\n useEffect(() => {\n fetchConfigs().then(setConfigFiles);\n fetchEnv().then((env) => setShowEnv(env.exists || env.exampleExists));\n }, [setConfigFiles]);\n\n return (\n <>\n <SidebarSection label=\"General\">\n <ListItem\n size=\"small\"\n active={activeSection === 'general'}\n onClick={() => setActiveSection('general')}\n >\n Project Info\n </ListItem>\n </SidebarSection>\n\n {showEnv && (\n <SidebarSection label=\"Environment\">\n <ListItem\n size=\"small\"\n active={activeSection === 'env'}\n onClick={() => setActiveSection('env')}\n >\n Env Vars\n </ListItem>\n </SidebarSection>\n )}\n\n {configFiles.length > 0 && (\n <SidebarSection label=\"Config Files\">\n {configFiles.map((name) => (\n <ListItem\n key={name}\n size=\"small\"\n active={activeSection === `config:${name}`}\n onClick={() => setActiveSection(`config:${name}`)}\n >\n {name}\n </ListItem>\n ))}\n </SidebarSection>\n )}\n </>\n );\n};\n"],"names":["fetchConfig","response","saveConfig","updates","fetchConfigs","fetchConfigFile","name","fetchEnv","saveEnv","entries","TASK_TYPE_KEYS","TASK_TYPE_LABELS","TASK_COLUMN_WIDTH","AGENT_COLUMN_WIDTH","MODEL_COLUMN_WIDTH","EFFORT_COLUMN_WIDTH","AgentTaskRowHeader","jsxs","space","jsx","fontSize","AgentTaskRow","taskKey","agentConfig","isLast","onSave","opts","AGENT_OPTIONS","modelOpts","effortOpts","localModel","setLocalModel","useState","useEffect","handleAgentChange","v","newId","newOpts","newConfig","_a","handleModelSelectChange","handleModelInputBlur","handleEffortChange","Fragment","Select","AGENT_IDS","id","AGENT_LABELS","m","Input","e","Divider","GeneralSection","fileRef","useRef","config","setConfig","fetchedIconDataUri","identityLoading","useProjectIdentity","uploadedIconDataUri","setUploadedIconDataUri","iconDataUri","uploading","setUploading","portInput","setPortInput","nameInput","setNameInput","toast","useToast","c","handleSaveAgentConfig","key","newEntry","current","updated","DEFAULT_AGENTS","prev","handleSavePort","port","handleSaveName","projectName","handleFile","file","reader","dataUri","ok","uploadIcon","Alert","Card","Stamp","color","Button","idx","parsePackageScripts","content","parsed","command","ConfigEditorSection","fileName","setContent","loading","setLoading","scripts","Table","row","fontFamily","CodeBlock","isSecretKey","EnvSection","rows","setRows","missingKeys","setMissingKeys","revealed","setRevealed","saving","setSaving","saved","setSaved","error","setError","env","updateRow","index","patch","i","handleAddRow","handleAddMissingKey","k","handleDeleteRow","_","next","toggleReveal","handleSave","trimmed","masked","_row","IconButton","CloseIcon","SettingsPage","activeSection","useAppStore","s","PageTitle","SettingsSidebar","setActiveSection","configFiles","setConfigFiles","showEnv","setShowEnv","SidebarSection","ListItem"],"mappings":"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"}
|