Skip to content

Commit 7469fca

Browse files
committed
feat: enhance pull functionality with type filtering and reverse-resolution order
- Updated the pull process to support filtering by resource types, allowing users to specify which types to pull. - Adjusted the order of resource pulling to ensure dependencies are resolved correctly, improving the integrity of the pulled state. - Enhanced logging to display the applied filters during the pull operation for better user feedback.
1 parent 77c54d6 commit 7469fca

2 files changed

Lines changed: 22 additions & 12 deletions

File tree

src/apply.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,9 @@ async function main(): Promise<void> {
4444
console.log(" Pull → Merge → Push");
4545
console.log("═══════════════════════════════════════════════════════════════\n");
4646

47-
// Step 1: Pull with merge
48-
const pullExit = runPassthrough(`npx tsx src/pull.ts ${env}`);
47+
// Step 1: Pull with merge (forward filters so only matching types are pulled)
48+
const pullCmd = `npx tsx src/pull.ts ${env} ${extraArgs}`.trim();
49+
const pullExit = runPassthrough(pullCmd);
4950
if (pullExit !== 0) {
5051
console.error("\n❌ Pull had issues. Resolve conflicts before pushing.");
5152
process.exit(1);

src/pull.ts

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { execSync } from "child_process";
22
import { mkdir, writeFile } from "fs/promises";
33
import { join, dirname, relative } from "path";
44
import { stringify } from "yaml";
5-
import { VAPI_ENV, VAPI_BASE_URL, VAPI_TOKEN, RESOURCES_DIR, BASE_DIR } from "./config.ts";
5+
import { VAPI_ENV, VAPI_BASE_URL, VAPI_TOKEN, RESOURCES_DIR, BASE_DIR, APPLY_FILTER } from "./config.ts";
66
import { loadState, saveState } from "./state.ts";
77
import type { StateFile, ResourceType } from "./types.ts";
88

@@ -461,9 +461,14 @@ export async function pullResourceType(
461461
async function main(): Promise<void> {
462462
const force = process.argv.includes("--force");
463463

464+
const typeFilter = APPLY_FILTER.resourceTypes;
465+
464466
console.log("═══════════════════════════════════════════════════════════════");
465467
console.log(`🔄 Vapi GitOps Pull - Environment: ${VAPI_ENV}${force ? " (force)" : ""}`);
466468
console.log(` API: ${VAPI_BASE_URL}`);
469+
if (typeFilter?.length) {
470+
console.log(` Filter: ${typeFilter.join(", ")}`);
471+
}
467472
console.log("═══════════════════════════════════════════════════════════════");
468473

469474
// Default mode: skip locally changed files (local is source of truth)
@@ -499,15 +504,19 @@ async function main(): Promise<void> {
499504
simulationSuites: { ...zero },
500505
};
501506

502-
// Pull in dependency order
503-
stats.tools = await pullResourceType("tools", state, changedFiles);
504-
stats.structuredOutputs = await pullResourceType("structuredOutputs", state, changedFiles);
505-
stats.assistants = await pullResourceType("assistants", state, changedFiles);
506-
stats.squads = await pullResourceType("squads", state, changedFiles);
507-
stats.personalities = await pullResourceType("personalities", state, changedFiles);
508-
stats.scenarios = await pullResourceType("scenarios", state, changedFiles);
509-
stats.simulations = await pullResourceType("simulations", state, changedFiles);
510-
stats.simulationSuites = await pullResourceType("simulationSuites", state, changedFiles);
507+
// Pull in reverse-resolution order: pull resources that are referenced by others first,
508+
// so their state is populated when resolving references (UUID → resourceId) in dependent types.
509+
// e.g. structuredOutputs reference assistants, so assistants must be pulled first.
510+
const shouldPull = (type: ResourceType) => !typeFilter?.length || typeFilter.includes(type);
511+
512+
if (shouldPull("tools")) stats.tools = await pullResourceType("tools", state, changedFiles);
513+
if (shouldPull("assistants")) stats.assistants = await pullResourceType("assistants", state, changedFiles);
514+
if (shouldPull("structuredOutputs")) stats.structuredOutputs = await pullResourceType("structuredOutputs", state, changedFiles);
515+
if (shouldPull("squads")) stats.squads = await pullResourceType("squads", state, changedFiles);
516+
if (shouldPull("personalities")) stats.personalities = await pullResourceType("personalities", state, changedFiles);
517+
if (shouldPull("scenarios")) stats.scenarios = await pullResourceType("scenarios", state, changedFiles);
518+
if (shouldPull("simulations")) stats.simulations = await pullResourceType("simulations", state, changedFiles);
519+
if (shouldPull("simulationSuites")) stats.simulationSuites = await pullResourceType("simulationSuites", state, changedFiles);
511520

512521
await saveState(state);
513522

0 commit comments

Comments
 (0)