oh-my-opencode-slim 0.9.12 → 0.9.14

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.
@@ -0,0 +1,62 @@
1
+ import type { InterviewStateEntry } from './types';
2
+ export declare function readDashboardAuthFile(port: number): Promise<{
3
+ token: string;
4
+ pid: number;
5
+ startedAt: number;
6
+ } | null>;
7
+ interface RegisteredSession {
8
+ sessionID: string;
9
+ directory: string;
10
+ pid: number;
11
+ registeredAt: number;
12
+ }
13
+ export declare const DEFAULT_DASHBOARD_PORT = 43211;
14
+ export interface DashboardConfig {
15
+ port: number;
16
+ outputFolder: string;
17
+ sessionClient?: {
18
+ list: (params?: Record<string, unknown>) => Promise<{
19
+ data?: Array<{
20
+ directory?: string;
21
+ time?: {
22
+ updated?: number;
23
+ };
24
+ }>;
25
+ }>;
26
+ };
27
+ }
28
+ export declare function createDashboardServer(config: DashboardConfig): {
29
+ start: () => Promise<string>;
30
+ close: () => void;
31
+ registerSession: (info: RegisteredSession) => void;
32
+ removeSession: (sessionID: string) => void;
33
+ pushState: (entry: InterviewStateEntry) => void;
34
+ getState: (interviewId: string) => InterviewStateEntry | undefined;
35
+ storeAnswers: (interviewId: string, answers: Array<{
36
+ questionId: string;
37
+ answer: string;
38
+ }>) => void;
39
+ getPendingAnswers: (interviewId: string) => Array<{
40
+ questionId: string;
41
+ answer: string;
42
+ }> | null;
43
+ consumePendingAnswers: (interviewId: string) => Array<{
44
+ questionId: string;
45
+ answer: string;
46
+ }> | null;
47
+ consumeNudgeAction: (interviewId: string) => 'more-questions' | 'confirm-complete' | null;
48
+ authToken: string;
49
+ discoverSessionDirectories: () => Promise<void>;
50
+ addManualFolder: (dir: string) => void;
51
+ removeManualFolder: (dir: string) => void;
52
+ getManualFolders: () => string[];
53
+ setScanDays: (days: number) => void;
54
+ getScanDays: () => number;
55
+ refreshFiles: () => Promise<void>;
56
+ };
57
+ export declare function probeDashboard(port: number): Promise<{
58
+ alive: boolean;
59
+ timestamp: number;
60
+ }>;
61
+ export declare function tryBecomeDashboard(config: DashboardConfig, maxAttempts?: number): Promise<ReturnType<typeof createDashboardServer> | null>;
62
+ export {};
@@ -0,0 +1,25 @@
1
+ import type { InterviewAnswer, InterviewQuestion, InterviewRecord } from './types';
2
+ export declare const DEFAULT_OUTPUT_FOLDER = "interview";
3
+ export declare function normalizeOutputFolder(outputFolder: string): string;
4
+ export declare function createInterviewDirectoryPath(directory: string, outputFolder: string): string;
5
+ export declare function createInterviewFilePath(directory: string, outputFolder: string, idea: string): string;
6
+ export declare function relativeInterviewPath(directory: string, filePath: string): string;
7
+ /**
8
+ * Resolve a user-provided value to an existing .md file path.
9
+ * Checks absolute paths, relative paths, and output-folder-relative paths.
10
+ * Returns null if no matching file is found.
11
+ */
12
+ export declare function resolveExistingInterviewPath(directory: string, outputFolder: string, value: string): string | null;
13
+ export declare function slugify(value: string): string;
14
+ export declare function extractSummarySection(document: string): string;
15
+ export declare function extractTitle(document: string): string;
16
+ export declare function buildInterviewDocument(idea: string, summary: string, history: string, meta?: {
17
+ sessionID?: string;
18
+ baseMessageCount?: number;
19
+ }): string;
20
+ /** Parse frontmatter from a .md file. Returns null if no frontmatter. */
21
+ export declare function parseFrontmatter(content: string): Record<string, string> | null;
22
+ export declare function ensureInterviewFile(record: InterviewRecord): Promise<void>;
23
+ export declare function readInterviewDocument(record: InterviewRecord): Promise<string>;
24
+ export declare function rewriteInterviewDocument(record: InterviewRecord, summary: string): Promise<string>;
25
+ export declare function appendInterviewAnswers(record: InterviewRecord, questions: InterviewQuestion[], answers: InterviewAnswer[]): Promise<void>;
@@ -0,0 +1,10 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ export declare function sendJson(response: ServerResponse, status: number, value: unknown): void;
3
+ export declare function sendHtml(response: ServerResponse, html: string): void;
4
+ export declare function isValidId(id: string): boolean;
5
+ export declare function extractResumeSlug(interviewId: string): string;
6
+ /**
7
+ * Read and parse JSON body from an HTTP request with size limit.
8
+ * Destroys the request if the body exceeds MAX_BODY_SIZE.
9
+ */
10
+ export declare function readJsonBody(request: IncomingMessage): Promise<unknown>;
@@ -1,22 +1,18 @@
1
1
  import type { PluginInput } from '@opencode-ai/plugin';
