Files
Codeman/src/types/intent.ts
T
Codeman maintainer 161f1da2eb feat: Read My Mind phase 1, per-case intent profiles (capture + API + skill)
Per-case profiles of user intent (docs/readmymind-plan.md): user-stated goals
plus the user's recently submitted prompts, captured from the Claude session
transcript behind the new synced readMyMindEnabled setting (default OFF).

- intent-store.ts: keyed by owner + realpath(workingDir), FIFO/size caps,
  consecutive-dupe collapse, atomic 0600 writes to ~/.codeman/intents.json
- transcript-watcher.ts: new transcript:user_prompt event for typed user turns
  (tool_result-only entries stay silent); capture wiring in server.ts is
  claude-only and gated on the setting per event
- readmymind-routes.ts: GET/PUT/DELETE /api/sessions/:id/intent, ownership
  via findSessionOrFail, strict Zod schema
- agent skill: SKILL.md recipe + endpoints.md rows so agents can read and
  record intent (PUT replaces: read + merge; never delete unprompted)
- groundwork for the phase-2 predictor button; nothing is ever auto-sent

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 18:03:13 +02:00

32 lines
1.1 KiB
TypeScript

/**
* @fileoverview Read My Mind intent types.
*
* An intent profile is per CASE (owner + workingDir), not per session:
* intentions outlive `/clear`, respawn cycles, and individual sessions.
* See `docs/readmymind-plan.md`.
*/
/** One captured user prompt, as it appeared in the session transcript. */
export interface IntentPromptEntry {
/** Capture time (ms epoch). */
ts: number;
/** Codeman session the prompt was sent in. */
sessionId: string;
/** The prompt text, sanitized and bounded. */
text: string;
}
/** Per-case profile of what the user is trying to accomplish. */
export interface IntentProfile {
/** Stable key: sha256(owner + ':' + realpath(workingDir)), first 16 hex chars. */
key: string;
/** The case working directory the profile belongs to (realpath-resolved). */
workingDir: string;
/** Last mutation (ms epoch). 0 for a never-persisted empty profile. */
updatedAt: number;
/** User/agent-stated goals, freeform markdown, bounded. */
goals: string;
/** Most recent captured prompts, oldest first, FIFO-capped. */
recentPrompts: IntentPromptEntry[];
}