@stackmemoryai/stackmemory
Version:
Project-scoped memory for AI coding tools. Durable context across sessions with MCP integration, frames, smart retrieval, Claude Code skills, and automatic hooks.
131 lines (130 loc) • 4.3 kB
JavaScript
import { fileURLToPath as __fileURLToPath } from 'url';
import { dirname as __pathDirname } from 'path';
const __filename = __fileURLToPath(import.meta.url);
const __dirname = __pathDirname(__filename);
import { z } from "zod";
import { ValidationError, ErrorCode } from "../errors/index.js";
const StackPermissionsSchema = z.object({
canRead: z.boolean(),
canWrite: z.boolean(),
canHandoff: z.boolean(),
canMerge: z.boolean(),
canAdminister: z.boolean()
});
const stackIdSchema = z.string().min(1).max(200);
const userIdSchema = z.string().min(1).max(100);
const frameIdSchema = z.string().min(1).max(100);
const teamIdSchema = z.string().min(1).max(100);
const CreateSharedStackSchema = z.object({
teamId: teamIdSchema,
name: z.string().min(1).max(200),
ownerId: userIdSchema,
permissions: StackPermissionsSchema.optional()
});
const SwitchStackSchema = z.object({
stackId: stackIdSchema
});
const FrameContextSchema = z.object({
totalFrames: z.number().min(1).max(1e4),
frameTypes: z.array(z.string()).min(1).max(50),
estimatedSize: z.number().min(0).max(1e6),
// Max 1MB
dependencies: z.array(z.string()).max(100)
});
const BusinessContextSchema = z.object({
milestone: z.string().max(100).optional(),
priority: z.enum(["low", "medium", "high", "critical"]).optional(),
deadline: z.date().optional(),
stakeholders: z.array(userIdSchema).max(20).optional()
});
const HandoffRequestSchema = z.object({
initiatedAt: z.date(),
initiatorId: userIdSchema,
frameContext: FrameContextSchema,
businessContext: BusinessContextSchema.optional()
});
const InitiateHandoffSchema = z.object({
targetStackId: stackIdSchema,
frameIds: z.array(frameIdSchema).min(1).max(1e3),
handoffRequest: HandoffRequestSchema,
reviewerId: userIdSchema.optional(),
description: z.string().max(1e3).optional()
});
const HandoffApprovalSchema = z.object({
reviewerId: userIdSchema,
decision: z.enum(["approved", "rejected", "needs_changes"]),
feedback: z.string().max(2e3).optional(),
suggestedChanges: z.array(
z.object({
frameId: frameIdSchema,
suggestion: z.string().max(500),
reason: z.string().max(300).optional()
})
).max(50).optional()
});
const ConflictResolutionSchema = z.object({
strategy: z.enum(["source_wins", "target_wins", "merge_both", "manual"]),
resolvedBy: userIdSchema,
notes: z.string().max(1e3).optional()
});
const MergePolicyRuleSchema = z.object({
condition: z.string().min(1).max(500),
action: z.enum(["source_wins", "target_wins", "merge_both", "manual_review"]),
priority: z.number().min(1).max(10)
});
const CreateMergePolicySchema = z.object({
name: z.string().min(1).max(100),
description: z.string().max(500).optional(),
rules: z.array(MergePolicyRuleSchema).min(1).max(20),
autoApplyThreshold: z.enum(["low", "medium", "high"])
});
const StartMergeSessionSchema = z.object({
sourceStackId: stackIdSchema,
targetStackId: stackIdSchema,
frameIds: z.array(frameIdSchema).max(1e3).optional(),
policyName: z.string().max(100).optional()
});
function validateInput(schema, input) {
try {
return schema.parse(input);
} catch (error) {
if (error instanceof z.ZodError) {
const details = error.errors.map((e) => `${e.path.join(".")}: ${e.message}`).join(", ");
throw new ValidationError(
`Validation failed: ${details}`,
ErrorCode.VALIDATION_FAILED,
{ errors: error.errors }
);
}
throw error;
}
}
function validateInputSafe(schema, input) {
try {
const data = schema.parse(input);
return { success: true, data };
} catch (error) {
if (error instanceof z.ZodError) {
const details = error.errors.map((e) => `${e.path.join(".")}: ${e.message}`).join(", ");
return { success: false, error: `Validation failed: ${details}` };
}
return { success: false, error: "Unknown validation error" };
}
}
export {
BusinessContextSchema,
ConflictResolutionSchema,
CreateMergePolicySchema,
CreateSharedStackSchema,
FrameContextSchema,
HandoffApprovalSchema,
HandoffRequestSchema,
InitiateHandoffSchema,
MergePolicyRuleSchema,
StackPermissionsSchema,
StartMergeSessionSchema,
SwitchStackSchema,
validateInput,
validateInputSafe
};
//# sourceMappingURL=validation.js.map