private String formatPlan()

in spring-ai-alibaba-graph/spring-ai-alibaba-graph-example/src/main/java/com/alibaba/cloud/ai/example/graph/openmanus/tool/PlanningTool.java [385:452]


	private String formatPlan(Map<String, Object> plan) {
		StringBuilder output = new StringBuilder();
		String planTitle = (String) plan.get("title");
		String planId = (String) plan.get("plan_id");

		output.append("Plan: ").append(planTitle).append(" (ID: ").append(planId).append(")\n");
		output.append(repeatString("=", output.length())).append("\n\n");

		// Calculate progress statistics
		List<String> steps = (List<String>) plan.get("steps");
		List<String> stepStatuses = (List<String>) plan.get("step_statuses");
		List<String> stepNotes = (List<String>) plan.get("step_notes");

		int totalSteps = steps.size();
		long completed = stepStatuses.stream().filter(status -> "completed".equals(status)).count();
		long inProgress = stepStatuses.stream().filter(status -> "in_progress".equals(status)).count();
		long blocked = stepStatuses.stream().filter(status -> "blocked".equals(status)).count();
		long notStarted = stepStatuses.stream().filter(status -> "not_started".equals(status)).count();

		output.append("Progress: ").append(completed).append("/").append(totalSteps).append(" steps completed ");
		if (totalSteps > 0) {
			double percentage = (completed / (double) totalSteps) * 100;
			output.append(String.format("(%.1f%%)\n", percentage));
		}
		else {
			output.append("(0%)\n");
		}

		output.append("Status: ")
			.append(completed)
			.append(" completed, ")
			.append(inProgress)
			.append(" in progress, ")
			.append(blocked)
			.append(" blocked, ")
			.append(notStarted)
			.append(" not started\n\n");
		output.append("Steps:\n");

		// Add each step with its status and notes
		for (int i = 0; i < totalSteps; i++) {
			String step = steps.get(i);
			String status = stepStatuses.get(i);
			String notes = stepNotes.get(i);

			String statusSymbol;
			switch (status) {
				case "in_progress":
					statusSymbol = "[→]";
					break;
				case "completed":
					statusSymbol = "[✓]";
					break;
				case "blocked":
					statusSymbol = "[!]";
					break;
				default:
					statusSymbol = "[ ]";
			}

			output.append(i).append(". ").append(statusSymbol).append(" ").append(step).append("\n");
			if (notes != null && !notes.isEmpty()) {
				output.append("   Notes: ").append(notes).append("\n");
			}
		}

		return output.toString();
	}