The fixture chat panel is now a working agent. Ask Reginald a question and it consults the real project through a tool loop, then answers in grounded prose. Read-only v0 — writes still go through the propose-approve controls. core (@commitea/core/agent): - chat-client: OpenAI-wire chat completions over an injected fetch (same seam as gitea). Points at any OpenAI-compatible endpoint (LM Studio/Ollama/OpenAI). - model-router: small model for prose + the read tool; big model reserved for later decomposition (pickModel). - agent-loop: runAgentTurn drives call→tool→result→call until prose (or a step budget), recording each tool step. Injected complete + execute → fully testable. - query-project: the single read tool's engine — compact focus/board/calibration/ issue/search views built from scheduler + lifecycle + calibration; unbuilt views return a notImplemented marker (never fabricated). The model reports, never computes. - agent-tools: query_project declaration + Reginald's system prompt. app: - main model bridge (model:status, model:chat) runs the loop; query_project reconciles the repo and builds the view. Model traffic stays in main (token/CSP). gitea.ts refactored to share getGiteaClient + reconcileSnapshot. - preload + global.d.ts expose the model bridge; useChat drives the panel — real agent turn when a model is configured, scripted fixture reply otherwise (so fixture e2e is unchanged). A subtle "consulted the project" activity line. Model config (env, defaults to LM Studio on :1234): COMMITEA_MODEL_URL / _SMALL (google/gemma-4-e4b) / _BIG (qwen/qwen3.6-35b-a3b). COMMITEA_E2E=1 keeps it unconfigured so the panel stays scripted. Verified: 88 core tests green (14 agent: client parse, loop tool/error/budget, all views) + a gated live integration test. Desktop typecheck clean, 14 fixture e2e green. Gated live e2e drives the real app against gitea + gemma-4-e4b: asked "what now?", Reginald called query_project and answered "focus is on issue #2" (the real scheduler pick). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
91 lines
2.5 KiB
TypeScript
91 lines
2.5 KiB
TypeScript
export {
|
|
ESTIMATE_LABELS,
|
|
PRIORITY_LABELS,
|
|
HARD_DEADLINE_LABEL,
|
|
extractLabelFacts,
|
|
isCommiteaLabel,
|
|
parseEstimateLabel,
|
|
parsePriorityLabel,
|
|
} from './labels/label-schema.js'
|
|
export type { EstimateLabel, LabelFacts, PriorityLabel } from './labels/label-schema.js'
|
|
|
|
export { createGiteaClient, normalizeIssue, normalizeMilestone, normalizeTimeline } from './gitea/client.js'
|
|
export type { GiteaClient, ListIssuesOptions } from './gitea/client.js'
|
|
export { GiteaApiError } from './gitea/types.js'
|
|
export type {
|
|
FetchLike,
|
|
GiteaConfig,
|
|
GiteaHttpResponse,
|
|
GiteaIssue,
|
|
GiteaLabel,
|
|
GiteaMilestone,
|
|
GiteaMilestoneRef,
|
|
GiteaRequestInit,
|
|
} from './gitea/types.js'
|
|
|
|
export { describeChange, planIssueChange } from './changes/apply-changes-v0.js'
|
|
export type { IssueChange, LabelPlan } from './changes/apply-changes-v0.js'
|
|
|
|
export {
|
|
inferColumnV0,
|
|
inferLifecycle,
|
|
LIFECYCLE_COLUMNS,
|
|
workingDaysBetween,
|
|
} from './lifecycle/lifecycle-v0.js'
|
|
export type {
|
|
LifecycleColumn,
|
|
LifecycleEvent,
|
|
LifecycleEventType,
|
|
LifecycleInference,
|
|
LifecycleStages,
|
|
} from './lifecycle/lifecycle-v0.js'
|
|
|
|
export { DEFAULT_ESTIMATE_DAYS, schedule, selectFocus } from './scheduler/scheduler-v0.js'
|
|
export type {
|
|
DependencyEdge,
|
|
Focus,
|
|
SchedulableIssue,
|
|
ScheduledItem,
|
|
SchedulePlan,
|
|
} from './scheduler/scheduler-v0.js'
|
|
|
|
export {
|
|
COLD_START_PRIORS,
|
|
durationParams,
|
|
forecast,
|
|
nearestBucket,
|
|
PRIOR_BUCKETS,
|
|
priorForEstimate,
|
|
} from './forecast/forecast-v0.js'
|
|
export type {
|
|
BurnUpPoint,
|
|
DurationModel,
|
|
Forecast,
|
|
ForecastOptions,
|
|
LognormalPrior,
|
|
} from './forecast/forecast-v0.js'
|
|
|
|
export {
|
|
CALIBRATION_BUCKET_FLOOR,
|
|
calibrationSamples,
|
|
COLD_START_THRESHOLD,
|
|
fitCalibration,
|
|
toDurationModel,
|
|
} from './calibration/calibration-v0.js'
|
|
export type {
|
|
BucketFit,
|
|
CalibrationModel,
|
|
CalibrationSample,
|
|
PersonBias,
|
|
} from './calibration/calibration-v0.js'
|
|
|
|
export { createChatClient } from './agent/chat-client.js'
|
|
export type { ChatClient, ChatMessage, CompletionResult, ModelConfig, ToolCall, ToolDecl } from './agent/chat-client.js'
|
|
export { pickModel } from './agent/model-router.js'
|
|
export type { ModelRouter, TaskKind } from './agent/model-router.js'
|
|
export { runAgentTurn } from './agent/agent-loop.js'
|
|
export type { AgentStep, AgentTurn, ToolExecutor } from './agent/agent-loop.js'
|
|
export { QUERY_PROJECT_TOOL, REGINALD_SYSTEM, REGINALD_TOOLS } from './agent/agent-tools.js'
|
|
export { buildProjectView } from './agent/query-project.js'
|
|
export type { ProjectSnapshot, ProjectView, QueryFilters } from './agent/query-project.js'
|