@pi-unipi/unipi 3.0.0-alpha.2 → 3.0.0-alpha.21
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/CHANGELOG.md +292 -0
- package/README.md +8 -11
- package/docs/prefix-cache-architecture.md +14 -0
- package/package.json +22 -24
- package/packages/ask-user/README.md +55 -107
- package/packages/ask-user/ask-ui.ts +306 -732
- package/packages/ask-user/clipboard.ts +50 -0
- package/packages/ask-user/config.ts +74 -78
- package/packages/ask-user/package.json +2 -2
- package/packages/ask-user/questions.ts +151 -0
- package/packages/ask-user/skills/ask-user/SKILL.md +59 -133
- package/packages/ask-user/tools.ts +198 -432
- package/packages/autocomplete/package.json +1 -1
- package/packages/autocomplete/src/constants.ts +38 -43
- package/packages/autocomplete/src/sorting.ts +8 -0
- package/packages/background-tasks/package.json +2 -2
- package/packages/background-tasks/src/config.ts +0 -73
- package/packages/background-tasks/src/index.ts +20 -16
- package/packages/background-tasks/src/registry.ts +1 -171
- package/packages/background-tasks/src/types.ts +0 -32
- package/packages/btw/README.md +13 -56
- package/packages/btw/extensions/btw.ts +403 -1796
- package/packages/btw/package.json +5 -2
- package/packages/btw/skills/btw/SKILL.md +7 -143
- package/packages/compactor/README.md +56 -287
- package/packages/compactor/package.json +5 -9
- package/packages/compactor/skills/compactor/SKILL.md +13 -20
- package/packages/compactor/src/card.ts +90 -0
- package/packages/compactor/src/commands/index.ts +73 -130
- package/packages/compactor/src/compaction/compact-args.ts +5 -3
- package/packages/compactor/src/compaction/filter-noise.ts +1 -1
- package/packages/compactor/src/compaction/hooks.ts +487 -311
- package/packages/compactor/src/compaction/source.ts +178 -0
- package/packages/compactor/src/compaction/summarize.ts +586 -52
- package/packages/compactor/src/config/manager.ts +130 -127
- package/packages/compactor/src/config/schema.ts +32 -48
- package/packages/compactor/src/index.ts +40 -431
- package/packages/compactor/src/info-screen.ts +44 -190
- package/packages/compactor/src/session/recall-blocks.ts +1 -1
- package/packages/compactor/src/stats.ts +76 -0
- package/packages/compactor/src/tools/context-budget.ts +17 -34
- package/packages/compactor/src/tools/ctx-doctor.ts +45 -36
- package/packages/compactor/src/tools/register.ts +29 -269
- package/packages/compactor/src/types.ts +47 -186
- package/packages/core/README.md +25 -0
- package/packages/core/child-agent.ts +1 -0
- package/packages/core/command-echo.ts +63 -0
- package/packages/core/compaction-context.ts +41 -0
- package/packages/core/constants.ts +8 -38
- package/packages/core/events.ts +0 -53
- package/packages/core/fusion-status.ts +4 -0
- package/packages/core/global.d.ts +10 -0
- package/packages/core/harness-messages.ts +392 -0
- package/packages/core/index.ts +14 -0
- package/packages/core/kanboard-status.ts +49 -0
- package/packages/core/long-horizon-owner-status.ts +46 -0
- package/packages/core/model-cache.ts +81 -7
- package/packages/core/package.json +6 -3
- package/packages/core/src/attach/detect.ts +163 -0
- package/packages/core/src/child-agent/child-args.ts +31 -0
- package/packages/core/src/child-agent/delivery.ts +41 -0
- package/packages/core/src/child-agent/index.ts +5 -0
- package/packages/core/src/child-agent/readers.ts +203 -0
- package/packages/core/src/child-agent/runtime.ts +584 -0
- package/packages/core/src/evidence.ts +78 -0
- package/packages/core/src/hints/browser.ts +278 -0
- package/packages/core/src/hints/crab-data.ts +19 -0
- package/packages/core/src/hints/index.ts +865 -0
- package/packages/core/src/hints/lines.ts +607 -0
- package/packages/core/src/hints/store.ts +120 -0
- package/packages/core/src/jev/chatter.ts +24 -0
- package/packages/core/src/jev/settings.ts +177 -14
- package/packages/core/src/package-colors.ts +2 -0
- package/packages/core/src/settings/catalog.ts +39 -15
- package/packages/core/src/settings/engine.ts +48 -2
- package/packages/core/src/settings/hub.ts +83 -20
- package/packages/core/src/settings/open.ts +49 -0
- package/packages/core/src/settings/schema.ts +27 -7
- package/packages/core/src/tui/hub-kit.ts +18 -5
- package/packages/core/src/tui/kit.ts +198 -0
- package/packages/core/src/tui/progress.ts +73 -0
- package/packages/core/src/turn/arbiter.ts +290 -0
- package/packages/footer/README.md +4 -6
- package/packages/footer/package.json +3 -3
- package/packages/footer/src/glance-editor.ts +19 -11
- package/packages/footer/src/help.ts +1 -1
- package/packages/footer/src/index.ts +36 -3
- package/packages/footer/src/presets.ts +3 -4
- package/packages/footer/src/rendering/icons.ts +0 -20
- package/packages/footer/src/segments/compactor.ts +52 -142
- package/packages/footer/src/segments/status-ext.ts +0 -1
- package/packages/fusion/README.md +14 -4
- package/packages/fusion/package.json +4 -3
- package/packages/fusion/src/child-args.ts +1 -0
- package/packages/fusion/src/index.ts +161 -8
- package/packages/fusion/src/pi-settings.ts +57 -0
- package/packages/fusion/src/picker.ts +186 -51
- package/packages/fusion/src/preset.ts +56 -2
- package/packages/fusion/src/prompts.ts +1 -1
- package/packages/fusion/src/sidekick-runtime.ts +1 -420
- package/packages/fusion/src/tools.ts +107 -128
- package/packages/fusion/src/transcript.ts +27 -85
- package/packages/info-screen/package.json +2 -2
- package/packages/input-shortcuts/README.md +18 -30
- package/packages/input-shortcuts/package.json +2 -2
- package/packages/input-shortcuts/src/burst.ts +88 -0
- package/packages/input-shortcuts/src/chord-overlay.ts +20 -70
- package/packages/input-shortcuts/src/cleared-input.ts +97 -0
- package/packages/input-shortcuts/src/index.ts +99 -193
- package/packages/input-shortcuts/src/last-response.ts +40 -0
- package/packages/input-shortcuts/src/registers.ts +8 -23
- package/packages/input-shortcuts/src/types.ts +4 -16
- package/packages/input-shortcuts/src/undo-redo.ts +59 -47
- package/packages/kanboard/README.md +51 -47
- package/packages/kanboard/index.ts +293 -55
- package/packages/kanboard/package.json +8 -8
- package/packages/kanboard/skills/kanboard/SKILL.md +61 -27
- package/packages/kanboard/src/badges.ts +93 -0
- package/packages/kanboard/src/bin.ts +4 -2
- package/packages/kanboard/src/commands.ts +218 -84
- package/packages/kanboard/src/debug.ts +20 -0
- package/packages/kanboard/src/guard.ts +267 -109
- package/packages/kanboard/src/monitor.ts +330 -0
- package/packages/kanboard/src/notice-buffer.ts +74 -0
- package/packages/kanboard/src/progress.ts +27 -0
- package/packages/kanboard/src/reminders.ts +234 -0
- package/packages/kanboard/src/settings.ts +69 -15
- package/packages/kanboard/src/shapes.ts +5 -0
- package/packages/long-horizon/index.ts +190 -13
- package/packages/long-horizon/package.json +3 -3
- package/packages/long-horizon/src/commands.ts +103 -7
- package/packages/long-horizon/src/compaction-brief.ts +35 -0
- package/packages/long-horizon/src/engine/continuation.ts +84 -15
- package/packages/long-horizon/src/engine/goal-state.ts +64 -13
- package/packages/long-horizon/src/engine/nudge-stash.ts +71 -0
- package/packages/long-horizon/src/engine/ralph.ts +3 -2
- package/packages/long-horizon/src/engine/runaway.ts +68 -11
- package/packages/long-horizon/src/engine/verifier.ts +19 -0
- package/packages/long-horizon/src/gate.ts +37 -12
- package/packages/long-horizon/src/judge/resolve.ts +1 -0
- package/packages/long-horizon/src/owner.ts +35 -2
- package/packages/long-horizon/src/progress.ts +87 -0
- package/packages/long-horizon/src/prompts/goal.ts +1 -1
- package/packages/long-horizon/src/runtime.ts +172 -18
- package/packages/long-horizon/src/settings.ts +54 -39
- package/packages/long-horizon/src/tools/goal.ts +6 -0
- package/packages/long-horizon/src/tools/graph.ts +1 -1
- package/packages/long-horizon/src/tools/swarm.ts +3 -3
- package/packages/mcp/package.json +2 -2
- package/packages/memory/commands.ts +7 -2
- package/packages/memory/index.ts +210 -32
- package/packages/memory/package.json +3 -3
- package/packages/memory/save-session.ts +264 -0
- package/packages/memory/settings.ts +17 -0
- package/packages/memory/tools.ts +253 -203
- package/packages/notify/package.json +2 -2
- package/packages/skill-registry/README.md +53 -16
- package/packages/skill-registry/index.ts +230 -0
- package/packages/skill-registry/package.json +19 -8
- package/packages/skill-registry/src/editor.ts +206 -0
- package/packages/skill-registry/src/judge.ts +289 -0
- package/packages/skill-registry/src/registry.ts +87 -0
- package/packages/skill-registry/src/settings.ts +259 -0
- package/packages/skill-registry/src/vault.ts +80 -0
- package/packages/subagents/README.md +39 -119
- package/packages/subagents/package.json +6 -13
- package/packages/subagents/skills/subagents/SKILL.md +18 -42
- package/packages/subagents/src/agents.ts +213 -0
- package/packages/subagents/src/cards.ts +182 -0
- package/packages/subagents/src/index.ts +609 -1084
- package/packages/subagents/src/manager.ts +429 -0
- package/packages/subagents/src/profiles.ts +130 -0
- package/packages/subagents/src/transcript.ts +154 -0
- package/packages/subagents/src/ui.ts +389 -0
- package/packages/unipi/bundled.js +39756 -45569
- package/packages/unipi/index.ts +55 -10
- package/packages/updater/package.json +2 -2
- package/packages/utility/README.md +76 -69
- package/packages/utility/package.json +2 -2
- package/packages/utility/skills/image/SKILL.md +37 -0
- package/packages/utility/skills/utility/SKILL.md +17 -60
- package/packages/utility/src/answer/extract.ts +128 -0
- package/packages/utility/src/answer/index.ts +213 -0
- package/packages/utility/src/answer/reply.ts +133 -0
- package/packages/utility/src/answer/web.ts +167 -0
- package/packages/utility/src/attach/index.ts +205 -0
- package/packages/utility/src/commands.ts +38 -142
- package/packages/utility/src/diagnostics/engine.ts +50 -5
- package/packages/utility/src/image/index.ts +33 -0
- package/packages/utility/src/image/models.ts +221 -0
- package/packages/{image/src → utility/src/image}/recognize.ts +2 -2
- package/packages/utility/src/image/settings.ts +178 -0
- package/packages/{image/src/image-source.ts → utility/src/image/source.ts} +1 -1
- package/packages/utility/src/image/tools.ts +168 -0
- package/packages/utility/src/image/transports.ts +186 -0
- package/packages/utility/src/index.ts +68 -389
- package/packages/utility/src/lifecycle/cleanup.ts +116 -311
- package/packages/utility/src/rename/gate.ts +102 -0
- package/packages/utility/src/rename/index.ts +191 -0
- package/packages/utility/src/rename/session.ts +170 -0
- package/packages/utility/src/render/delegated.ts +285 -0
- package/packages/utility/src/render/harness.ts +683 -0
- package/packages/utility/src/render/parse.ts +156 -0
- package/packages/utility/src/render/pi-settings.ts +38 -0
- package/packages/utility/src/render/reply-bg.ts +307 -0
- package/packages/utility/src/render/simple.ts +724 -0
- package/packages/utility/src/render/spacing.ts +235 -0
- package/packages/utility/src/render/styled.ts +251 -0
- package/packages/utility/src/render/tools.ts +353 -0
- package/packages/utility/src/settings.ts +166 -233
- package/packages/utility/src/types.ts +1 -222
- package/packages/watchdog/index.ts +17 -6
- package/packages/watchdog/package.json +3 -3
- package/packages/watchdog/src/config.ts +3 -2
- package/packages/web-api/package.json +2 -2
- package/packages/workflow/README.md +3 -0
- package/packages/workflow/index.ts +0 -2
- package/packages/workflow/package.json +2 -2
- package/packages/workflow/src/permission/decide.ts +6 -4
- package/packages/workflow/src/permission/index.ts +17 -7
- package/packages/workflow/src/permission/settings.ts +39 -4
- package/packages/workflow/src/plan/index.ts +19 -4
- package/packages/background-tasks/extensions/delegate-child.ts +0 -1
- package/packages/background-tasks/src/context-parent-snapshot.ts +0 -142
- package/packages/background-tasks/src/context-token-budget.ts +0 -903
- package/packages/background-tasks/src/context-visible-conversation-v2.ts +0 -551
- package/packages/background-tasks/src/delegate/artifacts.ts +0 -487
- package/packages/background-tasks/src/delegate/budget.ts +0 -415
- package/packages/background-tasks/src/delegate/hook-contract-evidence.json +0 -18
- package/packages/background-tasks/src/delegate/hook-contract.ts +0 -154
- package/packages/background-tasks/src/delegate/launch.ts +0 -484
- package/packages/background-tasks/src/delegate/result-package.ts +0 -459
- package/packages/background-tasks/src/delegate/runner.ts +0 -430
- package/packages/background-tasks/src/delegate/seed.ts +0 -423
- package/packages/background-tasks/src/delegate/types.ts +0 -323
- package/packages/background-tasks/src/delegate-child-extension.ts +0 -978
- package/packages/background-tasks/src/delegate-extension.ts +0 -654
- package/packages/background-tasks/src/fixtures/delegate-context-incident.json +0 -17
- package/packages/compactor/skills/compactor-detail/SKILL.md +0 -116
- package/packages/compactor/skills/compactor-doctor/SKILL.md +0 -71
- package/packages/compactor/skills/compactor-stats/SKILL.md +0 -51
- package/packages/compactor/src/compaction/build-sections.ts +0 -76
- package/packages/compactor/src/compaction/extract/goals.ts +0 -36
- package/packages/compactor/src/compaction/extract/preferences.ts +0 -40
- package/packages/compactor/src/compaction/format.ts +0 -53
- package/packages/compactor/src/compaction/merge.ts +0 -143
- package/packages/compactor/src/config/presets.ts +0 -160
- package/packages/compactor/src/executor/executor.ts +0 -233
- package/packages/compactor/src/executor/runtime.ts +0 -115
- package/packages/compactor/src/security/evaluator.ts +0 -89
- package/packages/compactor/src/security/policy.ts +0 -96
- package/packages/compactor/src/security/scanner.ts +0 -65
- package/packages/compactor/src/session/auto-inject.ts +0 -60
- package/packages/compactor/src/session/db.ts +0 -325
- package/packages/compactor/src/session/extract.ts +0 -144
- package/packages/compactor/src/session/resume-inject.ts +0 -64
- package/packages/compactor/src/session/snapshot.ts +0 -327
- package/packages/compactor/src/tools/ctx-batch-execute.ts +0 -41
- package/packages/compactor/src/tools/ctx-execute-file.ts +0 -23
- package/packages/compactor/src/tools/ctx-execute.ts +0 -23
- package/packages/compactor/src/tools/ctx-stats.ts +0 -96
- package/packages/image/README.md +0 -99
- package/packages/image/package.json +0 -61
- package/packages/image/skills/image/SKILL.md +0 -76
- package/packages/image/src/generate.ts +0 -256
- package/packages/image/src/index.ts +0 -135
- package/packages/image/src/models.ts +0 -519
- package/packages/image/src/openai-images-api.ts +0 -282
- package/packages/image/src/register-providers.ts +0 -209
- package/packages/image/src/settings.ts +0 -173
- package/packages/image/src/tools.ts +0 -326
- package/packages/input-shortcuts/src/clipboard.ts +0 -119
- package/packages/kanboard/src/runner.ts +0 -817
- package/packages/skill-registry/skills/auto/SKILL.md +0 -465
- package/packages/skill-registry/skills/brainstorm/SKILL.md +0 -219
- package/packages/skill-registry/skills/chore-create/SKILL.md +0 -315
- package/packages/skill-registry/skills/chore-execute/SKILL.md +0 -314
- package/packages/skill-registry/skills/consolidate/SKILL.md +0 -142
- package/packages/skill-registry/skills/consultant/SKILL.md +0 -97
- package/packages/skill-registry/skills/debug/SKILL.md +0 -228
- package/packages/skill-registry/skills/document/SKILL.md +0 -120
- package/packages/skill-registry/skills/fix/SKILL.md +0 -212
- package/packages/skill-registry/skills/gather-context/SKILL.md +0 -145
- package/packages/skill-registry/skills/plan/SKILL.md +0 -231
- package/packages/skill-registry/skills/quick-fix/SKILL.md +0 -135
- package/packages/skill-registry/skills/quick-work/SKILL.md +0 -110
- package/packages/skill-registry/skills/research/SKILL.md +0 -251
- package/packages/skill-registry/skills/review-work/SKILL.md +0 -187
- package/packages/skill-registry/skills/scan-issues/SKILL.md +0 -195
- package/packages/skill-registry/skills/work/SKILL.md +0 -218
- package/packages/skill-registry/skills/worktree-create/SKILL.md +0 -69
- package/packages/skill-registry/skills/worktree-list/SKILL.md +0 -78
- package/packages/skill-registry/skills/worktree-merge/SKILL.md +0 -89
- package/packages/subagents/agents/delegate.md +0 -14
- package/packages/subagents/agents/oracle.md +0 -78
- package/packages/subagents/agents/researcher.md +0 -52
- package/packages/subagents/agents/reviewer.md +0 -80
- package/packages/subagents/agents/scout.md +0 -50
- package/packages/subagents/agents/worker.md +0 -59
- package/packages/subagents/prompts/council.md +0 -48
- package/packages/subagents/prompts/gather-context-and-clarify.md +0 -13
- package/packages/subagents/prompts/parallel-cleanup.md +0 -59
- package/packages/subagents/prompts/parallel-research.md +0 -50
- package/packages/subagents/prompts/parallel-review.md +0 -54
- package/packages/subagents/prompts/review-loop.md +0 -43
- package/packages/subagents/skills/council-mode/SKILL.md +0 -230
- package/packages/subagents/skills/subagents/references/constraints-and-recipes.md +0 -259
- package/packages/subagents/skills/subagents/references/execution-controls.md +0 -454
- package/packages/subagents/skills/subagents/references/management-authoring-rpc.md +0 -161
- package/packages/subagents/skills/subagents/references/multi-lane-orchestration.md +0 -39
- package/packages/subagents/skills/subagents/references/prompting-and-roles.md +0 -267
- package/packages/subagents/src/acceptance.ts +0 -331
- package/packages/subagents/src/agent-manager.ts +0 -405
- package/packages/subagents/src/agent-memory.ts +0 -300
- package/packages/subagents/src/agent-overrides.ts +0 -183
- package/packages/subagents/src/agent-runner.ts +0 -271
- package/packages/subagents/src/async-runner.ts +0 -422
- package/packages/subagents/src/authority-policy.ts +0 -47
- package/packages/subagents/src/budgets.ts +0 -285
- package/packages/subagents/src/child-safety.ts +0 -140
- package/packages/subagents/src/config.ts +0 -249
- package/packages/subagents/src/conversation-viewer.ts +0 -281
- package/packages/subagents/src/core-compat.ts +0 -94
- package/packages/subagents/src/custom-agents.ts +0 -343
- package/packages/subagents/src/file-system-retry.ts +0 -50
- package/packages/subagents/src/fleet-data.ts +0 -105
- package/packages/subagents/src/fleet-view.ts +0 -322
- package/packages/subagents/src/foreground-detach.ts +0 -59
- package/packages/subagents/src/fork-context.ts +0 -285
- package/packages/subagents/src/global.d.ts +0 -7
- package/packages/subagents/src/guide.ts +0 -129
- package/packages/subagents/src/mission-state.ts +0 -133
- package/packages/subagents/src/mission-store.ts +0 -436
- package/packages/subagents/src/output-limits.ts +0 -142
- package/packages/subagents/src/parity-types.ts +0 -315
- package/packages/subagents/src/pi-args.ts +0 -167
- package/packages/subagents/src/result-files.ts +0 -232
- package/packages/subagents/src/result-watcher.ts +0 -221
- package/packages/subagents/src/retained-children.ts +0 -176
- package/packages/subagents/src/run-fanout-budget.ts +0 -356
- package/packages/subagents/src/scheduled-runs.ts +0 -349
- package/packages/subagents/src/schemas.ts +0 -263
- package/packages/subagents/src/slash-commands.ts +0 -80
- package/packages/subagents/src/supervisor-channel.ts +0 -249
- package/packages/subagents/src/tool-handler.ts +0 -1144
- package/packages/subagents/src/types.ts +0 -238
- package/packages/subagents/src/widget.ts +0 -457
- package/packages/subagents/src/workflow-script.ts +0 -737
- package/packages/subagents/src/workflow-worker.ts +0 -384
- package/packages/subagents/src/worktree.ts +0 -614
- package/packages/utility/src/analytics/collector.ts +0 -293
- package/packages/utility/src/info-screen.ts +0 -80
- package/packages/utility/src/lifecycle/process.ts +0 -162
- package/packages/utility/src/prefix-cache.ts +0 -263
- package/packages/utility/src/skill-discovery.ts +0 -542
- package/packages/utility/src/tools/env.ts +0 -113
- package/packages/utility/src/tui/name-badge-state.ts +0 -315
- package/packages/utility/src/tui/name-badge.ts +0 -109
- /package/packages/{subagents/src → core/src/child-agent}/pi-spawn.ts +0 -0
|
@@ -1,148 +1,175 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Config manager — load
|
|
2
|
+
* Config manager — load and save compactor settings
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
6
5
|
import { homedir } from "node:os";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { getSettingsScoped, registerSettings, setSettings } from "@pi-unipi/core";
|
|
9
8
|
import type { CompactorConfig } from "../types.js";
|
|
10
9
|
import { DEFAULT_COMPACTOR_CONFIG } from "./schema.js";
|
|
11
10
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
// Absorbs the deleted legacy settings overlay: per-strategy modes,
|
|
17
|
-
// the % auto-compaction trigger, pipeline toggles, and preset actions.
|
|
18
|
-
const STRATEGY_MODES: ReadonlyArray<SettingsField> = [
|
|
19
|
-
{ key: "sessionGoals.mode", type: "enum", label: "Session goals mode", options: ["full", "brief", "off"] },
|
|
20
|
-
{ key: "filesAndChanges.mode", type: "enum", label: "Files & changes mode", options: ["all", "modified-only", "off"] },
|
|
21
|
-
{ key: "commits.mode", type: "enum", label: "Commits mode", options: ["full", "brief", "off"] },
|
|
22
|
-
{ key: "outstandingContext.mode", type: "enum", label: "Outstanding context mode", options: ["full", "critical-only", "off"] },
|
|
23
|
-
{ key: "userPreferences.mode", type: "enum", label: "User preferences mode", options: ["all", "recent-only", "off"] },
|
|
24
|
-
{ key: "briefTranscript.mode", type: "enum", label: "Brief transcript mode", options: ["full", "compact", "minimal", "off"] },
|
|
25
|
-
{ key: "sessionContinuity.mode", type: "enum", label: "Session continuity mode", options: ["full", "off"] },
|
|
26
|
-
{ key: "sandboxExecution.mode", type: "enum", label: "Sandbox execution mode", options: ["all", "off"] },
|
|
27
|
-
];
|
|
11
|
+
const METHOD_OPTIONS = [
|
|
12
|
+
{ value: "vcc", label: "lossless (no model)" },
|
|
13
|
+
{ value: "llm", label: "model summary" },
|
|
14
|
+
] as const;
|
|
28
15
|
|
|
16
|
+
// Registered with the unified settings hub. Canonical paths:
|
|
17
|
+
// global ~/.unipi/config/compactor/config.json,
|
|
18
|
+
// project .unipi/config/compactor/config.json.
|
|
29
19
|
registerSettings({
|
|
30
20
|
namespace: "compactor",
|
|
31
21
|
label: "Compactor",
|
|
32
|
-
defaults: DEFAULT_COMPACTOR_CONFIG as unknown as Record<string, unknown>,
|
|
22
|
+
defaults: { ...DEFAULT_COMPACTOR_CONFIG } as unknown as Record<string, unknown>,
|
|
33
23
|
schema: [
|
|
34
24
|
{
|
|
35
|
-
title: "
|
|
36
|
-
description: "
|
|
25
|
+
title: "Compaction",
|
|
26
|
+
description: "How the context is shrunk when it fills up",
|
|
37
27
|
fields: [
|
|
38
|
-
{
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
{
|
|
46
|
-
|
|
28
|
+
{
|
|
29
|
+
key: "method",
|
|
30
|
+
type: "enum",
|
|
31
|
+
label: "Method",
|
|
32
|
+
description: "Lossless: instant structured summary, full history stays searchable. Model summary: Pi's model-written summary (costs a model call).",
|
|
33
|
+
options: METHOD_OPTIONS,
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
key: "piCompact",
|
|
37
|
+
type: "enum",
|
|
38
|
+
label: "Pi's /compact",
|
|
39
|
+
description: "What Pi's built-in /compact command does",
|
|
40
|
+
options: [{ value: "follow", label: "same as Method" }, ...METHOD_OPTIONS],
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
key: "trigger",
|
|
44
|
+
type: "enum",
|
|
45
|
+
label: "When",
|
|
46
|
+
description: "Pi's limit: compact when the context nears the model's window (Pi's compaction settings). Percentage: compact at a set % of the window.",
|
|
47
|
+
options: [
|
|
48
|
+
{ value: "pi", label: "Pi's context limit" },
|
|
49
|
+
{ value: "percent", label: "at a percentage" },
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
{ key: "thresholdPercent", type: "number", label: "Percentage", min: 30, max: 95, description: "Used when When = at a percentage" },
|
|
53
|
+
{ key: "notify", type: "boolean", label: "Notifications", description: "Show a notice when compaction runs or fails" },
|
|
47
54
|
],
|
|
48
55
|
},
|
|
49
56
|
{
|
|
50
|
-
title: "
|
|
51
|
-
description: "
|
|
57
|
+
title: "Advanced compaction",
|
|
58
|
+
description: "Tuned defaults — rarely worth changing",
|
|
59
|
+
advanced: true,
|
|
52
60
|
fields: [
|
|
53
|
-
{ key: "
|
|
54
|
-
{ key: "
|
|
55
|
-
{ key: "
|
|
56
|
-
{ key: "
|
|
57
|
-
{ key: "
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
{ key: "
|
|
64
|
-
{ key: "
|
|
65
|
-
{ key: "
|
|
61
|
+
{ key: "smartKeepTail", type: "boolean", label: "Smart keep tail", description: "Keep more recent turns when the kept tail would be tiny (≤5k tokens, up to 25k)" },
|
|
62
|
+
{ key: "summaryBudgetTokens", type: "number", label: "Summary budget", min: 0, max: 20000, zeroLabel: "auto", description: "Lossless summary size in tokens (auto scales 1.5k–4k with session size)" },
|
|
63
|
+
{ key: "sections.activeWork", type: "boolean", label: "Section: active work", description: "Goal, ralph and kanboard state from those modules" },
|
|
64
|
+
{ key: "sections.requests", type: "boolean", label: "Section: your requests" },
|
|
65
|
+
{ key: "sections.state", type: "boolean", label: "Section: latest state", description: "The agent's most recent progress reports" },
|
|
66
|
+
{ key: "sections.decisions", type: "boolean", label: "Section: decisions & constraints" },
|
|
67
|
+
{ key: "sections.files", type: "boolean", label: "Section: files" },
|
|
68
|
+
{ key: "sections.commits", type: "boolean", label: "Section: commits" },
|
|
69
|
+
{ key: "sections.errors", type: "boolean", label: "Section: open errors" },
|
|
70
|
+
{ key: "sections.lessons", type: "boolean", label: "Section: lessons", description: "Lessons the agent wrote down: memory notes, # comments, diagnoses" },
|
|
71
|
+
{ key: "sections.transcript", type: "boolean", label: "Section: recent transcript" },
|
|
72
|
+
{ key: "cooldownMs", type: "number", label: "Percentage cooldown ms", min: 0, zeroLabel: "none", description: "Minimum delay between percentage-triggered compactions" },
|
|
73
|
+
{ key: "repeatMinGrowthTokens", type: "number", label: "Percentage repeat growth", min: 0, zeroLabel: "off", description: "New tokens needed to compact again while still above the percentage" },
|
|
74
|
+
{ key: "llmInstructions", type: "string", label: "Model summary instructions", emptyLabel: "none", description: "Extra instructions passed to model-written summaries" },
|
|
66
75
|
{ key: "debug", type: "boolean", label: "Debug output", description: "Write compaction diagnostics to /tmp/compactor-debug.json" },
|
|
67
76
|
],
|
|
68
77
|
},
|
|
69
|
-
{
|
|
70
|
-
title: "Presets",
|
|
71
|
-
description: "One-key bundles of strategy + auto settings",
|
|
72
|
-
fields: [
|
|
73
|
-
{ key: "preset.precise", type: "action", label: "Apply preset: precise", description: "Maximum fidelity — everything on, full modes", command: "unipi:compact-apply-precise" },
|
|
74
|
-
{ key: "preset.balanced", type: "action", label: "Apply preset: balanced", description: "Default mix", command: "unipi:compact-apply-balanced" },
|
|
75
|
-
{ key: "preset.thorough", type: "action", label: "Apply preset: thorough", description: "Deep extraction, heavier output", command: "unipi:compact-apply-thorough" },
|
|
76
|
-
{ key: "preset.lean", type: "action", label: "Apply preset: lean", description: "Minimal footprint", command: "unipi:compact-apply-lean" },
|
|
77
|
-
],
|
|
78
|
-
},
|
|
79
78
|
],
|
|
80
79
|
});
|
|
81
80
|
|
|
82
81
|
export const COMPACTOR_CONFIG_PATH = join(homedir(), ".unipi", "config", "compactor", "config.json");
|
|
83
82
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
83
|
+
type Raw = Record<string, unknown>;
|
|
84
|
+
|
|
85
|
+
const isRecord = (value: unknown): value is Raw =>
|
|
86
|
+
typeof value === "object" && value !== null && !Array.isArray(value);
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Translate a pre-rework config (overrideDefaultCompaction / autoCompaction.*)
|
|
90
|
+
* into the current keys. Only fills keys the scope does not already set.
|
|
91
|
+
*/
|
|
92
|
+
export function translateLegacyConfig(raw: Raw): Raw {
|
|
93
|
+
const out: Raw = {};
|
|
94
|
+
for (const key of Object.keys(DEFAULT_COMPACTOR_CONFIG)) {
|
|
95
|
+
if (key in raw) out[key] = raw[key];
|
|
96
|
+
}
|
|
97
|
+
// The jev method was removed: a saved method:"jev" behaves as "vcc".
|
|
98
|
+
if (out.method === "jev") out.method = "vcc";
|
|
99
|
+
if (out.piCompact === "jev") out.piCompact = "vcc";
|
|
100
|
+
if (!("method" in raw) && raw.overrideDefaultCompaction === false) out.method = "llm";
|
|
101
|
+
const auto = raw.autoCompaction;
|
|
102
|
+
if (isRecord(auto)) {
|
|
103
|
+
if (!("trigger" in raw) && auto.enabled === true) out.trigger = "percent";
|
|
104
|
+
const carry: Array<[keyof CompactorConfig, string]> = [
|
|
105
|
+
["thresholdPercent", "thresholdPercent"],
|
|
106
|
+
["cooldownMs", "cooldownMs"],
|
|
107
|
+
["repeatMinGrowthTokens", "repeatMinGrowthTokens"],
|
|
108
|
+
["notify", "notify"],
|
|
109
|
+
];
|
|
110
|
+
for (const [to, from] of carry) {
|
|
111
|
+
if (!(to in raw) && auto[from] !== undefined) out[to] = auto[from];
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return out;
|
|
87
115
|
}
|
|
88
116
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
117
|
+
function deepMerge<T extends Raw>(base: T, override: Raw): T {
|
|
118
|
+
const result: Raw = { ...base };
|
|
119
|
+
for (const [key, value] of Object.entries(override)) {
|
|
120
|
+
if (value === undefined) continue;
|
|
121
|
+
result[key] = isRecord(value) && isRecord(result[key]) ? deepMerge(result[key] as Raw, value) : value;
|
|
94
122
|
}
|
|
95
|
-
|
|
123
|
+
return result as T;
|
|
124
|
+
}
|
|
96
125
|
|
|
97
|
-
/**
|
|
98
|
-
function
|
|
99
|
-
|
|
100
|
-
for (const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
!Array.isArray(overrideVal) &&
|
|
107
|
-
overrideVal !== null &&
|
|
108
|
-
typeof baseVal === "object" &&
|
|
109
|
-
!Array.isArray(baseVal) &&
|
|
110
|
-
baseVal !== null
|
|
111
|
-
) {
|
|
112
|
-
(result as any)[key] = deepMerge(baseVal as any, overrideVal as any);
|
|
113
|
-
} else if (overrideVal !== undefined) {
|
|
114
|
-
(result as any)[key] = overrideVal;
|
|
126
|
+
/** Load the effective config: defaults ← global ← project (legacy keys translated per scope). */
|
|
127
|
+
export function loadConfig(cwd: string = process.cwd()): CompactorConfig {
|
|
128
|
+
let config: Raw = structuredClone(DEFAULT_COMPACTOR_CONFIG) as unknown as Raw;
|
|
129
|
+
for (const scope of ["global", "project"] as const) {
|
|
130
|
+
let raw: Raw | undefined;
|
|
131
|
+
try {
|
|
132
|
+
raw = getSettingsScoped("compactor", scope, cwd);
|
|
133
|
+
} catch {
|
|
134
|
+
raw = undefined;
|
|
115
135
|
}
|
|
136
|
+
if (raw) config = deepMerge(config, translateLegacyConfig(raw));
|
|
116
137
|
}
|
|
117
|
-
|
|
138
|
+
if (config.method === "jev") config.method = "vcc";
|
|
139
|
+
if (config.piCompact === "jev") config.piCompact = "vcc";
|
|
140
|
+
return config as unknown as CompactorConfig;
|
|
118
141
|
}
|
|
119
142
|
|
|
120
143
|
/**
|
|
121
|
-
*
|
|
122
|
-
*
|
|
144
|
+
* Write translated legacy keys into each scope's file once, so the settings
|
|
145
|
+
* hub shows the effective values. Additive only: old keys stay, untouched.
|
|
123
146
|
*/
|
|
124
|
-
export function
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
147
|
+
export function migrateLegacyConfigFiles(cwd: string = process.cwd()): void {
|
|
148
|
+
for (const scope of ["global", "project"] as const) {
|
|
149
|
+
try {
|
|
150
|
+
const raw = getSettingsScoped("compactor", scope, cwd);
|
|
151
|
+
if (!raw || (!("overrideDefaultCompaction" in raw) && !("autoCompaction" in raw))) continue;
|
|
152
|
+
const translated = translateLegacyConfig(raw);
|
|
153
|
+
const patch: Raw = {};
|
|
154
|
+
for (const key of ["method", "trigger", "thresholdPercent", "cooldownMs", "repeatMinGrowthTokens", "notify"]) {
|
|
155
|
+
if (!(key in raw) && key in translated) patch[key] = translated[key];
|
|
156
|
+
}
|
|
157
|
+
if (Object.keys(patch).length > 0) setSettings("compactor", patch, scope, cwd);
|
|
158
|
+
} catch {
|
|
159
|
+
// Unreadable scope: loadConfig still translates on read.
|
|
160
|
+
}
|
|
131
161
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
return config;
|
|
135
162
|
}
|
|
136
163
|
|
|
137
|
-
/**
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
164
|
+
/** Save a config patch (global by default). */
|
|
165
|
+
export function saveConfig(
|
|
166
|
+
patch: Partial<CompactorConfig>,
|
|
167
|
+
opts?: { perProject?: boolean; cwd?: string },
|
|
168
|
+
): { success: boolean; error?: string } {
|
|
142
169
|
try {
|
|
143
170
|
setSettings(
|
|
144
171
|
"compactor",
|
|
145
|
-
|
|
172
|
+
patch as unknown as Raw,
|
|
146
173
|
opts?.perProject ? "project" : "global",
|
|
147
174
|
opts?.cwd ?? process.cwd(),
|
|
148
175
|
);
|
|
@@ -151,27 +178,3 @@ export function saveConfig(config: CompactorConfig, opts?: { perProject?: boolea
|
|
|
151
178
|
return { success: false, error: String(err) };
|
|
152
179
|
}
|
|
153
180
|
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Migrate partial config to full schema, filling missing keys from defaults.
|
|
157
|
-
* Uses deepMerge so nested strategy objects merge recursively.
|
|
158
|
-
*/
|
|
159
|
-
export function migrateConfig(partial: Partial<CompactorConfig>): CompactorConfig {
|
|
160
|
-
const defaults = structuredClone(DEFAULT_COMPACTOR_CONFIG);
|
|
161
|
-
return deepMerge(defaults, partial);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Scaffold config file on first run.
|
|
166
|
-
*/
|
|
167
|
-
export function scaffoldConfig(): void {
|
|
168
|
-
try {
|
|
169
|
-
const dir = dirname(COMPACTOR_CONFIG_PATH);
|
|
170
|
-
if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
|
|
171
|
-
if (!existsSync(COMPACTOR_CONFIG_PATH)) {
|
|
172
|
-
writeFileSync(COMPACTOR_CONFIG_PATH, `${JSON.stringify(DEFAULT_COMPACTOR_CONFIG, null, 2)}\n`);
|
|
173
|
-
}
|
|
174
|
-
} catch {
|
|
175
|
-
// best-effort
|
|
176
|
-
}
|
|
177
|
-
}
|
|
@@ -2,56 +2,40 @@
|
|
|
2
2
|
* Compactor configuration schema with defaults
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import type {
|
|
6
|
-
|
|
7
|
-
const strategy = (enabled: boolean, mode: string): CompactorStrategyConfig => ({
|
|
8
|
-
enabled,
|
|
9
|
-
mode,
|
|
10
|
-
});
|
|
5
|
+
import type { AutoCompactionConfig, CompactorConfig } from "../types.js";
|
|
11
6
|
|
|
12
7
|
export const DEFAULT_COMPACTOR_CONFIG: CompactorConfig = {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
briefTranscript: {
|
|
19
|
-
...strategy(true, "full"),
|
|
20
|
-
mode: "full",
|
|
21
|
-
userTokenLimit: 256,
|
|
22
|
-
assistantTokenLimit: 200,
|
|
23
|
-
toolCallLimit: 8,
|
|
24
|
-
},
|
|
25
|
-
sessionContinuity: {
|
|
26
|
-
...strategy(true, "full"),
|
|
27
|
-
mode: "full",
|
|
28
|
-
eventCategories: [],
|
|
29
|
-
},
|
|
30
|
-
fts5Index: {
|
|
31
|
-
...strategy(true, "manual"),
|
|
32
|
-
mode: "manual",
|
|
33
|
-
chunkSize: 4096,
|
|
34
|
-
cacheTtlHours: 24,
|
|
35
|
-
},
|
|
36
|
-
sandboxExecution: {
|
|
37
|
-
...strategy(true, "all"),
|
|
38
|
-
mode: "all",
|
|
39
|
-
allowedLanguages: ["javascript", "typescript", "python", "shell"],
|
|
40
|
-
outputLimit: 100 * 1024 * 1024,
|
|
41
|
-
},
|
|
42
|
-
pipeline: {
|
|
43
|
-
autoInjection: false,
|
|
44
|
-
customNoisePatterns: [],
|
|
45
|
-
},
|
|
46
|
-
autoCompaction: {
|
|
47
|
-
enabled: false,
|
|
48
|
-
thresholdPercent: 80,
|
|
49
|
-
cooldownMs: 60_000,
|
|
50
|
-
repeatMinGrowthTokens: 4_000,
|
|
51
|
-
notify: true,
|
|
52
|
-
},
|
|
53
|
-
overrideDefaultCompaction: true,
|
|
8
|
+
method: "vcc",
|
|
9
|
+
piCompact: "follow",
|
|
10
|
+
trigger: "pi",
|
|
11
|
+
thresholdPercent: 80,
|
|
12
|
+
notify: true,
|
|
54
13
|
smartKeepTail: true,
|
|
55
|
-
|
|
14
|
+
summaryBudgetTokens: 0,
|
|
15
|
+
sections: {
|
|
16
|
+
activeWork: true,
|
|
17
|
+
requests: true,
|
|
18
|
+
state: true,
|
|
19
|
+
decisions: true,
|
|
20
|
+
files: true,
|
|
21
|
+
commits: true,
|
|
22
|
+
errors: true,
|
|
23
|
+
lessons: true,
|
|
24
|
+
transcript: true,
|
|
25
|
+
},
|
|
26
|
+
cooldownMs: 60_000,
|
|
27
|
+
repeatMinGrowthTokens: 4_000,
|
|
28
|
+
llmInstructions: "",
|
|
56
29
|
debug: false,
|
|
57
30
|
};
|
|
31
|
+
|
|
32
|
+
/** The percentage-trigger view of a config (input to decideAutoCompaction). */
|
|
33
|
+
export function autoCompactionOf(config: CompactorConfig): AutoCompactionConfig {
|
|
34
|
+
return {
|
|
35
|
+
enabled: config.trigger === "percent",
|
|
36
|
+
thresholdPercent: config.thresholdPercent,
|
|
37
|
+
cooldownMs: config.cooldownMs,
|
|
38
|
+
repeatMinGrowthTokens: config.repeatMinGrowthTokens,
|
|
39
|
+
notify: config.notify,
|
|
40
|
+
};
|
|
41
|
+
}
|