pi-goosedump 0.13.5 → 0.13.7
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 -10
- package/dist/index.ts +88 -88
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# pi-goosedump
|
|
2
2
|
|
|
3
3
|
Pi extension for session search, durable memory, session management, and
|
|
4
|
-
compaction. Canonical tools use the `
|
|
4
|
+
compaction. Canonical tools use the `goosedump_` prefix (with legacy `goose_` aliases supported).
|
|
5
5
|
|
|
6
6
|
## Install
|
|
7
7
|
|
|
@@ -15,20 +15,20 @@ packaged binary.
|
|
|
15
15
|
|
|
16
16
|
## Tools
|
|
17
17
|
|
|
18
|
-
- `
|
|
19
|
-
- `
|
|
20
|
-
- `
|
|
21
|
-
- `
|
|
22
|
-
- `
|
|
23
|
-
- `
|
|
18
|
+
- `goosedump_search` and `goosedump_grep` find session entries.
|
|
19
|
+
- `goosedump_get` expands entry IDs to full content.
|
|
20
|
+
- `goosedump_remember`, `goosedump_recall`, and `goosedump_forget` manage durable memory.
|
|
21
|
+
- `goosedump_memory_status` reports memory storage health.
|
|
22
|
+
- `goosedump_compact` compacts the current Pi session.
|
|
23
|
+
- `goosedump_sessions` lists or deletes sessions for the current project.
|
|
24
24
|
|
|
25
|
-
Search and grep return entry IDs; call `
|
|
25
|
+
Search and grep return entry IDs; call `goosedump_get` before relying on their
|
|
26
26
|
content. Non-Pi providers require an explicit session ID.
|
|
27
27
|
|
|
28
28
|
## Commands
|
|
29
29
|
|
|
30
|
-
`/
|
|
31
|
-
`/
|
|
30
|
+
`/goosedump-search`, `/goosedump-compact`, `/goosedump-sessions`, `/goosedump-forget`,
|
|
31
|
+
`/goosedump-memory-status`, and `/goosedump-settings`.
|
|
32
32
|
|
|
33
33
|
## Settings
|
|
34
34
|
|
package/dist/index.ts
CHANGED
|
@@ -685,7 +685,7 @@ async function goosedumpCompact(target, options, signal, executablePath) {
|
|
|
685
685
|
continue;
|
|
686
686
|
}
|
|
687
687
|
}
|
|
688
|
-
return { summary:
|
|
688
|
+
return { summary: "", warning: output.stderr.trim() };
|
|
689
689
|
}
|
|
690
690
|
function currentSessionTarget(ctx) {
|
|
691
691
|
const sessionManager = ctx.sessionManager;
|
|
@@ -740,7 +740,7 @@ function settingSpecFromSchema(schema) {
|
|
|
740
740
|
return { kind: "number", min: minimum, max: maximum };
|
|
741
741
|
}
|
|
742
742
|
var GOOSEDUMP_SETTING_SPECS = Object.fromEntries(GOOSEDUMP_SETTING_KEYS.map((key) => [key, settingSpecFromSchema(GOOSEDUMP_SETTING_SCHEMAS[key])]));
|
|
743
|
-
var MEMORY_DISABLED_MESSAGE = "Durable memory is disabled. Set goosedump.enableMemory to true in settings (or /
|
|
743
|
+
var MEMORY_DISABLED_MESSAGE = "Durable memory is disabled. Set goosedump.enableMemory to true in settings (or /goosedump-settings).";
|
|
744
744
|
function isValidGoosedumpSettingValue(key, value) {
|
|
745
745
|
return Value3.Check(GOOSEDUMP_SETTING_SCHEMAS[key], value);
|
|
746
746
|
}
|
|
@@ -1715,27 +1715,27 @@ function hideMemoryActivity(ctx) {
|
|
|
1715
1715
|
|
|
1716
1716
|
// src/policy.ts
|
|
1717
1717
|
var GOOSEDUMP_TOOL_NAMES = [
|
|
1718
|
-
"
|
|
1719
|
-
"
|
|
1720
|
-
"
|
|
1721
|
-
"
|
|
1722
|
-
"
|
|
1723
|
-
"
|
|
1724
|
-
"
|
|
1725
|
-
"
|
|
1726
|
-
"
|
|
1718
|
+
"goosedump_remember",
|
|
1719
|
+
"goosedump_recall",
|
|
1720
|
+
"goosedump_forget",
|
|
1721
|
+
"goosedump_memory_status",
|
|
1722
|
+
"goosedump_search",
|
|
1723
|
+
"goosedump_get",
|
|
1724
|
+
"goosedump_grep",
|
|
1725
|
+
"goosedump_compact",
|
|
1726
|
+
"goosedump_sessions"
|
|
1727
1727
|
];
|
|
1728
1728
|
var GOOSE_TOOL_NAMES = GOOSEDUMP_TOOL_NAMES;
|
|
1729
1729
|
var LEGACY_TO_CANONICAL_TOOL_NAMES = {
|
|
1730
|
-
goose_remember: "
|
|
1731
|
-
goose_recall: "
|
|
1732
|
-
goose_forget: "
|
|
1733
|
-
goose_memory_status: "
|
|
1734
|
-
goose_search: "
|
|
1735
|
-
goose_get: "
|
|
1736
|
-
goose_grep: "
|
|
1737
|
-
goose_compact: "
|
|
1738
|
-
goose_sessions: "
|
|
1730
|
+
goose_remember: "goosedump_remember",
|
|
1731
|
+
goose_recall: "goosedump_recall",
|
|
1732
|
+
goose_forget: "goosedump_forget",
|
|
1733
|
+
goose_memory_status: "goosedump_memory_status",
|
|
1734
|
+
goose_search: "goosedump_search",
|
|
1735
|
+
goose_get: "goosedump_get",
|
|
1736
|
+
goose_grep: "goosedump_grep",
|
|
1737
|
+
goose_compact: "goosedump_compact",
|
|
1738
|
+
goose_sessions: "goosedump_sessions"
|
|
1739
1739
|
};
|
|
1740
1740
|
function resolveCanonicalToolName(name) {
|
|
1741
1741
|
if (GOOSEDUMP_TOOL_NAMES.includes(name)) {
|
|
@@ -1762,14 +1762,14 @@ var PARAM_DESCRIPTIONS = {
|
|
|
1762
1762
|
sessionsDeleteId: "Session ID to delete (required for action: delete)"
|
|
1763
1763
|
};
|
|
1764
1764
|
var HISTORY_TARGET_GUIDELINE = "Default to the current Pi session; non-Pi providers require an explicit session ID.";
|
|
1765
|
-
var HISTORY_WORKFLOW_GUIDELINE = "Prefer
|
|
1766
|
-
var PREFER_REMEMBER = "Prefer
|
|
1767
|
-
var PREFER_RECALL = "Prefer
|
|
1768
|
-
var PREFER_HISTORY = "Prefer
|
|
1769
|
-
var PREFER_COMPACT = "Prefer
|
|
1770
|
-
var PREFER_SESSIONS = "Prefer
|
|
1765
|
+
var HISTORY_WORKFLOW_GUIDELINE = "Prefer goosedump_search or goosedump_grep for candidate entry IDs, then goosedump_get before quoting or acting on prior session content.";
|
|
1766
|
+
var PREFER_REMEMBER = "Prefer goosedump_remember after milestones instead of restating durable facts in prompts.";
|
|
1767
|
+
var PREFER_RECALL = "Prefer goosedump_recall over re-asking the user or re-deriving settled project context.";
|
|
1768
|
+
var PREFER_HISTORY = "Prefer goosedump_search or goosedump_grep, then goosedump_get, over replaying full history or guessing prior work.";
|
|
1769
|
+
var PREFER_COMPACT = "Prefer goosedump_compact when context is large, repetitive, or nearing limits; optional keep:N keeps the last N user turns.";
|
|
1770
|
+
var PREFER_SESSIONS = "Prefer goosedump_sessions for cwd session discovery/delete; use goosedump_forget / goosedump_memory_status to maintain durable memory.";
|
|
1771
1771
|
var CANONICAL_GOOSE_TOOL_POLICIES = {
|
|
1772
|
-
|
|
1772
|
+
goosedump_remember: {
|
|
1773
1773
|
description: "Preferred for background memory learning after milestones. Extracts evidence-backed claims for later recall; defaults to the current Pi session.",
|
|
1774
1774
|
snippet: "Persist important context from the current or another session into durable memory",
|
|
1775
1775
|
preference: PREFER_REMEMBER,
|
|
@@ -1779,7 +1779,7 @@ var CANONICAL_GOOSE_TOOL_POLICIES = {
|
|
|
1779
1779
|
"Defaults to the current Pi session; pass provider/session to learn from another agent session."
|
|
1780
1780
|
]
|
|
1781
1781
|
},
|
|
1782
|
-
|
|
1782
|
+
goosedump_recall: {
|
|
1783
1783
|
description: "Preferred for durable project memory before re-asking the user or re-deriving settled decisions. Returns provenance-backed claims, never instructions.",
|
|
1784
1784
|
snippet: "Recall durable context from earlier sessions",
|
|
1785
1785
|
preference: PREFER_RECALL,
|
|
@@ -1792,59 +1792,59 @@ var CANONICAL_GOOSE_TOOL_POLICIES = {
|
|
|
1792
1792
|
"Filter with type when you already know the memory kind (decision, fact, preference, procedure, lesson)."
|
|
1793
1793
|
]
|
|
1794
1794
|
},
|
|
1795
|
-
|
|
1795
|
+
goosedump_forget: {
|
|
1796
1796
|
description: "Preferred for tombstoning stale or wrong durable memory by mem_ ID or provider:session.",
|
|
1797
1797
|
snippet: "Remove obsolete entries from durable memory store",
|
|
1798
1798
|
guidelines: [
|
|
1799
|
-
"Call
|
|
1799
|
+
"Call goosedump_forget when stored memory is stale, wrong, or should no longer be recalled.",
|
|
1800
1800
|
"Target a memory ID (mem_...) or a provider:session to drop that session's retained sources.",
|
|
1801
|
-
"Forgotten content leaves a tombstone; use
|
|
1801
|
+
"Forgotten content leaves a tombstone; use goosedump_memory_status to inspect remaining store health."
|
|
1802
1802
|
]
|
|
1803
1803
|
},
|
|
1804
|
-
|
|
1804
|
+
goosedump_memory_status: {
|
|
1805
1805
|
description: "Preferred for diagnosing empty recall, missing embeddings, or unexpected durable-memory volume.",
|
|
1806
1806
|
snippet: "Inspect durable memory health and statistics",
|
|
1807
1807
|
guidelines: [
|
|
1808
|
-
"Call
|
|
1808
|
+
"Call goosedump_memory_status when diagnosing empty recall, missing embeddings, or unexpected memory volume.",
|
|
1809
1809
|
"Useful before or after bulk learn/forget operations."
|
|
1810
1810
|
]
|
|
1811
1811
|
},
|
|
1812
|
-
|
|
1813
|
-
description: "Preferred for ranked session-history search. Returns compact entry IDs; expand hits with
|
|
1812
|
+
goosedump_search: {
|
|
1813
|
+
description: "Preferred for ranked session-history search. Returns compact entry IDs; expand hits with goosedump_get. Defaults to the current Pi session.",
|
|
1814
1814
|
snippet: "Search session history by ranked relevance",
|
|
1815
1815
|
preference: PREFER_HISTORY,
|
|
1816
1816
|
guidelines: [
|
|
1817
1817
|
PREFER_HISTORY,
|
|
1818
|
-
"Call
|
|
1818
|
+
"Call goosedump_search to recover relevant prior work from this or another coding-agent session.",
|
|
1819
1819
|
HISTORY_WORKFLOW_GUIDELINE,
|
|
1820
1820
|
'Default scope is "lineage" (active branch); use scope: "all" for every branch in the session.',
|
|
1821
1821
|
"Page results with page when the first page is incomplete.",
|
|
1822
1822
|
HISTORY_TARGET_GUIDELINE
|
|
1823
1823
|
]
|
|
1824
1824
|
},
|
|
1825
|
-
|
|
1826
|
-
description: "Preferred for expanding
|
|
1825
|
+
goosedump_get: {
|
|
1826
|
+
description: "Preferred for expanding goosedump_search/goosedump_grep entry IDs to full content. Defaults to the current Pi session.",
|
|
1827
1827
|
snippet: "Expand session entries by ID to full content",
|
|
1828
1828
|
guidelines: [
|
|
1829
|
-
"Prefer
|
|
1829
|
+
"Prefer goosedump_get after goosedump_search or goosedump_grep; do not guess full prior content from overviews.",
|
|
1830
1830
|
"Pass only the IDs you need; full transcripts are expensive.",
|
|
1831
1831
|
'Default scope is "lineage" (active branch); use scope: "all" for every branch in the session.',
|
|
1832
1832
|
HISTORY_TARGET_GUIDELINE
|
|
1833
1833
|
]
|
|
1834
1834
|
},
|
|
1835
|
-
|
|
1836
|
-
description: "Preferred for glob/substring filtering of session history when ranked search is too fuzzy. Expand hits with
|
|
1835
|
+
goosedump_grep: {
|
|
1836
|
+
description: "Preferred for glob/substring filtering of session history when ranked search is too fuzzy. Expand hits with goosedump_get. Defaults to the current Pi session.",
|
|
1837
1837
|
snippet: "Filter session history by glob pattern",
|
|
1838
1838
|
preference: PREFER_HISTORY,
|
|
1839
1839
|
guidelines: [
|
|
1840
1840
|
PREFER_HISTORY,
|
|
1841
|
-
"Call
|
|
1841
|
+
"Call goosedump_grep for exact substring or glob matches when ranked search is too fuzzy.",
|
|
1842
1842
|
HISTORY_WORKFLOW_GUIDELINE,
|
|
1843
1843
|
'Default scope is "lineage" (active branch); use scope: "all" for every branch in the session.',
|
|
1844
1844
|
HISTORY_TARGET_GUIDELINE
|
|
1845
1845
|
]
|
|
1846
1846
|
},
|
|
1847
|
-
|
|
1847
|
+
goosedump_compact: {
|
|
1848
1848
|
description: "Preferred for proactive session compaction when context is large or nearing limits. Optional keep:N; runs through Pi's compaction flow.",
|
|
1849
1849
|
snippet: "Compact session history; optionally keep recent user turns",
|
|
1850
1850
|
preference: PREFER_COMPACT,
|
|
@@ -1855,7 +1855,7 @@ var CANONICAL_GOOSE_TOOL_POLICIES = {
|
|
|
1855
1855
|
"Successful compaction may queue background memory learning."
|
|
1856
1856
|
]
|
|
1857
1857
|
},
|
|
1858
|
-
|
|
1858
|
+
goosedump_sessions: {
|
|
1859
1859
|
description: "Preferred for listing or deleting coding-agent sessions scoped to the current working directory.",
|
|
1860
1860
|
snippet: "List or delete coding agent sessions for current directory",
|
|
1861
1861
|
preference: PREFER_SESSIONS,
|
|
@@ -2062,20 +2062,20 @@ function formatExpandedMemoryStatus(content, theme) {
|
|
|
2062
2062
|
function renderGooseDumpRememberCall(args, theme, ...rest) {
|
|
2063
2063
|
const context = rest[0] ?? {};
|
|
2064
2064
|
const target = args?.session ? `${args?.provider ?? "pi"}:${args.session}` : "current session";
|
|
2065
|
-
const text = clampLineToWidth(`${renderToolLabel(theme, "
|
|
2065
|
+
const text = clampLineToWidth(`${renderToolLabel(theme, "goosedump_remember")} ${theme.fg("accent", target)}`, context.width);
|
|
2066
2066
|
return upsertTextComponent(context.lastComponent, text);
|
|
2067
2067
|
}
|
|
2068
2068
|
var renderGooseRememberCall = renderGooseDumpRememberCall;
|
|
2069
2069
|
function renderGooseDumpRememberResult(result, options, theme, ...rest) {
|
|
2070
2070
|
const { isPartial, isError, expanded, width } = resolveRenderResultContext(options, rest);
|
|
2071
2071
|
if (isPartial)
|
|
2072
|
-
return renderPendingResult("pending
|
|
2072
|
+
return renderPendingResult("pending goosedump_remember", width, theme);
|
|
2073
2073
|
const content = result.content?.[0]?.text ?? "";
|
|
2074
2074
|
if (isError || result.isError) {
|
|
2075
2075
|
return renderErrorResult(content, {
|
|
2076
2076
|
expanded,
|
|
2077
2077
|
width,
|
|
2078
|
-
fallback: "
|
|
2078
|
+
fallback: "goosedump_remember failed",
|
|
2079
2079
|
theme
|
|
2080
2080
|
});
|
|
2081
2081
|
}
|
|
@@ -2098,20 +2098,20 @@ function renderGooseDumpRecallCall(args, theme, ...rest) {
|
|
|
2098
2098
|
args?.history && "history"
|
|
2099
2099
|
].filter(Boolean);
|
|
2100
2100
|
const flagsBadge = flags.length > 0 ? theme.fg("dim", ` [${flags.join(", ")}]`) : "";
|
|
2101
|
-
const text = clampLineToWidth(`${renderToolLabel(theme, "
|
|
2101
|
+
const text = clampLineToWidth(`${renderToolLabel(theme, "goosedump_recall")} ${theme.fg("accent", query)}${flagsBadge}`, context.width);
|
|
2102
2102
|
return upsertTextComponent(context.lastComponent, text);
|
|
2103
2103
|
}
|
|
2104
2104
|
var renderGooseRecallCall = renderGooseDumpRecallCall;
|
|
2105
2105
|
function renderGooseDumpRecallResult(result, options, theme, ...rest) {
|
|
2106
2106
|
const { isPartial, isError, expanded, width } = resolveRenderResultContext(options, rest);
|
|
2107
2107
|
if (isPartial)
|
|
2108
|
-
return renderPendingResult("pending
|
|
2108
|
+
return renderPendingResult("pending goosedump_recall", width, theme);
|
|
2109
2109
|
const content = result.content?.[0]?.text ?? "";
|
|
2110
2110
|
if (isError || result.isError) {
|
|
2111
2111
|
return renderErrorResult(content, {
|
|
2112
2112
|
expanded,
|
|
2113
2113
|
width,
|
|
2114
|
-
fallback: "
|
|
2114
|
+
fallback: "goosedump_recall failed",
|
|
2115
2115
|
theme
|
|
2116
2116
|
});
|
|
2117
2117
|
}
|
|
@@ -2139,20 +2139,20 @@ var renderGooseRecallResult = renderGooseDumpRecallResult;
|
|
|
2139
2139
|
function renderGooseDumpForgetCall(args, theme, ...rest) {
|
|
2140
2140
|
const context = rest[0] ?? {};
|
|
2141
2141
|
const target = args?.target ? String(args.target) : '""';
|
|
2142
|
-
const text = clampLineToWidth(`${renderToolLabel(theme, "
|
|
2142
|
+
const text = clampLineToWidth(`${renderToolLabel(theme, "goosedump_forget")} ${theme.fg("accent", target)}`, context.width);
|
|
2143
2143
|
return upsertTextComponent(context.lastComponent, text);
|
|
2144
2144
|
}
|
|
2145
2145
|
var renderGooseForgetCall = renderGooseDumpForgetCall;
|
|
2146
2146
|
function renderGooseDumpForgetResult(result, options, theme, ...rest) {
|
|
2147
2147
|
const { isPartial, isError, expanded, width } = resolveRenderResultContext(options, rest);
|
|
2148
2148
|
if (isPartial)
|
|
2149
|
-
return renderPendingResult("pending
|
|
2149
|
+
return renderPendingResult("pending goosedump_forget", width, theme);
|
|
2150
2150
|
const content = result.content?.[0]?.text ?? "";
|
|
2151
2151
|
if (isError || result.isError) {
|
|
2152
2152
|
return renderErrorResult(content, {
|
|
2153
2153
|
expanded,
|
|
2154
2154
|
width,
|
|
2155
|
-
fallback: "
|
|
2155
|
+
fallback: "goosedump_forget failed",
|
|
2156
2156
|
theme
|
|
2157
2157
|
});
|
|
2158
2158
|
}
|
|
@@ -2163,20 +2163,20 @@ function renderGooseDumpForgetResult(result, options, theme, ...rest) {
|
|
|
2163
2163
|
var renderGooseForgetResult = renderGooseDumpForgetResult;
|
|
2164
2164
|
function renderGooseDumpMemoryStatusCall(_args, theme, ...rest) {
|
|
2165
2165
|
const context = rest[0] ?? {};
|
|
2166
|
-
const text = clampLineToWidth(renderToolLabel(theme, "
|
|
2166
|
+
const text = clampLineToWidth(renderToolLabel(theme, "goosedump_memory_status"), context.width);
|
|
2167
2167
|
return upsertTextComponent(context.lastComponent, text);
|
|
2168
2168
|
}
|
|
2169
2169
|
var renderGooseMemoryStatusCall = renderGooseDumpMemoryStatusCall;
|
|
2170
2170
|
function renderGooseDumpMemoryStatusResult(result, options, theme, ...rest) {
|
|
2171
2171
|
const { isPartial, isError, expanded, width } = resolveRenderResultContext(options, rest);
|
|
2172
2172
|
if (isPartial)
|
|
2173
|
-
return renderPendingResult("pending
|
|
2173
|
+
return renderPendingResult("pending goosedump_memory_status", width, theme);
|
|
2174
2174
|
const content = result.content?.[0]?.text ?? "";
|
|
2175
2175
|
if (isError || result.isError) {
|
|
2176
2176
|
return renderErrorResult(content, {
|
|
2177
2177
|
expanded,
|
|
2178
2178
|
width,
|
|
2179
|
-
fallback: "
|
|
2179
|
+
fallback: "goosedump_memory_status failed",
|
|
2180
2180
|
theme
|
|
2181
2181
|
});
|
|
2182
2182
|
}
|
|
@@ -2214,20 +2214,20 @@ function renderGooseDumpSearchCall(args, theme, ...rest) {
|
|
|
2214
2214
|
args?.page && args.page > 1 && `page=${args.page}`
|
|
2215
2215
|
].filter(Boolean);
|
|
2216
2216
|
const flagsBadge = flags.length > 0 ? theme.fg("dim", ` [${flags.join(", ")}]`) : "";
|
|
2217
|
-
const text = clampLineToWidth(`${renderToolLabel(theme, "
|
|
2217
|
+
const text = clampLineToWidth(`${renderToolLabel(theme, "goosedump_search")} ${theme.fg("accent", query)}${target}${flagsBadge}`, context.width);
|
|
2218
2218
|
return upsertTextComponent(context.lastComponent, text);
|
|
2219
2219
|
}
|
|
2220
2220
|
var renderGooseSearchCall = renderGooseDumpSearchCall;
|
|
2221
2221
|
function renderGooseDumpSearchResult(result, options, theme, ...rest) {
|
|
2222
2222
|
const { isPartial, isError, expanded, width } = resolveRenderResultContext(options, rest);
|
|
2223
2223
|
if (isPartial)
|
|
2224
|
-
return renderPendingResult("pending
|
|
2224
|
+
return renderPendingResult("pending goosedump_search", width, theme);
|
|
2225
2225
|
const content = result.content?.[0]?.text ?? "";
|
|
2226
2226
|
if (isError || result.isError) {
|
|
2227
2227
|
return renderErrorResult(content, {
|
|
2228
2228
|
expanded,
|
|
2229
2229
|
width,
|
|
2230
|
-
fallback: "
|
|
2230
|
+
fallback: "goosedump_search failed",
|
|
2231
2231
|
theme
|
|
2232
2232
|
});
|
|
2233
2233
|
}
|
|
@@ -2259,17 +2259,17 @@ function renderGooseDumpGetCall(args, theme, ...rest) {
|
|
|
2259
2259
|
const ids = Array.isArray(args?.ids) ? args.ids : [];
|
|
2260
2260
|
const idsDisplay = ids.length <= 3 ? ids.join(", ") : `${ids.slice(0, 3).join(", ")}… (${ids.length})`;
|
|
2261
2261
|
const target = args?.session ? theme.fg("dim", ` in ${args.provider ?? "pi"}:${args.session}`) : "";
|
|
2262
|
-
const text = clampLineToWidth(`${renderToolLabel(theme, "
|
|
2262
|
+
const text = clampLineToWidth(`${renderToolLabel(theme, "goosedump_get")} ${theme.fg("accent", `[${idsDisplay}]`)}${target}`, context.width);
|
|
2263
2263
|
return upsertTextComponent(context.lastComponent, text);
|
|
2264
2264
|
}
|
|
2265
2265
|
var renderGooseGetCall = renderGooseDumpGetCall;
|
|
2266
2266
|
function renderGooseDumpGetResult(result, options, theme, ...rest) {
|
|
2267
2267
|
const { isPartial, isError, expanded, width } = resolveRenderResultContext(options, rest);
|
|
2268
2268
|
if (isPartial)
|
|
2269
|
-
return renderPendingResult("pending
|
|
2269
|
+
return renderPendingResult("pending goosedump_get", width, theme);
|
|
2270
2270
|
const content = result.content?.[0]?.text ?? "";
|
|
2271
2271
|
if (isError || result.isError) {
|
|
2272
|
-
return renderErrorResult(content, { expanded, width, fallback: "
|
|
2272
|
+
return renderErrorResult(content, { expanded, width, fallback: "goosedump_get failed", theme });
|
|
2273
2273
|
}
|
|
2274
2274
|
if (content.startsWith("No entries found")) {
|
|
2275
2275
|
return upsertTextComponent(rest[0]?.lastComponent, clampLineToWidth(summaryLine("no entries found", { theme, style: "dim" }), width));
|
|
@@ -2297,20 +2297,20 @@ function renderGooseDumpGrepCall(args, theme, ...rest) {
|
|
|
2297
2297
|
const target = args?.session ? theme.fg("dim", ` in ${args.provider ?? "pi"}:${args.session}`) : "";
|
|
2298
2298
|
const flags = [args?.scope && args.scope !== "lineage" && `scope=${args.scope}`].filter(Boolean);
|
|
2299
2299
|
const flagsBadge = flags.length > 0 ? theme.fg("dim", ` [${flags.join(", ")}]`) : "";
|
|
2300
|
-
const text = clampLineToWidth(`${renderToolLabel(theme, "
|
|
2300
|
+
const text = clampLineToWidth(`${renderToolLabel(theme, "goosedump_grep")} ${theme.fg("accent", pattern)}${target}${flagsBadge}`, context.width);
|
|
2301
2301
|
return upsertTextComponent(context.lastComponent, text);
|
|
2302
2302
|
}
|
|
2303
2303
|
var renderGooseGrepCall = renderGooseDumpGrepCall;
|
|
2304
2304
|
function renderGooseDumpGrepResult(result, options, theme, ...rest) {
|
|
2305
2305
|
const { isPartial, isError, expanded, width } = resolveRenderResultContext(options, rest);
|
|
2306
2306
|
if (isPartial)
|
|
2307
|
-
return renderPendingResult("pending
|
|
2307
|
+
return renderPendingResult("pending goosedump_grep", width, theme);
|
|
2308
2308
|
const content = result.content?.[0]?.text ?? "";
|
|
2309
2309
|
if (isError || result.isError) {
|
|
2310
2310
|
return renderErrorResult(content, {
|
|
2311
2311
|
expanded,
|
|
2312
2312
|
width,
|
|
2313
|
-
fallback: "
|
|
2313
|
+
fallback: "goosedump_grep failed",
|
|
2314
2314
|
theme
|
|
2315
2315
|
});
|
|
2316
2316
|
}
|
|
@@ -2335,20 +2335,20 @@ function renderGooseDumpCompactCall(args, theme, ...rest) {
|
|
|
2335
2335
|
const context = rest[0] ?? {};
|
|
2336
2336
|
const flags = args?.keep ? [theme.fg("dim", `keep=${args.keep}`)] : [];
|
|
2337
2337
|
const flagsBadge = flags.length > 0 ? ` [${flags.join(", ")}]` : "";
|
|
2338
|
-
const text = clampLineToWidth(`${renderToolLabel(theme, "
|
|
2338
|
+
const text = clampLineToWidth(`${renderToolLabel(theme, "goosedump_compact")}${flagsBadge}`, context.width);
|
|
2339
2339
|
return upsertTextComponent(context.lastComponent, text);
|
|
2340
2340
|
}
|
|
2341
2341
|
var renderGooseCompactCall = renderGooseDumpCompactCall;
|
|
2342
2342
|
function renderGooseDumpCompactResult(result, options, theme, ...rest) {
|
|
2343
2343
|
const { isPartial, isError, expanded, width } = resolveRenderResultContext(options, rest);
|
|
2344
2344
|
if (isPartial)
|
|
2345
|
-
return renderPendingResult("pending
|
|
2345
|
+
return renderPendingResult("pending goosedump_compact", width, theme);
|
|
2346
2346
|
const content = result.content?.[0]?.text ?? "";
|
|
2347
2347
|
if (isError || result.isError) {
|
|
2348
2348
|
return renderErrorResult(content, {
|
|
2349
2349
|
expanded,
|
|
2350
2350
|
width,
|
|
2351
|
-
fallback: "
|
|
2351
|
+
fallback: "goosedump_compact failed",
|
|
2352
2352
|
theme
|
|
2353
2353
|
});
|
|
2354
2354
|
}
|
|
@@ -2362,20 +2362,20 @@ function renderGooseDumpSessionsCall(args, theme, ...rest) {
|
|
|
2362
2362
|
const context = rest[0] ?? {};
|
|
2363
2363
|
const action = args?.action ?? "list";
|
|
2364
2364
|
const target = args?.session ? `${args?.provider ?? "pi"}:${args.session}` : `(${args?.provider ?? "pi"})`;
|
|
2365
|
-
const text = clampLineToWidth(`${renderToolLabel(theme, "
|
|
2365
|
+
const text = clampLineToWidth(`${renderToolLabel(theme, "goosedump_sessions")} ${theme.fg("accent", action)} ${theme.fg("dim", target)}`, context.width);
|
|
2366
2366
|
return upsertTextComponent(context.lastComponent, text);
|
|
2367
2367
|
}
|
|
2368
2368
|
var renderGooseSessionsCall = renderGooseDumpSessionsCall;
|
|
2369
2369
|
function renderGooseDumpSessionsResult(result, options, theme, ...rest) {
|
|
2370
2370
|
const { isPartial, isError, expanded, width } = resolveRenderResultContext(options, rest);
|
|
2371
2371
|
if (isPartial)
|
|
2372
|
-
return renderPendingResult("pending
|
|
2372
|
+
return renderPendingResult("pending goosedump_sessions", width, theme);
|
|
2373
2373
|
const content = result.content?.[0]?.text ?? "";
|
|
2374
2374
|
if (isError || result.isError) {
|
|
2375
2375
|
return renderErrorResult(content, {
|
|
2376
2376
|
expanded,
|
|
2377
2377
|
width,
|
|
2378
|
-
fallback: "
|
|
2378
|
+
fallback: "goosedump_sessions failed",
|
|
2379
2379
|
theme
|
|
2380
2380
|
});
|
|
2381
2381
|
}
|
|
@@ -2456,7 +2456,7 @@ function boundedHistoryResult(text) {
|
|
|
2456
2456
|
return textResult(text);
|
|
2457
2457
|
return textResult(`${output.content}
|
|
2458
2458
|
|
|
2459
|
-
[Output truncated: showing ${output.outputLines} of ${output.totalLines} lines ` + `and ${output.outputBytes} of ${output.totalBytes} bytes. ` + "Use
|
|
2459
|
+
[Output truncated: showing ${output.outputLines} of ${output.totalLines} lines ` + `and ${output.outputBytes} of ${output.totalBytes} bytes. ` + "Use goosedump_get with fewer IDs or a narrower goosedump_grep pattern.]");
|
|
2460
2460
|
}
|
|
2461
2461
|
function resolveHistoryTarget(ctx, tool, params) {
|
|
2462
2462
|
const provider = params.provider ?? "pi";
|
|
@@ -2504,7 +2504,7 @@ function registerGooseTools(pi, deps) {
|
|
|
2504
2504
|
pi.registerTool(defineGooseTool(canonicalName, parameters, handler, renderers));
|
|
2505
2505
|
pi.registerTool(defineGooseTool(legacyName, parameters, handler, renderers));
|
|
2506
2506
|
}
|
|
2507
|
-
registerPair("
|
|
2507
|
+
registerPair("goosedump_remember", "goose_remember", Type3.Object({ ...historyTargetParams() }), async (params, _signal, ctx, toolName) => {
|
|
2508
2508
|
const disabled = requireMemoryEnabled(ctx);
|
|
2509
2509
|
if (disabled)
|
|
2510
2510
|
return disabled;
|
|
@@ -2518,7 +2518,7 @@ function registerGooseTools(pi, deps) {
|
|
|
2518
2518
|
});
|
|
2519
2519
|
return textResult(accepted ? `Memory learning started for ${resolved.target}.` : `Memory learning dropped for ${resolved.target}: another inference task is active.`);
|
|
2520
2520
|
}, { renderCall: renderGooseRememberCall, renderResult: renderGooseRememberResult });
|
|
2521
|
-
registerPair("
|
|
2521
|
+
registerPair("goosedump_recall", "goose_recall", Type3.Object({
|
|
2522
2522
|
query: Type3.String({ description: PARAM_DESCRIPTIONS.memoryQuery }),
|
|
2523
2523
|
type: Type3.Optional(Type3.Union(GOOSE_MEMORY_TYPES.map((type) => Type3.Literal(type)), { description: PARAM_DESCRIPTIONS.memoryType })),
|
|
2524
2524
|
allProjects: Type3.Optional(Type3.Boolean({
|
|
@@ -2555,7 +2555,7 @@ function registerGooseTools(pi, deps) {
|
|
|
2555
2555
|
return textResult(`No durable memory for "${params.query}"`);
|
|
2556
2556
|
return textResult(formatMemoryHits(hits));
|
|
2557
2557
|
}, { renderCall: renderGooseRecallCall, renderResult: renderGooseRecallResult });
|
|
2558
|
-
registerPair("
|
|
2558
|
+
registerPair("goosedump_forget", "goose_forget", Type3.Object({
|
|
2559
2559
|
target: Type3.String({
|
|
2560
2560
|
description: PARAM_DESCRIPTIONS.forgetTarget
|
|
2561
2561
|
})
|
|
@@ -2569,13 +2569,13 @@ function registerGooseTools(pi, deps) {
|
|
|
2569
2569
|
const res = await goosedumpMemoryForget(params.target.trim(), signal, nativeExecutablePath);
|
|
2570
2570
|
return textResult(res);
|
|
2571
2571
|
}, { renderCall: renderGooseForgetCall, renderResult: renderGooseForgetResult });
|
|
2572
|
-
registerPair("
|
|
2572
|
+
registerPair("goosedump_memory_status", "goose_memory_status", Type3.Object({}), async (_params, signal, ctx) => {
|
|
2573
2573
|
const disabled = requireMemoryEnabled(ctx);
|
|
2574
2574
|
if (disabled)
|
|
2575
2575
|
return disabled;
|
|
2576
2576
|
return textResult(await goosedumpMemoryStatus(signal, nativeExecutablePath));
|
|
2577
2577
|
}, { renderCall: renderGooseMemoryStatusCall, renderResult: renderGooseMemoryStatusResult });
|
|
2578
|
-
registerPair("
|
|
2578
|
+
registerPair("goosedump_search", "goose_search", Type3.Object({
|
|
2579
2579
|
query: Type3.String({ description: PARAM_DESCRIPTIONS.searchQuery }),
|
|
2580
2580
|
...historyBranchParams(),
|
|
2581
2581
|
page: Type3.Optional(Type3.Integer({
|
|
@@ -2597,7 +2597,7 @@ function registerGooseTools(pi, deps) {
|
|
|
2597
2597
|
|
|
2598
2598
|
${text}`);
|
|
2599
2599
|
}, { renderCall: renderGooseSearchCall, renderResult: renderGooseSearchResult });
|
|
2600
|
-
registerPair("
|
|
2600
|
+
registerPair("goosedump_get", "goose_get", Type3.Object({
|
|
2601
2601
|
ids: Type3.Array(Type3.String(), {
|
|
2602
2602
|
minItems: 1,
|
|
2603
2603
|
description: PARAM_DESCRIPTIONS.entryIds
|
|
@@ -2613,7 +2613,7 @@ ${text}`);
|
|
|
2613
2613
|
}
|
|
2614
2614
|
return boundedHistoryResult(formatMessagesFull(messages));
|
|
2615
2615
|
}, { renderCall: renderGooseGetCall, renderResult: renderGooseGetResult });
|
|
2616
|
-
registerPair("
|
|
2616
|
+
registerPair("goosedump_grep", "goose_grep", Type3.Object({
|
|
2617
2617
|
pattern: Type3.String({ description: PARAM_DESCRIPTIONS.pattern }),
|
|
2618
2618
|
...historyBranchParams()
|
|
2619
2619
|
}), async (params, signal, ctx, toolName) => {
|
|
@@ -2626,7 +2626,7 @@ ${text}`);
|
|
|
2626
2626
|
}
|
|
2627
2627
|
return boundedHistoryResult(formatMessagesCompact(messages));
|
|
2628
2628
|
}, { renderCall: renderGooseGrepCall, renderResult: renderGooseGrepResult });
|
|
2629
|
-
registerPair("
|
|
2629
|
+
registerPair("goosedump_compact", "goose_compact", Type3.Object({
|
|
2630
2630
|
keep: Type3.Optional(Type3.Integer({
|
|
2631
2631
|
minimum: 1,
|
|
2632
2632
|
description: PARAM_DESCRIPTIONS.keep
|
|
@@ -2641,7 +2641,7 @@ ${text}`);
|
|
|
2641
2641
|
}
|
|
2642
2642
|
return textResult(compactStartedMessage(keep, result === "queued"));
|
|
2643
2643
|
}, { renderCall: renderGooseCompactCall, renderResult: renderGooseCompactResult });
|
|
2644
|
-
registerPair("
|
|
2644
|
+
registerPair("goosedump_sessions", "goose_sessions", Type3.Object({
|
|
2645
2645
|
action: Type3.Optional(Type3.Union([Type3.Literal("list"), Type3.Literal("delete")], {
|
|
2646
2646
|
default: "list",
|
|
2647
2647
|
description: PARAM_DESCRIPTIONS.sessionsAction
|
|
@@ -3561,13 +3561,13 @@ ${renderToolRoutingPolicy()}`
|
|
|
3561
3561
|
compaction.syncCompactCounters(ctx);
|
|
3562
3562
|
compaction.updateStatus(ctx);
|
|
3563
3563
|
};
|
|
3564
|
-
registerGooseCommand("
|
|
3565
|
-
registerGooseCommand("
|
|
3564
|
+
registerGooseCommand("goosedump-settings", "Edit goosedump settings", openSettingsEditor);
|
|
3565
|
+
registerGooseCommand("goosedump-compact", "Compact the current session now; optionally keep the last N user turns", async (args, ctx) => {
|
|
3566
3566
|
let keep = null;
|
|
3567
3567
|
if (args.trim()) {
|
|
3568
3568
|
const match = args.trim().match(/^keep:(\d+)$/);
|
|
3569
3569
|
if (!match) {
|
|
3570
|
-
ctx.ui.notify("Usage: /
|
|
3570
|
+
ctx.ui.notify("Usage: /goosedump-compact [keep:N], where N >= 1", "error");
|
|
3571
3571
|
return;
|
|
3572
3572
|
}
|
|
3573
3573
|
keep = Number(match[1]);
|
|
@@ -3585,16 +3585,16 @@ ${renderToolRoutingPolicy()}`
|
|
|
3585
3585
|
ctx.ui.notify(compactStartedMessage(keep, result === "queued"), "info");
|
|
3586
3586
|
}
|
|
3587
3587
|
});
|
|
3588
|
-
registerGooseCommand("
|
|
3588
|
+
registerGooseCommand("goosedump-search", "Search the current session history", async (args, ctx) => {
|
|
3589
3589
|
const query = args.trim() || (await ctx.ui.input("Search query:", ""))?.trim() || "";
|
|
3590
3590
|
if (query.length === 0)
|
|
3591
3591
|
return;
|
|
3592
3592
|
await runSearchPanel(ctx, query, nativeExecutablePath);
|
|
3593
3593
|
});
|
|
3594
|
-
registerGooseCommand("
|
|
3594
|
+
registerGooseCommand("goosedump-sessions", "List, resume, or delete sessions for the current working directory", async (_args, ctx) => {
|
|
3595
3595
|
await runSessionsPanel(ctx, nativeExecutablePath);
|
|
3596
3596
|
});
|
|
3597
|
-
registerGooseCommand("
|
|
3597
|
+
registerGooseCommand("goosedump-forget", "Remove a durable memory entry or remembered session", async (args, ctx) => {
|
|
3598
3598
|
if (!isMemoryEnabled(ctx.cwd, projectSettingsTrusted(ctx))) {
|
|
3599
3599
|
ctx.ui.notify(MEMORY_DISABLED_MESSAGE, "warning");
|
|
3600
3600
|
return;
|
|
@@ -3605,7 +3605,7 @@ ${renderToolRoutingPolicy()}`
|
|
|
3605
3605
|
const res = await goosedumpMemoryForget(target, undefined, nativeExecutablePath);
|
|
3606
3606
|
ctx.ui.notify(res, "info");
|
|
3607
3607
|
});
|
|
3608
|
-
registerGooseCommand("
|
|
3608
|
+
registerGooseCommand("goosedump-memory-status", "Show durable memory storage health and type counts", async (_args, ctx) => {
|
|
3609
3609
|
if (!isMemoryEnabled(ctx.cwd, projectSettingsTrusted(ctx))) {
|
|
3610
3610
|
ctx.ui.notify(MEMORY_DISABLED_MESSAGE, "warning");
|
|
3611
3611
|
return;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-goosedump",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.7",
|
|
4
4
|
"description": "Pi extension for goosedump session search, durable memory, session management, and compaction",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"compaction",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"ci:test": "npm test"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@jarkkojs/goosedump": "^0.13.
|
|
40
|
+
"@jarkkojs/goosedump": "^0.13.7"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@earendil-works/pi-coding-agent": "^0.84.2",
|