@open330/oac 2026.222.1 → 2026.222.2

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.
@@ -234,6 +234,11 @@ var AnalyzeSchema = z.object({
234
234
  /** Directory for persisted context, relative to repo root. */
235
235
  contextDir: z.string().min(1).default(".oac/context")
236
236
  }).strict().default({});
237
+ var ContextPolicySchema = z.object({
238
+ mode: z.enum(["off", "warn", "enforce"]).default("off"),
239
+ requiredGlobs: z.array(z.string().min(1)).default([".context/plans/**/*.md"]),
240
+ maxAckItems: z.number().int().positive().default(3)
241
+ }).strict().default({});
237
242
  var OacConfigSchema = z.object({
238
243
  repos: z.array(RepoTargetSchema).default([]),
239
244
  provider: ProviderSchema,
@@ -243,7 +248,8 @@ var OacConfigSchema = z.object({
243
248
  completion: CompletionSchema,
244
249
  tracking: TrackingSchema,
245
250
  dashboard: DashboardSchema,
246
- analyze: AnalyzeSchema
251
+ analyze: AnalyzeSchema,
252
+ context: ContextPolicySchema
247
253
  }).strict();
248
254
  var OacConfig = OacConfigSchema;
249
255
  function defineConfig(config) {
@@ -347,6 +353,7 @@ export {
347
353
  TrackingSchema,
348
354
  DashboardSchema,
349
355
  AnalyzeSchema,
356
+ ContextPolicySchema,
350
357
  OacConfigSchema,
351
358
  OacConfig,
352
359
  defineConfig,
@@ -355,4 +362,4 @@ export {
355
362
  createEventBus,
356
363
  UNLIMITED_BUDGET
357
364
  };
358
- //# sourceMappingURL=chunk-7C7SC4TZ.js.map
365
+ //# sourceMappingURL=chunk-I3TKNT4M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/config.ts","../src/core/errors.ts","../src/core/event-bus.ts","../src/core/types.ts"],"sourcesContent":["import { z } from \"zod\";\n\nimport { configError } from \"./errors.js\";\n\nconst ENV_VAR_PATTERN = /\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g;\n\nconst DEFAULT_DISCOVERY_EXCLUDE = [\n \"node_modules\",\n \"dist\",\n \"build\",\n \".git\",\n \"*.min.js\",\n \"vendor/\",\n] as const;\n\nexport const RepoTargetSchema = z.union([\n z.string().min(1),\n z\n .object({\n name: z.string().min(1),\n branch: z.string().min(1).optional(),\n })\n .strict(),\n]);\n\nexport const ProviderSchema = z\n .object({\n id: z.string().min(1).default(\"claude-code\"),\n options: z.record(z.string(), z.unknown()).default({}),\n })\n .strict()\n .default({});\n\nexport const BudgetSchema = z\n .object({\n totalTokens: z.number().int().positive().default(100_000),\n reservePercent: z.number().min(0).max(1).default(0.1),\n estimationPadding: z.number().positive().default(1.2),\n })\n .strict()\n .default({});\n\nexport const DiscoveryScannersSchema = z\n .object({\n lint: z.boolean().default(true),\n todo: z.boolean().default(true),\n testGap: z.boolean().default(true),\n deadCode: z.boolean().default(false),\n githubIssues: z.boolean().default(true),\n })\n .strict()\n .default({});\n\nexport const DiscoverySchema = z\n .object({\n scanners: DiscoveryScannersSchema,\n issueLabels: z.array(z.string().min(1)).default([\"good-first-issue\", \"help-wanted\", \"bug\"]),\n minPriority: z.number().int().min(0).max(100).default(20),\n maxTasks: z.number().int().positive().default(50),\n customScanners: z.array(z.string().min(1)).default([]),\n exclude: z.array(z.string().min(1)).default([...DEFAULT_DISCOVERY_EXCLUDE]),\n })\n .strict()\n .default({});\n\nexport const ValidationSchema = z\n .object({\n lint: z.boolean().default(true),\n test: z.boolean().default(true),\n typeCheck: z.boolean().default(true),\n maxDiffLines: z.number().int().positive().default(500),\n })\n .strict()\n .default({});\n\nexport const PrSchema = z\n .object({\n draft: z.boolean().default(false),\n labels: z.array(z.string().min(1)).default([\"oac-contribution\"]),\n reviewers: z.array(z.string().min(1)).default([]),\n assignees: z.array(z.string().min(1)).default([]),\n })\n .strict()\n .default({});\n\nexport const ExecutionSchema = z\n .object({\n concurrency: z.number().int().positive().default(2),\n taskTimeout: z.number().int().positive().default(300),\n maxRetries: z.number().int().min(0).default(2),\n mode: z.enum([\"new-pr\", \"update-pr\", \"direct-commit\"]).default(\"new-pr\"),\n branchPattern: z.string().min(1).default(\"oac/{date}/{task}\"),\n validation: ValidationSchema,\n pr: PrSchema,\n })\n .strict()\n .default({});\n\nexport const LinearIntegrationSchema = z\n .object({\n enabled: z.boolean().default(false),\n apiKey: z.string().min(1).optional(),\n teamId: z.string().min(1).optional(),\n })\n .strict()\n .default({})\n .superRefine((value, ctx) => {\n if (value.enabled && !value.apiKey) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"apiKey\"],\n message: \"Linear integration is enabled but apiKey is missing\",\n });\n }\n if (value.enabled && !value.teamId) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"teamId\"],\n message: \"Linear integration is enabled but teamId is missing\",\n });\n }\n });\n\nexport const JiraIntegrationSchema = z\n .object({\n enabled: z.boolean().default(false),\n baseUrl: z.string().url().optional(),\n email: z.string().min(1).optional(),\n apiToken: z.string().min(1).optional(),\n projectKey: z.string().min(1).optional(),\n })\n .strict()\n .default({})\n .superRefine((value, ctx) => {\n if (!value.enabled) {\n return;\n }\n\n if (!value.baseUrl) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"baseUrl\"],\n message: \"Jira integration is enabled but baseUrl is missing\",\n });\n }\n if (!value.email) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"email\"],\n message: \"Jira integration is enabled but email is missing\",\n });\n }\n if (!value.apiToken) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"apiToken\"],\n message: \"Jira integration is enabled but apiToken is missing\",\n });\n }\n if (!value.projectKey) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"projectKey\"],\n message: \"Jira integration is enabled but projectKey is missing\",\n });\n }\n });\n\nexport const CompletionSchema = z\n .object({\n integrations: z\n .object({\n linear: LinearIntegrationSchema,\n jira: JiraIntegrationSchema,\n })\n .strict()\n .default({}),\n monitor: z\n .object({\n enabled: z.boolean().default(false),\n pollInterval: z.number().int().positive().default(300),\n autoRespondToReviews: z.boolean().default(false),\n autoDeleteBranch: z.boolean().default(true),\n })\n .strict()\n .default({}),\n })\n .strict()\n .default({});\n\nexport const TrackingSchema = z\n .object({\n directory: z.string().min(1).default(\".oac\"),\n autoCommit: z.boolean().default(false),\n gitTracked: z.boolean().default(true),\n })\n .strict()\n .default({});\n\nexport const DashboardSchema = z\n .object({\n port: z.number().int().min(1).max(65535).default(3141),\n openBrowser: z.boolean().default(true),\n })\n .strict()\n .default({});\n\nexport const AnalyzeSchema = z\n .object({\n /** Auto-run analysis before `oac run` if context is stale or missing. */\n autoAnalyze: z.boolean().default(true),\n /** Max age in ms before context is considered stale (default: 24h). */\n staleAfterMs: z.number().int().positive().default(86_400_000),\n /** Directory for persisted context, relative to repo root. */\n contextDir: z.string().min(1).default(\".oac/context\"),\n })\n .strict()\n .default({});\n\nexport const ContextPolicySchema = z\n .object({\n mode: z.enum([\"off\", \"warn\", \"enforce\"]).default(\"off\"),\n requiredGlobs: z.array(z.string().min(1)).default([\".context/plans/**/*.md\"]),\n maxAckItems: z.number().int().positive().default(3),\n })\n .strict()\n .default({});\n\nexport const OacConfigSchema = z\n .object({\n repos: z.array(RepoTargetSchema).default([]),\n provider: ProviderSchema,\n budget: BudgetSchema,\n discovery: DiscoverySchema,\n execution: ExecutionSchema,\n completion: CompletionSchema,\n tracking: TrackingSchema,\n dashboard: DashboardSchema,\n analyze: AnalyzeSchema,\n context: ContextPolicySchema,\n })\n .strict();\n\nexport const OacConfig = OacConfigSchema;\nexport type OacConfig = z.output<typeof OacConfigSchema>;\nexport type OacConfigInput = z.input<typeof OacConfigSchema>;\n\nexport interface LoadConfigOptions {\n env?: Record<string, string | undefined>;\n}\n\nexport function defineConfig(config: OacConfigInput): OacConfigInput {\n return config;\n}\n\nexport function interpolateEnvVars(\n value: string,\n env: Record<string, string | undefined> = getProcessEnv(),\n path: string[] = [],\n): string {\n return value.replaceAll(ENV_VAR_PATTERN, (_, variableName: string) => {\n const interpolated = env[variableName];\n if (interpolated !== undefined) {\n return interpolated;\n }\n\n throw configError(\n \"CONFIG_SECRET_MISSING\",\n `Environment variable ${variableName} is referenced in config but not set`,\n {\n context: {\n variableName,\n path: path.length > 0 ? path.join(\".\") : \"<root>\",\n },\n },\n );\n });\n}\n\nexport function loadConfig(config: unknown = {}, options: LoadConfigOptions = {}): OacConfig {\n const env = options.env ?? getProcessEnv();\n const interpolatedConfig = interpolateConfigEnvVars(config, env);\n const parsed = OacConfigSchema.safeParse(interpolatedConfig);\n\n if (parsed.success) {\n return parsed.data;\n }\n\n throw configError(\"CONFIG_INVALID\", \"Invalid OAC configuration\", {\n context: {\n issues: parsed.error.issues.map((issue) => ({\n code: issue.code,\n message: issue.message,\n path: issue.path.join(\".\"),\n })),\n },\n });\n}\n\nfunction interpolateConfigEnvVars(\n value: unknown,\n env: Record<string, string | undefined>,\n path: string[] = [],\n): unknown {\n if (typeof value === \"string\") {\n return interpolateEnvVars(value, env, path);\n }\n\n if (Array.isArray(value)) {\n return value.map((item, index) => interpolateConfigEnvVars(item, env, [...path, `${index}`]));\n }\n\n if (!isPlainObject(value)) {\n return value;\n }\n\n const interpolatedObject: Record<string, unknown> = {};\n\n for (const [key, nestedValue] of Object.entries(value)) {\n interpolatedObject[key] = interpolateConfigEnvVars(nestedValue, env, [...path, key]);\n }\n\n return interpolatedObject;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getProcessEnv(): Record<string, string | undefined> {\n const globalProcess = globalThis as {\n process?: { env?: Record<string, string | undefined> };\n };\n return globalProcess.process?.env ?? {};\n}\n","export type OacErrorSeverity = \"fatal\" | \"recoverable\" | \"warning\";\n\nexport const REPO_ERROR_CODES = [\n \"REPO_NOT_FOUND\",\n \"REPO_ARCHIVED\",\n \"REPO_NO_PERMISSION\",\n \"REPO_CLONE_FAILED\",\n] as const;\n\nexport const DISCOVERY_ERROR_CODES = [\n \"SCANNER_FAILED\",\n \"SCANNER_TIMEOUT\",\n \"NO_TASKS_FOUND\",\n] as const;\n\nexport const BUDGET_ERROR_CODES = [\"BUDGET_INSUFFICIENT\", \"TOKENIZER_UNAVAILABLE\"] as const;\n\nexport const EXECUTION_ERROR_CODES = [\n \"AGENT_NOT_AVAILABLE\",\n \"AGENT_EXECUTION_FAILED\",\n \"AGENT_TIMEOUT\",\n \"AGENT_OOM\",\n \"AGENT_TOKEN_LIMIT\",\n \"AGENT_RATE_LIMITED\",\n \"VALIDATION_LINT_FAILED\",\n \"VALIDATION_TEST_FAILED\",\n \"VALIDATION_DIFF_TOO_LARGE\",\n \"VALIDATION_FORBIDDEN_PATTERN\",\n] as const;\n\nexport const COMPLETION_ERROR_CODES = [\n \"PR_CREATION_FAILED\",\n \"PR_PUSH_REJECTED\",\n \"WEBHOOK_DELIVERY_FAILED\",\n] as const;\n\nexport const CONFIG_ERROR_CODES = [\"CONFIG_INVALID\", \"CONFIG_SECRET_MISSING\"] as const;\n\nexport const SYSTEM_ERROR_CODES = [\"NETWORK_ERROR\", \"DISK_SPACE_LOW\", \"GIT_LOCK_FAILED\"] as const;\n\nexport const OAC_ERROR_CODES = [\n ...REPO_ERROR_CODES,\n ...DISCOVERY_ERROR_CODES,\n ...BUDGET_ERROR_CODES,\n ...EXECUTION_ERROR_CODES,\n ...COMPLETION_ERROR_CODES,\n ...CONFIG_ERROR_CODES,\n ...SYSTEM_ERROR_CODES,\n] as const;\n\nexport type RepoErrorCode = (typeof REPO_ERROR_CODES)[number];\nexport type DiscoveryErrorCode = (typeof DISCOVERY_ERROR_CODES)[number];\nexport type BudgetErrorCode = (typeof BUDGET_ERROR_CODES)[number];\nexport type ExecutionErrorCode = (typeof EXECUTION_ERROR_CODES)[number];\nexport type CompletionErrorCode = (typeof COMPLETION_ERROR_CODES)[number];\nexport type ConfigErrorCode = (typeof CONFIG_ERROR_CODES)[number];\nexport type SystemErrorCode = (typeof SYSTEM_ERROR_CODES)[number];\nexport type OacErrorCode = (typeof OAC_ERROR_CODES)[number];\n\nexport interface OacErrorOptions {\n severity?: OacErrorSeverity;\n context?: Record<string, unknown>;\n cause?: unknown;\n}\n\nexport class OacError extends Error {\n public readonly code: OacErrorCode;\n public readonly severity: OacErrorSeverity;\n public readonly context?: Record<string, unknown>;\n public override readonly cause?: unknown;\n\n public constructor(\n message: string,\n code: OacErrorCode,\n severity: OacErrorSeverity,\n context?: Record<string, unknown>,\n cause?: unknown,\n ) {\n super(message);\n this.name = \"OacError\";\n this.code = code;\n this.severity = severity;\n this.context = context;\n this.cause = cause;\n }\n}\n\nfunction createError(\n code: OacErrorCode,\n message: string,\n defaultSeverity: OacErrorSeverity,\n options: OacErrorOptions = {},\n): OacError {\n return new OacError(\n message,\n code,\n options.severity ?? defaultSeverity,\n options.context,\n options.cause,\n );\n}\n\nexport function repoError(\n code: RepoErrorCode,\n message: string,\n options: OacErrorOptions = {},\n): OacError {\n return createError(code, message, \"fatal\", options);\n}\n\nexport function discoveryError(\n code: DiscoveryErrorCode,\n message: string,\n options: OacErrorOptions = {},\n): OacError {\n return createError(code, message, \"recoverable\", options);\n}\n\nexport function budgetError(\n code: BudgetErrorCode,\n message: string,\n options: OacErrorOptions = {},\n): OacError {\n return createError(code, message, \"recoverable\", options);\n}\n\nexport function executionError(\n code: ExecutionErrorCode,\n message: string,\n options: OacErrorOptions = {},\n): OacError {\n return createError(code, message, \"recoverable\", options);\n}\n\nexport function completionError(\n code: CompletionErrorCode,\n message: string,\n options: OacErrorOptions = {},\n): OacError {\n return createError(code, message, \"recoverable\", options);\n}\n\nexport function configError(\n code: ConfigErrorCode,\n message: string,\n options: OacErrorOptions = {},\n): OacError {\n return createError(code, message, \"fatal\", options);\n}\n","import { EventEmitter } from \"eventemitter3\";\n\nimport type { OacError } from \"./errors.js\";\nimport type { ExecutionResult, ResolvedRepo, RunSummary, Task, TokenEstimate } from \"./types.js\";\n\nexport interface OacEvents {\n \"repo:resolved\": { repo: ResolvedRepo };\n \"task:discovered\": { tasks: Task[] };\n \"task:selected\": { task: Task; reason: string };\n \"budget:estimated\": { task: Task; estimate: TokenEstimate };\n \"execution:started\": { jobId: string; task: Task; agent: string };\n \"execution:progress\": { jobId: string; tokensUsed: number; stage: string };\n \"execution:completed\": { jobId: string; result: ExecutionResult };\n \"execution:failed\": { jobId: string; error: OacError };\n \"pr:created\": { jobId: string; prUrl: string };\n \"pr:merged\": { jobId: string; prUrl: string };\n \"run:completed\": { summary: RunSummary };\n}\n\ntype OacEventArgs = {\n [K in keyof OacEvents]: [payload: OacEvents[K]];\n};\n\nexport type OacEventBus = EventEmitter<OacEventArgs>;\n\nexport function createEventBus(): OacEventBus {\n return new EventEmitter<OacEventArgs>();\n}\n","export type AgentProviderId = \"claude-code\" | \"codex\" | \"opencode\" | (string & {});\n\n/**\n * Sentinel value representing an unlimited token budget.\n * Uses MAX_SAFE_INTEGER (passes Number.isFinite() checks in budget planner).\n */\nexport const UNLIMITED_BUDGET = Number.MAX_SAFE_INTEGER;\n\nexport interface ResolvedRepo {\n fullName: string;\n owner: string;\n name: string;\n localPath: string;\n worktreePath: string;\n meta: {\n defaultBranch: string;\n language?: string;\n languages: Record<string, number>;\n size: number;\n stars: number;\n openIssuesCount: number;\n topics: string[];\n license?: string;\n isArchived: boolean;\n isFork: boolean;\n permissions: {\n admin: boolean;\n maintain: boolean;\n push: boolean;\n triage: boolean;\n pull: boolean;\n };\n };\n git: {\n headSha: string;\n remoteUrl: string;\n isShallowClone: boolean;\n };\n}\n\nexport type TaskSource = \"lint\" | \"todo\" | \"test-gap\" | \"dead-code\" | \"github-issue\" | \"custom\";\n\nexport type TaskComplexity = \"trivial\" | \"simple\" | \"moderate\" | \"complex\";\n\nexport type ExecutionMode = \"new-pr\" | \"update-pr\" | \"direct-commit\";\n\nexport interface Task {\n id: string;\n source: TaskSource;\n title: string;\n description: string;\n targetFiles: string[];\n priority: number;\n complexity: TaskComplexity;\n executionMode: ExecutionMode;\n linkedIssue?: {\n number: number;\n url: string;\n labels: string[];\n };\n metadata: Record<string, unknown>;\n discoveredAt: string;\n /** When this task belongs to an epic, the parent epic's id. */\n parentEpicId?: string;\n}\n\n// ── Epics ─────────────────────────────────────────────────────\n\nexport type EpicStatus = \"pending\" | \"in-progress\" | \"completed\" | \"skipped\";\n\n/**\n * An Epic groups related tasks that should be executed together in a single\n * agent session, producing one PR with coherent multi-file changes.\n */\nexport interface Epic {\n id: string;\n title: string;\n description: string;\n /** Module scope, e.g. \"budget\", \"discovery\", or \"root\" */\n scope: string;\n subtasks: Task[];\n /** Broader file set the agent should read for context */\n contextFiles: string[];\n status: EpicStatus;\n priority: number;\n estimatedTokens: number;\n createdAt: string;\n completedAt?: string;\n metadata: Record<string, unknown>;\n}\n\nexport interface TokenEstimate {\n taskId: string;\n providerId: AgentProviderId;\n contextTokens: number;\n promptTokens: number;\n expectedOutputTokens: number;\n totalEstimatedTokens: number;\n confidence: number;\n feasible: boolean;\n estimatedCostUsd?: number;\n}\n\nexport interface ExecutionPlan {\n totalBudget: number;\n selectedTasks: Array<{\n task: Task;\n estimate: TokenEstimate;\n cumulativeBudgetUsed: number;\n }>;\n deferredTasks: Array<{\n task: Task;\n estimate: TokenEstimate;\n reason: \"budget_exceeded\" | \"low_confidence\" | \"too_complex\";\n }>;\n reserveTokens: number;\n remainingTokens: number;\n}\n\nexport interface ContributionTask {\n taskId: string;\n title: string;\n source: TaskSource;\n complexity: TaskComplexity;\n status: \"success\" | \"partial\" | \"failed\";\n tokensUsed: number;\n duration: number;\n filesChanged: string[];\n pr?: {\n number: number;\n url: string;\n status: \"open\" | \"merged\" | \"closed\";\n };\n linkedIssue?: {\n number: number;\n url: string;\n };\n error?: string;\n}\n\nexport interface ContributionLog {\n version: \"1.0\";\n runId: string;\n timestamp: string;\n contributor: {\n githubUsername: string;\n email?: string;\n };\n repo: {\n fullName: string;\n headSha: string;\n defaultBranch: string;\n };\n budget: {\n provider: AgentProviderId;\n totalTokensBudgeted: number;\n totalTokensUsed: number;\n estimatedCostUsd?: number;\n };\n tasks: ContributionTask[];\n metrics: {\n tasksDiscovered: number;\n tasksAttempted: number;\n tasksSucceeded: number;\n tasksFailed: number;\n totalDuration: number;\n totalFilesChanged: number;\n totalLinesAdded: number;\n totalLinesRemoved: number;\n };\n}\n\nexport interface ExecutionResult {\n success: boolean;\n exitCode: number;\n totalTokensUsed: number;\n filesChanged: string[];\n duration: number;\n error?: string;\n}\n\nexport interface RunSummary {\n runId: string;\n repo: string;\n provider: AgentProviderId;\n startedAt: string;\n completedAt: string;\n duration: number;\n budget: {\n totalTokens: number;\n reserveTokens: number;\n usedTokens: number;\n remainingTokens: number;\n estimatedCostUsd?: number;\n };\n tasks: {\n discovered: number;\n selected: number;\n attempted: number;\n succeeded: number;\n failed: number;\n deferred: number;\n };\n pullRequests: {\n created: number;\n merged: number;\n urls: string[];\n };\n}\n"],"mappings":"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","names":[]}
package/dist/cli/cli.js CHANGED
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  createCliProgram,
3
3
  runCli
4
- } from "../chunk-GPHH2IYN.js";
4
+ } from "../chunk-ATVWSG75.js";
5
5
  import "../chunk-UCYK4Z6O.js";
6
6
  import "../chunk-ZJBLRKCV.js";
7
7
  import "../chunk-ALBVUNUY.js";
8
- import "../chunk-JROCVTM7.js";
9
- import "../chunk-7C7SC4TZ.js";
8
+ import "../chunk-27FEE5KS.js";
9
+ import "../chunk-I3TKNT4M.js";
10
10
  import "../chunk-JDFAJP45.js";
11
11
  import "../chunk-LQC5DLT7.js";
12
12
  export {
package/dist/cli/index.js CHANGED
@@ -4,12 +4,12 @@ import {
4
4
  EXIT_CONFIG_ERROR,
5
5
  EXIT_GENERAL_ERROR,
6
6
  runCli
7
- } from "../chunk-GPHH2IYN.js";
7
+ } from "../chunk-ATVWSG75.js";
8
8
  import "../chunk-UCYK4Z6O.js";
9
9
  import "../chunk-ZJBLRKCV.js";
10
10
  import "../chunk-ALBVUNUY.js";
11
- import "../chunk-JROCVTM7.js";
12
- import "../chunk-7C7SC4TZ.js";
11
+ import "../chunk-27FEE5KS.js";
12
+ import "../chunk-I3TKNT4M.js";
13
13
  import "../chunk-JDFAJP45.js";
14
14
  import "../chunk-LQC5DLT7.js";
15
15
 
@@ -1,6 +1,6 @@
1
1
  import { R as ResolvedRepo, T as Task, e as ExecutionResult } from '../types-Ck7IucqK.js';
2
2
  import { Octokit } from '@octokit/rest';
3
- import { O as OacConfig } from '../config-DequKoFA.js';
3
+ import { O as OacConfig } from '../config-DnzZ7w92.js';
4
4
  import { k as OacEventBus } from '../event-bus-KiuR6e3P.js';
5
5
  import 'zod';
6
6
  import 'eventemitter3';
@@ -2,7 +2,7 @@ import {
2
2
  OacError,
3
3
  completionError,
4
4
  executionError
5
- } from "../chunk-7C7SC4TZ.js";
5
+ } from "../chunk-I3TKNT4M.js";
6
6
  import {
7
7
  truncate
8
8
  } from "../chunk-JDFAJP45.js";
@@ -442,6 +442,19 @@ declare const AnalyzeSchema: z.ZodDefault<z.ZodObject<{
442
442
  staleAfterMs?: number | undefined;
443
443
  contextDir?: string | undefined;
444
444
  }>>;
445
+ declare const ContextPolicySchema: z.ZodDefault<z.ZodObject<{
446
+ mode: z.ZodDefault<z.ZodEnum<["off", "warn", "enforce"]>>;
447
+ requiredGlobs: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
448
+ maxAckItems: z.ZodDefault<z.ZodNumber>;
449
+ }, "strict", z.ZodTypeAny, {
450
+ mode: "off" | "warn" | "enforce";
451
+ requiredGlobs: string[];
452
+ maxAckItems: number;
453
+ }, {
454
+ mode?: "off" | "warn" | "enforce" | undefined;
455
+ requiredGlobs?: string[] | undefined;
456
+ maxAckItems?: number | undefined;
457
+ }>>;
445
458
  declare const OacConfigSchema: z.ZodObject<{
446
459
  repos: z.ZodDefault<z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodObject<{
447
460
  name: z.ZodString;
@@ -782,6 +795,19 @@ declare const OacConfigSchema: z.ZodObject<{
782
795
  staleAfterMs?: number | undefined;
783
796
  contextDir?: string | undefined;
784
797
  }>>;
798
+ context: z.ZodDefault<z.ZodObject<{
799
+ mode: z.ZodDefault<z.ZodEnum<["off", "warn", "enforce"]>>;
800
+ requiredGlobs: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
801
+ maxAckItems: z.ZodDefault<z.ZodNumber>;
802
+ }, "strict", z.ZodTypeAny, {
803
+ mode: "off" | "warn" | "enforce";
804
+ requiredGlobs: string[];
805
+ maxAckItems: number;
806
+ }, {
807
+ mode?: "off" | "warn" | "enforce" | undefined;
808
+ requiredGlobs?: string[] | undefined;
809
+ maxAckItems?: number | undefined;
810
+ }>>;
785
811
  }, "strict", z.ZodTypeAny, {
786
812
  repos: (string | {
787
813
  name: string;
@@ -865,6 +891,11 @@ declare const OacConfigSchema: z.ZodObject<{
865
891
  staleAfterMs: number;
866
892
  contextDir: string;
867
893
  };
894
+ context: {
895
+ mode: "off" | "warn" | "enforce";
896
+ requiredGlobs: string[];
897
+ maxAckItems: number;
898
+ };
868
899
  }, {
869
900
  repos?: (string | {
870
901
  name: string;
@@ -948,6 +979,11 @@ declare const OacConfigSchema: z.ZodObject<{
948
979
  staleAfterMs?: number | undefined;
949
980
  contextDir?: string | undefined;
950
981
  } | undefined;
982
+ context?: {
983
+ mode?: "off" | "warn" | "enforce" | undefined;
984
+ requiredGlobs?: string[] | undefined;
985
+ maxAckItems?: number | undefined;
986
+ } | undefined;
951
987
  }>;
952
988
  declare const OacConfig: z.ZodObject<{
953
989
  repos: z.ZodDefault<z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodObject<{
@@ -1289,6 +1325,19 @@ declare const OacConfig: z.ZodObject<{
1289
1325
  staleAfterMs?: number | undefined;
1290
1326
  contextDir?: string | undefined;
1291
1327
  }>>;
1328
+ context: z.ZodDefault<z.ZodObject<{
1329
+ mode: z.ZodDefault<z.ZodEnum<["off", "warn", "enforce"]>>;
1330
+ requiredGlobs: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
1331
+ maxAckItems: z.ZodDefault<z.ZodNumber>;
1332
+ }, "strict", z.ZodTypeAny, {
1333
+ mode: "off" | "warn" | "enforce";
1334
+ requiredGlobs: string[];
1335
+ maxAckItems: number;
1336
+ }, {
1337
+ mode?: "off" | "warn" | "enforce" | undefined;
1338
+ requiredGlobs?: string[] | undefined;
1339
+ maxAckItems?: number | undefined;
1340
+ }>>;
1292
1341
  }, "strict", z.ZodTypeAny, {
1293
1342
  repos: (string | {
1294
1343
  name: string;
@@ -1372,6 +1421,11 @@ declare const OacConfig: z.ZodObject<{
1372
1421
  staleAfterMs: number;
1373
1422
  contextDir: string;
1374
1423
  };
1424
+ context: {
1425
+ mode: "off" | "warn" | "enforce";
1426
+ requiredGlobs: string[];
1427
+ maxAckItems: number;
1428
+ };
1375
1429
  }, {
1376
1430
  repos?: (string | {
1377
1431
  name: string;
@@ -1455,6 +1509,11 @@ declare const OacConfig: z.ZodObject<{
1455
1509
  staleAfterMs?: number | undefined;
1456
1510
  contextDir?: string | undefined;
1457
1511
  } | undefined;
1512
+ context?: {
1513
+ mode?: "off" | "warn" | "enforce" | undefined;
1514
+ requiredGlobs?: string[] | undefined;
1515
+ maxAckItems?: number | undefined;
1516
+ } | undefined;
1458
1517
  }>;
1459
1518
  type OacConfig = z.output<typeof OacConfigSchema>;
1460
1519
  type OacConfigInput = z.input<typeof OacConfigSchema>;
@@ -1465,4 +1524,4 @@ declare function defineConfig(config: OacConfigInput): OacConfigInput;
1465
1524
  declare function interpolateEnvVars(value: string, env?: Record<string, string | undefined>, path?: string[]): string;
1466
1525
  declare function loadConfig(config?: unknown, options?: LoadConfigOptions): OacConfig;
1467
1526
 
1468
- export { AnalyzeSchema as A, BudgetSchema as B, CompletionSchema as C, DashboardSchema as D, ExecutionSchema as E, JiraIntegrationSchema as J, LinearIntegrationSchema as L, OacConfig as O, PrSchema as P, RepoTargetSchema as R, TrackingSchema as T, ValidationSchema as V, DiscoveryScannersSchema as a, DiscoverySchema as b, type LoadConfigOptions as c, type OacConfigInput as d, OacConfigSchema as e, ProviderSchema as f, defineConfig as g, interpolateEnvVars as i, loadConfig as l };
1527
+ export { AnalyzeSchema as A, BudgetSchema as B, CompletionSchema as C, DashboardSchema as D, ExecutionSchema as E, JiraIntegrationSchema as J, LinearIntegrationSchema as L, OacConfig as O, PrSchema as P, RepoTargetSchema as R, TrackingSchema as T, ValidationSchema as V, ContextPolicySchema as a, DiscoveryScannersSchema as b, DiscoverySchema as c, type LoadConfigOptions as d, type OacConfigInput as e, OacConfigSchema as f, ProviderSchema as g, defineConfig as h, interpolateEnvVars as i, loadConfig as l };
@@ -1,4 +1,4 @@
1
- export { A as AnalyzeSchema, B as BudgetSchema, C as CompletionSchema, D as DashboardSchema, a as DiscoveryScannersSchema, b as DiscoverySchema, E as ExecutionSchema, J as JiraIntegrationSchema, L as LinearIntegrationSchema, c as LoadConfigOptions, O as OacConfig, d as OacConfigInput, e as OacConfigSchema, P as PrSchema, f as ProviderSchema, R as RepoTargetSchema, T as TrackingSchema, V as ValidationSchema, g as defineConfig, i as interpolateEnvVars, l as loadConfig } from '../config-DequKoFA.js';
1
+ export { A as AnalyzeSchema, B as BudgetSchema, C as CompletionSchema, a as ContextPolicySchema, D as DashboardSchema, b as DiscoveryScannersSchema, c as DiscoverySchema, E as ExecutionSchema, J as JiraIntegrationSchema, L as LinearIntegrationSchema, d as LoadConfigOptions, O as OacConfig, e as OacConfigInput, f as OacConfigSchema, P as PrSchema, g as ProviderSchema, R as RepoTargetSchema, T as TrackingSchema, V as ValidationSchema, h as defineConfig, i as interpolateEnvVars, l as loadConfig } from '../config-DnzZ7w92.js';
2
2
  export { B as BUDGET_ERROR_CODES, a as BudgetErrorCode, C as COMPLETION_ERROR_CODES, b as CONFIG_ERROR_CODES, c as CompletionErrorCode, d as ConfigErrorCode, D as DISCOVERY_ERROR_CODES, e as DiscoveryErrorCode, E as EXECUTION_ERROR_CODES, f as ExecutionErrorCode, O as OAC_ERROR_CODES, g as OacError, h as OacErrorCode, i as OacErrorOptions, j as OacErrorSeverity, k as OacEventBus, l as OacEvents, R as REPO_ERROR_CODES, m as RepoErrorCode, S as SYSTEM_ERROR_CODES, n as SystemErrorCode, o as budgetError, p as completionError, q as configError, r as createEventBus, s as discoveryError, t as executionError, u as repoError } from '../event-bus-KiuR6e3P.js';
3
3
  export { A as AgentProviderId, C as ContributionLog, a as ContributionTask, E as Epic, b as EpicStatus, c as ExecutionMode, d as ExecutionPlan, e as ExecutionResult, R as ResolvedRepo, f as RunSummary, T as Task, g as TaskComplexity, h as TaskSource, i as TokenEstimate, U as UNLIMITED_BUDGET } from '../types-Ck7IucqK.js';
4
4
  import 'zod';
@@ -5,6 +5,7 @@ import {
5
5
  COMPLETION_ERROR_CODES,
6
6
  CONFIG_ERROR_CODES,
7
7
  CompletionSchema,
8
+ ContextPolicySchema,
8
9
  DISCOVERY_ERROR_CODES,
9
10
  DashboardSchema,
10
11
  DiscoveryScannersSchema,
@@ -35,7 +36,7 @@ import {
35
36
  interpolateEnvVars,
36
37
  loadConfig,
37
38
  repoError
38
- } from "../chunk-7C7SC4TZ.js";
39
+ } from "../chunk-I3TKNT4M.js";
39
40
  import {
40
41
  createMemoryMonitor,
41
42
  getMemorySnapshot,
@@ -49,6 +50,7 @@ export {
49
50
  COMPLETION_ERROR_CODES,
50
51
  CONFIG_ERROR_CODES,
51
52
  CompletionSchema,
53
+ ContextPolicySchema,
52
54
  DISCOVERY_ERROR_CODES,
53
55
  DashboardSchema,
54
56
  DiscoveryScannersSchema,
@@ -17,10 +17,10 @@ import {
17
17
  CodexAdapter,
18
18
  createSandbox,
19
19
  executeTask
20
- } from "../chunk-JROCVTM7.js";
20
+ } from "../chunk-27FEE5KS.js";
21
21
  import {
22
22
  createEventBus
23
- } from "../chunk-7C7SC4TZ.js";
23
+ } from "../chunk-I3TKNT4M.js";
24
24
  import "../chunk-JDFAJP45.js";
25
25
  import {
26
26
  buildLeaderboard,
@@ -31,12 +31,14 @@ import {
31
31
  // src/dashboard/server.ts
32
32
  import { randomUUID as randomUUID2 } from "crypto";
33
33
  import { readFile, readdir } from "fs/promises";
34
- import { resolve } from "path";
34
+ import { resolve as resolve2 } from "path";
35
35
  import cors from "@fastify/cors";
36
36
  import Fastify from "fastify";
37
37
 
38
38
  // src/dashboard/pipeline.ts
39
39
  import { randomUUID } from "crypto";
40
+ import { mkdir, writeFile } from "fs/promises";
41
+ import { join, resolve } from "path";
40
42
  import { execa } from "execa";
41
43
  import PQueue from "p-queue";
42
44
  function buildScanners() {
@@ -118,11 +120,9 @@ Automated contribution by OAC.`],
118
120
  { cwd: sandboxPath }
119
121
  );
120
122
  }
121
- const diffResult = await execa(
122
- "git",
123
- ["diff", "--name-only", `origin/${baseBranch}`, "HEAD"],
124
- { cwd: sandboxPath }
125
- );
123
+ const diffResult = await execa("git", ["diff", "--name-only", `origin/${baseBranch}`, "HEAD"], {
124
+ cwd: sandboxPath
125
+ });
126
126
  const changedFiles = diffResult.stdout.trim().split("\n").filter(Boolean);
127
127
  return { hasChanges: changedFiles.length > 0, filesChanged: changedFiles };
128
128
  } catch {
@@ -209,6 +209,45 @@ function resolveGithubUsername() {
209
209
  }
210
210
  return "oac-user";
211
211
  }
212
+ async function writeContributionToSandbox(input) {
213
+ const { sandboxPath, task, execution, runId, repoOwner } = input;
214
+ const contributionsDir = resolve(sandboxPath, ".oac", "contributions");
215
+ await mkdir(contributionsDir, { recursive: true });
216
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString();
217
+ const contributor = resolveGithubUsername();
218
+ const datePrefix = timestamp.replace(/[:.]/g, "").replace("T", "-").slice(0, 15);
219
+ const safeTaskId = task.id.replace(/[^A-Za-z0-9-]/g, "-").replace(/-+/g, "-").slice(0, 40);
220
+ const filename = `${datePrefix}-${safeTaskId}.json`;
221
+ const metadata = {
222
+ version: "1.0",
223
+ runId,
224
+ timestamp,
225
+ contributor,
226
+ task: {
227
+ id: task.id,
228
+ title: task.title,
229
+ source: task.source,
230
+ complexity: task.complexity,
231
+ linkedIssue: task.linkedIssue ? { number: task.linkedIssue.number, url: task.linkedIssue.url } : void 0
232
+ },
233
+ execution: {
234
+ success: execution.success,
235
+ tokensUsed: execution.totalTokensUsed,
236
+ duration: execution.duration,
237
+ filesChanged: execution.filesChanged
238
+ }
239
+ };
240
+ const filePath = join(contributionsDir, filename);
241
+ await writeFile(filePath, `${JSON.stringify(metadata, null, 2)}
242
+ `, "utf8");
243
+ try {
244
+ await execa("git", ["add", filePath], { cwd: sandboxPath });
245
+ await execa("git", ["commit", "-m", "[OAC] Add contribution metadata"], {
246
+ cwd: sandboxPath
247
+ });
248
+ } catch {
249
+ }
250
+ }
212
251
  async function executePipeline(config, onEvent) {
213
252
  const runId = randomUUID();
214
253
  const startedAt = (/* @__PURE__ */ new Date()).toISOString();
@@ -330,6 +369,13 @@ async function executePipeline(config, onEvent) {
330
369
  }
331
370
  let pr;
332
371
  if (execution.success && sandbox && execution.filesChanged.length > 0) {
372
+ await writeContributionToSandbox({
373
+ sandboxPath: sandbox.sandboxPath,
374
+ task: entry.task,
375
+ execution,
376
+ runId,
377
+ repoOwner: resolvedRepo.owner
378
+ });
333
379
  emit({
334
380
  type: "run:stage",
335
381
  stage: "creating-pr",
@@ -1070,7 +1116,7 @@ function broadcastEvent(event) {
1070
1116
  }
1071
1117
  }
1072
1118
  async function readContributionLogs(oacDir) {
1073
- const contributionsPath = resolve(oacDir, ".oac", "contributions");
1119
+ const contributionsPath = resolve2(oacDir, ".oac", "contributions");
1074
1120
  let entries;
1075
1121
  try {
1076
1122
  entries = await readdir(contributionsPath, { withFileTypes: true, encoding: "utf8" });
@@ -1081,7 +1127,7 @@ async function readContributionLogs(oacDir) {
1081
1127
  const results = await Promise.all(
1082
1128
  files.map(async (fileName) => {
1083
1129
  try {
1084
- const content = await readFile(resolve(contributionsPath, fileName), "utf8");
1130
+ const content = await readFile(resolve2(contributionsPath, fileName), "utf8");
1085
1131
  const parsed = contributionLogSchema.safeParse(JSON.parse(content));
1086
1132
  return parsed.success ? parsed.data : null;
1087
1133
  } catch {
@@ -1096,7 +1142,7 @@ async function readRunStatus(oacDir) {
1096
1142
  return currentRun;
1097
1143
  }
1098
1144
  try {
1099
- const content = await readFile(resolve(oacDir, ".oac", "status.json"), "utf8");
1145
+ const content = await readFile(resolve2(oacDir, ".oac", "status.json"), "utf8");
1100
1146
  return JSON.parse(content);
1101
1147
  } catch {
1102
1148
  return { status: "idle", message: "No active runs" };