@aexol/spectral 0.7.1 → 0.7.5
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 +5 -0
- package/dist/agent/agents.js +1 -1
- package/dist/agent/index.js +199 -184
- package/dist/commands/serve.js +0 -3
- package/dist/designer/data/systems/renault/DESIGN.md +1 -1
- package/dist/designer/philosophies.js +668 -0
- package/dist/mcp/sampling-handler.js +1 -1
- package/dist/memory/commands/status.js +1 -1
- package/dist/memory/compaction.js +2 -2
- package/dist/memory/config.js +1 -1
- package/dist/memory/debug-log.js +1 -1
- package/dist/memory/hooks/compaction-hook.js +29 -0
- package/dist/memory/index.js +2 -0
- package/dist/memory/observer.js +2 -2
- package/dist/memory/project-observations-store.js +14 -0
- package/dist/memory/tokens.js +1 -1
- package/dist/memory/tools/read-project-observations.js +82 -0
- package/dist/memory/tools/recall-observation.js +2 -2
- package/dist/pi/agent-core/agent-loop.js +501 -0
- package/dist/pi/agent-core/agent.js +401 -0
- package/dist/pi/agent-core/harness/agent-harness.js +899 -0
- package/dist/pi/agent-core/harness/compaction/branch-summarization.js +173 -0
- package/dist/pi/agent-core/harness/compaction/compaction.js +532 -0
- package/dist/pi/agent-core/harness/compaction/utils.js +130 -0
- package/dist/pi/agent-core/harness/env/nodejs.js +485 -0
- package/dist/pi/agent-core/harness/messages.js +101 -0
- package/dist/pi/agent-core/harness/prompt-templates.js +229 -0
- package/dist/pi/agent-core/harness/session/jsonl-repo.js +100 -0
- package/dist/pi/agent-core/harness/session/jsonl-storage.js +230 -0
- package/dist/pi/agent-core/harness/session/memory-repo.js +41 -0
- package/dist/pi/agent-core/harness/session/memory-storage.js +113 -0
- package/dist/pi/agent-core/harness/session/repo-utils.js +38 -0
- package/dist/pi/agent-core/harness/session/session.js +196 -0
- package/dist/pi/agent-core/harness/session/uuid.js +49 -0
- package/dist/pi/agent-core/harness/skills.js +310 -0
- package/dist/pi/agent-core/harness/system-prompt.js +29 -0
- package/dist/pi/agent-core/harness/types.js +93 -0
- package/dist/pi/agent-core/harness/utils/shell-output.js +125 -0
- package/dist/pi/agent-core/harness/utils/truncate.js +289 -0
- package/dist/pi/agent-core/index.js +24 -0
- package/dist/pi/agent-core/node.js +2 -0
- package/dist/pi/agent-core/proxy.js +277 -0
- package/dist/pi/agent-core/types.js +1 -0
- package/dist/pi/ai/api-registry.js +43 -0
- package/dist/pi/ai/cli.js +120 -0
- package/dist/pi/ai/env-api-keys.js +169 -0
- package/dist/pi/ai/image-models.generated.js +441 -0
- package/dist/pi/ai/image-models.js +22 -0
- package/dist/pi/ai/images-api-registry.js +21 -0
- package/dist/pi/ai/images.js +13 -0
- package/dist/pi/ai/index.js +18 -0
- package/dist/pi/ai/models.generated.js +16220 -0
- package/dist/pi/ai/models.js +70 -0
- package/dist/pi/ai/oauth.js +1 -0
- package/dist/pi/ai/providers/anthropic.js +945 -0
- package/dist/pi/ai/providers/faux.js +367 -0
- package/dist/pi/ai/providers/github-copilot-headers.js +28 -0
- package/dist/pi/ai/providers/openai-completions.js +945 -0
- package/dist/pi/ai/providers/openai-prompt-cache.js +9 -0
- package/dist/pi/ai/providers/register-builtins.js +97 -0
- package/dist/pi/ai/providers/simple-options.js +40 -0
- package/dist/pi/ai/providers/transform-messages.js +183 -0
- package/dist/pi/ai/session-resources.js +21 -0
- package/dist/pi/ai/stream.js +26 -0
- package/dist/pi/ai/types.js +1 -0
- package/dist/pi/ai/utils/diagnostics.js +24 -0
- package/dist/pi/ai/utils/event-stream.js +80 -0
- package/dist/pi/ai/utils/hash.js +13 -0
- package/dist/pi/ai/utils/headers.js +7 -0
- package/dist/pi/ai/utils/json-parse.js +112 -0
- package/dist/pi/ai/utils/node-http-proxy.js +96 -0
- package/dist/pi/ai/utils/oauth/anthropic.js +334 -0
- package/dist/pi/ai/utils/oauth/device-code.js +54 -0
- package/dist/pi/ai/utils/oauth/github-copilot.js +270 -0
- package/dist/pi/ai/utils/oauth/index.js +121 -0
- package/dist/pi/ai/utils/oauth/oauth-page.js +104 -0
- package/dist/pi/ai/utils/oauth/openai-codex.js +384 -0
- package/dist/pi/ai/utils/oauth/pkce.js +30 -0
- package/dist/pi/ai/utils/oauth/types.js +1 -0
- package/dist/pi/ai/utils/overflow.js +150 -0
- package/dist/pi/ai/utils/sanitize-unicode.js +25 -0
- package/dist/pi/ai/utils/typebox-helpers.js +20 -0
- package/dist/pi/ai/utils/validation.js +280 -0
- package/dist/pi/coding-agent/bun/cli.js +7 -0
- package/dist/pi/coding-agent/bun/restore-sandbox-env.js +31 -0
- package/dist/pi/coding-agent/cli/args.js +340 -0
- package/dist/pi/coding-agent/cli/file-processor.js +82 -0
- package/dist/pi/coding-agent/cli/initial-message.js +21 -0
- package/dist/pi/coding-agent/cli.js +17 -0
- package/dist/pi/coding-agent/config.js +414 -0
- package/dist/pi/coding-agent/core/agent-session-runtime.js +299 -0
- package/dist/pi/coding-agent/core/agent-session-services.js +117 -0
- package/dist/pi/coding-agent/core/agent-session.js +2498 -0
- package/dist/pi/coding-agent/core/auth-guidance.js +20 -0
- package/dist/pi/coding-agent/core/auth-storage.js +441 -0
- package/dist/pi/coding-agent/core/bash-executor.js +110 -0
- package/dist/pi/coding-agent/core/compaction/branch-summarization.js +242 -0
- package/dist/pi/coding-agent/core/compaction/compaction.js +624 -0
- package/dist/pi/coding-agent/core/compaction/index.js +6 -0
- package/dist/pi/coding-agent/core/compaction/utils.js +152 -0
- package/dist/pi/coding-agent/core/defaults.js +1 -0
- package/dist/pi/coding-agent/core/diagnostics.js +1 -0
- package/dist/pi/coding-agent/core/event-bus.js +24 -0
- package/dist/pi/coding-agent/core/exec.js +74 -0
- package/dist/pi/coding-agent/core/export-html/ansi-to-html.js +248 -0
- package/dist/pi/coding-agent/core/export-html/index.js +225 -0
- package/dist/pi/coding-agent/core/export-html/tool-renderer.js +107 -0
- package/dist/pi/coding-agent/core/extensions/index.js +8 -0
- package/dist/pi/coding-agent/core/extensions/loader.js +485 -0
- package/dist/pi/coding-agent/core/extensions/runner.js +824 -0
- package/dist/pi/coding-agent/core/extensions/types.js +44 -0
- package/dist/pi/coding-agent/core/extensions/wrapper.js +21 -0
- package/dist/pi/coding-agent/core/footer-data-provider.js +309 -0
- package/dist/pi/coding-agent/core/http-dispatcher.js +47 -0
- package/dist/pi/coding-agent/core/index.js +11 -0
- package/dist/pi/coding-agent/core/keybindings.js +294 -0
- package/dist/pi/coding-agent/core/messages.js +122 -0
- package/dist/pi/coding-agent/core/model-registry.js +728 -0
- package/dist/pi/coding-agent/core/model-resolver.js +494 -0
- package/dist/pi/coding-agent/core/output-guard.js +58 -0
- package/dist/pi/coding-agent/core/package-manager.js +2020 -0
- package/dist/pi/coding-agent/core/prompt-templates.js +237 -0
- package/dist/pi/coding-agent/core/provider-display-names.js +32 -0
- package/dist/pi/coding-agent/core/resolve-config-value.js +125 -0
- package/dist/pi/coding-agent/core/resource-loader.js +733 -0
- package/dist/pi/coding-agent/core/sdk.js +282 -0
- package/dist/pi/coding-agent/core/session-cwd.js +37 -0
- package/dist/pi/coding-agent/core/session-manager.js +1146 -0
- package/dist/pi/coding-agent/core/settings-manager.js +794 -0
- package/dist/pi/coding-agent/core/skills.js +386 -0
- package/dist/pi/coding-agent/core/slash-commands.js +24 -0
- package/dist/pi/coding-agent/core/source-info.js +18 -0
- package/dist/pi/coding-agent/core/system-prompt.js +122 -0
- package/dist/pi/coding-agent/core/telemetry.js +8 -0
- package/dist/pi/coding-agent/core/timings.js +30 -0
- package/dist/pi/coding-agent/core/tools/bash.js +341 -0
- package/dist/pi/coding-agent/core/tools/edit-diff.js +344 -0
- package/dist/pi/coding-agent/core/tools/edit.js +324 -0
- package/dist/pi/coding-agent/core/tools/file-mutation-queue.js +36 -0
- package/dist/pi/coding-agent/core/tools/find.js +297 -0
- package/dist/pi/coding-agent/core/tools/grep.js +303 -0
- package/dist/pi/coding-agent/core/tools/index.js +111 -0
- package/dist/pi/coding-agent/core/tools/ls.js +168 -0
- package/dist/pi/coding-agent/core/tools/output-accumulator.js +183 -0
- package/dist/pi/coding-agent/core/tools/path-utils.js +61 -0
- package/dist/pi/coding-agent/core/tools/read.js +288 -0
- package/dist/pi/coding-agent/core/tools/render-utils.js +48 -0
- package/dist/pi/coding-agent/core/tools/tool-definition-wrapper.js +33 -0
- package/dist/pi/coding-agent/core/tools/truncate.js +214 -0
- package/dist/pi/coding-agent/core/tools/write.js +212 -0
- package/dist/pi/coding-agent/index.js +41 -0
- package/dist/pi/coding-agent/main.js +5 -0
- package/dist/pi/coding-agent/migrations.js +280 -0
- package/dist/pi/coding-agent/modes/index.js +7 -0
- package/dist/pi/coding-agent/modes/interactive/components/diff.js +132 -0
- package/dist/pi/coding-agent/modes/interactive/components/keybinding-hints.js +35 -0
- package/dist/pi/coding-agent/modes/interactive/components/visual-truncate.js +32 -0
- package/dist/pi/coding-agent/modes/interactive/interactive-mode.js +3 -0
- package/dist/pi/coding-agent/modes/interactive/theme/theme.js +1023 -0
- package/dist/pi/coding-agent/modes/print-mode.js +130 -0
- package/dist/pi/coding-agent/modes/rpc/jsonl.js +48 -0
- package/dist/pi/coding-agent/modes/rpc/rpc-client.js +409 -0
- package/dist/pi/coding-agent/modes/rpc/rpc-mode.js +600 -0
- package/dist/pi/coding-agent/modes/rpc/rpc-types.js +7 -0
- package/dist/pi/coding-agent/utils/ansi.js +51 -0
- package/dist/pi/coding-agent/utils/changelog.js +86 -0
- package/dist/pi/coding-agent/utils/child-process.js +87 -0
- package/dist/pi/coding-agent/utils/clipboard-image.js +244 -0
- package/dist/pi/coding-agent/utils/clipboard-native.js +13 -0
- package/dist/pi/coding-agent/utils/clipboard.js +116 -0
- package/dist/pi/coding-agent/utils/exif-orientation.js +157 -0
- package/dist/pi/coding-agent/utils/frontmatter.js +25 -0
- package/dist/pi/coding-agent/utils/fs-watch.js +24 -0
- package/dist/pi/coding-agent/utils/git.js +162 -0
- package/dist/pi/coding-agent/utils/html.js +39 -0
- package/dist/pi/coding-agent/utils/image-convert.js +38 -0
- package/dist/pi/coding-agent/utils/image-resize.js +136 -0
- package/dist/pi/coding-agent/utils/mime.js +68 -0
- package/dist/pi/coding-agent/utils/paths.js +91 -0
- package/dist/pi/coding-agent/utils/photon.js +120 -0
- package/dist/pi/coding-agent/utils/pi-user-agent.js +4 -0
- package/dist/pi/coding-agent/utils/shell.js +194 -0
- package/dist/pi/coding-agent/utils/sleep.js +16 -0
- package/dist/pi/coding-agent/utils/syntax-highlight.js +117 -0
- package/dist/pi/coding-agent/utils/tools-manager.js +327 -0
- package/dist/pi/coding-agent/utils/version-check.js +81 -0
- package/dist/pi/coding-agent/utils/windows-self-update.js +76 -0
- package/dist/pi/tui/autocomplete.js +631 -0
- package/dist/pi/tui/components/box.js +103 -0
- package/dist/pi/tui/components/cancellable-loader.js +34 -0
- package/dist/pi/tui/components/editor.js +1915 -0
- package/dist/pi/tui/components/image.js +88 -0
- package/dist/pi/tui/components/input.js +425 -0
- package/dist/pi/tui/components/loader.js +68 -0
- package/dist/pi/tui/components/markdown.js +633 -0
- package/dist/pi/tui/components/select-list.js +158 -0
- package/dist/pi/tui/components/settings-list.js +184 -0
- package/dist/pi/tui/components/spacer.js +22 -0
- package/dist/pi/tui/components/text.js +88 -0
- package/dist/pi/tui/components/truncated-text.js +50 -0
- package/dist/pi/tui/editor-component.js +1 -0
- package/dist/pi/tui/fuzzy.js +109 -0
- package/dist/pi/tui/index.js +31 -0
- package/dist/pi/tui/keybindings.js +173 -0
- package/dist/pi/tui/keys.js +1172 -0
- package/dist/pi/tui/kill-ring.js +43 -0
- package/dist/pi/tui/stdin-buffer.js +360 -0
- package/dist/pi/tui/terminal-image.js +335 -0
- package/dist/pi/tui/terminal.js +324 -0
- package/dist/pi/tui/tui.js +1076 -0
- package/dist/pi/tui/undo-stack.js +24 -0
- package/dist/pi/tui/utils.js +1016 -0
- package/dist/relay/dispatcher.js +30 -0
- package/dist/server/handlers/queue.js +52 -0
- package/dist/server/pi-bridge.js +9 -1
- package/dist/server/session-stream.js +76 -111
- package/dist/server/storage.js +154 -2
- package/dist/server/title-generator.js +14 -153
- package/package.json +24 -6
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SettingsManager } from "
|
|
1
|
+
import { SettingsManager } from "../../pi/coding-agent/index.js";
|
|
2
2
|
import { getMemoryState, rawTokensSinceLastBound, rawTokensSinceLastCompaction, } from "../branch.js";
|
|
3
3
|
import { observationPoolTokens as estimateObservationPoolTokens } from "../compaction.js";
|
|
4
4
|
import { countByRelevance, formatRelevanceHistogram } from "../relevance.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { agentLoop } from "
|
|
2
|
-
import { Type } from "
|
|
1
|
+
import { agentLoop } from "../pi/agent-core/index.js";
|
|
2
|
+
import { Type } from "../pi/ai/index.js";
|
|
3
3
|
import { debugLog, isDebugLogEnabled } from "./debug-log.js";
|
|
4
4
|
import { hashId } from "./ids.js";
|
|
5
5
|
import { AGENT_LOOP_MAX_TOKENS, boundedMaxTokens } from "./model-budget.js";
|
package/dist/memory/config.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import { getAgentDir } from "
|
|
3
|
+
import { getAgentDir } from "../pi/coding-agent/index.js";
|
|
4
4
|
export const DEFAULTS = {
|
|
5
5
|
observationThresholdTokens: 1_000,
|
|
6
6
|
compactionThresholdTokens: 50_000,
|
package/dist/memory/debug-log.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
2
|
import { existsSync, mkdirSync, renameSync, statSync, unlinkSync, appendFileSync } from "node:fs";
|
|
3
3
|
import { dirname, join } from "node:path";
|
|
4
|
-
import { getAgentDir } from "
|
|
4
|
+
import { getAgentDir } from "../pi/coding-agent/index.js";
|
|
5
5
|
export const DEBUG_LOG_MAX_BYTES = 10 * 1024 * 1024;
|
|
6
6
|
export const DEBUG_LOG_RELATIVE_PATH = join("observational-memory", "debug.ndjson");
|
|
7
7
|
const storage = new AsyncLocalStorage();
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { debugLog, withDebugLogContext } from "../debug-log.js";
|
|
2
2
|
import { resolveTurnLimits } from "../config.js";
|
|
3
|
+
import { getProjectObsStore } from "../project-observations-store.js";
|
|
3
4
|
import { collectObservationsByCoverage, findLastCompactionIndex, gapRawEntries, getMemoryState, } from "../branch.js";
|
|
4
5
|
import { coverageTagCounts, migrateLegacyReflections, observationPoolTokens, renderSummary, runPruner, runReflector, } from "../compaction.js";
|
|
5
6
|
import { observationsToPromptLines, runObserver } from "../observer.js";
|
|
@@ -188,6 +189,8 @@ export function registerCompactionHook(pi, runtime) {
|
|
|
188
189
|
};
|
|
189
190
|
if (hasUI)
|
|
190
191
|
ui?.notify(`Observational memory: no new observations — carrying forward ${memoryState.committedObs.length} observation${memoryState.committedObs.length === 1 ? "" : "s"}, ${workingReflections.length} reflection${workingReflections.length === 1 ? "" : "s"}`, "info");
|
|
192
|
+
// Promote reflections as project observations (cross-session durable memory).
|
|
193
|
+
persistProjectObservations(ctx, workingReflections);
|
|
191
194
|
return {
|
|
192
195
|
compaction: {
|
|
193
196
|
summary,
|
|
@@ -274,6 +277,8 @@ export function registerCompactionHook(pi, runtime) {
|
|
|
274
277
|
});
|
|
275
278
|
if (hasUI)
|
|
276
279
|
ui?.notify(`Observational memory: compaction assembled — ${finalObservations.length} observation${finalObservations.length === 1 ? "" : "s"}, ${finalReflections.length} reflection${finalReflections.length === 1 ? "" : "s"}`, "info");
|
|
280
|
+
// Promote reflections as project observations (cross-session durable memory).
|
|
281
|
+
persistProjectObservations(ctx, finalReflections);
|
|
277
282
|
return {
|
|
278
283
|
compaction: {
|
|
279
284
|
summary,
|
|
@@ -288,4 +293,28 @@ export function registerCompactionHook(pi, runtime) {
|
|
|
288
293
|
runtime.compactHookInFlight = false;
|
|
289
294
|
}
|
|
290
295
|
});
|
|
296
|
+
function persistProjectObservations(ctx, reflections) {
|
|
297
|
+
const store = getProjectObsStore();
|
|
298
|
+
if (!store)
|
|
299
|
+
return; // Not available in standalone pi mode.
|
|
300
|
+
const projectId = store.getProjectByCwd(ctx.cwd);
|
|
301
|
+
if (!projectId)
|
|
302
|
+
return; // No project registered for this cwd.
|
|
303
|
+
const sessionId = ctx.sessionManager.getSessionId?.();
|
|
304
|
+
if (!sessionId)
|
|
305
|
+
return;
|
|
306
|
+
if (reflections.length === 0)
|
|
307
|
+
return;
|
|
308
|
+
const projectObs = reflections.map((r) => ({
|
|
309
|
+
id: typeof r === "string" ? r : r.id ?? r.content.slice(0, 64),
|
|
310
|
+
content: typeof r === "string" ? r : r.content,
|
|
311
|
+
relevance: "high",
|
|
312
|
+
}));
|
|
313
|
+
store.insertProjectObservations(projectId, sessionId, projectObs, Date.now());
|
|
314
|
+
debugLog("compaction.project_obs", {
|
|
315
|
+
count: projectObs.length,
|
|
316
|
+
projectId,
|
|
317
|
+
sessionId,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
291
320
|
}
|
package/dist/memory/index.js
CHANGED
|
@@ -5,6 +5,7 @@ import { registerCompactionTrigger } from "./hooks/compaction-trigger.js";
|
|
|
5
5
|
import { registerObserverTrigger } from "./hooks/observer-trigger.js";
|
|
6
6
|
import { Runtime } from "./runtime.js";
|
|
7
7
|
import { registerRecallTool } from "./tools/recall-observation.js";
|
|
8
|
+
import { registerReadProjectObservationsTool } from "./tools/read-project-observations.js";
|
|
8
9
|
export default function observationalMemory(pi) {
|
|
9
10
|
const runtime = new Runtime();
|
|
10
11
|
// Log extension load so we can confirm it's running in serve mode.
|
|
@@ -15,4 +16,5 @@ export default function observationalMemory(pi) {
|
|
|
15
16
|
registerStatusCommand(pi, runtime);
|
|
16
17
|
registerViewCommand(pi, runtime);
|
|
17
18
|
registerRecallTool(pi);
|
|
19
|
+
registerReadProjectObservationsTool(pi);
|
|
18
20
|
}
|
package/dist/memory/observer.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { agentLoop } from "
|
|
2
|
-
import { Type } from "
|
|
1
|
+
import { agentLoop } from "../pi/agent-core/index.js";
|
|
2
|
+
import { Type } from "../pi/ai/index.js";
|
|
3
3
|
import { hashId } from "./ids.js";
|
|
4
4
|
import { AGENT_LOOP_MAX_TOKENS, boundedMaxTokens } from "./model-budget.js";
|
|
5
5
|
import { OBSERVER_SYSTEM } from "./prompts.js";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module-level singleton that bridges the server's SessionStore into the
|
|
3
|
+
* memory extension so the `read_project_observations` tool can query
|
|
4
|
+
* cross-session observations.
|
|
5
|
+
*
|
|
6
|
+
* Set once by the SessionStreamManager at startup. Read by tools at runtime.
|
|
7
|
+
*/
|
|
8
|
+
let _store = null;
|
|
9
|
+
export function setProjectObsStore(store) {
|
|
10
|
+
_store = store;
|
|
11
|
+
}
|
|
12
|
+
export function getProjectObsStore() {
|
|
13
|
+
return _store;
|
|
14
|
+
}
|
package/dist/memory/tokens.js
CHANGED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Type } from "../../pi/ai/index.js";
|
|
2
|
+
import { defineTool } from "../../pi/coding-agent/index.js";
|
|
3
|
+
import { getProjectObsStore } from "../project-observations-store.js";
|
|
4
|
+
export const READ_PROJECT_OBSERVATIONS_TOOL_NAME = "read_project_observations";
|
|
5
|
+
export const readProjectObservationsTool = defineTool({
|
|
6
|
+
name: READ_PROJECT_OBSERVATIONS_TOOL_NAME,
|
|
7
|
+
label: "Search project observations",
|
|
8
|
+
description: "Search all past observations across ALL sessions in this project. " +
|
|
9
|
+
"Use this when you need to recall project conventions, past decisions, " +
|
|
10
|
+
"file locations, or user preferences before editing or creating files. " +
|
|
11
|
+
"Uses simple substring matching — be specific with your query terms. " +
|
|
12
|
+
"Returns up to 20 most recent matching observations with relevance tags.",
|
|
13
|
+
promptSnippet: "Use read_project_observations(<query>) to search past observations across ALL sessions in this project.",
|
|
14
|
+
promptGuidelines: [
|
|
15
|
+
"Use read_project_observations before creating new files to find conventions for that file kind.",
|
|
16
|
+
"Use read_project_observations before editing a file to find past context about that file or its directory.",
|
|
17
|
+
"Be specific: search for file paths, technology names, or pattern keywords.",
|
|
18
|
+
"Do not use for broad topic searches — keep queries narrow for relevant results.",
|
|
19
|
+
"Results include relevance tags (critical/high/medium/low) to help you prioritize.",
|
|
20
|
+
],
|
|
21
|
+
parameters: Type.Object({
|
|
22
|
+
query: Type.String({
|
|
23
|
+
minLength: 1,
|
|
24
|
+
description: "Substring to search for in past observation content. " +
|
|
25
|
+
"Use file paths (e.g. 'src/auth/middleware'), technology names, " +
|
|
26
|
+
"or pattern keywords (e.g. 'convention', 'api route').",
|
|
27
|
+
}),
|
|
28
|
+
}),
|
|
29
|
+
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
30
|
+
const query = params.query.trim();
|
|
31
|
+
if (!query) {
|
|
32
|
+
const message = "Query must be a non-empty string.";
|
|
33
|
+
return {
|
|
34
|
+
content: [{ type: "text", text: message }],
|
|
35
|
+
details: { status: "empty_query", results: [], count: 0 },
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const store = getProjectObsStore();
|
|
39
|
+
if (!store) {
|
|
40
|
+
const message = "Project observations store is not available — " +
|
|
41
|
+
"this tool requires the spectral server (spectral serve).";
|
|
42
|
+
return {
|
|
43
|
+
content: [{ type: "text", text: message }],
|
|
44
|
+
details: { status: "store_unavailable", results: [], count: 0 },
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const projectId = store.getProjectByCwd(ctx.cwd);
|
|
48
|
+
if (!projectId) {
|
|
49
|
+
const message = `No project found for current working directory: ${ctx.cwd}`;
|
|
50
|
+
return {
|
|
51
|
+
content: [{ type: "text", text: message }],
|
|
52
|
+
details: { status: "no_project", results: [], count: 0 },
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const results = store.searchProjectObservations(projectId, query);
|
|
56
|
+
if (results.length === 0) {
|
|
57
|
+
const message = `No past observations found matching "${query}" in this project.`;
|
|
58
|
+
return {
|
|
59
|
+
content: [{ type: "text", text: message }],
|
|
60
|
+
details: { status: "no_results", query, results: [], count: 0 },
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const lines = results.map((r) => `[${r.relevance}] ${r.content}`);
|
|
64
|
+
const text = `Found ${results.length} past observation(s) matching "${query}" in this project:\n\n${lines.join("\n")}`;
|
|
65
|
+
return {
|
|
66
|
+
content: [{ type: "text", text }],
|
|
67
|
+
details: {
|
|
68
|
+
status: "ok",
|
|
69
|
+
query,
|
|
70
|
+
results: results.map((r) => ({
|
|
71
|
+
content: r.content,
|
|
72
|
+
relevance: r.relevance,
|
|
73
|
+
sessionId: r.sessionId,
|
|
74
|
+
})),
|
|
75
|
+
count: results.length,
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
export function registerReadProjectObservationsTool(pi) {
|
|
81
|
+
pi.registerTool(readProjectObservationsTool);
|
|
82
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Type } from "
|
|
2
|
-
import { defineTool } from "
|
|
1
|
+
import { Type } from "../../pi/ai/index.js";
|
|
2
|
+
import { defineTool } from "../../pi/coding-agent/index.js";
|
|
3
3
|
import { recallMemorySources, } from "../branch.js";
|
|
4
4
|
import { renderRecallSourceEntries, renderRecallSourceEntry } from "../serialize.js";
|
|
5
5
|
import { estimateEntryTokens } from "../tokens.js";
|