2
2
  import type { PluginConfig } from '../config';
3
3
  /**
4
- * Interview Manager - Composition root wiring the lean service ↔ server flow.
4
+ * Interview Manager Composition root.
5
5
  *
6
- * Architecture:
7
- * - Service: in-memory interview runtime + markdown document updates
8
- * - Server: localhost UI + JSON API
9
- * - Manager: small adapter exposing plugin hooks
6
+ * Two modes:
10
7
  *
11
- * Dependency injection pattern:
12
- * - Server depends on service.getState and service.submitAnswers
13
- * - Service depends on server.ensureStarted (via setBaseUrlResolver)
14
- * - Circular dependency resolved by lazy resolution
8
+ * 1. **Dashboard mode** (dashboard:true or port>0):
9
+ * First process to bind the port becomes the dashboard (dumb aggregator).
10
+ * Other processes register as sessions and push state to it.
11
+ * Sessions drive LLM interaction locally, dashboard just serves the web UI.
15
12
  *
16
- * Plugin integration:
17
- * - registerCommand: injects /interview into OpenCode config
18
- * - handleCommandExecuteBefore: intercepts /interview execution
19
- * - handleEvent: listens to session.status and session.deleted events
13
+ * 2. **Per-session mode** (default, port=0, dashboard:false):
14
+ * Upstream behavior. Each process runs its own interview server on a random
15
+ * port. Lazy startup on first /interview command.
20
16
  */
