vigthoria-cli 1.13.26 → 1.13.30
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.
- package/README.md +12 -0
- package/completions/_vigthoria +1 -0
- package/completions/vigthoria.bash +1 -1
- package/completions/vigthoria.fish +1 -0
- package/dist/commands/chat.js +73 -26
- package/dist/commands/config.js +4 -4
- package/dist/commands/creative-registration.d.ts +13 -0
- package/dist/commands/creative-registration.js +88 -0
- package/dist/commands/fork.d.ts +3 -2
- package/dist/commands/fork.js +124 -123
- package/dist/commands/game.d.ts +8 -0
- package/dist/commands/game.js +113 -9
- package/dist/commands/history.d.ts +0 -1
- package/dist/commands/history.js +8 -22
- package/dist/commands/hub.d.ts +20 -0
- package/dist/commands/hub.js +17 -3
- package/dist/commands/preview.js +7 -2
- package/dist/commands/product-run-registration.js +1 -1
- package/dist/commands/replay.d.ts +0 -1
- package/dist/commands/replay.js +10 -19
- package/dist/commands/repo.js +16 -4
- package/dist/commands/update-registration.js +2 -2
- package/dist/commands/workflow.d.ts +4 -0
- package/dist/commands/workflow.js +27 -0
- package/dist/index.js +8 -4
- package/dist/utils/agentRunOutcome.d.ts +7 -0
- package/dist/utils/agentRunOutcome.js +13 -0
- package/dist/utils/api.d.ts +20 -5
- package/dist/utils/api.js +428 -43
- package/dist/utils/command-policy.js +3 -1
- package/dist/utils/config.d.ts +2 -0
- package/dist/utils/config.js +22 -9
- package/dist/utils/frontend-preview-service.d.ts +1 -0
- package/dist/utils/frontend-preview-service.js +54 -5
- package/dist/utils/model-governance.js +23 -14
- package/dist/utils/model-transport-service.js +1 -1
- package/dist/utils/network-policy.js +15 -3
- package/dist/utils/operator-client.js +23 -4
- package/dist/utils/post-write-validator.js +7 -3
- package/dist/utils/preview-screenshot-adapter.d.ts +16 -41
- package/dist/utils/preview-screenshot-adapter.js +273 -64
- package/dist/utils/runtime-capability.d.ts +7 -0
- package/dist/utils/runtime-capability.js +11 -0
- package/dist/utils/runtime-temp.d.ts +5 -2
- package/dist/utils/runtime-temp.js +131 -30
- package/dist/utils/tools.js +1 -1
- package/dist/utils/v3-stream-events.js +10 -2
- package/dist/utils/v3-workspace-service.d.ts +1 -0
- package/dist/utils/v3-workspace-service.js +38 -1
- package/dist/utils/vigflow-client.d.ts +9 -0
- package/dist/utils/vigflow-client.js +48 -2
- package/dist/utils/workspace-reference.d.ts +8 -0
- package/dist/utils/workspace-reference.js +21 -0
- package/install.ps1 +2 -2
- package/install.sh +2 -2
- package/package.json +4 -6
- package/scripts/release/LOCAL_MACHINE_USER_VERIFICATION.md +2 -2
- package/scripts/release/validate-live-service-gates.sh +3 -3
- package/scripts/release/validate-no-go-gates.sh +2 -0
package/README.md
CHANGED
|
@@ -216,6 +216,18 @@ This generates a tower defense game from scratch with Agent Mode, validates it i
|
|
|
216
216
|
|
|
217
217
|
## Commands
|
|
218
218
|
|
|
219
|
+
### Creative V2 planning
|
|
220
|
+
|
|
221
|
+
Use the guarded Creative V2 route for storyboards, videos, commercials,
|
|
222
|
+
avatars, music videos, and audio. The command creates a plan/preflight only;
|
|
223
|
+
it never approves paid rendering, credit debits, publishing, or identity
|
|
224
|
+
processing:
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
vigthoria creative workflows
|
|
228
|
+
vigthoria creative plan --workflow storyboard --duration 30 --aspect-ratio 16:9 "Launch film for a privacy-first AI workspace"
|
|
229
|
+
```
|
|
230
|
+
|
|
219
231
|
### Chat Mode
|
|
220
232
|
|
|
221
233
|
```bash
|
package/completions/_vigthoria
CHANGED
|
@@ -12,6 +12,7 @@ _vigthoria() {
|
|
|
12
12
|
'chat-resume:Resume the latest chat session for the current or specified project'
|
|
13
13
|
'commands:List every CLI command grouped by command family'
|
|
14
14
|
'config:Configure Vigthoria CLI settings'
|
|
15
|
+
'creative:Plan guarded media workflows with the native V2 Creative Agent'
|
|
15
16
|
'deploy:Deploy and host your project on Vigthoria infrastructure'
|
|
16
17
|
'device:Android Developer Bridge commands via local ADB'
|
|
17
18
|
'devtools:DevTools Bridge commands for browser debugging'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Generated from contracts/phase-0/command-manifest.json; do not edit.
|
|
2
2
|
_vigthoria_completions() {
|
|
3
3
|
local cur="${COMP_WORDS[COMP_CWORD]}"
|
|
4
|
-
COMPREPLY=( $(compgen -W 'agent auth background bridge cancel chat chat-resume commands config deploy device devtools doctor edit explain fix fork game generate history hub hyper-loop init legion login logout menu music operator preview replay repo review security status update v4 v4-menu wallet workflow' -- "$cur") )
|
|
4
|
+
COMPREPLY=( $(compgen -W 'agent auth background bridge cancel chat chat-resume commands config creative deploy device devtools doctor edit explain fix fork game generate history hub hyper-loop init legion login logout menu music operator preview replay repo review security status update v4 v4-menu wallet workflow' -- "$cur") )
|
|
5
5
|
}
|
|
6
6
|
complete -F _vigthoria_completions vigthoria vig vigthoria-chat
|
|
@@ -8,6 +8,7 @@ complete -c vigthoria -c vig -c vigthoria-chat -n '__fish_use_subcommand' -a 'ch
|
|
|
8
8
|
complete -c vigthoria -c vig -c vigthoria-chat -n '__fish_use_subcommand' -a 'chat-resume' -d 'Resume the latest chat session for the current or specified project'
|
|
9
9
|
complete -c vigthoria -c vig -c vigthoria-chat -n '__fish_use_subcommand' -a 'commands' -d 'List every CLI command grouped by command family'
|
|
10
10
|
complete -c vigthoria -c vig -c vigthoria-chat -n '__fish_use_subcommand' -a 'config' -d 'Configure Vigthoria CLI settings'
|
|
11
|
+
complete -c vigthoria -c vig -c vigthoria-chat -n '__fish_use_subcommand' -a 'creative' -d 'Plan guarded media workflows with the native V2 Creative Agent'
|
|
11
12
|
complete -c vigthoria -c vig -c vigthoria-chat -n '__fish_use_subcommand' -a 'deploy' -d 'Deploy and host your project on Vigthoria infrastructure'
|
|
12
13
|
complete -c vigthoria -c vig -c vigthoria-chat -n '__fish_use_subcommand' -a 'device' -d 'Android Developer Bridge commands via local ADB'
|
|
13
14
|
complete -c vigthoria -c vig -c vigthoria-chat -n '__fish_use_subcommand' -a 'devtools' -d 'DevTools Bridge commands for browser debugging'
|
package/dist/commands/chat.js
CHANGED
|
@@ -22,7 +22,7 @@ import { renderDynamicHelp } from '../utils/command-menu.js';
|
|
|
22
22
|
import { resolvePromptWorkspace } from '../utils/prompt-workspace-resolver.js';
|
|
23
23
|
import { FileUtils } from '../utils/files.js';
|
|
24
24
|
import { isDirectModeFollowUpQuestion, sanitizeDirectModeOutput, stripHiddenThoughtBlocks } from '../utils/direct-output-policy.js';
|
|
25
|
-
import { createLiveOutcome, evaluateExecutorSuccess, handleRunCompleteEvent, handleTaskEvent, isSubstantiveAgentAnswer, isToolEvidenceStubAnswer, normalizeAgentAnswerContent, noteAnalysisToolUse, } from '../utils/agentRunOutcome.js';
|
|
25
|
+
import { createLiveOutcome, evaluateExecutorSuccess, handleRunCompleteEvent, handleTaskEvent, isSubstantiveAgentAnswer, isToolEvidenceStubAnswer, normalizeAgentAnswerContent, noteAnalysisToolUse, resolveAgentPartialMutation, } from '../utils/agentRunOutcome.js';
|
|
26
26
|
import { looksLikeMarkdownReport, renderMarkdownToTerminal, summarizeMarkdownReport, } from '../utils/terminalMarkdown.js';
|
|
27
27
|
import { emitDeckEvent, isDeckModeEnabled } from '../utils/deckEvents.js';
|
|
28
28
|
import { formatGoaSystemGrounding, splitGoaContextFromInput, } from '../utils/goaEvents.js';
|
|
@@ -30,6 +30,7 @@ import { inferAgentTaskTypeWithContext, resolvePlannerAgentTimeoutMs, resolveWor
|
|
|
30
30
|
import { resolveAgentRoute } from '../utils/agentRoute.js';
|
|
31
31
|
import { isV3StreamKeepaliveEvent } from '../utils/v3-stream-events.js';
|
|
32
32
|
import { resolveAutoApproval } from '../utils/process-policy.js';
|
|
33
|
+
import { hasLocalV3ServiceIdentity } from '../utils/runtime-capability.js';
|
|
33
34
|
import { ChatToolCallParser } from '../utils/chat-tool-call-parser.js';
|
|
34
35
|
import { ChatPromptPolicy } from '../utils/chat-prompt-policy.js';
|
|
35
36
|
import { AgentStreamState } from '../utils/agent-stream-state.js';
|
|
@@ -1333,17 +1334,18 @@ export class ChatCommand {
|
|
|
1333
1334
|
isJsonOutput: () => this.jsonOutput,
|
|
1334
1335
|
idleTimeoutMs: () => DEFAULT_V3_AGENT_IDLE_TIMEOUT_MS,
|
|
1335
1336
|
});
|
|
1336
|
-
this.sessionManager = new SessionManager();
|
|
1337
|
+
this.sessionManager = new SessionManager(this.config.getStateRoot());
|
|
1337
1338
|
}
|
|
1338
1339
|
async run(options) {
|
|
1340
|
+
this.agentMode = options.agent === true;
|
|
1341
|
+
this.operatorMode = options.operator === true;
|
|
1339
1342
|
const hasRuntimeToken = Boolean(process.env.VIGTHORIA_TOKEN || process.env.VIGTHORIA_AUTH_TOKEN);
|
|
1340
|
-
|
|
1343
|
+
const hasAgentServiceIdentity = this.agentMode && hasLocalV3ServiceIdentity();
|
|
1344
|
+
if (!this.config.isAuthenticated() && !hasRuntimeToken && !hasAgentServiceIdentity) {
|
|
1341
1345
|
throw new CliCommandError('Not authenticated. Run: vigthoria login', {
|
|
1342
1346
|
code: 'AUTH_REQUIRED', category: 'authentication',
|
|
1343
1347
|
});
|
|
1344
1348
|
}
|
|
1345
|
-
this.agentMode = options.agent === true;
|
|
1346
|
-
this.operatorMode = options.operator === true;
|
|
1347
1349
|
this.workflowTarget = typeof options.workflow === 'string' && options.workflow.trim()
|
|
1348
1350
|
? options.workflow.trim()
|
|
1349
1351
|
: null;
|
|
@@ -1884,26 +1886,14 @@ export class ChatCommand {
|
|
|
1884
1886
|
await this.runOperatorDirectAnswer(prompt);
|
|
1885
1887
|
return;
|
|
1886
1888
|
}
|
|
1887
|
-
// ── Repo-grounded operator path: try V3 agent first, then fall back ──
|
|
1888
|
-
// Prompts that reference files, code symbols, or analysis verbs need
|
|
1889
|
-
// tool access to read actual file contents. Route these through the
|
|
1890
|
-
// V3 agent (which archives runs for history/replay/fork and supports
|
|
1891
|
-
// workspace hydration) first. Falls back to local agent loop if V3
|
|
1892
|
-
// is unreachable.
|
|
1893
|
-
if (this.isRepoGroundedPrompt(prompt) && this.tools) {
|
|
1894
|
-
this.operatorMode = true;
|
|
1895
|
-
const handledByV3 = await this.tryV3AgentWorkflow(prompt);
|
|
1896
|
-
if (handledByV3) {
|
|
1897
|
-
this.saveSession();
|
|
1898
|
-
return;
|
|
1899
|
-
}
|
|
1900
|
-
await this.runLocalAgentLoop(prompt);
|
|
1901
|
-
return;
|
|
1902
|
-
}
|
|
1903
1889
|
getBridgeClient()?.emitPrompt({ prompt, mode: 'operator', model: this.currentModel });
|
|
1904
1890
|
const runtimeContext = await this.getPromptRuntimeContext(prompt);
|
|
1905
1891
|
const spinner = this.jsonOutput ? null : createSpinner({ text: 'Thinking like an operator...', spinner: 'clock' }).start();
|
|
1906
|
-
|
|
1892
|
+
// Operator is the BMAD surface. Keep grounded repository analysis on the
|
|
1893
|
+
// Operator service and make mutation intent explicit instead of silently
|
|
1894
|
+
// diverting it into V3 Agent mode. Read-only is the fail-safe default.
|
|
1895
|
+
const operatorTaskType = inferAgentTaskTypeWithContext(prompt);
|
|
1896
|
+
const workflowType = resolveWorkflowType(operatorTaskType, prompt);
|
|
1907
1897
|
const executionPrompt = this.buildExecutionPrompt(prompt);
|
|
1908
1898
|
try {
|
|
1909
1899
|
this.rememberBrainEvent('task', `GoA operator workflow started for prompt: ${prompt.slice(0, 220)}`, 'operator');
|
|
@@ -2963,6 +2953,10 @@ export class ChatCommand {
|
|
|
2963
2953
|
return false;
|
|
2964
2954
|
}
|
|
2965
2955
|
const errorMessage = `V3 agent workflow returned an incomplete result and legacy fallback is disabled. ${previewGate?.error || 'Workspace changes were not fully validated.'}`;
|
|
2956
|
+
const partialMutation = resolveAgentPartialMutation(changedFileCount, response.metadata?.partialMutation);
|
|
2957
|
+
liveOutcome.executorError = previewGate?.error || 'Template Service preview proof did not pass.';
|
|
2958
|
+
liveOutcome.failedTaskIds.add('preview-gate');
|
|
2959
|
+
liveOutcome.unfinishedTaskIds.delete('agent-run-in-progress');
|
|
2966
2960
|
if (spinner) {
|
|
2967
2961
|
spinner.stop();
|
|
2968
2962
|
}
|
|
@@ -2972,8 +2966,8 @@ export class ChatCommand {
|
|
|
2972
2966
|
watcher?.stop();
|
|
2973
2967
|
throw new CliCommandError(errorMessage, {
|
|
2974
2968
|
code: 'AGENT_PREVIEW_FAILED',
|
|
2975
|
-
category:
|
|
2976
|
-
partialMutation
|
|
2969
|
+
category: partialMutation === false ? 'execution' : 'partial_mutation',
|
|
2970
|
+
partialMutation,
|
|
2977
2971
|
details: { executionPath: 'v3-agent', previewGate },
|
|
2978
2972
|
});
|
|
2979
2973
|
}
|
|
@@ -3168,10 +3162,11 @@ export class ChatCommand {
|
|
|
3168
3162
|
}
|
|
3169
3163
|
}
|
|
3170
3164
|
if (!executorSucceeded) {
|
|
3165
|
+
const partialMutation = resolveAgentPartialMutation(changedFileCount, response.metadata?.partialMutation);
|
|
3171
3166
|
throw new CliCommandError(runEvaluation.statusHeadline, {
|
|
3172
3167
|
code: 'AGENT_INCOMPLETE',
|
|
3173
|
-
category:
|
|
3174
|
-
partialMutation
|
|
3168
|
+
category: partialMutation === false ? 'execution' : 'partial_mutation',
|
|
3169
|
+
partialMutation,
|
|
3175
3170
|
details: {
|
|
3176
3171
|
mode: 'agent',
|
|
3177
3172
|
model: routingPolicy.selectedModel,
|
|
@@ -3217,9 +3212,61 @@ export class ChatCommand {
|
|
|
3217
3212
|
catch (error) {
|
|
3218
3213
|
this.stopV3IdleWatch();
|
|
3219
3214
|
watcher?.stop();
|
|
3215
|
+
const persistTypedAgentFailure = (failure) => {
|
|
3216
|
+
const safeFailure = sanitizeUserFacingErrorText(failure.message || 'Agent execution failed.');
|
|
3217
|
+
liveOutcome.streamAborted = true;
|
|
3218
|
+
if (!liveOutcome.executorError)
|
|
3219
|
+
liveOutcome.executorError = safeFailure;
|
|
3220
|
+
if (failure.code === 'AGENT_PLAN_INVALID')
|
|
3221
|
+
liveOutcome.failedTaskIds.add('agent-plan');
|
|
3222
|
+
liveOutcome.unfinishedTaskIds.delete('agent-run-in-progress');
|
|
3223
|
+
this.commitAgentRunOutcome({
|
|
3224
|
+
prompt,
|
|
3225
|
+
originalPrompt: null,
|
|
3226
|
+
taskId: null,
|
|
3227
|
+
contextId: executionId,
|
|
3228
|
+
tasksSucceeded: liveOutcome.tasksSucceeded,
|
|
3229
|
+
tasksTotal: liveOutcome.tasksTotal,
|
|
3230
|
+
failedTaskIds: [...liveOutcome.failedTaskIds],
|
|
3231
|
+
unfinishedTaskIds: [...liveOutcome.unfinishedTaskIds],
|
|
3232
|
+
qualityScore: liveOutcome.qualityScore,
|
|
3233
|
+
qualityMissing: liveOutcome.qualityMissing,
|
|
3234
|
+
qualityBlockers: liveOutcome.qualityBlockers,
|
|
3235
|
+
hasOutput: this.api.hasAgentWorkspaceOutput(workspaceContext),
|
|
3236
|
+
answerContent: null,
|
|
3237
|
+
selfHealStatus: 'failed',
|
|
3238
|
+
selfHealTool: null,
|
|
3239
|
+
plannerError: liveOutcome.plannerError ? sanitizeUserFacingErrorText(liveOutcome.plannerError) : null,
|
|
3240
|
+
executorError: liveOutcome.executorError,
|
|
3241
|
+
clientToolErrors: this.api.getClientToolErrors(),
|
|
3242
|
+
transportErrors: this.api.getLastChatTransportErrors(),
|
|
3243
|
+
workspacePath: workspacePath || null,
|
|
3244
|
+
workspaceSyncIssue: null,
|
|
3245
|
+
finishedAt: Date.now(),
|
|
3246
|
+
}, prompt);
|
|
3247
|
+
this.updateAgentExecutionCheckpoint({
|
|
3248
|
+
status: 'failed',
|
|
3249
|
+
contextId: executionId,
|
|
3250
|
+
failedTaskIds: [...liveOutcome.failedTaskIds],
|
|
3251
|
+
unfinishedTaskIds: [...liveOutcome.unfinishedTaskIds],
|
|
3252
|
+
error: liveOutcome.executorError,
|
|
3253
|
+
});
|
|
3254
|
+
};
|
|
3255
|
+
if (error?.code === 'AGENT_PLAN_INVALID') {
|
|
3256
|
+
const planFailure = new CliCommandError(error.message, {
|
|
3257
|
+
code: 'AGENT_PLAN_INVALID',
|
|
3258
|
+
category: 'execution',
|
|
3259
|
+
partialMutation: error?.partialMutation ?? false,
|
|
3260
|
+
details: error?.mutation ? { mutation: error.mutation } : undefined,
|
|
3261
|
+
cause: error,
|
|
3262
|
+
});
|
|
3263
|
+
persistTypedAgentFailure(planFailure);
|
|
3264
|
+
throw planFailure;
|
|
3265
|
+
}
|
|
3220
3266
|
if (error instanceof CliCommandError) {
|
|
3221
3267
|
if (spinner)
|
|
3222
3268
|
spinner.stop();
|
|
3269
|
+
persistTypedAgentFailure(error);
|
|
3223
3270
|
throw error;
|
|
3224
3271
|
}
|
|
3225
3272
|
if (!this.api.hasAgentWorkspaceOutput(workspaceContext)) {
|
package/dist/commands/config.js
CHANGED
|
@@ -101,8 +101,8 @@ export class ConfigCommand {
|
|
|
101
101
|
message: 'Default AI model:',
|
|
102
102
|
choices: [
|
|
103
103
|
{ name: '═══ Code Models ═══', disabled: true },
|
|
104
|
-
{ name: 'Vigthoria v4 Creative 27B -
|
|
105
|
-
{ name: 'Vigthoria v4 Code 27B - Production executor', value: 'code' },
|
|
104
|
+
{ name: 'Vigthoria v4.2 Creative 27B - Multimodal architect and planning', value: 'architect' },
|
|
105
|
+
{ name: 'Vigthoria v4.2 Code 27B - Production executor', value: 'code' },
|
|
106
106
|
{ name: 'Vigthoria v4 Assistant 9B - Fast FIM and diagnostics', value: 'assistant' },
|
|
107
107
|
],
|
|
108
108
|
default: 'code',
|
|
@@ -309,8 +309,8 @@ export class ConfigCommand {
|
|
|
309
309
|
name: 'defaultModel',
|
|
310
310
|
message: 'Default AI model:',
|
|
311
311
|
choices: [
|
|
312
|
-
{ name: 'Vigthoria v4 Creative 27B — Architect', value: 'architect' },
|
|
313
|
-
{ name: 'Vigthoria v4 Code 27B — Executor', value: 'code' },
|
|
312
|
+
{ name: 'Vigthoria v4.2 Creative 27B — Multimodal Architect', value: 'architect' },
|
|
313
|
+
{ name: 'Vigthoria v4.2 Code 27B — Executor', value: 'code' },
|
|
314
314
|
{ name: 'Vigthoria v4 Assistant 9B — FIM and diagnostics', value: 'assistant' },
|
|
315
315
|
],
|
|
316
316
|
default: current.preferences.defaultModel,
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import type { Config } from '../utils/config.js';
|
|
3
|
+
import type { Logger } from '../utils/logger.js';
|
|
4
|
+
export type CreativeWorkflow = 'video' | 'storyboard' | 'commercial' | 'avatar' | 'music-video' | 'music-audio';
|
|
5
|
+
export declare function buildCreativePlanPrompt(options: {
|
|
6
|
+
workflow: CreativeWorkflow;
|
|
7
|
+
brief: string;
|
|
8
|
+
title?: string;
|
|
9
|
+
duration?: number;
|
|
10
|
+
aspectRatio?: string;
|
|
11
|
+
project?: string;
|
|
12
|
+
}): string;
|
|
13
|
+
export declare function registerCreativeCommands(program: Command, config: Config, logger: Logger): void;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { ChatCommand } from './chat.js';
|
|
2
|
+
const CREATIVE_ROUTES = {
|
|
3
|
+
video: { taxonomy: 'v2_creative.video_project', runtime: 'v2-creative-studio-core' },
|
|
4
|
+
storyboard: { taxonomy: 'v2_creative.video_project', runtime: 'v2-creative-studio-core' },
|
|
5
|
+
commercial: { taxonomy: 'v2_creative.video_project', runtime: 'v2-creative-studio-core' },
|
|
6
|
+
avatar: { taxonomy: 'v2_creative.avatar_operator', runtime: 'v2-creative-avatar-operator' },
|
|
7
|
+
'music-video': { taxonomy: 'v2_creative.video_project', runtime: 'v2-creative-studio-core' },
|
|
8
|
+
'music-audio': { taxonomy: 'v2_creative.music_generation', runtime: 'vigthoria-music-ai' },
|
|
9
|
+
};
|
|
10
|
+
export function buildCreativePlanPrompt(options) {
|
|
11
|
+
const route = CREATIVE_ROUTES[options.workflow];
|
|
12
|
+
return [
|
|
13
|
+
'Route this request through the native V2 Creative Agent workflow.',
|
|
14
|
+
'Planning only: do not start paid/cloud rendering, debit credits, publish media, or process identity assets. Return the plan, preflight, quote, and explicit approval gates first.',
|
|
15
|
+
`@vigthoria-creative-v2:${JSON.stringify({
|
|
16
|
+
contract: 'vigthoria-cli-creative-v2.v1',
|
|
17
|
+
taxonomy: route.taxonomy,
|
|
18
|
+
target_runtime: route.runtime,
|
|
19
|
+
phase: 'plan_only',
|
|
20
|
+
workflow: options.workflow,
|
|
21
|
+
title: options.title?.trim() || undefined,
|
|
22
|
+
brief: options.brief.trim(),
|
|
23
|
+
duration_seconds: options.duration,
|
|
24
|
+
aspect_ratio: options.aspectRatio || '16:9',
|
|
25
|
+
workspace_root: options.project,
|
|
26
|
+
safety: {
|
|
27
|
+
paid_render_approved: false,
|
|
28
|
+
identity_processing_approved: false,
|
|
29
|
+
require_preflight_and_quote: true,
|
|
30
|
+
},
|
|
31
|
+
})}`,
|
|
32
|
+
].join('\n');
|
|
33
|
+
}
|
|
34
|
+
export function registerCreativeCommands(program, config, logger) {
|
|
35
|
+
const creative = program
|
|
36
|
+
.command('creative')
|
|
37
|
+
.description('Plan guarded media workflows with the native V2 Creative Agent');
|
|
38
|
+
creative
|
|
39
|
+
.command('workflows')
|
|
40
|
+
.description('List supported Creative V2 workflow routes')
|
|
41
|
+
.action(() => {
|
|
42
|
+
for (const [name, route] of Object.entries(CREATIVE_ROUTES)) {
|
|
43
|
+
console.log(`${name}\t${route.taxonomy}\t${route.runtime}`);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
creative
|
|
47
|
+
.command('plan <brief...>')
|
|
48
|
+
.description('Create a plan/preflight only; never approves rendering or billing')
|
|
49
|
+
.option('-w, --workflow <workflow>', 'video, storyboard, commercial, avatar, music-video, or music-audio', 'storyboard')
|
|
50
|
+
.option('-t, --title <title>', 'Project or campaign title')
|
|
51
|
+
.option('-d, --duration <seconds>', 'Target duration in seconds', (value) => Number.parseInt(value, 10), 30)
|
|
52
|
+
.option('-a, --aspect-ratio <ratio>', '16:9, 9:16, or 1:1', '16:9')
|
|
53
|
+
.option('-p, --project <path>', 'Workspace/project context', process.cwd())
|
|
54
|
+
.option('--json', 'Emit machine-readable direct-agent output', false)
|
|
55
|
+
.action(async (briefParts, options) => {
|
|
56
|
+
const workflow = String(options.workflow || '').trim();
|
|
57
|
+
if (!Object.prototype.hasOwnProperty.call(CREATIVE_ROUTES, workflow)) {
|
|
58
|
+
throw new Error(`Unsupported Creative V2 workflow: ${options.workflow}`);
|
|
59
|
+
}
|
|
60
|
+
const duration = Number(options.duration);
|
|
61
|
+
if (!Number.isFinite(duration) || duration < 5 || duration > 600) {
|
|
62
|
+
throw new Error('Creative duration must be between 5 and 600 seconds.');
|
|
63
|
+
}
|
|
64
|
+
const aspectRatio = String(options.aspectRatio || '16:9');
|
|
65
|
+
if (!['16:9', '9:16', '1:1'].includes(aspectRatio)) {
|
|
66
|
+
throw new Error('Creative aspect ratio must be 16:9, 9:16, or 1:1.');
|
|
67
|
+
}
|
|
68
|
+
const project = String(options.project || process.cwd());
|
|
69
|
+
const prompt = buildCreativePlanPrompt({
|
|
70
|
+
workflow,
|
|
71
|
+
brief: briefParts.join(' '),
|
|
72
|
+
title: options.title,
|
|
73
|
+
duration,
|
|
74
|
+
aspectRatio,
|
|
75
|
+
project,
|
|
76
|
+
});
|
|
77
|
+
await new ChatCommand(config, logger, program).run({
|
|
78
|
+
model: 'agent',
|
|
79
|
+
project,
|
|
80
|
+
projectProvided: Boolean(options.project),
|
|
81
|
+
agent: true,
|
|
82
|
+
autoApprove: false,
|
|
83
|
+
prompt,
|
|
84
|
+
json: Boolean(options.json),
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
creative.action(() => creative.outputHelp());
|
|
88
|
+
}
|
package/dist/commands/fork.d.ts
CHANGED
|
@@ -7,10 +7,11 @@ interface ForkOptions {
|
|
|
7
7
|
}
|
|
8
8
|
export declare class ForkCommand {
|
|
9
9
|
private config;
|
|
10
|
-
|
|
10
|
+
private logger;
|
|
11
|
+
constructor(config: Config, logger: Logger);
|
|
11
12
|
private getHeaders;
|
|
12
13
|
private getBaseUrl;
|
|
13
|
-
private
|
|
14
|
+
private buildForkHistory;
|
|
14
15
|
run(runId: string, message: string, options: ForkOptions): Promise<void>;
|
|
15
16
|
}
|
|
16
17
|
export {};
|