Ctrl K
ComunidadGuías…

packages/openclaw-plugin/index.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
/**
 * @byte5ai/palaia — palaia Memory Backend for OpenClaw
 *
 * Plugin entry point. Loaded by OpenClaw via jiti (no build step needed).
 *
 * Registers:
 * - Tools: memory_search, memory_get, memory_write
 * - MemoryPromptSection: Guided tool usage hints
 * - Session hooks (always): session_start, session_end, before_reset,
 *   llm_input, llm_output, after_tool_call, subagent_spawning, subagent_ended
 * - ContextEngine (modern) OR legacy hooks (before_prompt_build, agent_end,
 *   message_received, message_sending)
 *
 * v3.0 Features:
 * - Session continuity: Auto-briefing on session start / LLM switch
 * - Session summaries: Auto-saved on session end / reset
 * - Tool observations: Tracked via after_tool_call
 * - Progressive disclosure: Compact mode for large memory stores
 * - Privacy markers: <private> blocks excluded from capture
 * - Recency boost: Fresh memories ranked higher
 *
 * Activation:
 *   plugins: { slots: { memory: "palaia" } }
 */

import { resolveConfig, type PalaiaPluginConfig } from "./src/config.js";
import { registerTools } from "./src/tools.js";
import { registerHooks } from "./src/hooks/index.js";
import { registerSessionHooks } from "./src/hooks/session.js";
import { createPalaiaContextEngine } from "./src/context-engine.js";
import type { OpenClawPluginApi, OpenClawPluginEntry } from "./src/types.js";

// Plugin entry point compatible with OpenClaw plugin-sdk definePluginEntry
const palaiaPlugin: OpenClawPluginEntry = {
  id: "palaia",
  name: "palaia Memory",
  register(api: OpenClawPluginApi) {
    // Issue #66: Plugin config is resolved GLOBALLY via api.pluginConfig.
    // OpenClaw does NOT provide per-agent config resolution — all agents share the same
    // plugin config from openclaw.json → plugins.entries.palaia.config.
    // See: https://github.com/byte5ai/palaia/issues/66
    const rawConfig = api.pluginConfig as
      | Partial<PalaiaPluginConfig>
      | undefined;
    const config = resolveConfig(rawConfig);

    // If workspace not set, use agent workspace from context
    if (!config.workspace && api.workspace) {
      config.workspace = typeof api.workspace === "string"
        ? api.workspace
        : api.workspace.dir;
    }

    // Register agent tools (memory_search, memory_get, memory_write)
    registerTools(api, config);

    // Register memory prompt guidance for agents.
    // Uses the v2026.5.7 registerMemoryCapability API when available;
    // falls back to the deprecated registerMemoryPromptSection for older hosts.
    const memoryPromptBuilder = ({ availableTools }: { availableTools: Set<string>; citationsMode?: string }) => {
      const lines: string[] = [];
      if (availableTools.has("memory_search")) {
        lines.push("Use `memory_search` to find relevant memories by semantic query.");
      }
      if (availableTools.has("memory_get")) {
        lines.push("Use `memory_get <id>` to retrieve full memory details by ID.");
      }
      if (availableTools.has("memory_write")) {
        lines.push("Use `memory_write` for processes/SOPs and tasks only — conversation knowledge is auto-captured.");
      }
      return lines;
    };

    if (api.registerMemoryCapability) {
      api.registerMemoryCapability("palaia", { promptBuilder: memoryPromptBuilder });
    } else if (api.registerMemoryPromptSection) {
      api.registerMemoryPromptSection(memoryPromptBuilder);
    }

    // Session lifecycle hooks are always registered (session_start, session_end,
    // before_reset, llm_input, llm_output, after_tool_call).
    // These work independently of the ContextEngine vs legacy hooks choice.
    registerSessionHooks(api, config);

    // Register ContextEngine when available, otherwise use legacy hooks.
    // The factory receives ContextEngineFactoryContext (v2026.5.7+) which
    // provides workspaceDir / agentDir for reliable workspace resolution.
    if (api.registerContextEngine) {
      api.registerContextEngine("palaia", (ctx) => {
        const effectiveWorkspace =
          ctx?.workspaceDir ||
          config.workspace ||
          (typeof api.workspace === "string" ? api.workspace : api.workspace?.dir);
        return createPalaiaContextEngine(api, { ...config, workspace: effectiveWorkspace });
      });
    } else {
      registerHooks(api, config);  // Legacy fallback
    }
  },
};

export default palaiaPlugin;