pi-goosedump 0.12.52 → 0.12.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.ts +213 -78
- package/package.json +2 -2
package/dist/index.ts
CHANGED
|
@@ -2,17 +2,101 @@
|
|
|
2
2
|
// Copyright (C) Jarkko Sakkinen 2026
|
|
3
3
|
|
|
4
4
|
// src/cli.ts
|
|
5
|
+
import { Type as Type2 } from "@sinclair/typebox";
|
|
6
|
+
import { Value as Value2 } from "@sinclair/typebox/value";
|
|
5
7
|
import { execFile } from "node:child_process";
|
|
6
|
-
import { existsSync } from "node:fs";
|
|
8
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
7
9
|
import { createRequire } from "node:module";
|
|
8
10
|
import { dirname, join } from "node:path";
|
|
11
|
+
import { fileURLToPath } from "node:url";
|
|
12
|
+
|
|
13
|
+
// src/format.ts
|
|
14
|
+
import { Value } from "@sinclair/typebox/value";
|
|
9
15
|
|
|
10
16
|
// src/types.ts
|
|
17
|
+
import { Type } from "@sinclair/typebox";
|
|
11
18
|
var BRANCH_SUMMARY_PREFIX = `The following is a summary of a branch that this conversation came back from:
|
|
12
19
|
|
|
13
20
|
<summary>
|
|
14
21
|
`;
|
|
15
22
|
var BRANCH_SUMMARY_SUFFIX = "</summary>";
|
|
23
|
+
var GOOSE_MEMORY_TYPES = [
|
|
24
|
+
"decision",
|
|
25
|
+
"fact",
|
|
26
|
+
"preference",
|
|
27
|
+
"procedure",
|
|
28
|
+
"lesson"
|
|
29
|
+
];
|
|
30
|
+
var GOOSEDUMP_MEMORY_TYPE_SCHEMA = Type.Union([
|
|
31
|
+
Type.Literal("decision"),
|
|
32
|
+
Type.Literal("fact"),
|
|
33
|
+
Type.Literal("preference"),
|
|
34
|
+
Type.Literal("procedure"),
|
|
35
|
+
Type.Literal("lesson")
|
|
36
|
+
]);
|
|
37
|
+
var GOOSEDUMP_MEMORY_STATUS_SCHEMA = Type.Union([
|
|
38
|
+
Type.Literal("active"),
|
|
39
|
+
Type.Literal("superseded")
|
|
40
|
+
]);
|
|
41
|
+
var GOOSEDUMP_MEMORY_SOURCE_SCHEMA = Type.Object({
|
|
42
|
+
citation_id: Type.String(),
|
|
43
|
+
provider: Type.String(),
|
|
44
|
+
session_id: Type.String(),
|
|
45
|
+
entry_id: Type.String(),
|
|
46
|
+
role: Type.String(),
|
|
47
|
+
observed_at: Type.Number(),
|
|
48
|
+
project: Type.String(),
|
|
49
|
+
source_path: Type.String(),
|
|
50
|
+
content_hash: Type.Optional(Type.String()),
|
|
51
|
+
snippet: Type.String()
|
|
52
|
+
});
|
|
53
|
+
var GOOSEDUMP_MEMORY_ENTITY_SCHEMA = Type.Object({
|
|
54
|
+
kind: Type.String(),
|
|
55
|
+
value: Type.String(),
|
|
56
|
+
origins: Type.Optional(Type.Array(Type.String()))
|
|
57
|
+
});
|
|
58
|
+
var GOOSEDUMP_MEMORY_MATCH_REASON_SCHEMA = Type.Object({
|
|
59
|
+
kind: Type.Union([
|
|
60
|
+
Type.Literal("lexical"),
|
|
61
|
+
Type.Literal("entity"),
|
|
62
|
+
Type.Literal("relation"),
|
|
63
|
+
Type.Literal("vector"),
|
|
64
|
+
Type.Literal("history")
|
|
65
|
+
]),
|
|
66
|
+
detail: Type.String()
|
|
67
|
+
});
|
|
68
|
+
var GOOSEDUMP_MEMORY_RELATIONSHIP_SCHEMA = Type.Object({
|
|
69
|
+
direction: Type.Union([Type.Literal("outgoing"), Type.Literal("incoming")]),
|
|
70
|
+
kind: Type.Union([
|
|
71
|
+
Type.Literal("duplicates"),
|
|
72
|
+
Type.Literal("supports"),
|
|
73
|
+
Type.Literal("revises"),
|
|
74
|
+
Type.Literal("contradicts")
|
|
75
|
+
]),
|
|
76
|
+
claim_id: Type.String(),
|
|
77
|
+
display_id: Type.String(),
|
|
78
|
+
memory_type: GOOSEDUMP_MEMORY_TYPE_SCHEMA,
|
|
79
|
+
text: Type.String(),
|
|
80
|
+
status: GOOSEDUMP_MEMORY_STATUS_SCHEMA,
|
|
81
|
+
rationale: Type.String()
|
|
82
|
+
});
|
|
83
|
+
var GOOSEDUMP_MEMORY_HIT_SCHEMA = Type.Object({
|
|
84
|
+
id: Type.String(),
|
|
85
|
+
display_id: Type.String(),
|
|
86
|
+
memory_type: GOOSEDUMP_MEMORY_TYPE_SCHEMA,
|
|
87
|
+
text: Type.String(),
|
|
88
|
+
keywords: Type.Array(Type.String()),
|
|
89
|
+
status: Type.Optional(GOOSEDUMP_MEMORY_STATUS_SCHEMA),
|
|
90
|
+
score: Type.Number(),
|
|
91
|
+
project: Type.String(),
|
|
92
|
+
valid_from: Type.Union([Type.Number(), Type.Null()]),
|
|
93
|
+
valid_until: Type.Union([Type.Number(), Type.Null()]),
|
|
94
|
+
superseded_by: Type.Optional(Type.Union([Type.String(), Type.Null()])),
|
|
95
|
+
related_by: Type.Optional(Type.Array(GOOSEDUMP_MEMORY_ENTITY_SCHEMA)),
|
|
96
|
+
relationships: Type.Array(GOOSEDUMP_MEMORY_RELATIONSHIP_SCHEMA),
|
|
97
|
+
match_reasons: Type.Array(GOOSEDUMP_MEMORY_MATCH_REASON_SCHEMA),
|
|
98
|
+
evidence: Type.Array(GOOSEDUMP_MEMORY_SOURCE_SCHEMA)
|
|
99
|
+
});
|
|
16
100
|
var RECALL_TOKEN_BUDGET = 4096;
|
|
17
101
|
var RECALL_MAX_BYTES = RECALL_TOKEN_BUDGET;
|
|
18
102
|
var RECALL_DEFAULT_LIMIT = 5;
|
|
@@ -23,15 +107,47 @@ var MEMORY_HIT_SEPARATOR = `
|
|
|
23
107
|
`;
|
|
24
108
|
var MEMORY_TEXT_TRUNCATED = `
|
|
25
109
|
[Entry text truncated]`;
|
|
110
|
+
var TURNS_BEFORE_COMPACT_MIN = 0;
|
|
111
|
+
var TURNS_BEFORE_COMPACT_MAX = 255;
|
|
112
|
+
var SUMMARY_MAX_TOKENS_MIN = 512;
|
|
113
|
+
var SUMMARY_MAX_TOKENS_MAX = 65536;
|
|
114
|
+
var TURNS_BEFORE_COMPACT_SCHEMA = Type.Integer({
|
|
115
|
+
minimum: TURNS_BEFORE_COMPACT_MIN,
|
|
116
|
+
maximum: TURNS_BEFORE_COMPACT_MAX
|
|
117
|
+
});
|
|
118
|
+
var SUMMARY_MAX_TOKENS_SCHEMA = Type.Integer({
|
|
119
|
+
minimum: SUMMARY_MAX_TOKENS_MIN,
|
|
120
|
+
maximum: SUMMARY_MAX_TOKENS_MAX
|
|
121
|
+
});
|
|
122
|
+
var ENABLE_MEMORY_SCHEMA = Type.Boolean();
|
|
123
|
+
var GOOSEDUMP_SETTINGS_SCHEMA = Type.Object({
|
|
124
|
+
turnsBeforeCompact: TURNS_BEFORE_COMPACT_SCHEMA,
|
|
125
|
+
summaryMaxTokens: SUMMARY_MAX_TOKENS_SCHEMA,
|
|
126
|
+
enableMemory: ENABLE_MEMORY_SCHEMA
|
|
127
|
+
});
|
|
128
|
+
var GOOSEDUMP_SETTING_SCHEMAS = {
|
|
129
|
+
turnsBeforeCompact: TURNS_BEFORE_COMPACT_SCHEMA,
|
|
130
|
+
summaryMaxTokens: SUMMARY_MAX_TOKENS_SCHEMA,
|
|
131
|
+
enableMemory: ENABLE_MEMORY_SCHEMA
|
|
132
|
+
};
|
|
133
|
+
var GOOSEDUMP_SETTING_KEYS = Object.keys(GOOSEDUMP_SETTINGS_SCHEMA.properties);
|
|
26
134
|
var DEFAULT_GOOSEDUMP_SETTINGS = {
|
|
27
135
|
turnsBeforeCompact: 0,
|
|
28
136
|
summaryMaxTokens: 4096,
|
|
29
137
|
enableMemory: false
|
|
30
138
|
};
|
|
31
|
-
var
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
139
|
+
var GOOSEDUMP_SESSION_SCHEMA = Type.Object({
|
|
140
|
+
id: Type.String(),
|
|
141
|
+
parent: Type.Union([Type.String(), Type.Null()]),
|
|
142
|
+
provider: Type.String(),
|
|
143
|
+
cwd: Type.String(),
|
|
144
|
+
path: Type.String(),
|
|
145
|
+
count: Type.Integer({ minimum: 0 }),
|
|
146
|
+
label: Type.Union([Type.String(), Type.Null()]),
|
|
147
|
+
from: Type.Union([Type.String(), Type.Null()]),
|
|
148
|
+
until: Type.Union([Type.String(), Type.Null()])
|
|
149
|
+
});
|
|
150
|
+
var GOOSEDUMP_SESSION_LIST_SCHEMA = Type.Array(GOOSEDUMP_SESSION_SCHEMA);
|
|
35
151
|
var GOOSE_PROVIDERS = [
|
|
36
152
|
"pi",
|
|
37
153
|
"claude",
|
|
@@ -105,9 +221,6 @@ function isControlChar(char) {
|
|
|
105
221
|
const code = char.charCodeAt(0);
|
|
106
222
|
return code < 32 || code === 127 || code >= 128 && code <= 159;
|
|
107
223
|
}
|
|
108
|
-
function isStringArray(value) {
|
|
109
|
-
return Array.isArray(value) && value.every((item) => typeof item === "string");
|
|
110
|
-
}
|
|
111
224
|
|
|
112
225
|
// src/format.ts
|
|
113
226
|
function summarizeToolArgs(args) {
|
|
@@ -191,20 +304,11 @@ function parsePiMessages(output) {
|
|
|
191
304
|
}
|
|
192
305
|
return messages;
|
|
193
306
|
}
|
|
194
|
-
function isMemorySource(value) {
|
|
195
|
-
return isRecord(value) && typeof value.citation_id === "string" && typeof value.provider === "string" && typeof value.session_id === "string" && typeof value.entry_id === "string" && typeof value.role === "string" && typeof value.observed_at === "number" && typeof value.project === "string" && typeof value.source_path === "string" && typeof value.snippet === "string" && (value.content_hash === undefined || typeof value.content_hash === "string");
|
|
196
|
-
}
|
|
197
|
-
function isMemoryMatchReason(value) {
|
|
198
|
-
return isRecord(value) && typeof value.detail === "string" && ["lexical", "entity", "relation", "vector", "history"].includes(value.kind);
|
|
199
|
-
}
|
|
200
|
-
function isMemoryRelationship(value) {
|
|
201
|
-
return isRecord(value) && ["outgoing", "incoming"].includes(value.direction) && ["duplicates", "supports", "revises", "contradicts"].includes(value.kind) && typeof value.claim_id === "string" && typeof value.display_id === "string" && ["fact", "decision", "preference", "procedure", "lesson"].includes(value.memory_type) && typeof value.text === "string" && ["active", "superseded"].includes(value.status) && typeof value.rationale === "string";
|
|
202
|
-
}
|
|
203
307
|
function parseMemoryHits(output) {
|
|
204
308
|
const value = JSON.parse(output);
|
|
205
309
|
if (!Array.isArray(value))
|
|
206
310
|
throw new Error("goosedump memory recall returned invalid JSON");
|
|
207
|
-
return value.filter((item) =>
|
|
311
|
+
return value.filter((item) => Value.Check(GOOSEDUMP_MEMORY_HIT_SCHEMA, item));
|
|
208
312
|
}
|
|
209
313
|
function formatMemorySource(source) {
|
|
210
314
|
const observed = new Date(source.observed_at).toISOString();
|
|
@@ -283,19 +387,53 @@ ${m.content}`).join(`
|
|
|
283
387
|
|
|
284
388
|
// src/cli.ts
|
|
285
389
|
var require2 = createRequire(import.meta.url);
|
|
390
|
+
var NATIVE_PACKAGE_TABLE = "native-packages.json";
|
|
391
|
+
var NATIVE_GOOSEDUMP_PACKAGE_SCHEMA = Type2.Object({
|
|
392
|
+
packageName: Type2.String({ minLength: 1 }),
|
|
393
|
+
binaryName: Type2.String({ minLength: 1 })
|
|
394
|
+
});
|
|
395
|
+
var NATIVE_GOOSEDUMP_PACKAGES_SCHEMA = Type2.Object({
|
|
396
|
+
"darwin-arm64": NATIVE_GOOSEDUMP_PACKAGE_SCHEMA,
|
|
397
|
+
"linux-arm64": NATIVE_GOOSEDUMP_PACKAGE_SCHEMA,
|
|
398
|
+
"linux-x64": NATIVE_GOOSEDUMP_PACKAGE_SCHEMA,
|
|
399
|
+
"win32-x64": NATIVE_GOOSEDUMP_PACKAGE_SCHEMA
|
|
400
|
+
});
|
|
401
|
+
var cachedNativePackages;
|
|
402
|
+
function resolveNativePackageTable() {
|
|
403
|
+
try {
|
|
404
|
+
const wrapperRequire = createRequire(resolveGoosedumpBinary());
|
|
405
|
+
return wrapperRequire.resolve(`./${NATIVE_PACKAGE_TABLE}`);
|
|
406
|
+
} catch {}
|
|
407
|
+
let dir = dirname(fileURLToPath(import.meta.url));
|
|
408
|
+
for (let i = 0;i < 8; i++) {
|
|
409
|
+
const candidate = join(dir, "bin", NATIVE_PACKAGE_TABLE);
|
|
410
|
+
if (existsSync(candidate))
|
|
411
|
+
return candidate;
|
|
412
|
+
const parent = dirname(dir);
|
|
413
|
+
if (parent === dir)
|
|
414
|
+
break;
|
|
415
|
+
dir = parent;
|
|
416
|
+
}
|
|
417
|
+
throw new Error("broken pi-goosedump installation: cannot resolve the native package table from @jarkkojs/goosedump");
|
|
418
|
+
}
|
|
419
|
+
function loadNativeGoosedumpPackages() {
|
|
420
|
+
const table = JSON.parse(readFileSync(resolveNativePackageTable(), "utf8"));
|
|
421
|
+
if (!Value2.Check(NATIVE_GOOSEDUMP_PACKAGES_SCHEMA, table)) {
|
|
422
|
+
throw new Error("broken pi-goosedump installation: native package table is invalid");
|
|
423
|
+
}
|
|
424
|
+
return table;
|
|
425
|
+
}
|
|
426
|
+
function nativeGoosedumpPackages() {
|
|
427
|
+
cachedNativePackages ??= loadNativeGoosedumpPackages();
|
|
428
|
+
return cachedNativePackages;
|
|
429
|
+
}
|
|
286
430
|
function nativeGoosedumpPackage(target) {
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
return { packageName: "@jarkkojs/goosedump-linux-arm64", binaryName: "goosedump" };
|
|
292
|
-
case "darwin-arm64":
|
|
293
|
-
return { packageName: "@jarkkojs/goosedump-darwin-arm64", binaryName: "goosedump" };
|
|
294
|
-
case "win32-x64":
|
|
295
|
-
return { packageName: "@jarkkojs/goosedump-win32-x64", binaryName: "goosedump.exe" };
|
|
296
|
-
default:
|
|
297
|
-
throw new Error(`unsupported platform architecture: ${target}`);
|
|
431
|
+
const packages = nativeGoosedumpPackages();
|
|
432
|
+
const entry = packages[target];
|
|
433
|
+
if (!entry) {
|
|
434
|
+
throw new Error(`unsupported platform architecture: ${target}; supported platforms: ${Object.keys(packages).join(", ")}`);
|
|
298
435
|
}
|
|
436
|
+
return entry;
|
|
299
437
|
}
|
|
300
438
|
function resolveGoosedumpBinary() {
|
|
301
439
|
try {
|
|
@@ -400,6 +538,9 @@ async function goosedumpListSessions(signal, executablePath) {
|
|
|
400
538
|
if (!Array.isArray(parsed)) {
|
|
401
539
|
throw new Error("invalid goosedump session list JSON: expected an array");
|
|
402
540
|
}
|
|
541
|
+
if (!Value2.Check(GOOSEDUMP_SESSION_LIST_SCHEMA, parsed)) {
|
|
542
|
+
throw new Error("invalid goosedump session list JSON");
|
|
543
|
+
}
|
|
403
544
|
return parsed;
|
|
404
545
|
}
|
|
405
546
|
async function goosedumpRemoveSession(target, signal, executablePath) {
|
|
@@ -464,42 +605,37 @@ import { findCutPoint } from "@earendil-works/pi-coding-agent";
|
|
|
464
605
|
|
|
465
606
|
// src/settings.ts
|
|
466
607
|
import { DEFAULT_COMPACTION_SETTINGS } from "@earendil-works/pi-coding-agent";
|
|
608
|
+
import { Value as Value3 } from "@sinclair/typebox/value";
|
|
467
609
|
import { randomUUID } from "node:crypto";
|
|
468
610
|
import {
|
|
469
611
|
existsSync as existsSync2,
|
|
470
612
|
mkdirSync,
|
|
471
|
-
readFileSync,
|
|
613
|
+
readFileSync as readFileSync2,
|
|
472
614
|
renameSync,
|
|
473
615
|
unlinkSync,
|
|
474
616
|
writeFileSync
|
|
475
617
|
} from "node:fs";
|
|
476
618
|
import { homedir } from "node:os";
|
|
477
619
|
import { dirname as dirname2, join as join2 } from "node:path";
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
kind: "
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
},
|
|
489
|
-
enableMemory: { kind: "boolean" }
|
|
490
|
-
};
|
|
620
|
+
function settingSpecFromSchema(schema) {
|
|
621
|
+
if (schema.type === "boolean")
|
|
622
|
+
return { kind: "boolean" };
|
|
623
|
+
const { minimum, maximum } = schema;
|
|
624
|
+
if (typeof minimum !== "number" || typeof maximum !== "number") {
|
|
625
|
+
throw new Error("goosedump setting schema is missing integer bounds");
|
|
626
|
+
}
|
|
627
|
+
return { kind: "number", min: minimum, max: maximum };
|
|
628
|
+
}
|
|
629
|
+
var GOOSEDUMP_SETTING_SPECS = Object.fromEntries(GOOSEDUMP_SETTING_KEYS.map((key) => [key, settingSpecFromSchema(GOOSEDUMP_SETTING_SCHEMAS[key])]));
|
|
491
630
|
var MEMORY_DISABLED_MESSAGE = "Durable memory is disabled. Set goosedump.enableMemory to true in settings (or /goose-settings).";
|
|
492
631
|
function isValidGoosedumpSettingValue(key, value) {
|
|
493
|
-
|
|
494
|
-
if (spec.kind === "boolean")
|
|
495
|
-
return typeof value === "boolean";
|
|
496
|
-
return typeof value === "number" && Number.isSafeInteger(value) && value >= spec.min && value <= spec.max;
|
|
632
|
+
return Value3.Check(GOOSEDUMP_SETTING_SCHEMAS[key], value);
|
|
497
633
|
}
|
|
498
634
|
function pickValidGoosedumpSettings(raw) {
|
|
499
635
|
if (!isRecord(raw))
|
|
500
636
|
return {};
|
|
501
637
|
const settings = {};
|
|
502
|
-
for (const key of
|
|
638
|
+
for (const key of GOOSEDUMP_SETTING_KEYS) {
|
|
503
639
|
const value = raw[key];
|
|
504
640
|
if (!isValidGoosedumpSettingValue(key, value))
|
|
505
641
|
continue;
|
|
@@ -527,7 +663,7 @@ function readJsonObject(path) {
|
|
|
527
663
|
if (!existsSync2(path))
|
|
528
664
|
return {};
|
|
529
665
|
try {
|
|
530
|
-
const parsed = JSON.parse(
|
|
666
|
+
const parsed = JSON.parse(readFileSync2(path, "utf8"));
|
|
531
667
|
return isRecord(parsed) ? parsed : {};
|
|
532
668
|
} catch {
|
|
533
669
|
return {};
|
|
@@ -538,7 +674,7 @@ function readJsonObjectStrict(path) {
|
|
|
538
674
|
return {};
|
|
539
675
|
let parsed;
|
|
540
676
|
try {
|
|
541
|
-
parsed = JSON.parse(
|
|
677
|
+
parsed = JSON.parse(readFileSync2(path, "utf8"));
|
|
542
678
|
} catch (error) {
|
|
543
679
|
const message = error instanceof Error ? error.message : String(error);
|
|
544
680
|
throw new Error(`${path}: ${message}`);
|
|
@@ -596,7 +732,7 @@ function validateGoosedumpSettings(path) {
|
|
|
596
732
|
if (!isRecord(root.goosedump)) {
|
|
597
733
|
throw new Error(`${path}: goosedump must be a JSON object`);
|
|
598
734
|
}
|
|
599
|
-
for (const key of
|
|
735
|
+
for (const key of GOOSEDUMP_SETTING_KEYS) {
|
|
600
736
|
const value = root.goosedump[key];
|
|
601
737
|
if (value !== undefined && !isValidGoosedumpSettingValue(key, value)) {
|
|
602
738
|
throw new Error(`${path}: goosedump.${key} must be ${goosedumpSettingValidationMessage(key)}`);
|
|
@@ -1499,7 +1635,7 @@ import {
|
|
|
1499
1635
|
defineTool,
|
|
1500
1636
|
truncateHead
|
|
1501
1637
|
} from "@earendil-works/pi-coding-agent";
|
|
1502
|
-
import { Type } from "@sinclair/typebox";
|
|
1638
|
+
import { Type as Type3 } from "@sinclair/typebox";
|
|
1503
1639
|
function memoryDisabledResult() {
|
|
1504
1640
|
return textResult(MEMORY_DISABLED_MESSAGE);
|
|
1505
1641
|
}
|
|
@@ -1509,18 +1645,18 @@ function requireMemoryEnabled(ctx) {
|
|
|
1509
1645
|
return memoryDisabledResult();
|
|
1510
1646
|
}
|
|
1511
1647
|
function historyProviderParam() {
|
|
1512
|
-
return
|
|
1648
|
+
return Type3.Optional(Type3.Union(GOOSE_PROVIDERS.map((provider) => Type3.Literal(provider)), {
|
|
1513
1649
|
default: "pi",
|
|
1514
1650
|
description: PARAM_DESCRIPTIONS.provider
|
|
1515
1651
|
}));
|
|
1516
1652
|
}
|
|
1517
1653
|
function historySessionParam() {
|
|
1518
|
-
return
|
|
1654
|
+
return Type3.Optional(Type3.String({
|
|
1519
1655
|
description: PARAM_DESCRIPTIONS.session
|
|
1520
1656
|
}));
|
|
1521
1657
|
}
|
|
1522
1658
|
function historyScopeParam() {
|
|
1523
|
-
return
|
|
1659
|
+
return Type3.Optional(Type3.Union([Type3.Literal("lineage"), Type3.Literal("all")], {
|
|
1524
1660
|
default: "lineage",
|
|
1525
1661
|
description: PARAM_DESCRIPTIONS.scope
|
|
1526
1662
|
}));
|
|
@@ -1574,7 +1710,6 @@ function gooseToolMeta(name) {
|
|
|
1574
1710
|
promptGuidelines: [...policy.guidelines]
|
|
1575
1711
|
};
|
|
1576
1712
|
}
|
|
1577
|
-
var GOOSE_MEMORY_TYPES = ["decision", "fact", "preference", "procedure", "lesson"];
|
|
1578
1713
|
function defineGooseTool(name, parameters, handler) {
|
|
1579
1714
|
return defineTool({
|
|
1580
1715
|
...gooseToolMeta(name),
|
|
@@ -1590,7 +1725,7 @@ function defineGooseTool(name, parameters, handler) {
|
|
|
1590
1725
|
}
|
|
1591
1726
|
function registerGooseTools(pi, deps) {
|
|
1592
1727
|
const { nativeExecutablePath, enqueueRemember, requestCompaction } = deps;
|
|
1593
|
-
pi.registerTool(defineGooseTool("goose_remember",
|
|
1728
|
+
pi.registerTool(defineGooseTool("goose_remember", Type3.Object({ ...historyTargetParams() }), async (params, _signal, ctx) => {
|
|
1594
1729
|
const disabled = requireMemoryEnabled(ctx);
|
|
1595
1730
|
if (disabled)
|
|
1596
1731
|
return disabled;
|
|
@@ -1604,18 +1739,18 @@ function registerGooseTools(pi, deps) {
|
|
|
1604
1739
|
});
|
|
1605
1740
|
return textResult(`Memory learning queued for ${resolved.target}.`);
|
|
1606
1741
|
}));
|
|
1607
|
-
pi.registerTool(defineGooseTool("goose_recall",
|
|
1608
|
-
query:
|
|
1609
|
-
type:
|
|
1610
|
-
allProjects:
|
|
1742
|
+
pi.registerTool(defineGooseTool("goose_recall", Type3.Object({
|
|
1743
|
+
query: Type3.String({ description: PARAM_DESCRIPTIONS.memoryQuery }),
|
|
1744
|
+
type: Type3.Optional(Type3.Union(GOOSE_MEMORY_TYPES.map((type) => Type3.Literal(type)), { description: PARAM_DESCRIPTIONS.memoryType })),
|
|
1745
|
+
allProjects: Type3.Optional(Type3.Boolean({
|
|
1611
1746
|
default: false,
|
|
1612
1747
|
description: PARAM_DESCRIPTIONS.allProjects
|
|
1613
1748
|
})),
|
|
1614
|
-
history:
|
|
1749
|
+
history: Type3.Optional(Type3.Boolean({
|
|
1615
1750
|
default: false,
|
|
1616
1751
|
description: PARAM_DESCRIPTIONS.history
|
|
1617
1752
|
})),
|
|
1618
|
-
limit:
|
|
1753
|
+
limit: Type3.Optional(Type3.Integer({
|
|
1619
1754
|
minimum: 1,
|
|
1620
1755
|
maximum: 20,
|
|
1621
1756
|
default: 5,
|
|
@@ -1637,8 +1772,8 @@ function registerGooseTools(pi, deps) {
|
|
|
1637
1772
|
return textResult(`No durable memory for "${params.query}"`);
|
|
1638
1773
|
return textResult(formatMemoryHits(hits));
|
|
1639
1774
|
}));
|
|
1640
|
-
pi.registerTool(defineGooseTool("goose_forget",
|
|
1641
|
-
target:
|
|
1775
|
+
pi.registerTool(defineGooseTool("goose_forget", Type3.Object({
|
|
1776
|
+
target: Type3.String({
|
|
1642
1777
|
description: PARAM_DESCRIPTIONS.forgetTarget
|
|
1643
1778
|
})
|
|
1644
1779
|
}), async (params, signal, ctx) => {
|
|
@@ -1651,16 +1786,16 @@ function registerGooseTools(pi, deps) {
|
|
|
1651
1786
|
const res = await goosedumpMemoryForget(params.target.trim(), signal, nativeExecutablePath);
|
|
1652
1787
|
return textResult(res);
|
|
1653
1788
|
}));
|
|
1654
|
-
pi.registerTool(defineGooseTool("goose_memory_status",
|
|
1789
|
+
pi.registerTool(defineGooseTool("goose_memory_status", Type3.Object({}), async (_params, signal, ctx) => {
|
|
1655
1790
|
const disabled = requireMemoryEnabled(ctx);
|
|
1656
1791
|
if (disabled)
|
|
1657
1792
|
return disabled;
|
|
1658
1793
|
return textResult(await goosedumpMemoryStatus(signal, nativeExecutablePath));
|
|
1659
1794
|
}));
|
|
1660
|
-
pi.registerTool(defineGooseTool("goose_search",
|
|
1661
|
-
query:
|
|
1795
|
+
pi.registerTool(defineGooseTool("goose_search", Type3.Object({
|
|
1796
|
+
query: Type3.String({ description: PARAM_DESCRIPTIONS.searchQuery }),
|
|
1662
1797
|
...historyBranchParams(),
|
|
1663
|
-
page:
|
|
1798
|
+
page: Type3.Optional(Type3.Integer({
|
|
1664
1799
|
minimum: 1,
|
|
1665
1800
|
default: 1,
|
|
1666
1801
|
description: PARAM_DESCRIPTIONS.page
|
|
@@ -1679,8 +1814,8 @@ function registerGooseTools(pi, deps) {
|
|
|
1679
1814
|
|
|
1680
1815
|
${text}`);
|
|
1681
1816
|
}));
|
|
1682
|
-
pi.registerTool(defineGooseTool("goose_get",
|
|
1683
|
-
ids:
|
|
1817
|
+
pi.registerTool(defineGooseTool("goose_get", Type3.Object({
|
|
1818
|
+
ids: Type3.Array(Type3.String(), {
|
|
1684
1819
|
minItems: 1,
|
|
1685
1820
|
description: PARAM_DESCRIPTIONS.entryIds
|
|
1686
1821
|
}),
|
|
@@ -1695,8 +1830,8 @@ ${text}`);
|
|
|
1695
1830
|
}
|
|
1696
1831
|
return boundedHistoryResult(formatMessagesFull(messages));
|
|
1697
1832
|
}));
|
|
1698
|
-
pi.registerTool(defineGooseTool("goose_grep",
|
|
1699
|
-
pattern:
|
|
1833
|
+
pi.registerTool(defineGooseTool("goose_grep", Type3.Object({
|
|
1834
|
+
pattern: Type3.String({ description: PARAM_DESCRIPTIONS.pattern }),
|
|
1700
1835
|
...historyBranchParams()
|
|
1701
1836
|
}), async (params, signal, ctx) => {
|
|
1702
1837
|
const resolved = resolveHistoryTarget(ctx, "goose_grep", params);
|
|
@@ -1708,8 +1843,8 @@ ${text}`);
|
|
|
1708
1843
|
}
|
|
1709
1844
|
return boundedHistoryResult(formatMessagesCompact(messages));
|
|
1710
1845
|
}));
|
|
1711
|
-
pi.registerTool(defineGooseTool("goose_compact",
|
|
1712
|
-
keep:
|
|
1846
|
+
pi.registerTool(defineGooseTool("goose_compact", Type3.Object({
|
|
1847
|
+
keep: Type3.Optional(Type3.Integer({
|
|
1713
1848
|
minimum: 1,
|
|
1714
1849
|
description: PARAM_DESCRIPTIONS.keep
|
|
1715
1850
|
}))
|
|
@@ -1723,13 +1858,13 @@ ${text}`);
|
|
|
1723
1858
|
}
|
|
1724
1859
|
return textResult(compactStartedMessage(keep, result === "queued"));
|
|
1725
1860
|
}));
|
|
1726
|
-
pi.registerTool(defineGooseTool("goose_sessions",
|
|
1727
|
-
action:
|
|
1861
|
+
pi.registerTool(defineGooseTool("goose_sessions", Type3.Object({
|
|
1862
|
+
action: Type3.Optional(Type3.Union([Type3.Literal("list"), Type3.Literal("delete")], {
|
|
1728
1863
|
default: "list",
|
|
1729
1864
|
description: PARAM_DESCRIPTIONS.sessionsAction
|
|
1730
1865
|
})),
|
|
1731
1866
|
provider: historyProviderParam(),
|
|
1732
|
-
session:
|
|
1867
|
+
session: Type3.Optional(Type3.String({
|
|
1733
1868
|
description: PARAM_DESCRIPTIONS.sessionsDeleteId
|
|
1734
1869
|
}))
|
|
1735
1870
|
}), async (params, signal, ctx) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-goosedump",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.54",
|
|
4
4
|
"description": "Pi extension for goosedump session search, durable memory, session management, and compaction",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"compaction",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"@earendil-works/pi-tui": "^0.82.1",
|
|
41
|
-
"@jarkkojs/goosedump": "^0.12.
|
|
41
|
+
"@jarkkojs/goosedump": "^0.12.54",
|
|
42
42
|
"@sinclair/typebox": "^0.34.49"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|