21
17
  export declare function createInterviewManager(ctx: PluginInput, config: PluginConfig): {
22
18
  registerCommand: (config: Record<string, unknown>) => void;
@@ -1,7 +1,11 @@
1
- import type { InterviewAnswer, InterviewState } from './types';
1
+ import type { InterviewAnswer, InterviewFileItem, InterviewListItem, InterviewState } from './types';
2
2
  export declare function createInterviewServer(deps: {
3
3
  getState: (interviewId: string) => Promise<InterviewState>;
4
+ listInterviewFiles: () => Promise<InterviewFileItem[]>;
5
+ listInterviews: () => InterviewListItem[];
4
6
  submitAnswers: (interviewId: string, answers: InterviewAnswer[]) => Promise<void>;
7
+ handleNudgeAction: (interviewId: string, action: 'more-questions' | 'confirm-complete') => Promise<void>;
8
+ outputFolder: string;
5
9
  port: number;
6
10
  }): {
7
11
  ensureStarted: () => Promise<string>;
@@ -1,10 +1,13 @@
1
1
  import type { PluginInput } from '@opencode-ai/plugin';
2
2
  import type { InterviewConfig } from '../config';
3
- import type { InterviewAnswer, InterviewState } from './types';
3
+ import type { InterviewAnswer, InterviewFileItem, InterviewListItem, InterviewRecord, InterviewState } from './types';
4
4
  export declare function createInterviewService(ctx: PluginInput, config?: InterviewConfig, deps?: {
5
5
  openBrowser?: (url: string) => void;
6
6
  }): {
7
7
  setBaseUrlResolver: (resolver: () => Promise<string>) => void;
8
+ setStatePushCallback: (callback: (interviewId: string, state: InterviewState) => void) => void;
9
+ setOnInterviewCreated: (callback: (interview: InterviewRecord) => void) => void;
10
+ getActiveInterviewId: (sessionID: string) => string | null;
8
11
  registerCommand: (config: Record<string, unknown>) => void;
9
12
  handleCommandExecuteBefore: (input: {
10
13
  command: string;
@@ -23,5 +26,8 @@ export declare function createInterviewService(ctx: PluginInput, config?: Interv
23
26
  };
24
27
  }) => Promise<void>;
25
28
  getInterviewState: (interviewId: string) => Promise<InterviewState>;
29
+ listInterviewFiles: () => Promise<InterviewFileItem[]>;
30
+ listInterviews: () => InterviewListItem[];
26
31
  submitAnswers: (interviewId: string, answers: InterviewAnswer[]) => Promise<void>;
32
+ handleNudgeAction: (interviewId: string, action: 'more-questions' | 'confirm-complete') => Promise<void>;
27
33
  };
@@ -1,12 +1,9 @@
1
- import type { InterviewAssistantState, InterviewMessage, InterviewRecord, InterviewSnapshot } from './types';
1
+ import type { InterviewAssistantState, InterviewMessage, InterviewRecord } from './types';
2
2
  export declare function transcriptPath(directory: string, id: string): string;
3
3
  export declare function summaryPath(directory: string, id: string): string;
4
- export declare function snapshotPath(directory: string, id: string): string;
5
- export declare function ensureInterviewDirectory(directory: string): Promise<void>;
6
4
  export declare function writeInterviewRecord(record: InterviewRecord): Promise<void>;
7
5
  export declare function readInterviewRecord(directory: string, id: string): Promise<InterviewRecord | null>;
8
- export declare function writeInterviewSnapshot(record: InterviewRecord, snapshot: InterviewSnapshot): Promise<void>;
9
- export declare function readInterviewSnapshot(directory: string, id: string): Promise<InterviewSnapshot | null>;
10
6
  export declare function findActiveInterviewBySession(directory: string, sessionID: string): Promise<InterviewRecord | null>;
11
7
  export declare function writeTranscript(record: InterviewRecord, messages: InterviewMessage[]): Promise<void>;
12
8
  export declare function writeSummary(record: InterviewRecord, state: InterviewAssistantState, answerCount: number): Promise<void>;
9
+ export declare function ensureInterviewDirectory(directory: string): Promise<void>;
@@ -1,3 +1,4 @@
1
+ import { z } from 'zod';
1
2
  export interface InterviewQuestion {
2
3
  id: string;
3
4
  question: string;
@@ -13,6 +14,19 @@ export interface InterviewAssistantState {
13
14
  title?: string;
14
15
  questions: InterviewQuestion[];
15
16
  }
17
+ /** Raw question object from LLM output — loose, everything optional. */
18
+ export declare const RawQuestionSchema: z.ZodObject<{
19
+ id: z.ZodOptional<z.ZodString>;
20
+ question: z.ZodOptional<z.ZodString>;
21
+ options: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
22
+ suggested: z.ZodOptional<z.ZodUnknown>;
23
+ }, z.core.$strip>;
24
+ /** Raw interview_state block from LLM output. */
25
+ export declare const RawInterviewStateSchema: z.ZodObject<{
26
+ summary: z.ZodOptional<z.ZodUnknown>;
27
+ title: z.ZodOptional<z.ZodUnknown>;
28
+ questions: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
29
+ }, z.core.$strip>;
16
30
  export interface InterviewRecord {
17
31
  id: string;
18
32
  sessionID: string;
@@ -33,14 +47,50 @@ export interface InterviewMessage {
33
47
  };
34
48
  parts?: InterviewMessagePart[];
35
49
  }
50
+ export interface InterviewListItem {
51
+ id: string;
52
+ idea: string;
53
+ status: InterviewRecord['status'];
54
+ createdAt: string;
55
+ }
56
+ export interface InterviewFileItem {
57
+ fileName: string;
58
+ resumeCommand: string;
59
+ title: string;
60
+ summary: string;
61
+ sessionID?: string;
62
+ directory?: string;
63
+ }
36
64
  export interface InterviewState {
37
65
  interview: InterviewRecord;
38
66
  url: string;
39
67
  markdownPath: string;
40
- mode: 'awaiting-agent' | 'awaiting-user' | 'abandoned' | 'error';
68
+ mode: 'awaiting-agent' | 'awaiting-user' | 'abandoned' | 'completed' | 'error' | 'session-disconnected';
41
69
  lastParseError?: string;
42
70
  isBusy: boolean;
43
71
  summary: string;
44
72
  questions: InterviewQuestion[];
45
73
  document: string;
46
74
  }
75
+ /** Wire format for dashboard state cache entries. */
76
+ export interface InterviewStateEntry {
77
+ interviewId: string;
78
+ sessionID: string;
79
+ idea: string;
80
+ mode: 'awaiting-agent' | 'awaiting-user' | 'abandoned' | 'completed' | 'error' | 'session-disconnected';
81
+ summary: string;
82
+ title: string;
83
+ questions: Array<{
84
+ id: string;
85
+ question: string;
86
+ options?: string[];
87
+ suggested?: string;
88
+ }>;
89
+ pendingAnswers: Array<{
90
+ questionId: string;
91
+ answer: string;
92
+ }> | null;
93
+ lastUpdatedAt: number;
94
+ filePath: string;
95
+ nudgeAction: 'more-questions' | 'confirm-complete' | null;
96
+ }
@@ -1 +1,12 @@
1
- export declare function renderInterviewPage(interviewId: string): string;
1
+ import type { InterviewFileItem, InterviewListItem } from './types';
2
+ interface DashboardInterviewItem extends InterviewListItem {
3
+ url: string;
4
+ mode: string;
5
+ resumeSlug: string;
6
+ sessionID?: string;
7
+ directory?: string;
8
+ }
9
+ export declare function escapeHtml(value: string): string;
10
+ export declare function renderDashboardPage(interviews: DashboardInterviewItem[], files: InterviewFileItem[], outputFolder: string): string;
11
+ export declare function renderInterviewPage(interviewId: string, resumeSlug: string): string;
12
+ export {};
@@ -0,0 +1,5 @@
1
+ import type { Account, AccountQuotaResult, AccountsConfig } from './types';
2
+ export declare const CONFIG_PATHS: string[];
3
+ export declare function loadAccountsConfig(): AccountsConfig | null;
4
+ export declare function fetchAccountQuota(account: Account): Promise<AccountQuotaResult>;
5
+ export declare function fetchAllQuotas(accounts: Account[]): Promise<AccountQuotaResult[]>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Compact quota display tool - groups models by quota family
3
+ *
4
+ * Output format:
5
+ * ```
6
+ * tornikevault
7
+ * Claude [░░░░░░░░░░] 0% 3h23m
8
+ * G-Flash [██████████] 100% 4h59m
9
+ * G-Pro [██████████] 100% 4h59m
10
+ *
11
+ * tzedgin
12
+ * Claude [░░░░░░░░░░] 0% 1h41m
13
+ * G-Flash [██████████] 100% 4h59m
14
+ * G-Pro [██████████] 100% 4h59m
15
+ * ```
16
+ */
17
+ export declare const antigravity_quota: {
18
+ description: string;
19
+ args: {};
20
+ execute(args: Record<string, never>, context: import("@opencode-ai/plugin").ToolContext): Promise<string>;
21
+ };
@@ -0,0 +1,41 @@
1
+ export interface Account {
2
+ email: string;
3
+ refreshToken: string;
4
+ projectId?: string;
5
+ managedProjectId?: string;
6
+ rateLimitResetTimes: Record<string, number>;
7
+ }
8
+ export interface AccountsConfig {
9
+ accounts: Account[];
10
+ activeIndex: number;
11
+ }
12
+ export interface QuotaInfo {
13
+ remainingFraction?: number;
14
+ resetTime?: string;
15
+ }
16
+ export interface ModelInfo {
17
+ displayName?: string;
18
+ model?: string;
19
+ quotaInfo?: QuotaInfo;
20
+ recommended?: boolean;
21
+ }
22
+ export interface QuotaResponse {
23
+ models?: Record<string, ModelInfo>;
24
+ }
25
+ export interface TokenResponse {
26
+ access_token: string;
27
+ }
28
+ export interface LoadCodeAssistResponse {
29
+ cloudaicompanionProject?: unknown;
30
+ }
31
+ export interface ModelQuota {
32
+ name: string;
33
+ percent: number;
34
+ resetIn: string;
35
+ }
36
+ export interface AccountQuotaResult {
37
+ email: string;
38
+ success: boolean;
39
+ error?: string;
40
+ models: ModelQuota[];
41
+ }
@@ -11,7 +11,7 @@ export declare function joinRenderedContent(metadata: string, content: string, f
11
11
  export declare function renderMessageForFormat(content: string, format: 'text' | 'markdown' | 'html'): string;
12
12
  export declare function buildRedirectResultMessage(originalUrl: string, redirectUrl: string, statusCode: number): string;
13
13
  export declare function buildLlmsRequiredMessage(originalUrl: string, reason?: string): string;
14
- export declare function extractFromHtml(html: string, finalUrl: string, extractMain: boolean): ExtractedContent;
14
+ export declare function extractFromHtml(html: string, finalUrl: string, extractMain: boolean): Promise<ExtractedContent>;
15
15
  export declare function inferCanonicalUrlFromText(content: string, finalUrl: string): string | undefined;
16
16
  export declare function extractHeadingsFromMarkdown(content: string): string[] | undefined;
17
17
  export declare function detectQualitySignals(fetchResult: Pick<CachedFetch, 'text' | 'markdown' | 'rawContent' | 'wordCount' | 'sourceKind' | 'extractedMain'>): string[];
@@ -0,0 +1,30 @@
1
+ import type { ChildProcess } from 'node:child_process';
2
+ export declare const isBun: boolean;
3
+ export interface CrossSpawnResult {
4
+ proc: ChildProcess;
5
+ /** Collects all stdout into a string */
6
+ stdout: () => Promise<string>;
7
+ /** Collects all stderr into a string */
8
+ stderr: () => Promise<string>;
9
+ /** Resolves when process exits with exit code */
10
+ exited: Promise<number>;
11
+ /** Kill the process */
12
+ kill: (signal?: NodeJS.Signals | number) => boolean;
13
+ /** Current exit code or null if running */
14
+ get exitCode(): number | null;
15
+ }
16
+ /**
17
+ * Cross-runtime spawn that works in both Bun and Node.js.
18
+ * API mimics Bun.spawn but uses node:child_process internally.
19
+ */
20
+ export declare function crossSpawn(command: string[], options?: {
21
+ stdout?: 'pipe' | 'inherit' | 'ignore';
22
+ stderr?: 'pipe' | 'inherit' | 'ignore';
23
+ stdin?: 'pipe' | 'inherit' | 'ignore';
24
+ cwd?: string;
25
+ env?: Record<string, string | undefined>;
26
+ }): CrossSpawnResult;
27
+ /**
28
+ * Cross-runtime file write that works in both Bun and Node.js.
29
+ */
30
+ export declare function crossWrite(path: string, data: ArrayBuffer | Buffer | string): Promise<void>;
@@ -1,7 +1,7 @@
1
1
  export * from './agent-variant';
2
2
  export * from './env';
3
3
  export * from './internal-initiator';
4
- export { log } from './logger';
4
+ export { getLogDir, initLogger, log, resetLogger } from './logger';
5
5
  export * from './polling';
6
6
  export * from './session';
7
7
  export { extractZip } from './zip-extractor';
@@ -1 +1,6 @@
1
+ declare function getLogDir(): string;
2
+ export declare function initLogger(sessionId: string): void;
3
+ /** @internal Reset logger state for testing */
4
+ export declare function resetLogger(): void;
5
+ export { getLogDir };
1
6
  export declare function log(message: string, data?: unknown): void;
@@ -339,6 +339,13 @@
339
339
  }
340
340
  }
341
341
  },
342
+ "disabled_agents": {
343
+ "description": "Agent names to disable completely. Disabled agents are not instantiated and cannot be delegated to. Orchestrator and council internal agents (councillor, council-master) cannot be disabled. By default, 'observer' is disabled. Remove it from this list and configure a vision-capable model to enable.",
344
+ "type": "array",
345
+ "items": {
346
+ "type": "string"
347
+ }
348
+ },
342
349
  "disabled_mcps": {
343
350
  "type": "array",
344
351
  "items": {
@@ -450,6 +457,10 @@
450
457
  "type": "integer",
451
458
  "minimum": 0,
452
459
  "maximum": 65535
460
+ },
461
+ "dashboard": {
462
+ "default": false,
463
+ "type": "boolean"
453
464
  }
454
465
  }
455
466
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode-slim",
3
- "version": "0.9.12",
3
+ "version": "0.9.14",
4
4
  "description": "Lightweight agent orchestration plugin for OpenCode - a slimmed-down fork of oh-my-opencode",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -36,8 +36,10 @@
36
36
  "LICENSE"
37
37
  ],
