@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
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Summary source — turn the session branch into what the lossless summary is
|
|
3
|
+
* built from, rebuilt from the FULL history on every compaction.
|
|
4
|
+
*
|
|
5
|
+
* Pi's session file is append-only, so every raw message is still on the
|
|
6
|
+
* branch after earlier compactions. Rebuilding from it (instead of merging onto
|
|
7
|
+
* the previous summary text) means a summary can never inherit bloat or drift
|
|
8
|
+
* from an earlier one.
|
|
9
|
+
*
|
|
10
|
+
* The one hard problem is telling the user's own words apart from text that
|
|
11
|
+
* extensions inject with the user role (loop prompts, nudges, notifications):
|
|
12
|
+
* - custom messages (hidden reminders, notices) are never user text;
|
|
13
|
+
* - user messages sent by extensions are marked at `input` time with an
|
|
14
|
+
* origin entry (see ORIGIN_ENTRY_TYPE) and dropped by that mark;
|
|
15
|
+
* - older sessions without marks fall back to known injected shapes.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { createHash } from "node:crypto";
|
|
19
|
+
import type { AgentMessage } from "@earendil-works/pi-agent-core";
|
|
20
|
+
import type { NormalizedBlock } from "../types.js";
|
|
21
|
+
import { textOf } from "./content.js";
|
|
22
|
+
import { filterNoise } from "./filter-noise.js";
|
|
23
|
+
import { normalizeAgentMessage } from "../session/recall-blocks.js";
|
|
24
|
+
|
|
25
|
+
/** Custom entry appended when an extension (not the user) sends a user message. */
|
|
26
|
+
export const ORIGIN_ENTRY_TYPE = "compactor-origin";
|
|
27
|
+
|
|
28
|
+
/** Stable key for a user message text (whitespace-insensitive, prefix-bounded). */
|
|
29
|
+
export function originKey(text: string): string {
|
|
30
|
+
const normalized = text.replace(/\s+/g, " ").trim().slice(0, 400);
|
|
31
|
+
return createHash("sha256").update(normalized).digest("hex").slice(0, 16);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Known shapes of text that extensions send with the user role. Used for
|
|
36
|
+
* sessions recorded before origin marks existed, and as a safety net.
|
|
37
|
+
*/
|
|
38
|
+
const INJECTED_PATTERNS: readonly RegExp[] = [
|
|
39
|
+
/^[─━=\-]{8,}\s*🔄 RALPH LOOP/u,
|
|
40
|
+
/🔄 RALPH LOOP:/u,
|
|
41
|
+
/^No-progress guard:/,
|
|
42
|
+
/^Continue working toward the active thread goal/,
|
|
43
|
+
/^Goal (?:recovery|status audit)\b/,
|
|
44
|
+
/^The active goal reached a budget limit/,
|
|
45
|
+
/^\[kanboard [\w.-]+\]/,
|
|
46
|
+
// Tagged envelopes: <background-task-notification>, <session_resume>, <system-reminder>, …
|
|
47
|
+
/^<[a-zA-Z][\w-]*(?:\s[^>]*)?>/,
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
export function isInjectedUserText(text: string, origins?: ReadonlySet<string>): boolean {
|
|
51
|
+
const trimmed = text.trim();
|
|
52
|
+
if (!trimmed) return true;
|
|
53
|
+
if (origins?.has(originKey(trimmed))) return true;
|
|
54
|
+
return INJECTED_PATTERNS.some((re) => re.test(trimmed));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Tools whose results are progress reports (long-horizon loops). */
|
|
58
|
+
const PROGRESS_TOOLS = /^(?:ralph_done|update_goal)$/;
|
|
59
|
+
/** Tools that ask the user a question; their results carry the user's answer. */
|
|
60
|
+
const ASK_TOOLS = /^(?:ask_user|ask_user_question|askuserquestion|ask)$/i;
|
|
61
|
+
|
|
62
|
+
const shortQuestion = (q: string): string => {
|
|
63
|
+
const one = q.replace(/\s+/g, " ").trim();
|
|
64
|
+
return one.length > 140 ? `${one.slice(0, 139).trimEnd()}…` : one;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* "Q → A" lines from an ask tool result, one per answered question (skipped
|
|
69
|
+
* ones are not decisions). Reads the multi-question details first, then the
|
|
70
|
+
* older single-question "User wrote/selected: …" text.
|
|
71
|
+
*/
|
|
72
|
+
export function askAnswers(message: any): string[] {
|
|
73
|
+
const d = message.details;
|
|
74
|
+
if (Array.isArray(d?.questions) && Array.isArray(d?.answers)) {
|
|
75
|
+
const out: string[] = [];
|
|
76
|
+
d.questions.forEach((q: any, i: number) => {
|
|
77
|
+
const a = d.answers[i];
|
|
78
|
+
if (!a || a.skipped) return;
|
|
79
|
+
const labels = (Array.isArray(a.selected) ? a.selected : []).map((v: string) => q.options?.find((o: any) => (o.value ?? o.label) === v)?.label ?? v);
|
|
80
|
+
const answer = [...labels, ...(typeof a.custom_text === "string" && a.custom_text.trim() ? [a.custom_text.trim()] : [])].join(", ");
|
|
81
|
+
if (answer) out.push(`${shortQuestion(String(q.question ?? ""))} → ${answer}`);
|
|
82
|
+
});
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
85
|
+
const text = textOf(message.content).trim();
|
|
86
|
+
const m = text.match(/^User (?:wrote|selected|answered|chose)[^:]*:\s*([\s\S]+)$/i);
|
|
87
|
+
if (!m) return [];
|
|
88
|
+
// The answer is the user's words: keep it whole, shorten the agent's question.
|
|
89
|
+
const question = typeof d?.question === "string" ? shortQuestion(d.question) : "";
|
|
90
|
+
const answer = m[1].trim();
|
|
91
|
+
return [question ? `${question} → ${answer}` : answer];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export interface SummarySource {
|
|
95
|
+
/** Blocks for sections + transcript: real user text, assistant, tools. sourceIndex = branch entry index. */
|
|
96
|
+
blocks: NormalizedBlock[];
|
|
97
|
+
/** The user's own messages, raw text (newlines kept), oldest first. */
|
|
98
|
+
requests: string[];
|
|
99
|
+
/** Assistant prose per message, raw text, oldest first. */
|
|
100
|
+
reports: string[];
|
|
101
|
+
/** Blocks of the kept tail (after the cut): newer truth, used only to spot what it replaces. */
|
|
102
|
+
tail?: NormalizedBlock[];
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** Origin marks recorded anywhere on the branch. */
|
|
106
|
+
export function collectOrigins(branchEntries: readonly any[]): Set<string> {
|
|
107
|
+
const origins = new Set<string>();
|
|
108
|
+
for (const entry of branchEntries) {
|
|
109
|
+
if (entry?.type === "custom" && entry.customType === ORIGIN_ENTRY_TYPE) {
|
|
110
|
+
const key = entry.data?.key;
|
|
111
|
+
if (typeof key === "string") origins.add(key);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return origins;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const assistantProse = (message: any): string => {
|
|
118
|
+
const content = message?.content;
|
|
119
|
+
if (typeof content === "string") return content;
|
|
120
|
+
if (!Array.isArray(content)) return "";
|
|
121
|
+
return content
|
|
122
|
+
.filter((part: any) => part?.type === "text" && typeof part.text === "string")
|
|
123
|
+
.map((part: any) => part.text)
|
|
124
|
+
.join("\n")
|
|
125
|
+
.trim();
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Build the summary source from branch entries [0, endIndex). Entries are the
|
|
130
|
+
* full branch (not just the live window), so earlier compactions are rebuilt
|
|
131
|
+
* from their raw messages; compaction entries themselves are skipped.
|
|
132
|
+
*/
|
|
133
|
+
export function collectSummarySource(
|
|
134
|
+
branchEntries: readonly any[],
|
|
135
|
+
endIndex: number,
|
|
136
|
+
origins: ReadonlySet<string> = collectOrigins(branchEntries),
|
|
137
|
+
): SummarySource {
|
|
138
|
+
const blocks: NormalizedBlock[] = [];
|
|
139
|
+
const requests: string[] = [];
|
|
140
|
+
const reports: string[] = [];
|
|
141
|
+
const end = Math.max(0, Math.min(endIndex, branchEntries.length));
|
|
142
|
+
|
|
143
|
+
for (let i = 0; i < end; i++) {
|
|
144
|
+
const entry = branchEntries[i];
|
|
145
|
+
if (!entry) continue;
|
|
146
|
+
if (entry.type === "branch_summary" && typeof entry.summary === "string") {
|
|
147
|
+
blocks.push({ kind: "assistant", text: `[branch summary] ${entry.summary.replace(/\s+/g, " ").slice(0, 600)}`, sourceIndex: i });
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
if (entry.type !== "message" || !entry.message) continue;
|
|
151
|
+
const message = entry.message as AgentMessage & { role?: string };
|
|
152
|
+
if (message.role === "user") {
|
|
153
|
+
const raw = textOf((message as any).content).trim();
|
|
154
|
+
if (isInjectedUserText(raw, origins)) continue;
|
|
155
|
+
requests.push(raw);
|
|
156
|
+
} else if (message.role === "assistant") {
|
|
157
|
+
const prose = assistantProse(message);
|
|
158
|
+
if (prose) reports.push(prose);
|
|
159
|
+
} else if (message.role === "toolResult" && ASK_TOOLS.test(String((message as any).toolName ?? ""))) {
|
|
160
|
+
// The user's answer to an agent question is the user's own decision.
|
|
161
|
+
requests.push(...askAnswers(message));
|
|
162
|
+
} else if (message.role === "toolResult" && PROGRESS_TOOLS.test(String((message as any).toolName ?? ""))) {
|
|
163
|
+
// Loop progress reports (ralph iteration summaries, goal updates).
|
|
164
|
+
const text = textOf((message as any).content).trim();
|
|
165
|
+
if (text) reports.push(text);
|
|
166
|
+
} else if (message.role === "custom") {
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
blocks.push(...normalizeAgentMessage(message, i));
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const tail: NormalizedBlock[] = [];
|
|
173
|
+
for (let i = end; i < branchEntries.length; i++) {
|
|
174
|
+
const entry = branchEntries[i];
|
|
175
|
+
if (entry?.type === "message" && entry.message && entry.message.role !== "custom") tail.push(...normalizeAgentMessage(entry.message, i));
|
|
176
|
+
}
|
|
177
|
+
return { blocks: filterNoise(blocks), requests, reports, tail: filterNoise(tail) };
|
|
178
|
+
}
|