pi-ui-extend 1.0.41 → 1.0.42
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/README.md +10 -2
- package/dist/app/app.d.ts +3 -0
- package/dist/app/app.js +26 -0
- package/dist/app/commands/command-host.d.ts +1 -0
- package/dist/app/commands/command-model-actions.js +6 -1
- package/dist/app/commands/command-registry.js +1 -1
- package/dist/app/commands/command-session-actions.js +9 -3
- package/dist/app/commands/reload-context-inventory.d.ts +11 -0
- package/dist/app/commands/reload-context-inventory.js +59 -0
- package/dist/app/extensions/extension-actions-controller.d.ts +1 -0
- package/dist/app/extensions/extension-actions-controller.js +6 -0
- package/dist/app/extensions/subagent-catalog-state.d.ts +9 -0
- package/dist/app/extensions/subagent-catalog-state.js +23 -0
- package/dist/app/rendering/editor-panels.js +10 -4
- package/dist/app/session/session-lifecycle-controller.d.ts +1 -0
- package/dist/app/session/session-lifecycle-controller.js +6 -0
- package/dist/app/session/tabs-controller.d.ts +1 -0
- package/dist/app/session/tabs-controller.js +19 -1
- package/dist/app/subagents/subagents-files.js +60 -1
- package/dist/app/subagents/subagents-model.d.ts +1 -0
- package/dist/app/subagents/subagents-model.js +18 -2
- package/dist/app/types.d.ts +5 -0
- package/dist/default-pix-config.js +10 -0
- package/dist/schemas/index.d.ts +1 -0
- package/dist/schemas/index.js +1 -0
- package/dist/schemas/pi-tools-suite-schema.d.ts +80 -58
- package/dist/schemas/pi-tools-suite-schema.js +43 -78
- package/dist/schemas/pix-schema.d.ts +7 -0
- package/dist/schemas/pix-schema.js +14 -0
- package/dist/schemas/tasks-schema.d.ts +18 -0
- package/dist/schemas/tasks-schema.js +41 -0
- package/docs/concurrency.md +6 -0
- package/docs/desktop-mvp.md +12 -1
- package/docs/desktop-task-manager.md +93 -82
- package/external/pi-tools-suite/README.md +37 -50
- package/external/pi-tools-suite/docs/browser-qa-subagent.md +19 -0
- package/external/pi-tools-suite/docs/evals.md +1 -1
- package/external/pi-tools-suite/docs/session-recovery.md +40 -14
- package/external/pi-tools-suite/docs/subagent-model-pools.md +38 -27
- package/external/pi-tools-suite/src/async-subagents/agents/frontier-review.md +23 -0
- package/external/pi-tools-suite/src/async-subagents/agents/presets.jsonc +16 -0
- package/external/pi-tools-suite/src/async-subagents/agents/research.md +5 -3
- package/external/pi-tools-suite/src/async-subagents/commands.ts +14 -70
- package/external/pi-tools-suite/src/async-subagents/core/activity.ts +33 -0
- package/external/pi-tools-suite/src/async-subagents/core/agent-catalog.ts +5 -4
- package/external/pi-tools-suite/src/async-subagents/core/agent-strategy.ts +1 -1
- package/external/pi-tools-suite/src/async-subagents/core/agents-dir.ts +8 -3
- package/external/pi-tools-suite/src/async-subagents/core/config.ts +122 -312
- package/external/pi-tools-suite/src/async-subagents/core/routing.ts +15 -2
- package/external/pi-tools-suite/src/async-subagents/core/spawn.ts +6 -2
- package/external/pi-tools-suite/src/async-subagents/core/state.ts +40 -0
- package/external/pi-tools-suite/src/async-subagents/core/types.ts +7 -0
- package/external/pi-tools-suite/src/async-subagents/index.ts +69 -5
- package/external/pi-tools-suite/src/async-subagents/lib.ts +7 -8
- package/external/pi-tools-suite/src/async-subagents/tools/spawn.ts +8 -4
- package/external/pi-tools-suite/src/async-subagents/tools/subagents.ts +3 -2
- package/external/pi-tools-suite/src/async-subagents/types.ts +1 -0
- package/external/pi-tools-suite/src/config.ts +41 -1
- package/external/pi-tools-suite/src/context-gateway/config.ts +11 -2
- package/external/pi-tools-suite/src/context-gateway/enforcement.ts +102 -0
- package/external/pi-tools-suite/src/context-gateway/index.ts +73 -19
- package/external/pi-tools-suite/src/context-gateway/storeless-capabilities.ts +3 -3
- package/external/pi-tools-suite/src/context-gateway/telemetry.ts +101 -28
- package/external/pi-tools-suite/src/context-gateway/types.ts +9 -3
- package/external/pi-tools-suite/src/context-inventory.ts +99 -0
- package/external/pi-tools-suite/src/dcp/auto-compress.ts +96 -44
- package/external/pi-tools-suite/src/dcp/commands.ts +18 -0
- package/external/pi-tools-suite/src/dcp/compress-tool.ts +170 -45
- package/external/pi-tools-suite/src/dcp/compression-blocks.ts +6 -58
- package/external/pi-tools-suite/src/dcp/compression-preview.ts +9 -0
- package/external/pi-tools-suite/src/dcp/config.ts +56 -13
- package/external/pi-tools-suite/src/dcp/prompts.ts +83 -192
- package/external/pi-tools-suite/src/dcp/protected-continuity.ts +175 -0
- package/external/pi-tools-suite/src/dcp/pruner-candidates.ts +1 -1
- package/external/pi-tools-suite/src/dcp/pruner-message-ids.ts +6 -10
- package/external/pi-tools-suite/src/dcp/pruner-tools.ts +6 -3
- package/external/pi-tools-suite/src/default-pi-tools-suite-config.ts +13 -9
- package/external/pi-tools-suite/src/index.ts +7 -1
- package/external/pi-tools-suite/src/resource-registry/index.ts +2290 -0
- package/external/pi-tools-suite/src/shell-command-policy.ts +219 -0
- package/external/pi-tools-suite/src/tool-descriptions.ts +3 -4
- package/package.json +4 -2
- package/schemas/pi-tools-suite.json +427 -280
- package/schemas/pix.json +24 -0
- package/schemas/tasks.json +132 -0
- package/skills/spec-wiki/SKILL.md +55 -0
- package/skills/spec-wiki/evals/evals.json +132 -0
- package/skills/spec-wiki/evals/files/bootstrap/architecture/rfc-007.md +14 -0
- package/skills/spec-wiki/evals/files/bootstrap/docs/how-to-pay.md +4 -0
- package/skills/spec-wiki/evals/files/bootstrap/docs/overview.md +9 -0
- package/skills/spec-wiki/evals/files/bootstrap/requirements/payment-behavior.md +17 -0
- package/skills/spec-wiki/evals/files/bootstrap/src/payments.ts +12 -0
- package/skills/spec-wiki/evals/files/bootstrap/tests/payments.test.ts +11 -0
- package/skills/spec-wiki/evals/files/focused/src/session.ts +5 -0
- package/skills/spec-wiki/evals/files/focused/tests/session.test.ts +17 -0
- package/skills/spec-wiki/evals/files/maintenance/low-signal/incoming/capture.txt +2 -0
- package/skills/spec-wiki/evals/files/maintenance/low-signal/src/capture.ts +3 -0
- package/skills/spec-wiki/evals/files/maintenance/move/docs/old-job-contract.md +18 -0
- package/skills/spec-wiki/evals/files/maintenance/move/src/job.ts +5 -0
- package/skills/spec-wiki/evals/files/maintenance/new-relation/docs/session-refresh.md +24 -0
- package/skills/spec-wiki/evals/files/maintenance/new-relation/incoming/refresh-worker.ts +7 -0
- package/skills/spec-wiki/evals/files/maintenance/new-relation/src/session.ts +7 -0
- package/skills/spec-wiki/evals/files/maintenance/no-impact/docs/auth-contract.md +17 -0
- package/skills/spec-wiki/evals/files/maintenance/no-impact/incoming/telemetry-format.ts +3 -0
- package/skills/spec-wiki/evals/files/maintenance/no-impact/src/auth.ts +3 -0
- package/skills/spec-wiki/evals/files/query/docs/how-to-run-jobs.md +4 -0
- package/skills/spec-wiki/evals/files/query/docs/spec-overview.md +9 -0
- package/skills/spec-wiki/evals/files/query/features/jobs/cancellation-contract.md +15 -0
- package/skills/spec-wiki/evals/files/query/features/jobs/retry-spec.md +6 -0
- package/skills/spec-wiki/evals/maintenance_regression.py +311 -0
- package/skills/spec-wiki/evals/retrieval-eval.md +37 -0
- package/skills/spec-wiki/evals/retrieval-evals.json +37 -0
- package/skills/spec-wiki/evals/trigger-evals.json +94 -0
- package/skills/spec-wiki/references/bootstrap.md +100 -0
- package/skills/spec-wiki/references/focused-spec.md +117 -0
- package/skills/spec-wiki/references/index-schema.md +330 -0
- package/skills/spec-wiki/references/maintenance.md +134 -0
- package/skills/spec-wiki/references/query.md +74 -0
- package/skills/spec-wiki/scripts/spec_wiki.py +2076 -0
- package/docs/desktop-markdown-media.md +0 -77
- package/external/pi-tools-suite/docs/dcp-emergency-current-turn.md +0 -102
- package/external/pi-tools-suite/src/async-subagents/async-subagents.sample.jsonc +0 -54
- package/external/pi-tools-suite/src/skill-installer/index.ts +0 -333
- package/skills/spec-lite/SKILL.md +0 -140
|
@@ -6,6 +6,16 @@ export const DEFAULT_PIX_CONFIG_JSONC = String.raw `{
|
|
|
6
6
|
"ignoreContextFiles": false,
|
|
7
7
|
// Maximum pi session JSONL files to retain per project. 0 disables automatic deletion.
|
|
8
8
|
"maxProjectSessions": 0,
|
|
9
|
+
"desktop": {
|
|
10
|
+
// External editor used by Pix Desktop's Project explorer: zed, code/vscode, cursor, subl, idea, webstorm, or an executable path/name.
|
|
11
|
+
"externalEditor": "zed",
|
|
12
|
+
"git": {
|
|
13
|
+
// LLM used for Source Control code review.
|
|
14
|
+
"reviewModelRef": "openai-codex/gpt-5.6-luna:medium",
|
|
15
|
+
// LLM used to generate commit messages from staged changes.
|
|
16
|
+
"commitMessageModelRef": "openai-codex/gpt-5.6-luna:minimal"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
9
19
|
|
|
10
20
|
"toolRenderer": {
|
|
11
21
|
"default": { "previewLines": 0, "direction": "head", "color": "toolTitle" },
|
package/dist/schemas/index.d.ts
CHANGED
package/dist/schemas/index.js
CHANGED
|
@@ -21,6 +21,10 @@ export declare const PiToolsSuiteConfigSchema: Type.TObject<{
|
|
|
21
21
|
chatId: Type.TOptional<Type.TString>;
|
|
22
22
|
}>>;
|
|
23
23
|
}>>;
|
|
24
|
+
commentChecker: Type.TOptional<Type.TObject<{
|
|
25
|
+
enabled: Type.TOptional<Type.TBoolean>;
|
|
26
|
+
strictness: Type.TOptional<Type.TUnion<[Type.TLiteral<"conservative">, Type.TLiteral<"balanced">, Type.TLiteral<"aggressive">]>>;
|
|
27
|
+
}>>;
|
|
24
28
|
dcp: Type.TOptional<Type.TObject<{
|
|
25
29
|
enabled: Type.TOptional<Type.TBoolean>;
|
|
26
30
|
debug: Type.TOptional<Type.TBoolean>;
|
|
@@ -30,12 +34,13 @@ export declare const PiToolsSuiteConfigSchema: Type.TObject<{
|
|
|
30
34
|
}>>;
|
|
31
35
|
manualMode: Type.TOptional<Type.TObject<{
|
|
32
36
|
enabled: Type.TOptional<Type.TBoolean>;
|
|
37
|
+
automaticStrategies: Type.TOptional<Type.TNever>;
|
|
33
38
|
}>>;
|
|
34
39
|
compress: Type.TOptional<Type.TObject<{
|
|
35
40
|
maxContextPercent: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
|
|
36
41
|
minContextPercent: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
|
|
37
|
-
modelMaxContextPercent: Type.TOptional<Type.TRecord<"^.*$", Type.TNumber
|
|
38
|
-
modelMinContextPercent: Type.TOptional<Type.TRecord<"^.*$", Type.TNumber
|
|
42
|
+
modelMaxContextPercent: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TNumber, Type.TString]>>>;
|
|
43
|
+
modelMinContextPercent: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TNumber, Type.TString]>>>;
|
|
39
44
|
maxContextLimit: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
|
|
40
45
|
minContextLimit: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
|
|
41
46
|
modelMaxContextLimits: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TNumber, Type.TString]>>>;
|
|
@@ -80,68 +85,79 @@ export declare const PiToolsSuiteConfigSchema: Type.TObject<{
|
|
|
80
85
|
maxSuggestions: Type.TOptional<Type.TNumber>;
|
|
81
86
|
protectedTools: Type.TOptional<Type.TArray<Type.TString>>;
|
|
82
87
|
}>>;
|
|
88
|
+
deduplication: Type.TOptional<Type.TNever>;
|
|
89
|
+
purgeErrors: Type.TOptional<Type.TNever>;
|
|
90
|
+
autoToolPruning: Type.TOptional<Type.TNever>;
|
|
83
91
|
}>>;
|
|
84
92
|
protectedFilePatterns: Type.TOptional<Type.TArray<Type.TString>>;
|
|
85
|
-
|
|
86
|
-
asyncSubagents: Type.TOptional<Type.TObject<{
|
|
87
|
-
defaultType: Type.TOptional<Type.TString>;
|
|
88
|
-
routing: Type.TOptional<Type.TObject<{
|
|
93
|
+
modelOverrides: Type.TOptional<Type.TRecord<"^.*$", Type.TObject<{
|
|
89
94
|
enabled: Type.TOptional<Type.TBoolean>;
|
|
90
|
-
model: Type.TOptional<Type.TString>;
|
|
91
|
-
fallbackModels: Type.TOptional<Type.TArray<Type.TString>>;
|
|
92
|
-
maxTaskChars: Type.TOptional<Type.TNumber>;
|
|
93
|
-
maxTokens: Type.TOptional<Type.TNumber>;
|
|
94
|
-
maxRetries: Type.TOptional<Type.TNumber>;
|
|
95
|
-
timeoutMs: Type.TOptional<Type.TNumber>;
|
|
96
95
|
debug: Type.TOptional<Type.TBoolean>;
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
96
|
+
debugLog: Type.TOptional<Type.TObject<{
|
|
97
|
+
maxBytes: Type.TOptional<Type.TNumber>;
|
|
98
|
+
maxBackups: Type.TOptional<Type.TNumber>;
|
|
99
|
+
}>>;
|
|
100
|
+
manualMode: Type.TOptional<Type.TObject<{
|
|
101
|
+
enabled: Type.TOptional<Type.TBoolean>;
|
|
102
|
+
automaticStrategies: Type.TOptional<Type.TNever>;
|
|
103
|
+
}>>;
|
|
104
|
+
compress: Type.TOptional<Type.TObject<{
|
|
105
|
+
maxContextPercent: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
|
|
106
|
+
minContextPercent: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
|
|
107
|
+
modelMaxContextPercent: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TNumber, Type.TString]>>>;
|
|
108
|
+
modelMinContextPercent: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TNumber, Type.TString]>>>;
|
|
109
|
+
maxContextLimit: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
|
|
110
|
+
minContextLimit: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
|
|
111
|
+
modelMaxContextLimits: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TNumber, Type.TString]>>>;
|
|
112
|
+
modelMinContextLimits: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TNumber, Type.TString]>>>;
|
|
113
|
+
summaryBuffer: Type.TOptional<Type.TBoolean>;
|
|
114
|
+
nudgeFrequency: Type.TOptional<Type.TNumber>;
|
|
115
|
+
iterationNudgeThreshold: Type.TOptional<Type.TNumber>;
|
|
116
|
+
nudgeForce: Type.TOptional<Type.TUnion<[Type.TLiteral<"strong">, Type.TLiteral<"soft">]>>;
|
|
117
|
+
protectedTools: Type.TOptional<Type.TArray<Type.TString>>;
|
|
118
|
+
protectTags: Type.TOptional<Type.TBoolean>;
|
|
119
|
+
protectUserMessages: Type.TOptional<Type.TBoolean>;
|
|
120
|
+
autoCandidates: Type.TOptional<Type.TObject<{
|
|
121
|
+
enabled: Type.TOptional<Type.TBoolean>;
|
|
122
|
+
minContextPercent: Type.TOptional<Type.TNumber>;
|
|
123
|
+
keepRecentTurns: Type.TOptional<Type.TNumber>;
|
|
124
|
+
minMessages: Type.TOptional<Type.TNumber>;
|
|
125
|
+
minTokens: Type.TOptional<Type.TNumber>;
|
|
126
|
+
}>>;
|
|
127
|
+
messageMode: Type.TOptional<Type.TObject<{
|
|
128
|
+
enabled: Type.TOptional<Type.TBoolean>;
|
|
129
|
+
minContextPercent: Type.TOptional<Type.TNumber>;
|
|
130
|
+
keepRecentTurns: Type.TOptional<Type.TNumber>;
|
|
131
|
+
mediumTokens: Type.TOptional<Type.TNumber>;
|
|
132
|
+
highTokens: Type.TOptional<Type.TNumber>;
|
|
133
|
+
maxSuggestions: Type.TOptional<Type.TNumber>;
|
|
134
|
+
}>>;
|
|
135
|
+
autoCompress: Type.TOptional<Type.TObject<{
|
|
136
|
+
enabled: Type.TOptional<Type.TBoolean>;
|
|
137
|
+
patience: Type.TOptional<Type.TNumber>;
|
|
138
|
+
summarizerModel: Type.TOptional<Type.TArray<Type.TString>>;
|
|
139
|
+
timeoutMs: Type.TOptional<Type.TNumber>;
|
|
140
|
+
}>>;
|
|
141
|
+
}>>;
|
|
142
|
+
strategies: Type.TOptional<Type.TObject<{
|
|
143
|
+
emergencyCurrentTurnPruning: Type.TOptional<Type.TObject<{
|
|
144
|
+
enabled: Type.TOptional<Type.TBoolean>;
|
|
145
|
+
hardContextPercent: Type.TOptional<Type.TNumber>;
|
|
146
|
+
targetContextPercent: Type.TOptional<Type.TNumber>;
|
|
147
|
+
patience: Type.TOptional<Type.TNumber>;
|
|
148
|
+
keepRecentToolPairs: Type.TOptional<Type.TNumber>;
|
|
149
|
+
minOutputTokens: Type.TOptional<Type.TNumber>;
|
|
150
|
+
maxSuggestions: Type.TOptional<Type.TNumber>;
|
|
151
|
+
protectedTools: Type.TOptional<Type.TArray<Type.TString>>;
|
|
152
|
+
}>>;
|
|
153
|
+
deduplication: Type.TOptional<Type.TNever>;
|
|
154
|
+
purgeErrors: Type.TOptional<Type.TNever>;
|
|
155
|
+
autoToolPruning: Type.TOptional<Type.TNever>;
|
|
133
156
|
}>>;
|
|
134
|
-
|
|
135
|
-
|
|
157
|
+
protectedFilePatterns: Type.TOptional<Type.TArray<Type.TString>>;
|
|
158
|
+
pruneNotification: Type.TOptional<Type.TNever>;
|
|
136
159
|
}>>>;
|
|
137
|
-
|
|
138
|
-
retry: Type.TOptional<Type.TObject<{
|
|
139
|
-
maxRetries: Type.TOptional<Type.TNumber>;
|
|
140
|
-
backoffMs: Type.TOptional<Type.TNumber>;
|
|
141
|
-
retryableExitCodes: Type.TOptional<Type.TArray<Type.TNumber>>;
|
|
142
|
-
}>>;
|
|
143
|
-
maxResultBytes: Type.TOptional<Type.TNumber>;
|
|
144
|
-
timeoutMs: Type.TOptional<Type.TNumber>;
|
|
160
|
+
pruneNotification: Type.TOptional<Type.TNever>;
|
|
145
161
|
}>>;
|
|
146
162
|
toolRenderer: Type.TOptional<Type.TObject<{
|
|
147
163
|
default: Type.TOptional<Type.TObject<{
|
|
@@ -184,6 +200,11 @@ export declare const PiToolsSuiteConfigSchema: Type.TObject<{
|
|
|
184
200
|
repoDiscovery: Type.TOptional<Type.TObject<{
|
|
185
201
|
profile: Type.TOptional<Type.TUnion<[Type.TLiteral<"baseline">, Type.TLiteral<"native-compact">]>>;
|
|
186
202
|
}>>;
|
|
203
|
+
resourceRegistry: Type.TOptional<Type.TObject<{
|
|
204
|
+
remote: Type.TOptional<Type.TString>;
|
|
205
|
+
branch: Type.TOptional<Type.TString>;
|
|
206
|
+
projectKey: Type.TOptional<Type.TString>;
|
|
207
|
+
}>>;
|
|
187
208
|
lsp: Type.TOptional<Type.TObject<{
|
|
188
209
|
servers: Type.TOptional<Type.TArray<Type.TObject<{
|
|
189
210
|
id: Type.TString;
|
|
@@ -206,5 +227,6 @@ export declare const PiToolsSuiteConfigSchema: Type.TObject<{
|
|
|
206
227
|
settings: Type.TOptional<Type.TUnknown>;
|
|
207
228
|
}>>>;
|
|
208
229
|
}>>;
|
|
230
|
+
asyncSubagents: Type.TOptional<Type.TNever>;
|
|
209
231
|
}>;
|
|
210
232
|
export type PiToolsSuiteConfigSchemaType = Static<typeof PiToolsSuiteConfigSchema>;
|
|
@@ -39,6 +39,7 @@ const TerminalBellConfig = Type.Object({
|
|
|
39
39
|
// ---------------------------------------------------------------------------
|
|
40
40
|
const DcpManualModeConfig = Type.Object({
|
|
41
41
|
enabled: Type.Optional(Type.Boolean({ description: "Enable manual DCP mode." })),
|
|
42
|
+
automaticStrategies: Type.Optional(Type.Never({ description: "Removed legacy key. Manual mode now has only the explicit enabled flag." })),
|
|
42
43
|
}, { description: "Manual mode configuration." });
|
|
43
44
|
const DcpAutoCandidatesConfig = Type.Object({
|
|
44
45
|
enabled: Type.Optional(Type.Boolean({ description: "Enable auto candidate selection for compression." })),
|
|
@@ -56,16 +57,16 @@ const DcpMessageModeConfig = Type.Object({
|
|
|
56
57
|
maxSuggestions: Type.Optional(Type.Number({ description: "Maximum compression suggestions.", minimum: 0 })),
|
|
57
58
|
}, { description: "Message-mode compression configuration." });
|
|
58
59
|
const DcpAutoCompressConfig = Type.Object({
|
|
59
|
-
enabled: Type.Optional(Type.Boolean({ description: "Allow
|
|
60
|
+
enabled: Type.Optional(Type.Boolean({ description: "Allow autonomous compression after pressure/opportunity gates. Explicit compress calls can still use summarizerModel when summary is omitted." })),
|
|
60
61
|
patience: Type.Optional(Type.Number({ description: "Completed actionable opportunities allowed before automatic compression.", minimum: 0 })),
|
|
61
|
-
summarizerModel: Type.Optional(Type.Array(Type.String(), { description: "Ordered
|
|
62
|
-
timeoutMs: Type.Optional(Type.Number({ description: "Per-summarizer deadline in milliseconds.", minimum: 1 })),
|
|
62
|
+
summarizerModel: Type.Optional(Type.Array(Type.String(), { description: "Ordered model refs used by auto-compress and explicit compress when summary is omitted; empty uses the deterministic extractive summary." })),
|
|
63
|
+
timeoutMs: Type.Optional(Type.Number({ description: "Per-summarizer deadline in milliseconds for automatic and explicit generated summaries.", minimum: 1 })),
|
|
63
64
|
}, { description: "Bounded automatic compression fallback." });
|
|
64
65
|
const DcpCompressConfig = Type.Object({
|
|
65
66
|
maxContextPercent: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: "Maximum context percent (0–1 or '80%') before compression triggers." })),
|
|
66
67
|
minContextPercent: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: "Target context percent after compression." })),
|
|
67
|
-
modelMaxContextPercent: Type.Optional(Type.Record(Type.String(), Type.Number(), { description: "Per-model max context percent
|
|
68
|
-
modelMinContextPercent: Type.Optional(Type.Record(Type.String(), Type.Number(), { description: "Per-model min context percent
|
|
68
|
+
modelMaxContextPercent: Type.Optional(Type.Record(Type.String(), Type.Union([Type.Number(), Type.String()]), { description: "Per-model max context overrides using the same fraction/token/percent formats." })),
|
|
69
|
+
modelMinContextPercent: Type.Optional(Type.Record(Type.String(), Type.Union([Type.Number(), Type.String()]), { description: "Per-model min context overrides using the same fraction/token/percent formats." })),
|
|
69
70
|
maxContextLimit: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: "Absolute max context tokens or '200k'." })),
|
|
70
71
|
minContextLimit: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: "Absolute min context tokens." })),
|
|
71
72
|
modelMaxContextLimits: Type.Optional(Type.Record(Type.String(), Type.Union([Type.Number(), Type.String()]), { description: "Per-model max context limit overrides." })),
|
|
@@ -93,7 +94,23 @@ const DcpEmergencyCurrentTurnPruningConfig = Type.Object({
|
|
|
93
94
|
}, { description: "Single bounded emergency cleanup strategy." });
|
|
94
95
|
const DcpStrategiesConfig = Type.Object({
|
|
95
96
|
emergencyCurrentTurnPruning: Type.Optional(DcpEmergencyCurrentTurnPruningConfig),
|
|
97
|
+
deduplication: Type.Optional(Type.Never({ description: "Removed legacy key; no automatic replacement policy maps to it." })),
|
|
98
|
+
purgeErrors: Type.Optional(Type.Never({ description: "Removed legacy key; no automatic replacement policy maps to it." })),
|
|
99
|
+
autoToolPruning: Type.Optional(Type.Never({ description: "Removed legacy key. Use explicit /dcp sweep or DCP compression/emergency policies instead." })),
|
|
96
100
|
}, { description: "Bounded DCP emergency strategy." });
|
|
101
|
+
const DcpConfigOverride = Type.Object({
|
|
102
|
+
enabled: Type.Optional(Type.Boolean()),
|
|
103
|
+
debug: Type.Optional(Type.Boolean()),
|
|
104
|
+
debugLog: Type.Optional(Type.Object({
|
|
105
|
+
maxBytes: Type.Optional(Type.Number({ minimum: 1024 })),
|
|
106
|
+
maxBackups: Type.Optional(Type.Number({ minimum: 1 })),
|
|
107
|
+
})),
|
|
108
|
+
manualMode: Type.Optional(DcpManualModeConfig),
|
|
109
|
+
compress: Type.Optional(DcpCompressConfig),
|
|
110
|
+
strategies: Type.Optional(DcpStrategiesConfig),
|
|
111
|
+
protectedFilePatterns: Type.Optional(Type.Array(Type.String())),
|
|
112
|
+
pruneNotification: Type.Optional(Type.Never({ description: "Removed legacy key; pruning notifications are no longer configurable." })),
|
|
113
|
+
}, { description: "Partial DCP override applied to a matching provider/model or bare-model key. Keys support * and ? wildcards." });
|
|
97
114
|
const DcpConfig = Type.Object({
|
|
98
115
|
enabled: Type.Optional(Type.Boolean({ description: "Enable DCP (Dynamic Context Pruning)." })),
|
|
99
116
|
debug: Type.Optional(Type.Boolean({ description: "Enable DCP debug logging." })),
|
|
@@ -105,73 +122,10 @@ const DcpConfig = Type.Object({
|
|
|
105
122
|
compress: Type.Optional(DcpCompressConfig),
|
|
106
123
|
strategies: Type.Optional(DcpStrategiesConfig),
|
|
107
124
|
protectedFilePatterns: Type.Optional(Type.Array(Type.String(), { description: "File path glob patterns whose content is protected from pruning." })),
|
|
125
|
+
modelOverrides: Type.Optional(Type.Record(Type.String(), DcpConfigOverride, { description: "Per-model partial DCP overrides. Exact keys take precedence over matching wildcards." })),
|
|
126
|
+
pruneNotification: Type.Optional(Type.Never({ description: "Removed legacy key; pruning notifications are no longer configurable." })),
|
|
108
127
|
}, { description: "DCP (Dynamic Context Pruning) configuration." });
|
|
109
128
|
// ---------------------------------------------------------------------------
|
|
110
|
-
// Async subagents
|
|
111
|
-
// ---------------------------------------------------------------------------
|
|
112
|
-
const RetryConfig = Type.Object({
|
|
113
|
-
maxRetries: Type.Optional(Type.Number({ description: "Maximum retry attempts.", minimum: 0 })),
|
|
114
|
-
backoffMs: Type.Optional(Type.Number({ description: "Base delay in ms before first retry.", minimum: 0 })),
|
|
115
|
-
retryableExitCodes: Type.Optional(Type.Array(Type.Number(), { description: "Exit codes eligible for retry. Empty array disables retry." })),
|
|
116
|
-
}, { description: "Retry configuration for sub-agents." });
|
|
117
|
-
const SubagentRoutingConfig = Type.Object({
|
|
118
|
-
enabled: Type.Optional(Type.Boolean({ description: "Enable fallback LLM selection for omitted subagentType values. Explicit valid types bypass the router; when disabled, every spawn task must specify a valid type." })),
|
|
119
|
-
model: Type.Optional(Type.String({ description: "Router model in provider/model form." })),
|
|
120
|
-
fallbackModels: Type.Optional(Type.Array(Type.String(), { uniqueItems: true, description: "Ordered router model fallbacks tried when the primary routing model is unavailable or fails. The current parent model is always tried last." })),
|
|
121
|
-
maxTaskChars: Type.Optional(Type.Number({ description: "Max task/scope characters sent to router.", minimum: 100 })),
|
|
122
|
-
maxTokens: Type.Optional(Type.Number({ description: "Max router response tokens.", minimum: 8 })),
|
|
123
|
-
maxRetries: Type.Optional(Type.Number({ description: "Router request retries.", minimum: 0 })),
|
|
124
|
-
timeoutMs: Type.Optional(Type.Number({ description: "Router request timeout in ms.", minimum: 1000 })),
|
|
125
|
-
debug: Type.Optional(Type.Boolean({ description: "Show routing debug warnings." })),
|
|
126
|
-
}, { description: "Fallback role routing for omitted types. Unknown explicit types or failed/incomplete routing reject the entire batch before any agents launch." });
|
|
127
|
-
const SubagentVisionConfig = Type.Object({
|
|
128
|
-
blindModelPatterns: Type.Optional(Type.Array(Type.String(), { description: "Glob-like model refs treated as unable to inspect images." })),
|
|
129
|
-
}, { description: "Vision capability overrides." });
|
|
130
|
-
const SubagentPresetTypeOverride = Type.Object({
|
|
131
|
-
model: Type.Optional(Type.String({ description: "Model override for this type within the preset." })),
|
|
132
|
-
fallbackModels: Type.Optional(Type.Array(Type.String(), { description: "Per-role fallback models." })),
|
|
133
|
-
thinking: Type.Optional(Type.String({ description: "Thinking level override." })),
|
|
134
|
-
extraArgs: Type.Optional(Type.Array(Type.String(), { description: "Extra CLI arguments." })),
|
|
135
|
-
timeoutMs: Type.Optional(Type.Number({ description: "Per-agent wall-clock timeout in ms.", minimum: 1 })),
|
|
136
|
-
}, { description: "Per-type override within a preset." });
|
|
137
|
-
const SubagentPreset = Type.Object({
|
|
138
|
-
description: Type.Optional(Type.String({ description: "Preset description." })),
|
|
139
|
-
models: Type.Optional(Type.Array(Type.String({ pattern: "^[^\\s/*]+/[^\\s*]+$" }), { uniqueItems: true, description: "Available model pool. Filter the agent's ordered models by membership; pool order is ignored. Empty intersection rejects spawn. Oracle also respects this pool." })),
|
|
140
|
-
model: Type.Optional(Type.String({ description: "Legacy default model. Ignored when models is set.", deprecated: true })),
|
|
141
|
-
fallbackModels: Type.Optional(Type.Array(Type.String(), { description: "Legacy fallback list. Ignored when models is set.", deprecated: true })),
|
|
142
|
-
thinking: Type.Optional(Type.String({ description: "Default thinking level." })),
|
|
143
|
-
extraArgs: Type.Optional(Type.Array(Type.String(), { description: "Extra CLI arguments." })),
|
|
144
|
-
timeoutMs: Type.Optional(Type.Number({ description: "Per-agent wall-clock timeout in ms.", minimum: 1 })),
|
|
145
|
-
types: Type.Optional(Type.Record(Type.String(), SubagentPresetTypeOverride, { description: "Per-type overrides." })),
|
|
146
|
-
}, { description: "Named available-model pool. Legacy model/types overrides remain supported; prefer models for new presets." });
|
|
147
|
-
const SubagentTypeConfig = Type.Object({
|
|
148
|
-
description: Type.Optional(Type.String({ description: "Role description for routing." })),
|
|
149
|
-
icon: Type.Optional(Type.String({ description: "Agent icon name rendered by UIs (pix TUI icon themes and Pix Desktop lucide icons): agent, search, code, flask, globe, sparkles, brain, wrench, terminal, bug, book, eye, zap, rocket. Unknown names render as the neutral agent icon." })),
|
|
150
|
-
models: Type.Optional(Type.Array(Type.String({ pattern: "^[^\\s/*]+/[^\\s*]+$" }), { uniqueItems: true, description: "Ordered model candidates. First usable member of the preset pool runs; only remaining compatible members can be used on quota failure. Replaces legacy model/fallbackModels/modelByParent selection." })),
|
|
151
|
-
model: Type.Optional(Type.String({ description: "Legacy primary model; use models for new profiles.", deprecated: true })),
|
|
152
|
-
fallbackModels: Type.Optional(Type.Array(Type.String(), { description: "Legacy candidates after model; use models for a complete ranked list.", deprecated: true })),
|
|
153
|
-
thinking: Type.Optional(Type.String({ description: "Thinking level." })),
|
|
154
|
-
tools: Type.Optional(Type.Array(Type.String(), { description: "Enabled tools for this type." })),
|
|
155
|
-
isolatedSkills: Type.Optional(Type.Array(Type.String(), { description: "Explicit skill files loaded after disabling normal skill discovery for this type." })),
|
|
156
|
-
extraArgs: Type.Optional(Type.Array(Type.String(), { description: "Extra CLI arguments." })),
|
|
157
|
-
promptAppend: Type.Optional(Type.String({ description: "Extra prompt text appended after generated prompt." })),
|
|
158
|
-
promptOverride: Type.Optional(Type.String({ description: "Full prompt replacement." })),
|
|
159
|
-
retry: Type.Optional(RetryConfig),
|
|
160
|
-
maxResultBytes: Type.Optional(Type.Number({ description: "Max bytes in result summary.", minimum: 0 })),
|
|
161
|
-
timeoutMs: Type.Optional(Type.Number({ description: "Per-agent wall-clock timeout in ms.", minimum: 1 })),
|
|
162
|
-
}, { description: "Configuration for a sub-agent type/role." });
|
|
163
|
-
const AsyncSubagentsConfig = Type.Object({
|
|
164
|
-
defaultType: Type.Optional(Type.String({ description: "Preferred role for genuinely ambiguous router tasks and legacy resolver default. Not used as a spawn fallback for missing/invalid routes." })),
|
|
165
|
-
routing: Type.Optional(SubagentRoutingConfig),
|
|
166
|
-
vision: Type.Optional(SubagentVisionConfig),
|
|
167
|
-
presets: Type.Optional(Type.Record(Type.String(), SubagentPreset, { description: "Named spawn presets." })),
|
|
168
|
-
types: Type.Optional(Type.Record(Type.String(), SubagentTypeConfig, { description: "Sub-agent type definitions." })),
|
|
169
|
-
maxConcurrent: Type.Optional(Type.Number({ description: "Max concurrent agents per spawn batch (0 = unlimited).", minimum: 0 })),
|
|
170
|
-
retry: Type.Optional(RetryConfig),
|
|
171
|
-
maxResultBytes: Type.Optional(Type.Number({ description: "Global max bytes in result summary.", minimum: 0 })),
|
|
172
|
-
timeoutMs: Type.Optional(Type.Number({ description: "Global per-agent wall-clock timeout in ms.", minimum: 1 })),
|
|
173
|
-
}, { description: "Async sub-agent configuration." });
|
|
174
|
-
// ---------------------------------------------------------------------------
|
|
175
129
|
// Prompt commands
|
|
176
130
|
// ---------------------------------------------------------------------------
|
|
177
131
|
const PromptCommand = Type.Object({
|
|
@@ -185,20 +139,29 @@ const SecretFirewallConfig = Type.Object({
|
|
|
185
139
|
sessionHygiene: Type.Optional(Type.Boolean({ description: "Redact detected secret material from tool results and completed messages before it remains in session history." })),
|
|
186
140
|
notify: Type.Optional(Type.Boolean({ description: "Show a warning when one or more secrets are redacted. Secret values are never included in notifications." })),
|
|
187
141
|
}, { description: "Settings for the opt-in credential-firewall module." });
|
|
142
|
+
const CommentCheckerConfig = Type.Object({
|
|
143
|
+
enabled: Type.Optional(Type.Boolean({ description: "Enable or disable comment-checker without disabling the whole module." })),
|
|
144
|
+
strictness: Type.Optional(Type.Union([Type.Literal("conservative"), Type.Literal("balanced"), Type.Literal("aggressive")], { description: "Comment classification strictness. Defaults to balanced." })),
|
|
145
|
+
}, { description: "Settings for the comment-checker module." });
|
|
188
146
|
const ContextGatewayBudgetsConfig = Type.Object({
|
|
189
|
-
maxInlineBytes: Type.Optional(Type.Integer({ minimum: 1, maximum: 67108864, description: "
|
|
190
|
-
maxResultBytes: Type.Optional(Type.Integer({ minimum: 1, maximum: 67108864, description: "
|
|
191
|
-
maxExactReadBytes: Type.Optional(Type.Integer({ minimum: 1, maximum: 67108864, description: "
|
|
192
|
-
maxSearchBytes: Type.Optional(Type.Integer({ minimum: 1, maximum: 67108864, description: "
|
|
193
|
-
maxSearchMatches: Type.Optional(Type.Integer({ minimum: 1, maximum: 1000, description: "
|
|
194
|
-
}, { description: "Context Gateway
|
|
147
|
+
maxInlineBytes: Type.Optional(Type.Integer({ minimum: 1, maximum: 67108864, description: "Maximum inline size for a proven compact representation. Default 8192." })),
|
|
148
|
+
maxResultBytes: Type.Optional(Type.Integer({ minimum: 1, maximum: 67108864, description: "Budget for shell/other result classes. Selective enforce currently compacts only recognised complete simple test/build output. Default 8192." })),
|
|
149
|
+
maxExactReadBytes: Type.Optional(Type.Integer({ minimum: 1, maximum: 67108864, description: "Read-class observation budget. Reads remain passthrough because snapshot-safe recovery is not available. Default 32768." })),
|
|
150
|
+
maxSearchBytes: Type.Optional(Type.Integer({ minimum: 1, maximum: 67108864, description: "Repo-search/AST/structure observation budget. Gateway does not post-hoc truncate producer output. Default 8192." })),
|
|
151
|
+
maxSearchMatches: Type.Optional(Type.Integer({ minimum: 1, maximum: 1000, description: "Reserved search-match policy budget. Default 12." })),
|
|
152
|
+
}, { description: "Context Gateway class-specific observation and selective-enforcement budgets." });
|
|
195
153
|
const ContextGatewayConfig = Type.Object({
|
|
196
|
-
mode: Type.Optional(Type.Union([Type.Literal("off"), Type.Literal("observe"), Type.Literal("enforce")], { description: "Context Gateway mode.
|
|
154
|
+
mode: Type.Optional(Type.Union([Type.Literal("off"), Type.Literal("observe"), Type.Literal("enforce")], { description: "Context Gateway mode. observe is passive; enforce only compacts proven complete simple test/build output and otherwise passes results through." })),
|
|
197
155
|
budgets: Type.Optional(ContextGatewayBudgetsConfig),
|
|
198
156
|
}, { description: "Context Gateway configuration. Default mode is off." });
|
|
199
157
|
const RepoDiscoveryConfig = Type.Object({
|
|
200
158
|
profile: Type.Optional(Type.Union([Type.Literal("baseline"), Type.Literal("native-compact")], { description: "repo_* runtime profile. baseline preserves historical argv/defaults; native-compact enables bounded native flags, cursors, validation, and an explicit per-call full override." })),
|
|
201
159
|
}, { description: "Repository discovery runtime policy. Default profile is baseline." });
|
|
160
|
+
const ResourceRegistryConfig = Type.Object({
|
|
161
|
+
remote: Type.Optional(Type.String({ description: "Git remote URL for the private registry. The repository contains reusable top-level skills/ and agents/ plus project-scoped state under projects/." })),
|
|
162
|
+
branch: Type.Optional(Type.String({ description: "Registry branch used for install/update/push/pull. Defaults to main." })),
|
|
163
|
+
projectKey: Type.Optional(Type.String({ description: "Optional explicit key for this project's projects/<key>/tasks.jsonc, plans/, and TODO.md state. Normally derived from the current Git origin." })),
|
|
164
|
+
}, { description: "Private Git-backed registry for reusable skills/agents and project-scoped tasks/plans state." });
|
|
202
165
|
// ---------------------------------------------------------------------------
|
|
203
166
|
// LSP
|
|
204
167
|
// ---------------------------------------------------------------------------
|
|
@@ -247,14 +210,16 @@ export const PiToolsSuiteConfigSchema = Type.Object({
|
|
|
247
210
|
]), { description: "Force per-todo thinking for matching provider/model or bare-model keys. Keys support * and ? wildcards; null removes an inherited override." })),
|
|
248
211
|
lookupModel: Type.Optional(Type.Union([Type.String(), Type.Null()], { description: "Vision-capable provider/model used by GLM's lookup tool; unset or null disables lookup." })),
|
|
249
212
|
terminalBell: Type.Optional(TerminalBellConfig),
|
|
213
|
+
commentChecker: Type.Optional(CommentCheckerConfig),
|
|
250
214
|
dcp: Type.Optional(DcpConfig),
|
|
251
|
-
asyncSubagents: Type.Optional(AsyncSubagentsConfig),
|
|
252
215
|
toolRenderer: Type.Optional(ToolRendererConfig),
|
|
253
216
|
promptCommands: Type.Optional(PromptCommandsConfig),
|
|
254
217
|
secretFirewall: Type.Optional(SecretFirewallConfig),
|
|
255
218
|
contextGateway: Type.Optional(ContextGatewayConfig),
|
|
256
219
|
repoDiscovery: Type.Optional(RepoDiscoveryConfig),
|
|
220
|
+
resourceRegistry: Type.Optional(ResourceRegistryConfig),
|
|
257
221
|
lsp: Type.Optional(LspConfig),
|
|
222
|
+
asyncSubagents: Type.Optional(Type.Never({ description: "Removed legacy key. Configure sub-agents in .pi/agents/*.md and model pools in .pi/agents/presets.jsonc." })),
|
|
258
223
|
}, {
|
|
259
224
|
$id: "https://unpkg.com/pi-ui-extend/schemas/pi-tools-suite.json",
|
|
260
225
|
$schema: "https://json-schema.org/draft-07/schema#",
|
|
@@ -64,5 +64,12 @@ export declare const PixConfigSchema: Type.TObject<{
|
|
|
64
64
|
label: Type.TString;
|
|
65
65
|
}>>>;
|
|
66
66
|
}>>;
|
|
67
|
+
desktop: Type.TOptional<Type.TObject<{
|
|
68
|
+
externalEditor: Type.TOptional<Type.TString>;
|
|
69
|
+
git: Type.TOptional<Type.TObject<{
|
|
70
|
+
reviewModelRef: Type.TOptional<Type.TString>;
|
|
71
|
+
commitMessageModelRef: Type.TOptional<Type.TString>;
|
|
72
|
+
}>>;
|
|
73
|
+
}>>;
|
|
67
74
|
}>;
|
|
68
75
|
export type PixConfigSchemaType = Static<typeof PixConfigSchema>;
|
|
@@ -69,6 +69,19 @@ const DictationConfig = Type.Object({
|
|
|
69
69
|
language: Type.Optional(Type.String({ description: "Selected language code, e.g. 'en' or 'ru'." })),
|
|
70
70
|
languages: Type.Optional(Type.Record(Type.String(), DictationLanguageModelConfig, { description: "Available language models keyed by language code." })),
|
|
71
71
|
}, { description: "Voice dictation (Vosk) configuration." });
|
|
72
|
+
const DesktopConfig = Type.Object({
|
|
73
|
+
externalEditor: Type.Optional(Type.String({
|
|
74
|
+
description: "External editor used by Pix Desktop project explorer. Known aliases include zed, code/vscode, cursor, subl/sublime, idea/intellij, and webstorm; an executable path/name is also accepted.",
|
|
75
|
+
})),
|
|
76
|
+
git: Type.Optional(Type.Object({
|
|
77
|
+
reviewModelRef: Type.Optional(Type.String({
|
|
78
|
+
description: "Model reference used by Pix Desktop for LLM review of Git diffs, optionally with a :thinking suffix.",
|
|
79
|
+
})),
|
|
80
|
+
commitMessageModelRef: Type.Optional(Type.String({
|
|
81
|
+
description: "Model reference used by Pix Desktop to generate Git commit messages, optionally with a :thinking suffix.",
|
|
82
|
+
})),
|
|
83
|
+
}, { description: "Pix Desktop Git/Source Control LLM preferences." })),
|
|
84
|
+
}, { description: "Pix Desktop-specific preferences." });
|
|
72
85
|
// ---------------------------------------------------------------------------
|
|
73
86
|
// Top-level schema
|
|
74
87
|
// ---------------------------------------------------------------------------
|
|
@@ -85,6 +98,7 @@ export const PixConfigSchema = Type.Object({
|
|
|
85
98
|
modelColors: Type.Optional(ModelColorsConfig),
|
|
86
99
|
iconTheme: Type.Optional(IconThemeConfig),
|
|
87
100
|
dictation: Type.Optional(DictationConfig),
|
|
101
|
+
desktop: Type.Optional(DesktopConfig),
|
|
88
102
|
}, {
|
|
89
103
|
$id: "https://unpkg.com/pi-ui-extend/schemas/pix.json",
|
|
90
104
|
$schema: "https://json-schema.org/draft-07/schema#",
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** JSON Schema for project-scoped Desktop tasks stored in <cwd>/.pi/tasks.jsonc. */
|
|
2
|
+
import { Static, Type } from "typebox";
|
|
3
|
+
export declare const ProjectTasksSchema: Type.TObject<{
|
|
4
|
+
$schema: Type.TOptional<Type.TString>;
|
|
5
|
+
version: Type.TLiteral<1>;
|
|
6
|
+
tasks: Type.TArray<Type.TObject<{
|
|
7
|
+
id: Type.TString;
|
|
8
|
+
title: Type.TString;
|
|
9
|
+
description: Type.TOptional<Type.TString>;
|
|
10
|
+
type: Type.TUnion<[Type.TLiteral<"bug">, Type.TLiteral<"feature">, Type.TLiteral<"improvement">]>;
|
|
11
|
+
status: Type.TUnion<[Type.TLiteral<"backlog">, Type.TLiteral<"todo">, Type.TLiteral<"in-progress">, Type.TLiteral<"done">]>;
|
|
12
|
+
priority: Type.TUnion<[Type.TLiteral<"low">, Type.TLiteral<"medium">, Type.TLiteral<"high">, Type.TLiteral<"urgent">]>;
|
|
13
|
+
sessionId: Type.TOptional<Type.TString>;
|
|
14
|
+
createdAt: Type.TString;
|
|
15
|
+
updatedAt: Type.TString;
|
|
16
|
+
}>>;
|
|
17
|
+
}>;
|
|
18
|
+
export type ProjectTasksSchemaType = Static<typeof ProjectTasksSchema>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** JSON Schema for project-scoped Desktop tasks stored in <cwd>/.pi/tasks.jsonc. */
|
|
2
|
+
import { Type } from "typebox";
|
|
3
|
+
const TaskType = Type.Union([
|
|
4
|
+
Type.Literal("bug"),
|
|
5
|
+
Type.Literal("feature"),
|
|
6
|
+
Type.Literal("improvement"),
|
|
7
|
+
]);
|
|
8
|
+
const TaskStatus = Type.Union([
|
|
9
|
+
Type.Literal("backlog"),
|
|
10
|
+
Type.Literal("todo"),
|
|
11
|
+
Type.Literal("in-progress"),
|
|
12
|
+
Type.Literal("done"),
|
|
13
|
+
]);
|
|
14
|
+
const TaskPriority = Type.Union([
|
|
15
|
+
Type.Literal("low"),
|
|
16
|
+
Type.Literal("medium"),
|
|
17
|
+
Type.Literal("high"),
|
|
18
|
+
Type.Literal("urgent"),
|
|
19
|
+
]);
|
|
20
|
+
const ProjectTask = Type.Object({
|
|
21
|
+
id: Type.String({ minLength: 1, maxLength: 128, description: "Stable unique task id." }),
|
|
22
|
+
title: Type.String({ minLength: 1, maxLength: 200, description: "Short task title." }),
|
|
23
|
+
description: Type.Optional(Type.String({ maxLength: 10_000, description: "Optional detailed task description." })),
|
|
24
|
+
type: TaskType,
|
|
25
|
+
status: TaskStatus,
|
|
26
|
+
priority: TaskPriority,
|
|
27
|
+
sessionId: Type.Optional(Type.String({ minLength: 1, maxLength: 512, description: "Optional Pi session associated with this task." })),
|
|
28
|
+
createdAt: Type.String({ format: "date-time", description: "RFC 3339 creation timestamp." }),
|
|
29
|
+
updatedAt: Type.String({ format: "date-time", description: "RFC 3339 last-update timestamp." }),
|
|
30
|
+
}, { additionalProperties: false });
|
|
31
|
+
export const ProjectTasksSchema = Type.Object({
|
|
32
|
+
$schema: Type.Optional(Type.String({ description: "JSON Schema URL used by editors for validation and autocomplete." })),
|
|
33
|
+
version: Type.Literal(1, { description: "Task document format version." }),
|
|
34
|
+
tasks: Type.Array(ProjectTask, { maxItems: 10_000, description: "Project tasks. Task ids must be unique." }),
|
|
35
|
+
}, {
|
|
36
|
+
$id: "https://unpkg.com/pi-ui-extend/schemas/tasks.json",
|
|
37
|
+
$schema: "https://json-schema.org/draft-07/schema#",
|
|
38
|
+
title: "Pix Project Tasks",
|
|
39
|
+
description: "Project-scoped task document stored in <cwd>/.pi/tasks.jsonc.",
|
|
40
|
+
additionalProperties: false,
|
|
41
|
+
});
|
package/docs/concurrency.md
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
# Spec: Application concurrency and lifecycle safety
|
|
2
2
|
|
|
3
|
+
<!-- markdownlint-disable MD013 -->
|
|
4
|
+
|
|
3
5
|
## Type
|
|
4
6
|
|
|
5
7
|
Change
|
|
6
8
|
|
|
9
|
+
## Lifecycle
|
|
10
|
+
|
|
11
|
+
Active implemented contract.
|
|
12
|
+
|
|
7
13
|
## Goal
|
|
8
14
|
|
|
9
15
|
Keep tab, session, editor, extension UI, persistence, and shutdown work bound to
|
package/docs/desktop-mvp.md
CHANGED
|
@@ -4,6 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
Change
|
|
6
6
|
|
|
7
|
+
## Lifecycle
|
|
8
|
+
|
|
9
|
+
Historical baseline. This document records the first Desktop vertical slice and
|
|
10
|
+
still contains useful process-host/ACP transport contracts, but it is no longer
|
|
11
|
+
the current feature-scope inventory. Later implemented Desktop behavior is
|
|
12
|
+
specified by the `specs/desktop-*.md` family.
|
|
13
|
+
|
|
7
14
|
## Goal
|
|
8
15
|
|
|
9
16
|
Provide a lightweight desktop client for Pix using Tauri 2 and Svelte 5 +
|
|
@@ -21,7 +28,11 @@ updates, cancel a running turn, and answer extension elicitations.
|
|
|
21
28
|
elicitations.
|
|
22
29
|
- Development commands and a documented local setup path.
|
|
23
30
|
|
|
24
|
-
##
|
|
31
|
+
## MVP-era non-goals
|
|
32
|
+
|
|
33
|
+
The items below were intentionally out of scope for the first slice. Several
|
|
34
|
+
were implemented later and are governed by newer feature specs; they are not
|
|
35
|
+
current product non-goals.
|
|
25
36
|
|
|
26
37
|
- Feature parity with `PiUiExtendApp`.
|
|
27
38
|
- Voice input, an embedded terminal, custom widgets, image attachments,
|