38
38
  "scripts": {
39
- "build": "bun build src/index.ts --outdir dist --target bun --format esm --packages external && bun build src/cli/index.ts --outdir dist/cli --target bun --format esm --packages external && tsc --emitDeclarationOnly && bun run generate-schema",
40
- "prepare": "bun build src/index.ts --outdir dist --target bun --format esm --packages external --external @ast-grep/napi --external @opencode-ai/plugin --external @opencode-ai/sdk",
39
+ "build:plugin": "bun build src/index.ts --outdir dist --target node --format esm --external @ast-grep/napi --external @opencode-ai/plugin --external @opencode-ai/sdk --external jsdom",
40
+ "build:cli": "bun build src/cli/index.ts --outdir dist/cli --target node --format esm --external @ast-grep/napi --external @opencode-ai/plugin --external @opencode-ai/sdk --external jsdom",
41
+ "build": "bun run build:plugin && bun run build:cli && tsc --emitDeclarationOnly && bun run generate-schema",
42
+ "prepare": "bun run build",
41
43
  "contributors:add": "all-contributors add",
42
44
  "contributors:check": "all-contributors check",
43
45
  "contributors:generate": "all-contributors generate",
@@ -1,43 +0,0 @@
1
- import type { PluginInput } from '@opencode-ai/plugin';
2
- import type { PluginConfig } from '../../config';
3
- declare const AUTOPILOT_CONTINUE_PROMPT = "[AUTOPILOT] Continue executing work in this same session now. Do not acknowledge autopilot, do not ask for confirmation, and do not stop after a status message. Perform the next concrete action immediately (run a tool/command, edit files, or advance the active todo). Only stop when all todos are completed/cancelled or the user explicitly disables autopilot.";
4
- interface MessagePart {
5
- type: string;
6
- text?: string;
7
- }
8
- interface TodoEntry {
9
- status?: string;
10
- }
11
- type AutopilotCommand = 'enable' | 'disable' | 'status' | null;
12
- declare function parseAutopilotCommand(text: string, keyword: string, disableKeyword: string): AutopilotCommand;
13
- declare function extractTodoList(data: unknown): TodoEntry[];
14
- declare function isActiveTodo(todo: TodoEntry): boolean;
15
- export declare function createAutopilotHook(ctx: PluginInput, config: PluginConfig): {
16
- 'chat.message': (input: {
17
- sessionID: string;
18
- agent?: string;
19
- messageID?: string;
20
- }, output: {
21
- parts: MessagePart[];
22
- }) => Promise<void>;
23
- event: (input: {
24
- event: {
25
- type: string;
26
- properties?: {
27
- sessionID?: string;
28
- status?: {
29
- type?: string;
30
- };
31
- info?: {
32
- id?: string;
33
- role?: string;
34
- sessionID?: string;
35
- time?: {
36
- completed?: number;
37
- };
38
- };
39
- };
40
- };
41
- }) => Promise<void>;
42
- };
43
- export { AUTOPILOT_CONTINUE_PROMPT, extractTodoList, isActiveTodo, parseAutopilotCommand, };
@@ -1,27 +0,0 @@
1
- import { z } from 'zod';
2
- export declare const interviewQuestionSchema: z.ZodObject<{
3
- id: z.ZodOptional<z.ZodString>;
4
- question: z.ZodString;
5
- options: z.ZodDefault<z.ZodArray<z.ZodString>>;
6
- suggested: z.ZodOptional<z.ZodString>;
7
- area: z.ZodOptional<z.ZodString>;
8
- }, z.core.$strip>;
9
- export declare const interviewAssistantStateSchema: z.ZodObject<{
10
- summary: z.ZodDefault<z.ZodString>;
11
- clarity: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
12
- criticalAreas: z.ZodDefault<z.ZodArray<z.ZodString>>;
13
- questions: z.ZodDefault<z.ZodArray<z.ZodObject<{
14
- id: z.ZodOptional<z.ZodString>;
15
- question: z.ZodString;
16
- options: z.ZodDefault<z.ZodArray<z.ZodString>>;
17
- suggested: z.ZodOptional<z.ZodString>;
18
- area: z.ZodOptional<z.ZodString>;
19
- }, z.core.$strip>>>;
20
- readyToExport: z.ZodDefault<z.ZodBoolean>;
21
- }, z.core.$strip>;
22
- export declare const interviewAnswersPayloadSchema: z.ZodObject<{
23
- answers: z.ZodArray<z.ZodObject<{
24
- questionId: z.ZodString;
25
- answer: z.ZodString;
26
- }, z.core.$strip>>;
27
- }, z.core.$strip>;